microsoft/vscode-react-native

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
b7451aef6bd5846d7333cd23872aaadd1d57136c

Branches

Tags

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

Clone

HTTPS

Download ZIP

src/cdp-proxy/reactNativeCDPProxy.ts

147lines · modeblame

f872f4d5RedMickey6 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 {
5Connection,
6Server,
7WebSocketTransport,
8IProtocolCommand,
9IProtocolError,
10IProtocolSuccess
11} from "vscode-cdp-proxy";
af1b9666RedMickey6 years ago12import { IncomingMessage } from "http";
f872f4d5RedMickey6 years ago13import { OutputChannelLogger } from "../extension/log/OutputChannelLogger";
a324603aRedMickey6 years ago14import { LogLevel } from "../extension/log/LogHelper";
d9c9ddcbRedMickey6 years ago15import { DebuggerEndpointHelper } from "./debuggerEndpointHelper";
a6562589RedMickey6 years ago16import { ICDPMessageHandler } from "./CDPMessageHandlers/ICDPMessageHandler";
f872f4d5RedMickey6 years ago17
18export class ReactNativeCDPProxy {
19
a324603aRedMickey6 years ago20private readonly PROXY_LOG_TAGS = {
21DEBUGGER_COMMAND: "Command Debugger To Target",
22APPLICATION_COMMAND: "Command Target To Debugger",
23DEBUGGER_REPLY: "Reply From Debugger To Target",
24APPLICATION_REPLY: "Reply From Target To Debugger",
25};
26
d9c9ddcbRedMickey6 years ago27private server: Server | null;
28private hostAddress: string;
29private port: number;
30private debuggerTarget: Connection;
31private applicationTarget: Connection;
32private logger: OutputChannelLogger;
33private logLevel: LogLevel;
34private debuggerEndpointHelper: DebuggerEndpointHelper;
a6562589RedMickey6 years ago35private CDPMessageHandler: ICDPMessageHandler;
d9c9ddcbRedMickey6 years ago36private applicationTargetPort: number;
37
a6562589RedMickey6 years ago38constructor(hostAddress: string, port: number, logLevel: LogLevel = LogLevel.None) {
f872f4d5RedMickey6 years ago39this.port = port;
40this.hostAddress = hostAddress;
a324603aRedMickey6 years ago41this.logger = OutputChannelLogger.getChannel("React Native Chrome Proxy", true, false, true);
f872f4d5RedMickey6 years ago42this.logLevel = logLevel;
d9c9ddcbRedMickey6 years ago43this.debuggerEndpointHelper = new DebuggerEndpointHelper();
f872f4d5RedMickey6 years ago44}
45
a6562589RedMickey6 years ago46public initializeServer(CDPMessageHandler: ICDPMessageHandler, logLevel: LogLevel): Promise<void> {
47this.logLevel = logLevel;
48this.CDPMessageHandler = CDPMessageHandler;
49
f872f4d5RedMickey6 years ago50return Server.create({ port: this.port, host: this.hostAddress })
51.then((server: Server) => {
52this.server = server;
53this.server.onConnection(this.onConnectionHandler.bind(this));
54});
55}
56
57public stopServer(): void {
58if (this.server) {
59this.server.dispose();
60this.server = null;
61}
62}
63
d9c9ddcbRedMickey6 years ago64public setApplicationTargetPort(applicationTargetPort: number): void {
65this.applicationTargetPort = applicationTargetPort;
f872f4d5RedMickey6 years ago66}
67
68private async onConnectionHandler([debuggerTarget, request]: [Connection, IncomingMessage]): Promise<void> {
69this.debuggerTarget = debuggerTarget;
70
71this.debuggerTarget.pause(); // don't listen for events until the target is ready
72
b7451aefRedMickey6 years ago73const browserInspectUri = await this.debuggerEndpointHelper.retryGetWSEndpoint(`http://localhost:${this.applicationTargetPort}`, 100);
d9c9ddcbRedMickey6 years ago74
f872f4d5RedMickey6 years ago75this.applicationTarget = new Connection(await WebSocketTransport.create(browserInspectUri));
76
77this.applicationTarget.onError(this.onApplicationTargetError.bind(this));
78this.debuggerTarget.onError(this.onDebuggerTargetError.bind(this));
79
80this.applicationTarget.onCommand(this.handleApplicationTargetCommand.bind(this));
81this.debuggerTarget.onCommand(this.handleDebuggerTargetCommand.bind(this));
82
83this.applicationTarget.onReply(this.handleApplicationTargetReply.bind(this));
84this.debuggerTarget.onReply(this.handleDebuggerTargetReply.bind(this));
85
4c757eebRedMickey6 years ago86this.debuggerTarget.onEnd(this.onDebuggerTargetClosed.bind(this));
af1b9666RedMickey6 years ago87
f872f4d5RedMickey6 years ago88// dequeue any messages we got in the meantime
89this.debuggerTarget.unpause();
90}
91
b7451aefRedMickey6 years ago92private handleDebuggerTargetCommand(event: IProtocolCommand) {
93this.logger.logWithCustomTag(this.PROXY_LOG_TAGS.DEBUGGER_COMMAND, JSON.stringify(event, null , 2), this.logLevel);
94const processedMessage = this.CDPMessageHandler.processDebuggerCDPMessage(event);
95
96if (processedMessage.sendBack) {
97this.debuggerTarget.send(processedMessage.event);
98} else {
99this.applicationTarget.send(processedMessage.event);
100}
f872f4d5RedMickey6 years ago101}
102
b7451aefRedMickey6 years ago103private handleApplicationTargetCommand(event: IProtocolCommand) {
104this.logger.logWithCustomTag(this.PROXY_LOG_TAGS.APPLICATION_COMMAND, JSON.stringify(event, null , 2), this.logLevel);
105const processedMessage = this.CDPMessageHandler.processApplicationCDPMessage(event);
106
107if (processedMessage.sendBack) {
108this.applicationTarget.send(processedMessage.event);
109} else {
110this.debuggerTarget.send(processedMessage.event);
111}
f872f4d5RedMickey6 years ago112}
113
b7451aefRedMickey6 years ago114private handleDebuggerTargetReply(event: IProtocolError | IProtocolSuccess) {
115this.logger.logWithCustomTag(this.PROXY_LOG_TAGS.DEBUGGER_REPLY, JSON.stringify(event, null , 2), this.logLevel);
116const processedMessage = this.CDPMessageHandler.processDebuggerCDPMessage(event);
117
118if (processedMessage.sendBack) {
119this.debuggerTarget.send(processedMessage.event);
120} else {
121this.applicationTarget.send(processedMessage.event);
122}
f872f4d5RedMickey6 years ago123}
124
b7451aefRedMickey6 years ago125private handleApplicationTargetReply(event: IProtocolError | IProtocolSuccess) {
126this.logger.logWithCustomTag(this.PROXY_LOG_TAGS.APPLICATION_REPLY, JSON.stringify(event, null , 2), this.logLevel);
127const processedMessage = this.CDPMessageHandler.processApplicationCDPMessage(event);
128
129if (processedMessage.sendBack) {
130this.applicationTarget.send(processedMessage.event);
131} else {
132this.debuggerTarget.send(processedMessage.event);
133}
f872f4d5RedMickey6 years ago134}
135
136private onDebuggerTargetError(err: Error) {
a324603aRedMickey6 years ago137this.logger.error("Error on debugger transport", err);
f872f4d5RedMickey6 years ago138}
139
140private onApplicationTargetError(err: Error) {
a324603aRedMickey6 years ago141this.logger.error("Error on application transport", err);
f872f4d5RedMickey6 years ago142}
143
4c757eebRedMickey6 years ago144private async onDebuggerTargetClosed() {
b7451aefRedMickey6 years ago145this.CDPMessageHandler.processDebuggerCDPMessage({method: "close"});
af1b9666RedMickey6 years ago146}
f872f4d5RedMickey6 years ago147}