microsoft/vscode-react-native

Public

mirrored from https://github.com/microsoft/vscode-react-nativeAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
984ca036ea8e629228ba7ebe24a22b2ea2415fe1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

src/debugger/direct/directDebugSession.ts

162lines · modeblame

2c19da7fRedMickey6 years ago1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT license. See LICENSE file in the project root for details.
3
4import * as vscode from "vscode";
5import { ProjectVersionHelper } from "../../common/projectVersionHelper";
984ca036RedMickey6 years ago6import { logger } from "vscode-debugadapter";
2c19da7fRedMickey6 years ago7import { TelemetryHelper } from "../../common/telemetryHelper";
8import { DebugProtocol } from "vscode-debugprotocol";
9import { DirectCDPMessageHandler } from "../../cdp-proxy/CDPMessageHandlers/directCDPMessageHandler";
10import { DebugSessionBase, IAttachRequestArgs, ILaunchRequestArgs } from "../debugSessionBase";
984ca036RedMickey6 years ago11import { DebuggerEndpointHelper } from "../../cdp-proxy/debuggerEndpointHelper";
2c19da7fRedMickey6 years ago12import * as nls from "vscode-nls";
13const localize = nls.loadMessageBundle();
14
15export class DirectDebugSession extends DebugSessionBase {
16
984ca036RedMickey6 years ago17private debuggerEndpointHelper: DebuggerEndpointHelper;
18
2c19da7fRedMickey6 years ago19constructor(session: vscode.DebugSession) {
20super(session);
984ca036RedMickey6 years ago21this.debuggerEndpointHelper = new DebuggerEndpointHelper();
2c19da7fRedMickey6 years ago22}
23
984ca036RedMickey6 years ago24protected async launchRequest(response: DebugProtocol.LaunchResponse, launchArgs: ILaunchRequestArgs, request?: DebugProtocol.Request): Promise<void> {
2c19da7fRedMickey6 years ago25let extProps = {
26platform: {
27value: launchArgs.platform,
28isPii: false,
29},
30isDirect: {
31value: true,
32isPii: false,
33},
34};
35
36return new Promise<void>((resolve, reject) => this.initializeSettings(launchArgs)
37.then(() => {
38logger.log("Launching the application");
39logger.verbose(`Launching the application: ${JSON.stringify(launchArgs, null , 2)}`);
40return ProjectVersionHelper.getReactNativeVersions(launchArgs.cwd, launchArgs.platform === "windows")
41.then(versions => {
42extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeVersion, "reactNativeVersion", extProps);
43if (launchArgs.platform === "windows") {
44extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeWindowsVersion, "reactNativeWindowsVersion", extProps);
45}
46return TelemetryHelper.generate("launch", extProps, (generator) => {
47return this.appLauncher.launch(launchArgs)
48.then(() => {
49return this.appLauncher.getPackagerPort(launchArgs.cwd);
50})
51.then((packagerPort: number) => {
52launchArgs.port = launchArgs.port || packagerPort;
53this.attachRequest(response, launchArgs).then(() => {
54resolve();
55}).catch((e) => reject(e));
56}).catch((e) => reject(e));
57})
58.catch((err) => {
59logger.error("An error occurred while launching the application. " + err.message || err);
60reject(err);
61});
62});
984ca036RedMickey6 years ago63}))
64.catch(err => this.showError(err.message, response));
2c19da7fRedMickey6 years ago65}
66
984ca036RedMickey6 years ago67protected async attachRequest(response: DebugProtocol.AttachResponse, attachArgs: IAttachRequestArgs, request?: DebugProtocol.Request): Promise<void> {
2c19da7fRedMickey6 years ago68let extProps = {
69platform: {
70value: attachArgs.platform,
71isPii: false,
72},
73isDirect: {
74value: true,
75isPii: false,
76},
77};
78
79this.previousAttachArgs = attachArgs;
80
81return new Promise<void>((resolve, reject) => this.initializeSettings(attachArgs)
82.then(() => {
83logger.log("Attaching to the application");
84logger.verbose(`Attaching to the application: ${JSON.stringify(attachArgs, null , 2)}`);
85return ProjectVersionHelper.getReactNativeVersions(attachArgs.cwd, true)
86.then(versions => {
87extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeVersion, "reactNativeVersion", extProps);
88if (!ProjectVersionHelper.isVersionError(versions.reactNativeWindowsVersion)) {
89extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeWindowsVersion, "reactNativeWindowsVersion", extProps);
90}
91return TelemetryHelper.generate("attach", extProps, (generator) => {
92attachArgs.port = attachArgs.port || this.appLauncher.getPackagerPort(attachArgs.cwd);
93logger.log(`Connecting to ${attachArgs.port} port`);
984ca036RedMickey6 years ago94return this.appLauncher.getRnCdpProxy().stopServer()
95.then(() => this.appLauncher.getRnCdpProxy().initializeServer(new DirectCDPMessageHandler(), this.cdpProxyLogLevel))
96.then(() => this.debuggerEndpointHelper.retryGetWSEndpoint(`http://localhost:${attachArgs.port}`, 90))
97.then((browserInspectUri) => {
98this.appLauncher.getRnCdpProxy().setBrowserInspectUri(browserInspectUri);
b7451aefRedMickey6 years ago99this.establishDebugSession(resolve);
2c19da7fRedMickey6 years ago100});
101})
102.catch((err) => {
103logger.error("An error occurred while attaching to the debugger. " + err.message || err);
104reject(err);
105});
106});
984ca036RedMickey6 years ago107}))
108.catch(err => this.showError(err.message, response));
2c19da7fRedMickey6 years ago109}
110
984ca036RedMickey6 years ago111protected async disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments, request?: DebugProtocol.Request): Promise<void> {
2c19da7fRedMickey6 years ago112// The client is about to disconnect so first we need to stop app worker
113if (this.appWorker) {
114this.appWorker.stop();
115}
116
984ca036RedMickey6 years ago117await this.appLauncher.getRnCdpProxy().stopServer();
2c19da7fRedMickey6 years ago118
119if (this.previousAttachArgs.platform === "android") {
120try {
121this.appLauncher.stopMonitoringLogCat();
122} catch (err) {
123logger.warn(localize("CouldNotStopMonitoringLogcat", "Couldn't stop monitoring logcat: {0}", err.message || err));
124}
125}
126
127super.disconnectRequest(response, args, request);
128}
129
b7451aefRedMickey6 years ago130protected establishDebugSession(resolve?: (value?: void | PromiseLike<void> | undefined) => void): void {
131const attachArguments = {
132type: "pwa-node",
133request: "attach",
134name: "Attach",
135continueOnAttach: true,
136port: this.appLauncher.getCdpProxyPort(),
137smartStep: false,
138// The unique identifier of the debug session. It is used to distinguish React Native extension's
139// debug sessions from other ones. So we can save and process only the extension's debug sessions
140// in vscode.debug API methods "onDidStartDebugSession" and "onDidTerminateDebugSession".
141rnDebugSessionId: this.session.id,
142};
143
144vscode.debug.startDebugging(
145this.appLauncher.getWorkspaceFolder(),
146attachArguments,
147this.session
148)
149.then((childDebugSessionStarted: boolean) => {
150if (childDebugSessionStarted) {
151if (resolve) {
152resolve();
153}
154} else {
155throw new Error("Cannot start child debug session");
156}
157},
158err => {
159throw err;
160});
161}
2c19da7fRedMickey6 years ago162}