@teardown/cli 1.2.27 → 1.2.29

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.
Files changed (25) hide show
  1. package/dist/modules/dev/dev-menu/keyboard-handler.d.ts +1 -0
  2. package/dist/modules/dev/dev-menu/keyboard-handler.js +9 -1
  3. package/dist/modules/dev/dev-server/cdp/index.d.ts +2 -0
  4. package/dist/modules/dev/dev-server/cdp/index.js +18 -0
  5. package/dist/modules/dev/dev-server/cdp/types.d.ts +107 -0
  6. package/dist/modules/dev/dev-server/cdp/types.js +2 -0
  7. package/dist/modules/dev/dev-server/dev-server.js +45 -23
  8. package/dist/modules/dev/dev-server/inspector/device.d.ts +46 -0
  9. package/dist/modules/dev/dev-server/inspector/device.event-reporter.d.ts +37 -0
  10. package/dist/modules/dev/dev-server/inspector/device.event-reporter.js +165 -0
  11. package/dist/modules/dev/dev-server/inspector/device.js +577 -0
  12. package/dist/modules/dev/dev-server/inspector/inspector.d.ts +27 -0
  13. package/dist/modules/dev/dev-server/inspector/inspector.js +203 -0
  14. package/dist/modules/dev/dev-server/inspector/types.d.ts +156 -0
  15. package/dist/modules/dev/dev-server/inspector/types.js +2 -0
  16. package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.d.ts +14 -0
  17. package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.js +61 -0
  18. package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.d.ts +19 -0
  19. package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.js +64 -0
  20. package/dist/modules/dev/dev-server/plugins/favicon.plugin.js +1 -2
  21. package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.d.ts +3 -0
  22. package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.js +7 -1
  23. package/dist/modules/dev/terminal/terminal.reporter.d.ts +3 -1
  24. package/dist/modules/dev/terminal/terminal.reporter.js +3 -0
  25. package/package.json +4 -4
@@ -15,6 +15,7 @@ export declare class KeyboardHandlerManager {
15
15
  private handleDevMenu;
16
16
  private handleOpenDebugger;
17
17
  private handleExit;
18
+ private isRawModeSupported;
18
19
  private setRawMode;
19
20
  private printAvailableCommands;
20
21
  }
@@ -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
- invariant(process.stdin instanceof node_tty_1.ReadStream, "process.stdin must be a readable stream to modify raw mode");
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,2 @@
1
+ export * from "./cdp.adapter";
2
+ export * from "./types";
@@ -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 {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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;
@@ -123,22 +124,43 @@ class DevServer {
123
124
  watch: true,
124
125
  onBundleBuilt: this.onBundleBuilt.bind(this),
125
126
  });
126
- const devMiddleware = (0, dev_middleware_1.createDevMiddleware)({
127
+ const inspector = new inspector_1.Inspector({
127
128
  projectRoot: this.config.projectRoot,
128
- serverBaseUrl: `http://${this.config.host}:${this.config.port}`,
129
- logger: this.instance.log,
130
- unstable_customInspectorMessageHandler: this.customInspectorMessageHandler.bind(this),
131
- unstable_experiments: {
132
- enableNetworkInspector: true,
133
- },
129
+ serverBaseUrl: this.getDevServerUrl(),
130
+ // eventReporter: this.terminalReporter,
134
131
  });
132
+ const websockets = inspector.createWebSocketServers();
133
+ // const devMiddleware = createDevMiddleware({
134
+ // projectRoot: this.config.projectRoot,
135
+ // serverBaseUrl: `http://${this.config.host}:${this.config.port}`,
136
+ // logger: this.instance.log,
137
+ // unstable_customInspectorMessageHandler:
138
+ // this.customInspectorMessageHandler.bind(this),
139
+ // unstable_experiments: {
140
+ // enableNetworkInspector: true,
141
+ // },
142
+ // });
143
+ // const debuggerConnectionServer = new DebuggerConnectionServer({
144
+ // devices: this.devices,
145
+ // eventReporter: this.eventReporter,
146
+ // startHeartbeat: this.startHeartbeat,
147
+ // });
148
+ // const deviceConnectionServer = new DeviceConnectionServer(this.instance);
135
149
  await this.instance.register(cors_1.default, {
136
- // hook: "preHandler",
137
- // origin: ["localhost:1420", "127.0.0.1:1420"],
138
- // allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
139
- // credentials: true,
140
- // maxAge: 86400,
141
- // preflightContinue: false,
150
+ origin: "*",
151
+ // "localhost",
152
+ // "localhost:8081",
153
+ // "127.0.0.1",
154
+ // "127.0.0.1:8081",
155
+ // /localhost:\d+/,
156
+ // /127\.0\.0\.1:\d+/,
157
+ // ],
158
+ // methods: ["GET", "PUT", "POST", "DELETE", "OPTIONS"],
159
+ // allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
160
+ // credentials: true,
161
+ // maxAge: 86400,
162
+ // preflight: true,
163
+ preflightContinue: true,
142
164
  });
143
165
  await this.instance.register(compress_1.default);
144
166
  await this.instance.register(sensible_1.default);
@@ -151,9 +173,9 @@ class DevServer {
151
173
  eventsServer: this.eventsServer,
152
174
  apiServer: this.apiServer,
153
175
  endpoints: {
154
- "/inspector/debug": devMiddleware.websocketEndpoints["/inspector/debug"],
155
- "/inspector/device": devMiddleware.websocketEndpoints["/inspector/device"],
156
- "/inspector/network": devMiddleware.websocketEndpoints["/inspector/debug"],
176
+ "/inspector/debug": websockets["/inspector/debug"],
177
+ "/inspector/device": websockets["/inspector/device"],
178
+ "/inspector/network": websockets["/inspector/debug"],
157
179
  },
158
180
  });
159
181
  await this.instance.register(multipart_plugin_1.multipartPlugin);
@@ -166,14 +188,14 @@ class DevServer {
166
188
  onSymbolicate: this.onSymbolicate.bind(this),
167
189
  });
168
190
  await this.instance.register(systrace_plugin_1.systracePlugin);
169
- // await this.instance.register(faviconPlugin);
191
+ await this.instance.register(favicon_plugin_1.faviconPlugin);
170
192
  // Register middleware
171
193
  this.instance.use("/open-url", cli_server_api_1.openURLMiddleware);
172
194
  this.instance.use("/open-stack-frame", (0, cli_server_api_1.openStackFrameInEditorMiddleware)({
173
195
  watchFolders: [this.config.projectRoot],
174
196
  }));
175
197
  this.instance.use(serverInstance.metroServer.processRequest);
176
- this.instance.use(devMiddleware.middleware);
198
+ this.instance.use(inspector.handleHttpRequest);
177
199
  }
178
200
  onSymbolicate(request, reply) {
179
201
  const result = JSON.parse(request.rawBody);
@@ -190,18 +212,18 @@ class DevServer {
190
212
  };
191
213
  }
192
214
  onDeviceMessage(connection, message) {
193
- console.log("onDeviceMessage", message);
194
215
  this.instance.log.info("Device -> Debugger", {
195
216
  message,
196
217
  });
197
218
  connection.debugger.sendMessage(message);
219
+ return true;
198
220
  }
199
221
  onDebuggerMessage(connection, message) {
200
- console.log("onDebuggerMessage", message);
201
222
  this.instance.log.info("Debugger -> Device", {
202
223
  message,
203
224
  });
204
225
  connection.device.sendMessage(message);
226
+ return true;
205
227
  }
206
228
  registerHooks() {
207
229
  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;