@teardown/cli 1.2.28 → 1.2.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/modules/dev/dev-menu/keyboard-handler.d.ts +1 -0
- package/dist/modules/dev/dev-menu/keyboard-handler.js +9 -1
- package/dist/modules/dev/dev-server/cdp/index.d.ts +2 -0
- package/dist/modules/dev/dev-server/cdp/index.js +18 -0
- package/dist/modules/dev/dev-server/cdp/types.d.ts +107 -0
- package/dist/modules/dev/dev-server/cdp/types.js +2 -0
- package/dist/modules/dev/dev-server/dev-server.d.ts +2 -0
- package/dist/modules/dev/dev-server/dev-server.js +48 -25
- package/dist/modules/dev/dev-server/inspector/device.d.ts +46 -0
- package/dist/modules/dev/dev-server/inspector/device.event-reporter.d.ts +37 -0
- package/dist/modules/dev/dev-server/inspector/device.event-reporter.js +165 -0
- package/dist/modules/dev/dev-server/inspector/device.js +577 -0
- package/dist/modules/dev/dev-server/inspector/inspector.d.ts +27 -0
- package/dist/modules/dev/dev-server/inspector/inspector.js +205 -0
- package/dist/modules/dev/dev-server/inspector/types.d.ts +156 -0
- package/dist/modules/dev/dev-server/inspector/types.js +2 -0
- package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.d.ts +14 -0
- package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.js +61 -0
- package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.d.ts +19 -0
- package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.js +64 -0
- package/dist/modules/dev/dev-server/plugins/favicon.plugin.js +1 -2
- package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.d.ts +3 -0
- package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.js +7 -1
- package/dist/modules/dev/terminal/terminal.reporter.d.ts +3 -1
- package/dist/modules/dev/terminal/terminal.reporter.js +3 -0
- package/package.json +4 -4
|
@@ -101,11 +101,19 @@ class KeyboardHandlerManager {
|
|
|
101
101
|
process.emit("SIGINT");
|
|
102
102
|
process.exit();
|
|
103
103
|
}
|
|
104
|
+
isRawModeSupported() {
|
|
105
|
+
return process.stdin instanceof node_tty_1.ReadStream;
|
|
106
|
+
}
|
|
104
107
|
setRawMode(enable) {
|
|
105
|
-
|
|
108
|
+
if (!this.isRawModeSupported()) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
106
111
|
process.stdin.setRawMode(enable);
|
|
107
112
|
}
|
|
108
113
|
printAvailableCommands() {
|
|
114
|
+
if (!this.isRawModeSupported()) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
109
117
|
this.devServer.terminalReporter.update({
|
|
110
118
|
type: "client_log",
|
|
111
119
|
level: "info",
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./cdp.adapter"), exports);
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { JSONSerializable } from "../inspector/types";
|
|
2
|
+
type integer = number;
|
|
3
|
+
export interface Debugger {
|
|
4
|
+
GetScriptSourceParams: {
|
|
5
|
+
/**
|
|
6
|
+
* Id of the script to get source for.
|
|
7
|
+
*/
|
|
8
|
+
scriptId: string;
|
|
9
|
+
};
|
|
10
|
+
GetScriptSourceResult: {
|
|
11
|
+
/**
|
|
12
|
+
* Script source (empty in case of Wasm bytecode).
|
|
13
|
+
*/
|
|
14
|
+
scriptSource: string;
|
|
15
|
+
/**
|
|
16
|
+
* Wasm bytecode. (Encoded as a base64 string when passed over JSON)
|
|
17
|
+
*/
|
|
18
|
+
bytecode?: string;
|
|
19
|
+
};
|
|
20
|
+
SetBreakpointByUrlParams: {
|
|
21
|
+
/**
|
|
22
|
+
* Line number to set breakpoint at.
|
|
23
|
+
*/
|
|
24
|
+
lineNumber: integer;
|
|
25
|
+
/**
|
|
26
|
+
* URL of the resources to set breakpoint on.
|
|
27
|
+
*/
|
|
28
|
+
url?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Regex pattern for the URLs of the resources to set breakpoints on. Either `url` or
|
|
31
|
+
* `urlRegex` must be specified.
|
|
32
|
+
*/
|
|
33
|
+
urlRegex?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Script hash of the resources to set breakpoint on.
|
|
36
|
+
*/
|
|
37
|
+
scriptHash?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Offset in the line to set breakpoint at.
|
|
40
|
+
*/
|
|
41
|
+
columnNumber?: integer;
|
|
42
|
+
/**
|
|
43
|
+
* Expression to use as a breakpoint condition. When specified, debugger will only stop on the
|
|
44
|
+
* breakpoint if this expression evaluates to true.
|
|
45
|
+
*/
|
|
46
|
+
condition?: string;
|
|
47
|
+
};
|
|
48
|
+
ScriptParsedEvent: {
|
|
49
|
+
/**
|
|
50
|
+
* Identifier of the script parsed.
|
|
51
|
+
*/
|
|
52
|
+
scriptId: string;
|
|
53
|
+
/**
|
|
54
|
+
* URL or name of the script parsed (if any).
|
|
55
|
+
*/
|
|
56
|
+
url: string;
|
|
57
|
+
/**
|
|
58
|
+
* URL of source map associated with script (if any).
|
|
59
|
+
*/
|
|
60
|
+
sourceMapURL: string;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export type Events = {
|
|
64
|
+
"Debugger.scriptParsed": Debugger["ScriptParsedEvent"];
|
|
65
|
+
[method: string]: JSONSerializable;
|
|
66
|
+
};
|
|
67
|
+
export type Commands = {
|
|
68
|
+
"Debugger.getScriptSource": {
|
|
69
|
+
paramsType: Debugger["GetScriptSourceParams"];
|
|
70
|
+
resultType: Debugger["GetScriptSourceResult"];
|
|
71
|
+
};
|
|
72
|
+
"Debugger.setBreakpointByUrl": {
|
|
73
|
+
paramsType: Debugger["SetBreakpointByUrlParams"];
|
|
74
|
+
resultType: null;
|
|
75
|
+
};
|
|
76
|
+
[method: string]: {
|
|
77
|
+
paramsType: JSONSerializable;
|
|
78
|
+
resultType: JSONSerializable;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
export type CDPEvent<TEvent extends keyof Events = "unknown"> = {
|
|
82
|
+
method: TEvent;
|
|
83
|
+
params: Events[TEvent];
|
|
84
|
+
};
|
|
85
|
+
export type CDPRequest<TCommand extends keyof Commands = "unknown"> = {
|
|
86
|
+
method: TCommand;
|
|
87
|
+
params: Commands[TCommand]["paramsType"];
|
|
88
|
+
id: number;
|
|
89
|
+
};
|
|
90
|
+
export type CDPResponse<TCommand extends keyof Commands = "unknown"> = {
|
|
91
|
+
result: Commands[TCommand]["resultType"];
|
|
92
|
+
id: number;
|
|
93
|
+
} | {
|
|
94
|
+
error: CDPRequestError;
|
|
95
|
+
id: number;
|
|
96
|
+
};
|
|
97
|
+
export type CDPRequestError = {
|
|
98
|
+
code: number;
|
|
99
|
+
message: string;
|
|
100
|
+
data?: JSONSerializable;
|
|
101
|
+
};
|
|
102
|
+
export type CDPClientMessage = CDPRequest<"Debugger.getScriptSource"> | CDPRequest<"Debugger.scriptParsed"> | CDPRequest<"Debugger.setBreakpointByUrl"> | CDPRequest<never>;
|
|
103
|
+
export type CDPServerMessage = {
|
|
104
|
+
method: string;
|
|
105
|
+
params: any;
|
|
106
|
+
} & (CDPEvent<"Debugger.scriptParsed"> | CDPEvent<never> | CDPResponse<"Debugger.getScriptSource"> | CDPResponse<never>);
|
|
107
|
+
export {};
|
|
@@ -5,6 +5,7 @@ import { TeardownTerminalReporter } from "../terminal/terminal.reporter";
|
|
|
5
5
|
import { WebSocketApiServer } from "./plugins/wss/servers/web-socket-api.server";
|
|
6
6
|
import { WebSocketEventsServer } from "./plugins/wss/servers/web-socket-events.server";
|
|
7
7
|
import { WebSocketMessageServer } from "./plugins/wss/servers/web-socket-message.server";
|
|
8
|
+
import { Inspector } from "./inspector/inspector";
|
|
8
9
|
export type DevServerOptions = {
|
|
9
10
|
projectRoot: string;
|
|
10
11
|
host: string;
|
|
@@ -24,6 +25,7 @@ export declare class DevServer {
|
|
|
24
25
|
messageServer: WebSocketMessageServer;
|
|
25
26
|
eventsServer: WebSocketEventsServer;
|
|
26
27
|
keyboardHandler: KeyboardHandlerManager;
|
|
28
|
+
inspector: Inspector;
|
|
27
29
|
constructor(config: DevServerOptions);
|
|
28
30
|
onWrite(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): Promise<void>;
|
|
29
31
|
getDevServerUrl(): string;
|
|
@@ -10,21 +10,22 @@ const cors_1 = __importDefault(require("@fastify/cors"));
|
|
|
10
10
|
const middie_1 = __importDefault(require("@fastify/middie"));
|
|
11
11
|
const sensible_1 = __importDefault(require("@fastify/sensible"));
|
|
12
12
|
const cli_server_api_1 = require("@react-native-community/cli-server-api");
|
|
13
|
-
const dev_middleware_1 = require("@react-native/dev-middleware");
|
|
14
|
-
const node_stream_1 = require("node:stream");
|
|
15
13
|
const metro_config_1 = require("@react-native/metro-config");
|
|
16
14
|
const fastify_1 = __importDefault(require("fastify"));
|
|
17
15
|
const metro_1 = __importDefault(require("metro"));
|
|
16
|
+
const node_stream_1 = require("node:stream");
|
|
18
17
|
const keyboard_handler_1 = require("../dev-menu/keyboard-handler");
|
|
19
18
|
const terminal_reporter_1 = require("../terminal/terminal.reporter");
|
|
20
19
|
const devtools_plugin_1 = require("./plugins/devtools.plugin");
|
|
20
|
+
const favicon_plugin_1 = require("./plugins/favicon.plugin");
|
|
21
21
|
const multipart_plugin_1 = require("./plugins/multipart.plugin");
|
|
22
|
-
const sybmolicate_plugin_1 = require("./sybmolicate/sybmolicate.plugin");
|
|
23
22
|
const systrace_plugin_1 = require("./plugins/systrace.plugin");
|
|
24
23
|
const wss_1 = require("./plugins/wss");
|
|
25
24
|
const web_socket_api_server_1 = require("./plugins/wss/servers/web-socket-api.server");
|
|
26
25
|
const web_socket_events_server_1 = require("./plugins/wss/servers/web-socket-events.server");
|
|
27
26
|
const web_socket_message_server_1 = require("./plugins/wss/servers/web-socket-message.server");
|
|
27
|
+
const sybmolicate_plugin_1 = require("./sybmolicate/sybmolicate.plugin");
|
|
28
|
+
const inspector_1 = require("./inspector/inspector");
|
|
28
29
|
class DevServer {
|
|
29
30
|
config;
|
|
30
31
|
terminalReporter;
|
|
@@ -34,6 +35,7 @@ class DevServer {
|
|
|
34
35
|
messageServer;
|
|
35
36
|
eventsServer;
|
|
36
37
|
keyboardHandler;
|
|
38
|
+
inspector;
|
|
37
39
|
constructor(config) {
|
|
38
40
|
this.config = config;
|
|
39
41
|
this.terminalReporter = new terminal_reporter_1.TeardownTerminalReporter(this);
|
|
@@ -54,6 +56,11 @@ class DevServer {
|
|
|
54
56
|
webSocketMessageServer: this.messageServer,
|
|
55
57
|
});
|
|
56
58
|
this.keyboardHandler = new keyboard_handler_1.KeyboardHandlerManager(this);
|
|
59
|
+
this.inspector = new inspector_1.Inspector({
|
|
60
|
+
projectRoot: this.config.projectRoot,
|
|
61
|
+
serverBaseUrl: this.getDevServerUrl(),
|
|
62
|
+
// eventReporter: this.terminalReporter,
|
|
63
|
+
});
|
|
57
64
|
}
|
|
58
65
|
async onWrite(chunk, encoding, callback) {
|
|
59
66
|
if (chunk == null) {
|
|
@@ -123,22 +130,38 @@ class DevServer {
|
|
|
123
130
|
watch: true,
|
|
124
131
|
onBundleBuilt: this.onBundleBuilt.bind(this),
|
|
125
132
|
});
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
const websockets = this.inspector.createWebSocketServers();
|
|
134
|
+
// const devMiddleware = createDevMiddleware({
|
|
135
|
+
// projectRoot: this.config.projectRoot,
|
|
136
|
+
// serverBaseUrl: `http://${this.config.host}:${this.config.port}`,
|
|
137
|
+
// logger: this.instance.log,
|
|
138
|
+
// unstable_customInspectorMessageHandler:
|
|
139
|
+
// this.customInspectorMessageHandler.bind(this),
|
|
140
|
+
// unstable_experiments: {
|
|
141
|
+
// enableNetworkInspector: true,
|
|
142
|
+
// },
|
|
143
|
+
// });
|
|
144
|
+
// const debuggerConnectionServer = new DebuggerConnectionServer({
|
|
145
|
+
// devices: this.devices,
|
|
146
|
+
// eventReporter: this.eventReporter,
|
|
147
|
+
// startHeartbeat: this.startHeartbeat,
|
|
148
|
+
// });
|
|
149
|
+
// const deviceConnectionServer = new DeviceConnectionServer(this.instance);
|
|
135
150
|
await this.instance.register(cors_1.default, {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
151
|
+
origin: "*",
|
|
152
|
+
// "localhost",
|
|
153
|
+
// "localhost:8081",
|
|
154
|
+
// "127.0.0.1",
|
|
155
|
+
// "127.0.0.1:8081",
|
|
156
|
+
// /localhost:\d+/,
|
|
157
|
+
// /127\.0\.0\.1:\d+/,
|
|
158
|
+
// ],
|
|
159
|
+
// methods: ["GET", "PUT", "POST", "DELETE", "OPTIONS"],
|
|
160
|
+
// allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
|
|
161
|
+
// credentials: true,
|
|
162
|
+
// maxAge: 86400,
|
|
163
|
+
// preflight: true,
|
|
164
|
+
preflightContinue: true,
|
|
142
165
|
});
|
|
143
166
|
await this.instance.register(compress_1.default);
|
|
144
167
|
await this.instance.register(sensible_1.default);
|
|
@@ -151,9 +174,9 @@ class DevServer {
|
|
|
151
174
|
eventsServer: this.eventsServer,
|
|
152
175
|
apiServer: this.apiServer,
|
|
153
176
|
endpoints: {
|
|
154
|
-
"/inspector/debug":
|
|
155
|
-
"/inspector/device":
|
|
156
|
-
"/inspector/network":
|
|
177
|
+
"/inspector/debug": websockets["/inspector/debug"],
|
|
178
|
+
"/inspector/device": websockets["/inspector/device"],
|
|
179
|
+
"/inspector/network": websockets["/inspector/debug"],
|
|
157
180
|
},
|
|
158
181
|
});
|
|
159
182
|
await this.instance.register(multipart_plugin_1.multipartPlugin);
|
|
@@ -166,14 +189,14 @@ class DevServer {
|
|
|
166
189
|
onSymbolicate: this.onSymbolicate.bind(this),
|
|
167
190
|
});
|
|
168
191
|
await this.instance.register(systrace_plugin_1.systracePlugin);
|
|
169
|
-
|
|
192
|
+
await this.instance.register(favicon_plugin_1.faviconPlugin);
|
|
170
193
|
// Register middleware
|
|
171
194
|
this.instance.use("/open-url", cli_server_api_1.openURLMiddleware);
|
|
172
195
|
this.instance.use("/open-stack-frame", (0, cli_server_api_1.openStackFrameInEditorMiddleware)({
|
|
173
196
|
watchFolders: [this.config.projectRoot],
|
|
174
197
|
}));
|
|
175
198
|
this.instance.use(serverInstance.metroServer.processRequest);
|
|
176
|
-
this.instance.use(
|
|
199
|
+
this.instance.use(inspector.handleHttpRequest);
|
|
177
200
|
}
|
|
178
201
|
onSymbolicate(request, reply) {
|
|
179
202
|
const result = JSON.parse(request.rawBody);
|
|
@@ -190,18 +213,18 @@ class DevServer {
|
|
|
190
213
|
};
|
|
191
214
|
}
|
|
192
215
|
onDeviceMessage(connection, message) {
|
|
193
|
-
console.log("onDeviceMessage", message);
|
|
194
216
|
this.instance.log.info("Device -> Debugger", {
|
|
195
217
|
message,
|
|
196
218
|
});
|
|
197
219
|
connection.debugger.sendMessage(message);
|
|
220
|
+
return true;
|
|
198
221
|
}
|
|
199
222
|
onDebuggerMessage(connection, message) {
|
|
200
|
-
console.log("onDebuggerMessage", message);
|
|
201
223
|
this.instance.log.info("Debugger -> Device", {
|
|
202
224
|
message,
|
|
203
225
|
});
|
|
204
226
|
connection.device.sendMessage(message);
|
|
227
|
+
return true;
|
|
205
228
|
}
|
|
206
229
|
registerHooks() {
|
|
207
230
|
this.instance.log.info("Registering hooks");
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import WS from "ws";
|
|
2
|
+
import type { EventReporter, Page } from "./types";
|
|
3
|
+
export declare class Device {
|
|
4
|
+
private id;
|
|
5
|
+
private name;
|
|
6
|
+
private app;
|
|
7
|
+
private messageFromDeviceQueue;
|
|
8
|
+
private deviceSocket;
|
|
9
|
+
private pages;
|
|
10
|
+
private debuggerConnection;
|
|
11
|
+
private lastConnectedLegacyReactNativePage;
|
|
12
|
+
private isLegacyPageReloading;
|
|
13
|
+
private lastGetPagesMessage;
|
|
14
|
+
private scriptIdToSourcePathMapping;
|
|
15
|
+
private projectRoot;
|
|
16
|
+
private deviceEventReporter;
|
|
17
|
+
private pagesPollingIntervalId;
|
|
18
|
+
private createCustomMessageHandler;
|
|
19
|
+
private connectedPageIds;
|
|
20
|
+
constructor(id: string, name: string, app: string, socket: WS, projectRoot: string, eventReporter?: EventReporter);
|
|
21
|
+
private terminateDebuggerConnection;
|
|
22
|
+
dangerouslyRecreateDevice(id: string, name: string, app: string, socket: WS, projectRoot: string, eventReporter?: EventReporter): void;
|
|
23
|
+
getName(): string;
|
|
24
|
+
getApp(): string;
|
|
25
|
+
getPagesList(): Page[];
|
|
26
|
+
handleDebuggerConnection(socket: WS, pageId: string, metadata: {
|
|
27
|
+
userAgent: string | null;
|
|
28
|
+
}): void;
|
|
29
|
+
private sendConnectEventToDevice;
|
|
30
|
+
private sendDisconnectEventToDevice;
|
|
31
|
+
private pageHasCapability;
|
|
32
|
+
private createSyntheticPage;
|
|
33
|
+
private handleMessageFromDevice;
|
|
34
|
+
private sendMessageToDevice;
|
|
35
|
+
private newLegacyReactNativePage;
|
|
36
|
+
private processMessageFromDeviceLegacy;
|
|
37
|
+
private interceptClientMessageForSourceFetching;
|
|
38
|
+
private processDebuggerSetBreakpointByUrl;
|
|
39
|
+
private processDebuggerGetScriptSource;
|
|
40
|
+
private mapToDevicePageId;
|
|
41
|
+
private tryParseHTTPURL;
|
|
42
|
+
private fetchText;
|
|
43
|
+
private sendErrorToDebugger;
|
|
44
|
+
private isPageFuseboxFrontend;
|
|
45
|
+
dangerouslyGetSocket(): WS;
|
|
46
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EventReporter } from "./types";
|
|
2
|
+
export type RequestMetadata = {
|
|
3
|
+
pageId: string | null;
|
|
4
|
+
frontendUserAgent: string | null;
|
|
5
|
+
prefersFuseboxFrontend: boolean | null;
|
|
6
|
+
};
|
|
7
|
+
export type ResponseMetadata = RequestMetadata;
|
|
8
|
+
export type DeviceMetadata = {
|
|
9
|
+
appId: string;
|
|
10
|
+
deviceId: string;
|
|
11
|
+
deviceName: string;
|
|
12
|
+
};
|
|
13
|
+
export declare class DeviceEventReporter {
|
|
14
|
+
private eventReporter;
|
|
15
|
+
private metadata;
|
|
16
|
+
private pendingCommands;
|
|
17
|
+
constructor(eventReporter: EventReporter, metadata: DeviceMetadata);
|
|
18
|
+
logRequest(req: {
|
|
19
|
+
id: number;
|
|
20
|
+
method: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}, origin: "debugger" | "proxy", metadata: RequestMetadata): void;
|
|
23
|
+
logResponse(res: {
|
|
24
|
+
id: number;
|
|
25
|
+
error?: {
|
|
26
|
+
message: string;
|
|
27
|
+
data?: unknown;
|
|
28
|
+
};
|
|
29
|
+
}, origin: "device" | "proxy", metadata: ResponseMetadata): void;
|
|
30
|
+
logConnection(connectedEntity: "debugger", metadata: {
|
|
31
|
+
pageId: string;
|
|
32
|
+
frontendUserAgent: string | null;
|
|
33
|
+
}): void;
|
|
34
|
+
logDisconnection(disconnectedEntity: "device" | "debugger"): void;
|
|
35
|
+
logProxyMessageHandlingError(messageOrigin: "device" | "debugger", error: Error, message: string): void;
|
|
36
|
+
private logExpiredCommand;
|
|
37
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.DeviceEventReporter = void 0;
|
|
7
|
+
const ttlcache_1 = __importDefault(require("@isaacs/ttlcache"));
|
|
8
|
+
class DeviceEventReporter {
|
|
9
|
+
eventReporter;
|
|
10
|
+
metadata;
|
|
11
|
+
pendingCommands;
|
|
12
|
+
constructor(eventReporter, metadata) {
|
|
13
|
+
this.eventReporter = eventReporter;
|
|
14
|
+
this.metadata = metadata;
|
|
15
|
+
this.pendingCommands = new ttlcache_1.default({
|
|
16
|
+
ttl: 10000,
|
|
17
|
+
dispose: (command, id, reason) => {
|
|
18
|
+
if (reason === "delete" || reason === "set") {
|
|
19
|
+
// TODO: Report clobbering ('set') using a dedicated error code
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
this.logExpiredCommand(command);
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
logRequest(req, origin, metadata) {
|
|
27
|
+
this.pendingCommands.set(req.id, {
|
|
28
|
+
method: req.method,
|
|
29
|
+
requestOrigin: origin,
|
|
30
|
+
requestTime: Date.now(),
|
|
31
|
+
metadata,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
logResponse(res, origin, metadata) {
|
|
35
|
+
const pendingCommand = this.pendingCommands.get(res.id);
|
|
36
|
+
if (!pendingCommand) {
|
|
37
|
+
this.eventReporter.logEvent({
|
|
38
|
+
type: "debugger_command",
|
|
39
|
+
protocol: "CDP",
|
|
40
|
+
requestOrigin: null,
|
|
41
|
+
method: null,
|
|
42
|
+
status: "coded_error",
|
|
43
|
+
errorCode: "UNMATCHED_REQUEST_ID",
|
|
44
|
+
responseOrigin: origin,
|
|
45
|
+
timeSinceStart: null,
|
|
46
|
+
appId: this.metadata.appId,
|
|
47
|
+
deviceId: this.metadata.deviceId,
|
|
48
|
+
deviceName: this.metadata.deviceName,
|
|
49
|
+
pageId: metadata.pageId,
|
|
50
|
+
frontendUserAgent: metadata.frontendUserAgent,
|
|
51
|
+
prefersFuseboxFrontend: metadata.prefersFuseboxFrontend,
|
|
52
|
+
});
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const timeSinceStart = Date.now() - pendingCommand.requestTime;
|
|
56
|
+
this.pendingCommands.delete(res.id);
|
|
57
|
+
if (res.error) {
|
|
58
|
+
let message = res.error.message;
|
|
59
|
+
if ("data" in res.error) {
|
|
60
|
+
message += ` (${String(res.error.data)})`;
|
|
61
|
+
}
|
|
62
|
+
this.eventReporter.logEvent({
|
|
63
|
+
type: "debugger_command",
|
|
64
|
+
requestOrigin: pendingCommand.requestOrigin,
|
|
65
|
+
method: pendingCommand.method,
|
|
66
|
+
protocol: "CDP",
|
|
67
|
+
status: "coded_error",
|
|
68
|
+
errorCode: "PROTOCOL_ERROR",
|
|
69
|
+
errorDetails: message,
|
|
70
|
+
responseOrigin: origin,
|
|
71
|
+
timeSinceStart,
|
|
72
|
+
appId: this.metadata.appId,
|
|
73
|
+
deviceId: this.metadata.deviceId,
|
|
74
|
+
deviceName: this.metadata.deviceName,
|
|
75
|
+
pageId: pendingCommand.metadata.pageId,
|
|
76
|
+
frontendUserAgent: pendingCommand.metadata.frontendUserAgent,
|
|
77
|
+
prefersFuseboxFrontend: metadata.prefersFuseboxFrontend,
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.eventReporter.logEvent({
|
|
82
|
+
type: "debugger_command",
|
|
83
|
+
protocol: "CDP",
|
|
84
|
+
requestOrigin: pendingCommand.requestOrigin,
|
|
85
|
+
method: pendingCommand.method,
|
|
86
|
+
status: "success",
|
|
87
|
+
responseOrigin: origin,
|
|
88
|
+
timeSinceStart,
|
|
89
|
+
appId: this.metadata.appId,
|
|
90
|
+
deviceId: this.metadata.deviceId,
|
|
91
|
+
deviceName: this.metadata.deviceName,
|
|
92
|
+
pageId: pendingCommand.metadata.pageId,
|
|
93
|
+
frontendUserAgent: pendingCommand.metadata.frontendUserAgent,
|
|
94
|
+
prefersFuseboxFrontend: metadata.prefersFuseboxFrontend,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
logConnection(connectedEntity, metadata) {
|
|
98
|
+
this.eventReporter.logEvent({
|
|
99
|
+
type: "connect_debugger_frontend",
|
|
100
|
+
status: "success",
|
|
101
|
+
appId: this.metadata.appId,
|
|
102
|
+
deviceName: this.metadata.deviceName,
|
|
103
|
+
deviceId: this.metadata.deviceId,
|
|
104
|
+
pageId: metadata.pageId,
|
|
105
|
+
frontendUserAgent: metadata.frontendUserAgent,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
logDisconnection(disconnectedEntity) {
|
|
109
|
+
const errorCode = disconnectedEntity === "device"
|
|
110
|
+
? "DEVICE_DISCONNECTED"
|
|
111
|
+
: "DEBUGGER_DISCONNECTED";
|
|
112
|
+
for (const pendingCommand of this.pendingCommands.values()) {
|
|
113
|
+
this.eventReporter.logEvent({
|
|
114
|
+
type: "debugger_command",
|
|
115
|
+
protocol: "CDP",
|
|
116
|
+
requestOrigin: pendingCommand.requestOrigin,
|
|
117
|
+
method: pendingCommand.method,
|
|
118
|
+
status: "coded_error",
|
|
119
|
+
errorCode,
|
|
120
|
+
responseOrigin: "proxy",
|
|
121
|
+
timeSinceStart: Date.now() - pendingCommand.requestTime,
|
|
122
|
+
appId: this.metadata.appId,
|
|
123
|
+
deviceId: this.metadata.deviceId,
|
|
124
|
+
deviceName: this.metadata.deviceName,
|
|
125
|
+
pageId: pendingCommand.metadata.pageId,
|
|
126
|
+
frontendUserAgent: pendingCommand.metadata.frontendUserAgent,
|
|
127
|
+
prefersFuseboxFrontend: pendingCommand.metadata.prefersFuseboxFrontend,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
this.pendingCommands.clear();
|
|
131
|
+
}
|
|
132
|
+
logProxyMessageHandlingError(messageOrigin, error, message) {
|
|
133
|
+
this.eventReporter.logEvent({
|
|
134
|
+
type: "proxy_error",
|
|
135
|
+
status: "error",
|
|
136
|
+
messageOrigin,
|
|
137
|
+
message,
|
|
138
|
+
error: error.message,
|
|
139
|
+
errorStack: error.stack ?? "",
|
|
140
|
+
appId: this.metadata.appId,
|
|
141
|
+
deviceId: this.metadata.deviceId,
|
|
142
|
+
deviceName: this.metadata.deviceName,
|
|
143
|
+
pageId: null,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
logExpiredCommand(pendingCommand) {
|
|
147
|
+
this.eventReporter.logEvent({
|
|
148
|
+
type: "debugger_command",
|
|
149
|
+
protocol: "CDP",
|
|
150
|
+
requestOrigin: pendingCommand.requestOrigin,
|
|
151
|
+
method: pendingCommand.method,
|
|
152
|
+
status: "coded_error",
|
|
153
|
+
errorCode: "TIMED_OUT",
|
|
154
|
+
responseOrigin: "proxy",
|
|
155
|
+
timeSinceStart: Date.now() - pendingCommand.requestTime,
|
|
156
|
+
appId: this.metadata.appId,
|
|
157
|
+
deviceId: this.metadata.deviceId,
|
|
158
|
+
deviceName: this.metadata.deviceName,
|
|
159
|
+
pageId: pendingCommand.metadata.pageId,
|
|
160
|
+
frontendUserAgent: pendingCommand.metadata.frontendUserAgent,
|
|
161
|
+
prefersFuseboxFrontend: pendingCommand.metadata.prefersFuseboxFrontend,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.DeviceEventReporter = DeviceEventReporter;
|