// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
import { IProtocolCommand } from "vscode-cdp-proxy";
import { ProcessedCDPMessage } from "./ICDPMessageHandler";
import { CDP_API_NAMES } from "./CDPAPINames";
import { BaseCDPMessageHandler } from "./baseCDPMessageHandler";
export class RnCDPMessageHandler extends BaseCDPMessageHandler {
private firstStop: boolean;
constructor() {
super();
this.firstStop = true;
}
public processDebuggerCDPMessage(event: any): ProcessedCDPMessage {
let sendBack = false;
if (event.method === CDP_API_NAMES.CLOSE) {
this.handleDebuggerDisconnect();
}
return {
event,
sendBack,
};
}
public processApplicationCDPMessage(event: any): ProcessedCDPMessage {
let sendBack = false;
if (event.method === CDP_API_NAMES.DEBUGGER_PAUSED && this.firstStop) {
event.params = this.handleAppBundleFirstPauseEvent(event);
}
return {
event,
sendBack,
};
}
/** Since the bundle runs inside the Node.js VM in `debuggerWorker.js` in runtime
* Node debug adapter need time to parse new added code source maps
* So we added `debugger;` statement at the start of the bundle code
* and wait for the adapter to receive a signal to stop on that statement
* and then change pause reason to `Break on start` so js-debug can process all breakpoints in the bundle and
* continue the code execution using `continueOnAttach` flag
*/
private handleAppBundleFirstPauseEvent(event: IProtocolCommand): any {
let params: any = event.params;
if (params.reason && params.reason === "other") {
this.firstStop = false;
params.reason = "Break on start";
}
return params;
}
private handleDebuggerDisconnect() {
this.firstStop = true;
}
}microsoft/vscode-react-native
Publicmirrored fromhttps://github.com/microsoft/vscode-react-nativeAvailable
src/cdp-proxy/CDPMessageHandlers/rnCDPMessageHandler.ts
60lines · modepreview