microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
17bf2e6423d9b2b85ca346a4f0116dfe25b16cff

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/debugger/direct/directDebugSession.ts

172lines · 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;
ebbd64f1RedMickey6 years ago18private onDidTerminateDebugSessionHandler: vscode.Disposable;
984ca036RedMickey6 years ago19
2c19da7fRedMickey6 years ago20constructor(session: vscode.DebugSession) {
21super(session);
984ca036RedMickey6 years ago22this.debuggerEndpointHelper = new DebuggerEndpointHelper();
ebbd64f1RedMickey6 years ago23
24this.onDidTerminateDebugSessionHandler = vscode.debug.onDidTerminateDebugSession(
25this.handleTerminateDebugSession.bind(this)
26);
2c19da7fRedMickey6 years ago27}
28
984ca036RedMickey6 years ago29protected async launchRequest(response: DebugProtocol.LaunchResponse, launchArgs: ILaunchRequestArgs, request?: DebugProtocol.Request): Promise<void> {
2c19da7fRedMickey6 years ago30let extProps = {
31platform: {
32value: launchArgs.platform,
33isPii: false,
34},
35isDirect: {
36value: true,
37isPii: false,
38},
39};
40
41return new Promise<void>((resolve, reject) => this.initializeSettings(launchArgs)
42.then(() => {
43logger.log("Launching the application");
44logger.verbose(`Launching the application: ${JSON.stringify(launchArgs, null , 2)}`);
45return ProjectVersionHelper.getReactNativeVersions(launchArgs.cwd, launchArgs.platform === "windows")
46.then(versions => {
47extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeVersion, "reactNativeVersion", extProps);
48if (launchArgs.platform === "windows") {
49extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeWindowsVersion, "reactNativeWindowsVersion", extProps);
50}
51return TelemetryHelper.generate("launch", extProps, (generator) => {
52return this.appLauncher.launch(launchArgs)
53.then(() => {
54return this.appLauncher.getPackagerPort(launchArgs.cwd);
55})
56.then((packagerPort: number) => {
57launchArgs.port = launchArgs.port || packagerPort;
58this.attachRequest(response, launchArgs).then(() => {
59resolve();
60}).catch((e) => reject(e));
61}).catch((e) => reject(e));
62})
63.catch((err) => {
64logger.error("An error occurred while launching the application. " + err.message || err);
65reject(err);
66});
67});
984ca036RedMickey6 years ago68}))
e23d1841RedMickey6 years ago69.catch(err => this.showError(err, response));
2c19da7fRedMickey6 years ago70}
71
984ca036RedMickey6 years ago72protected async attachRequest(response: DebugProtocol.AttachResponse, attachArgs: IAttachRequestArgs, request?: DebugProtocol.Request): Promise<void> {
2c19da7fRedMickey6 years ago73let extProps = {
74platform: {
75value: attachArgs.platform,
76isPii: false,
77},
78isDirect: {
79value: true,
80isPii: false,
81},
82};
83
84this.previousAttachArgs = attachArgs;
85
86return new Promise<void>((resolve, reject) => this.initializeSettings(attachArgs)
87.then(() => {
88logger.log("Attaching to the application");
89logger.verbose(`Attaching to the application: ${JSON.stringify(attachArgs, null , 2)}`);
90return ProjectVersionHelper.getReactNativeVersions(attachArgs.cwd, true)
91.then(versions => {
92extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeVersion, "reactNativeVersion", extProps);
93if (!ProjectVersionHelper.isVersionError(versions.reactNativeWindowsVersion)) {
94extProps = TelemetryHelper.addPropertyToTelemetryProperties(versions.reactNativeWindowsVersion, "reactNativeWindowsVersion", extProps);
95}
96return TelemetryHelper.generate("attach", extProps, (generator) => {
97attachArgs.port = attachArgs.port || this.appLauncher.getPackagerPort(attachArgs.cwd);
98logger.log(`Connecting to ${attachArgs.port} port`);
984ca036RedMickey6 years ago99return this.appLauncher.getRnCdpProxy().stopServer()
100.then(() => this.appLauncher.getRnCdpProxy().initializeServer(new DirectCDPMessageHandler(), this.cdpProxyLogLevel))
e23d1841RedMickey6 years ago101.then(() => this.debuggerEndpointHelper.retryGetWSEndpoint(
102`http://localhost:${attachArgs.port}`,
10390,
104this.cancellationTokenSource.token
105))
984ca036RedMickey6 years ago106.then((browserInspectUri) => {
107this.appLauncher.getRnCdpProxy().setBrowserInspectUri(browserInspectUri);
5d47053fRedMickey6 years ago108this.establishDebugSession(attachArgs, resolve);
e23d1841RedMickey6 years ago109})
110.catch(e => reject(e));
2c19da7fRedMickey6 years ago111})
112.catch((err) => {
113logger.error("An error occurred while attaching to the debugger. " + err.message || err);
114reject(err);
115});
116});
984ca036RedMickey6 years ago117}))
e23d1841RedMickey6 years ago118.catch(err => this.showError(err, response));
2c19da7fRedMickey6 years ago119}
120
984ca036RedMickey6 years ago121protected async disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments, request?: DebugProtocol.Request): Promise<void> {
ebbd64f1RedMickey6 years ago122this.onDidTerminateDebugSessionHandler.dispose();
123
2c19da7fRedMickey6 years ago124super.disconnectRequest(response, args, request);
125}
126
5d47053fRedMickey6 years ago127protected establishDebugSession(attachArgs: IAttachRequestArgs, resolve?: (value?: void | PromiseLike<void> | undefined) => void): void {
b7451aefRedMickey6 years ago128const attachArguments = {
129type: "pwa-node",
130request: "attach",
131name: "Attach",
132continueOnAttach: true,
133port: this.appLauncher.getCdpProxyPort(),
134smartStep: false,
5d47053fRedMickey6 years ago135skipFiles: attachArgs.skipFiles || [],
b7451aefRedMickey6 years ago136// The unique identifier of the debug session. It is used to distinguish React Native extension's
137// debug sessions from other ones. So we can save and process only the extension's debug sessions
138// in vscode.debug API methods "onDidStartDebugSession" and "onDidTerminateDebugSession".
139rnDebugSessionId: this.session.id,
140};
141
142vscode.debug.startDebugging(
143this.appLauncher.getWorkspaceFolder(),
144attachArguments,
ebbd64f1RedMickey6 years ago145{
146parentSession: this.session,
147consoleMode: vscode.DebugConsoleMode.MergeWithParent,
148}
b7451aefRedMickey6 years ago149)
150.then((childDebugSessionStarted: boolean) => {
151if (childDebugSessionStarted) {
152if (resolve) {
153resolve();
154}
155} else {
e23d1841RedMickey6 years ago156throw new Error(localize("CouldNotStartChildDebugSession", "Couldn't start child debug session"));
b7451aefRedMickey6 years ago157}
158},
159err => {
160throw err;
161});
162}
ebbd64f1RedMickey6 years ago163
164private handleTerminateDebugSession(debugSession: vscode.DebugSession) {
165if (
166debugSession.configuration.rnDebugSessionId === this.session.id
167&& debugSession.type === this.pwaNodeSessionName
168) {
169this.session.customRequest(this.disconnectCommand, {forcedStop: true});
170}
171}
2c19da7fRedMickey6 years ago172}