@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.
Files changed (26) 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.d.ts +2 -0
  8. package/dist/modules/dev/dev-server/dev-server.js +48 -25
  9. package/dist/modules/dev/dev-server/inspector/device.d.ts +46 -0
  10. package/dist/modules/dev/dev-server/inspector/device.event-reporter.d.ts +37 -0
  11. package/dist/modules/dev/dev-server/inspector/device.event-reporter.js +165 -0
  12. package/dist/modules/dev/dev-server/inspector/device.js +577 -0
  13. package/dist/modules/dev/dev-server/inspector/inspector.d.ts +27 -0
  14. package/dist/modules/dev/dev-server/inspector/inspector.js +205 -0
  15. package/dist/modules/dev/dev-server/inspector/types.d.ts +156 -0
  16. package/dist/modules/dev/dev-server/inspector/types.js +2 -0
  17. package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.d.ts +14 -0
  18. package/dist/modules/dev/dev-server/inspector/wss/servers/debugger-connection.server.js +61 -0
  19. package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.d.ts +19 -0
  20. package/dist/modules/dev/dev-server/inspector/wss/servers/device-connection.server.js +64 -0
  21. package/dist/modules/dev/dev-server/plugins/favicon.plugin.js +1 -2
  22. package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.d.ts +3 -0
  23. package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.js +7 -1
  24. package/dist/modules/dev/terminal/terminal.reporter.d.ts +3 -1
  25. package/dist/modules/dev/terminal/terminal.reporter.js +3 -0
  26. 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 });
@@ -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 devMiddleware = (0, dev_middleware_1.createDevMiddleware)({
127
- 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
- },
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
- // 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,
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": devMiddleware.websocketEndpoints["/inspector/debug"],
155
- "/inspector/device": devMiddleware.websocketEndpoints["/inspector/device"],
156
- "/inspector/network": devMiddleware.websocketEndpoints["/inspector/debug"],
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
- // await this.instance.register(faviconPlugin);
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(devMiddleware.middleware);
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;