@teardown/cli 1.2.26 → 1.2.27

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 (30) hide show
  1. package/dist/modules/dev/dev-menu/keyboard-handler.d.ts +1 -1
  2. package/dist/modules/dev/dev-menu/keyboard-handler.js +6 -2
  3. package/dist/modules/dev/dev-server/cdp/cdp.adapter.d.ts +6 -0
  4. package/dist/modules/dev/dev-server/cdp/cdp.adapter.js +12 -0
  5. package/dist/modules/dev/dev-server/dev-server.d.ts +9 -1
  6. package/dist/modules/dev/dev-server/dev-server.js +92 -38
  7. package/dist/modules/dev/dev-server/plugins/systrace.plugin.d.ts +1 -0
  8. package/dist/modules/dev/dev-server/plugins/systrace.plugin.js +28 -0
  9. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.d.ts +1 -1
  10. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-api.server.js +11 -6
  11. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.d.ts +1 -1
  12. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-events.server.js +11 -3
  13. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-hmr.server.js +11 -3
  14. package/dist/modules/dev/dev-server/plugins/wss/servers/web-socket-message.server.js +6 -1
  15. package/dist/modules/dev/dev-server/plugins/wss/web-socket-router.js +0 -2
  16. package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.d.ts +2 -1
  17. package/dist/modules/dev/dev-server/plugins/wss/wss.plugin.js +1 -3
  18. package/dist/modules/dev/dev-server/sybmolicate/sybmolicate.plugin.d.ts +11 -0
  19. package/dist/modules/dev/dev-server/{plugins/symbolicate/sybmolicatePlugin.js → sybmolicate/sybmolicate.plugin.js} +13 -7
  20. package/dist/modules/dev/terminal/terminal.reporter.js +3 -1
  21. package/package.json +7 -4
  22. package/dist/modules/dev/dev-server/plugins/symbolicate/index.d.ts +0 -2
  23. package/dist/modules/dev/dev-server/plugins/symbolicate/index.js +0 -18
  24. package/dist/modules/dev/dev-server/plugins/symbolicate/sybmolicatePlugin.d.ts +0 -1
  25. package/dist/modules/dev/dev-server/plugins/symbolicate/types.d.ts +0 -64
  26. package/dist/modules/dev/dev-server/plugins/symbolicate/types.js +0 -2
  27. package/dist/modules/dev/dev-server/types.d.ts +0 -27
  28. package/dist/modules/dev/dev-server/types.js +0 -17
  29. /package/dist/{commands/dev → modules/dev/dev-server/sybmolicate}/types.d.ts +0 -0
  30. /package/dist/{commands/dev → modules/dev/dev-server/sybmolicate}/types.js +0 -0
@@ -7,7 +7,7 @@ export declare class KeyboardHandlerManager {
7
7
  private readonly openDebuggerKeyboardHandler;
8
8
  private previousCallTimestamp;
9
9
  constructor(devServer: DevServer);
10
- initialize(): void;
10
+ initialize(): Promise<void>;
11
11
  private isTTYSupported;
12
12
  private setupKeyboardHandlers;
13
13
  private handleKeyPress;
@@ -23,7 +23,7 @@ class KeyboardHandlerManager {
23
23
  devServerUrl: this.devServer.getDevServerUrl(),
24
24
  });
25
25
  }
26
- initialize() {
26
+ async initialize() {
27
27
  if (!this.isTTYSupported()) {
28
28
  this.devServer.terminalReporter.update({
29
29
  type: "client_log",
@@ -111,9 +111,13 @@ class KeyboardHandlerManager {
111
111
  level: "info",
112
112
  data: [
113
113
  "Key commands available:",
114
+ "\n",
115
+ "\n",
114
116
  `${chalk_1.default.bold.inverse(" r ")} - reload app(s)`,
117
+ "\n",
115
118
  `${chalk_1.default.bold.inverse(" d ")} - open Dev Menu`,
116
- `${chalk_1.default.bold.inverse(" j ")} - open DevTools`,
119
+ // "\n",
120
+ // `${chalk.bold.inverse(" j ")} - open DevTools`,
117
121
  ],
118
122
  });
119
123
  }
@@ -0,0 +1,6 @@
1
+ import type { DevServer } from "../dev-server";
2
+ export declare class CDPAdapter {
3
+ private readonly instance;
4
+ constructor(instance: DevServer);
5
+ enable(): void;
6
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CDPAdapter = void 0;
4
+ // import type { DevServer } from "devtools-protocol";
5
+ class CDPAdapter {
6
+ instance;
7
+ constructor(instance) {
8
+ this.instance = instance;
9
+ }
10
+ enable() { }
11
+ }
12
+ exports.CDPAdapter = CDPAdapter;
@@ -1,9 +1,10 @@
1
1
  import { type FastifyInstance } from "fastify";
2
2
  import type { TerminalReportableEvent } from "metro/src/lib/TerminalReporter";
3
+ import { KeyboardHandlerManager } from "../dev-menu/keyboard-handler";
3
4
  import { TeardownTerminalReporter } from "../terminal/terminal.reporter";
5
+ import { WebSocketApiServer } from "./plugins/wss/servers/web-socket-api.server";
4
6
  import { WebSocketEventsServer } from "./plugins/wss/servers/web-socket-events.server";
5
7
  import { WebSocketMessageServer } from "./plugins/wss/servers/web-socket-message.server";
6
- import { KeyboardHandlerManager } from "../dev-menu/keyboard-handler";
7
8
  export type DevServerOptions = {
8
9
  projectRoot: string;
9
10
  host: string;
@@ -17,11 +18,14 @@ export type DevServerOptions = {
17
18
  export declare class DevServer {
18
19
  readonly config: DevServerOptions;
19
20
  terminalReporter: TeardownTerminalReporter;
21
+ private stream;
20
22
  private instance;
23
+ apiServer: WebSocketApiServer;
21
24
  messageServer: WebSocketMessageServer;
22
25
  eventsServer: WebSocketEventsServer;
23
26
  keyboardHandler: KeyboardHandlerManager;
24
27
  constructor(config: DevServerOptions);
28
+ onWrite(chunk: any, encoding: BufferEncoding, callback: (error?: Error | null) => void): Promise<void>;
25
29
  getDevServerUrl(): string;
26
30
  onInitializeDone(): void;
27
31
  reportMetroEvent(event: TerminalReportableEvent): void;
@@ -32,6 +36,10 @@ export declare class DevServer {
32
36
  private _metroConfig;
33
37
  private getMetroConfig;
34
38
  private registerPlugins;
39
+ private onSymbolicate;
40
+ private customInspectorMessageHandler;
41
+ private onDeviceMessage;
42
+ private onDebuggerMessage;
35
43
  private registerHooks;
36
44
  private registerRoutes;
37
45
  initialize(): Promise<void>;
@@ -5,55 +5,64 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.DevServer = void 0;
7
7
  exports.makeLogEntryFromFastifyLog = makeLogEntryFromFastifyLog;
8
+ const compress_1 = __importDefault(require("@fastify/compress"));
9
+ const cors_1 = __importDefault(require("@fastify/cors"));
8
10
  const middie_1 = __importDefault(require("@fastify/middie"));
9
11
  const sensible_1 = __importDefault(require("@fastify/sensible"));
10
- const compress_1 = __importDefault(require("@fastify/compress"));
11
12
  const cli_server_api_1 = require("@react-native-community/cli-server-api");
12
13
  const dev_middleware_1 = require("@react-native/dev-middleware");
14
+ const node_stream_1 = require("node:stream");
13
15
  const metro_config_1 = require("@react-native/metro-config");
14
16
  const fastify_1 = __importDefault(require("fastify"));
15
17
  const metro_1 = __importDefault(require("metro"));
16
- const node_stream_1 = require("node:stream");
18
+ const keyboard_handler_1 = require("../dev-menu/keyboard-handler");
17
19
  const terminal_reporter_1 = require("../terminal/terminal.reporter");
18
20
  const devtools_plugin_1 = require("./plugins/devtools.plugin");
19
- // import { faviconPlugin } from "./plugins/favicon.plugin";
20
21
  const multipart_plugin_1 = require("./plugins/multipart.plugin");
21
- const symbolicate_1 = require("./plugins/symbolicate");
22
+ const sybmolicate_plugin_1 = require("./sybmolicate/sybmolicate.plugin");
23
+ const systrace_plugin_1 = require("./plugins/systrace.plugin");
22
24
  const wss_1 = require("./plugins/wss");
25
+ const web_socket_api_server_1 = require("./plugins/wss/servers/web-socket-api.server");
23
26
  const web_socket_events_server_1 = require("./plugins/wss/servers/web-socket-events.server");
24
27
  const web_socket_message_server_1 = require("./plugins/wss/servers/web-socket-message.server");
25
- const keyboard_handler_1 = require("../dev-menu/keyboard-handler");
26
28
  class DevServer {
27
29
  config;
28
30
  terminalReporter;
31
+ stream;
29
32
  instance;
33
+ apiServer;
30
34
  messageServer;
31
35
  eventsServer;
32
36
  keyboardHandler;
33
37
  constructor(config) {
34
38
  this.config = config;
35
39
  this.terminalReporter = new terminal_reporter_1.TeardownTerminalReporter(this);
40
+ this.stream = new node_stream_1.Writable({
41
+ write: this.onWrite.bind(this),
42
+ });
36
43
  this.instance = (0, fastify_1.default)({
37
- // disableRequestLogging: false,
44
+ // disableRequestLogging: true,
38
45
  logger: {
39
46
  level: "trace",
40
- stream: new node_stream_1.Writable({
41
- write: (chunk, _encoding, callback) => {
42
- const log = JSON.parse(chunk.toString());
43
- this.onMessage(log);
44
- this.instance.wss?.apiServer.send(log);
45
- callback();
46
- },
47
- }),
47
+ stream: this.stream,
48
48
  },
49
49
  ...(config.https ? { https: config.https } : undefined),
50
50
  });
51
+ this.apiServer = new web_socket_api_server_1.WebSocketApiServer(this.instance);
51
52
  this.messageServer = new web_socket_message_server_1.WebSocketMessageServer(this.instance);
52
53
  this.eventsServer = new web_socket_events_server_1.WebSocketEventsServer(this.instance, {
53
54
  webSocketMessageServer: this.messageServer,
54
55
  });
55
56
  this.keyboardHandler = new keyboard_handler_1.KeyboardHandlerManager(this);
56
57
  }
58
+ async onWrite(chunk, encoding, callback) {
59
+ if (chunk == null) {
60
+ return;
61
+ }
62
+ const log = JSON.parse(chunk.toString());
63
+ this.onMessage(log);
64
+ callback();
65
+ }
57
66
  getDevServerUrl() {
58
67
  const https = this.config.https ? "https" : "http";
59
68
  return `${https}://${this.config.host}:${this.config.port}`;
@@ -62,21 +71,27 @@ class DevServer {
62
71
  this.keyboardHandler.initialize();
63
72
  }
64
73
  reportMetroEvent(event) {
65
- // this.messageServer.broadcast("report_event", event);
66
- // console.log("Metro event", event);
74
+ switch (event.type) {
75
+ case "client_log":
76
+ this.eventsServer.broadcastEvent(event);
77
+ break;
78
+ }
67
79
  }
68
80
  onBundleBuilt(bundlePath) {
69
- console.log("onBundleBuilt", bundlePath);
81
+ // console.log("onBundleBuilt", bundlePath);
82
+ this.messageServer.broadcast("reload");
70
83
  }
71
84
  onMessage(log) {
72
- this.terminalReporter.update({
73
- type: "client_log",
74
- level: "info",
75
- data: [log.msg],
76
- });
85
+ this.apiServer.send(log);
86
+ // console.log(log.msg, log.level);
87
+ // this.terminalReporter.update({
88
+ // type: "client_log",
89
+ // level: "info",
90
+ // data: [log.msg],
91
+ // });
77
92
  }
78
93
  onClientConnected(platform, clientId) {
79
- console.log("onClientConnected", platform, clientId);
94
+ // this.messageServer.broadcast("reload", undefined, []);
80
95
  // this.instance.wss.router.onClientConnected(platform, clientId);
81
96
  // this.onMessage({
82
97
  // level: 30,
@@ -108,15 +123,23 @@ class DevServer {
108
123
  watch: true,
109
124
  onBundleBuilt: this.onBundleBuilt.bind(this),
110
125
  });
111
- // console.log("Registering plugins");
112
126
  const devMiddleware = (0, dev_middleware_1.createDevMiddleware)({
113
127
  projectRoot: this.config.projectRoot,
114
128
  serverBaseUrl: `http://${this.config.host}:${this.config.port}`,
115
129
  logger: this.instance.log,
130
+ unstable_customInspectorMessageHandler: this.customInspectorMessageHandler.bind(this),
116
131
  unstable_experiments: {
117
- // enableNewDebugger: this.config.experiments?.experimentalDebugger,
132
+ enableNetworkInspector: true,
118
133
  },
119
134
  });
135
+ 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,
142
+ });
120
143
  await this.instance.register(compress_1.default);
121
144
  await this.instance.register(sensible_1.default);
122
145
  await this.instance.register(middie_1.default);
@@ -126,10 +149,11 @@ class DevServer {
126
149
  onClientConnected: this.onClientConnected.bind(this),
127
150
  messageServer: this.messageServer,
128
151
  eventsServer: this.eventsServer,
152
+ apiServer: this.apiServer,
129
153
  endpoints: {
130
154
  "/inspector/debug": devMiddleware.websocketEndpoints["/inspector/debug"],
131
155
  "/inspector/device": devMiddleware.websocketEndpoints["/inspector/device"],
132
- "/inspector/network": devMiddleware.websocketEndpoints["/inspector/debug"], // Uses same endpoint as debugger to handle Network-related CDP events
156
+ "/inspector/network": devMiddleware.websocketEndpoints["/inspector/debug"],
133
157
  },
134
158
  });
135
159
  await this.instance.register(multipart_plugin_1.multipartPlugin);
@@ -138,24 +162,50 @@ class DevServer {
138
162
  port: this.config.port,
139
163
  https: this.config.https,
140
164
  });
141
- await this.instance.register(symbolicate_1.symbolicatePlugin);
165
+ await this.instance.register(sybmolicate_plugin_1.symbolicatePlugin, {
166
+ onSymbolicate: this.onSymbolicate.bind(this),
167
+ });
168
+ await this.instance.register(systrace_plugin_1.systracePlugin);
142
169
  // await this.instance.register(faviconPlugin);
143
170
  // Register middleware
144
171
  this.instance.use("/open-url", cli_server_api_1.openURLMiddleware);
145
172
  this.instance.use("/open-stack-frame", (0, cli_server_api_1.openStackFrameInEditorMiddleware)({
146
173
  watchFolders: [this.config.projectRoot],
147
174
  }));
175
+ this.instance.use(serverInstance.metroServer.processRequest);
148
176
  this.instance.use(devMiddleware.middleware);
149
- // Convert Metro middleware to Fastify middleware format
150
- this.instance.use((req, res, next) => {
151
- const middleware = serverInstance.middleware;
152
- middleware(req, res, next);
177
+ }
178
+ onSymbolicate(request, reply) {
179
+ const result = JSON.parse(request.rawBody);
180
+ const { codeFrame, stack } = result;
181
+ this.instance.log.info("onSymbolicate", { codeFrame, stack });
182
+ }
183
+ customInspectorMessageHandler(connection) {
184
+ this.instance.log.info("Creating custom inspector message handler", {
185
+ connection,
186
+ });
187
+ return {
188
+ handleDeviceMessage: (message) => this.onDeviceMessage(connection, message),
189
+ handleDebuggerMessage: (message) => this.onDebuggerMessage(connection, message),
190
+ };
191
+ }
192
+ onDeviceMessage(connection, message) {
193
+ console.log("onDeviceMessage", message);
194
+ this.instance.log.info("Device -> Debugger", {
195
+ message,
196
+ });
197
+ connection.debugger.sendMessage(message);
198
+ }
199
+ onDebuggerMessage(connection, message) {
200
+ console.log("onDebuggerMessage", message);
201
+ this.instance.log.info("Debugger -> Device", {
202
+ message,
153
203
  });
154
- // console.log("Plugins registered");
204
+ connection.device.sendMessage(message);
155
205
  }
156
206
  registerHooks() {
157
- // console.log("Registering hooks");
158
- this.instance.addHook("onSend", async (request, reply, payload) => {
207
+ this.instance.log.info("Registering hooks");
208
+ this.instance = this.instance.addHook("onSend", async (request, reply, payload) => {
159
209
  reply.header("X-Content-Type-Options", "nosniff");
160
210
  reply.header("X-React-Native-Project-Root", this.config.projectRoot);
161
211
  const [pathname] = request.url.split("?");
@@ -164,17 +214,20 @@ class DevServer {
164
214
  }
165
215
  return payload;
166
216
  });
217
+ this.instance.log.info("Hooks registered");
167
218
  }
168
219
  registerRoutes() {
169
- // console.log("Registering routes");
220
+ this.instance.log.info("Registering routes");
170
221
  this.instance.get("/", async () => "React Native packager is running");
171
222
  this.instance.get("/status", async () => "packager-status:running");
223
+ this.instance.log.info("Routes registered");
172
224
  }
173
225
  async initialize() {
174
- console.log("Initializing dev server");
226
+ this.instance.log.info("Initializing dev server");
175
227
  await this.registerPlugins();
176
228
  this.registerHooks();
177
229
  this.registerRoutes();
230
+ this.instance.log.info("Dev server initialized");
178
231
  }
179
232
  async start() {
180
233
  this.instance.log.info("Starting dev server", this.config);
@@ -182,11 +235,12 @@ class DevServer {
182
235
  port: this.config.port,
183
236
  host: this.config.host,
184
237
  });
185
- console.log("Dev server started", this.instance.server.address());
238
+ this.instance.log.info("Dev server started", this.instance.server.address());
186
239
  }
187
240
  async stop() {
188
- console.log("Stopping dev server");
241
+ this.instance.log.info("Stopping dev server");
189
242
  await this.instance.close();
243
+ this.instance.log.info("Dev server stopped");
190
244
  }
191
245
  getInstance() {
192
246
  return this.instance;
@@ -0,0 +1 @@
1
+ export declare const systracePlugin: (instance: import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>) => Promise<void>;
@@ -0,0 +1,28 @@
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.systracePlugin = void 0;
7
+ const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const cli_tools_1 = require("@react-native-community/cli-tools");
10
+ exports.systracePlugin = (0, fastify_plugin_1.default)(async (instance) => {
11
+ instance.post("/systrace", async (request, reply) => {
12
+ cli_tools_1.logger.info("Dumping profile information...");
13
+ const dumpName = `/tmp/dump_${Date.now()}.json`;
14
+ // Get the raw body from the request
15
+ const rawBody = await request.body;
16
+ node_fs_1.default.writeFileSync(dumpName, JSON.stringify(rawBody));
17
+ const response =
18
+ // biome-ignore lint/style/useTemplate: <explanation>
19
+ `Your profile was saved at:\n${dumpName}\n\n` +
20
+ 'On Google Chrome navigate to chrome://tracing and then click on "load" ' +
21
+ "to load and visualise your profile.\n\n" +
22
+ "This message is also printed to your console by the packager so you can copy it :)";
23
+ cli_tools_1.logger.info(response);
24
+ return reply.send(response);
25
+ });
26
+ }, {
27
+ name: "systrace-plugin",
28
+ });
@@ -22,7 +22,7 @@ export declare class WebSocketApiServer extends WebSocketServer {
22
22
  *
23
23
  * @param event Event string or object to send.
24
24
  */
25
- send(event: any): void;
25
+ send(event: unknown): void;
26
26
  /**
27
27
  * Process new WebSocket connection from client application.
28
28
  *
@@ -26,13 +26,18 @@ class WebSocketApiServer extends web_socket_server_1.WebSocketServer {
26
26
  * @param event Event string or object to send.
27
27
  */
28
28
  send(event) {
29
+ if (this.clients.size === 0) {
30
+ return;
31
+ }
29
32
  const data = typeof event === "string" ? event : JSON.stringify(event);
30
33
  for (const [, socket] of this.clients.entries()) {
31
34
  try {
32
35
  socket.send(data);
33
36
  }
34
- catch {
35
- // NOOP
37
+ catch (error) {
38
+ this.fastify.log.error("Error sending message to API client", {
39
+ error,
40
+ });
36
41
  }
37
42
  }
38
43
  }
@@ -43,13 +48,13 @@ class WebSocketApiServer extends web_socket_server_1.WebSocketServer {
43
48
  */
44
49
  onConnection(socket) {
45
50
  const clientId = `client#${this.nextClientId++}`;
46
- console.log("WebSocketApiServer onConnection", clientId, socket);
47
51
  this.clients.set(clientId, socket);
48
- this.fastify.log.debug({ msg: "API client connected", clientId });
52
+ this.fastify.log.info("API client connected", {
53
+ clientId,
54
+ });
49
55
  this.clients.set(clientId, socket);
50
56
  const onClose = () => {
51
- this.fastify.log.debug({
52
- msg: "API client disconnected",
57
+ this.fastify.log.info("API client disconnected", {
53
58
  clientId,
54
59
  });
55
60
  this.clients.delete(clientId);
@@ -59,7 +59,7 @@ export declare class WebSocketEventsServer extends WebSocketServer {
59
59
  * @param message Message to serialize.
60
60
  * @returns String representation of a `message` or `undefined` if serialization failed.
61
61
  */
62
- serializeMessage(message: EventMessage): string | undefined;
62
+ serializeMessage(message: EventMessage, clientId?: string): string | undefined;
63
63
  /**
64
64
  * Broadcast event to all connected clients.
65
65
  *
@@ -84,7 +84,7 @@ class WebSocketEventsServer extends web_socket_server_1.WebSocketServer {
84
84
  * @param message Message to serialize.
85
85
  * @returns String representation of a `message` or `undefined` if serialization failed.
86
86
  */
87
- serializeMessage(message) {
87
+ serializeMessage(message, clientId) {
88
88
  let toSerialize = message;
89
89
  if (message.error && message.error instanceof Error) {
90
90
  toSerialize = {
@@ -112,7 +112,10 @@ class WebSocketEventsServer extends web_socket_server_1.WebSocketServer {
112
112
  };
113
113
  }
114
114
  try {
115
- return JSON.stringify(toSerialize);
115
+ return JSON.stringify({
116
+ ...toSerialize,
117
+ clientId,
118
+ });
116
119
  }
117
120
  catch (error) {
118
121
  this.fastify.log.error({ msg: "Failed to serialize", error });
@@ -130,11 +133,16 @@ class WebSocketEventsServer extends web_socket_server_1.WebSocketServer {
130
133
  }
131
134
  const serialized = this.serializeMessage(event);
132
135
  if (!serialized) {
136
+ console.log("Failed to serialize event");
133
137
  return;
134
138
  }
135
139
  for (const [clientId, socket] of this.clients.entries()) {
136
140
  try {
137
- socket.send(serialized);
141
+ const clientMessage = this.serializeMessage(event, clientId);
142
+ if (!clientMessage) {
143
+ continue;
144
+ }
145
+ socket.send(clientMessage);
138
146
  }
139
147
  catch (error) {
140
148
  this.fastify.log.error({
@@ -93,15 +93,23 @@ class WebSocketHMRServer extends web_socket_server_1.WebSocketServer {
93
93
  this.options.onClientConnected(platform, clientId);
94
94
  }
95
95
  async registerHMRClient(socket, requestUrl) {
96
- console.log("HMR server registerHMRClient", requestUrl);
97
- const sendFn = (data) => {
98
- socket.send(data);
96
+ const sendFn = (...args) => {
97
+ // @ts-ignore
98
+ socket.send(...args);
99
99
  };
100
100
  const hmrClient = await this.hmrServer.onClientConnect(requestUrl, sendFn);
101
101
  socket.on("error", (error) => {
102
+ this.fastify.log.error({
103
+ msg: "HMR client error",
104
+ error,
105
+ });
102
106
  this.hmrServer.onClientError(hmrClient, error);
103
107
  });
104
108
  socket.on("close", () => {
109
+ this.fastify.log.debug({
110
+ msg: "HMR client disconnected",
111
+ ...hmrClient,
112
+ });
105
113
  this.hmrServer.onClientDisconnect(hmrClient);
106
114
  });
107
115
  socket.on("message", (data) => {
@@ -65,6 +65,7 @@ class WebSocketMessageServer extends web_socket_server_1.WebSocketServer {
65
65
  * @returns Parsed message or `undefined` if parsing failed.
66
66
  */
67
67
  parseMessage(data, binary) {
68
+ console.log("parseMessage", data, binary);
68
69
  if (binary) {
69
70
  this.fastify.log.error({
70
71
  msg: "Failed to parse message - expected text message, got binary",
@@ -97,6 +98,7 @@ class WebSocketMessageServer extends web_socket_server_1.WebSocketServer {
97
98
  * @returns WebSocket connection.
98
99
  */
99
100
  getClientSocket(clientId) {
101
+ console.log("getClientSocket", clientId);
100
102
  const socket = this.clients.get(clientId);
101
103
  if (socket === undefined) {
102
104
  throw new Error(`Could not find client with id "${clientId}"`);
@@ -112,6 +114,7 @@ class WebSocketMessageServer extends web_socket_server_1.WebSocketServer {
112
114
  * @param error Concrete instance of an error that occurred.
113
115
  */
114
116
  handleError(clientId, message, error) {
117
+ console.log("handleError", clientId, message, error);
115
118
  const errorMessage = {
116
119
  id: message.id,
117
120
  method: message.method,
@@ -154,6 +157,7 @@ class WebSocketMessageServer extends web_socket_server_1.WebSocketServer {
154
157
  * @param message Message to forward.
155
158
  */
156
159
  forwardRequest(clientId, message) {
160
+ console.log("forwardRequest", clientId, message);
157
161
  if (!message.target) {
158
162
  this.fastify.log.error({
159
163
  msg: "Failed to forward request - message.target is missing",
@@ -200,6 +204,7 @@ class WebSocketMessageServer extends web_socket_server_1.WebSocketServer {
200
204
  * @param message The message to process by the server.
201
205
  */
202
206
  processServerRequest(clientId, message) {
207
+ console.log("processServerRequest", clientId, message);
203
208
  let result;
204
209
  switch (message.method) {
205
210
  case "getid":
@@ -297,7 +302,7 @@ class WebSocketMessageServer extends web_socket_server_1.WebSocketServer {
297
302
  };
298
303
  const onClose = (close) => {
299
304
  this.fastify.log.debug({
300
- msg: ["Message client closed"],
305
+ msg: "Message client closed",
301
306
  clientId,
302
307
  close,
303
308
  });
@@ -24,12 +24,10 @@ class WebSocketRouter {
24
24
  constructor(fastify) {
25
25
  this.fastify = fastify;
26
26
  this.fastify.server.on("upgrade", (request, socket, head) => {
27
- console.log("WebSocketRouter upgrade", request.url);
28
27
  const { pathname } = new URL(request.url || "", "http://localhost");
29
28
  let matched = false;
30
29
  for (const server of this.servers) {
31
30
  if (server.shouldUpgrade(pathname)) {
32
- // console.log("WebSocketRouter upgrade matched", pathname);
33
31
  matched = true;
34
32
  server.upgrade(request, socket, head);
35
33
  break;
@@ -1,7 +1,7 @@
1
1
  import type { ConfigT } from "metro-config";
2
2
  import type MetroServer from "metro/src/Server";
3
3
  import type { WebSocketServer } from "ws";
4
- import { WebSocketApiServer } from "./servers/web-socket-api.server";
4
+ import type { WebSocketApiServer } from "./servers/web-socket-api.server";
5
5
  import { WebSocketDebuggerServer } from "./servers/web-socket-debugger.server";
6
6
  import { WebSocketDevClientServer } from "./servers/web-socket-dev-client.server";
7
7
  import type { WebSocketEventsServer } from "./servers/web-socket-events.server";
@@ -37,6 +37,7 @@ export declare const wssPlugin: import("fastify").FastifyPluginCallback<{
37
37
  onClientConnected: (platform: string, clientId: string) => void;
38
38
  messageServer: WebSocketMessageServer;
39
39
  eventsServer: WebSocketEventsServer;
40
+ apiServer: WebSocketApiServer;
40
41
  endpoints: {
41
42
  [WS_DEVICE_URL]: WebSocketServer;
42
43
  [WS_DEBUGGER_URL]: WebSocketServer;
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.wssPlugin = void 0;
7
7
  const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
8
- const web_socket_api_server_1 = require("./servers/web-socket-api.server");
9
8
  const web_socket_debugger_server_1 = require("./servers/web-socket-debugger.server");
10
9
  const web_socket_dev_client_server_1 = require("./servers/web-socket-dev-client.server");
11
10
  const web_socket_hmr_server_1 = require("./servers/web-socket-hmr.server");
@@ -18,11 +17,10 @@ const web_socket_server_adapter_1 = require("./web-socket-server-adapter");
18
17
  const WS_DEVICE_URL = "/inspector/device";
19
18
  const WS_DEBUGGER_URL = "/inspector/debug";
20
19
  const WS_NETWORK_URL = "/inspector/network";
21
- exports.wssPlugin = (0, fastify_plugin_1.default)(async (instance, { metroConfig, metroServer, onClientConnected, endpoints, messageServer, eventsServer, }) => {
20
+ exports.wssPlugin = (0, fastify_plugin_1.default)(async (instance, { metroConfig, metroServer, onClientConnected, endpoints, messageServer, eventsServer, apiServer, }) => {
22
21
  const router = new web_socket_router_1.WebSocketRouter(instance);
23
22
  const debuggerServer = new web_socket_debugger_server_1.WebSocketDebuggerServer(instance);
24
23
  const devClientServer = new web_socket_dev_client_server_1.WebSocketDevClientServer(instance);
25
- const apiServer = new web_socket_api_server_1.WebSocketApiServer(instance);
26
24
  const hmrServer = new web_socket_hmr_server_1.WebSocketHMRServer(instance, {
27
25
  metroConfig,
28
26
  metroServer,
@@ -0,0 +1,11 @@
1
+ import type { IncomingMessageExtended } from "@fastify/middie";
2
+ import type http from "node:http";
3
+ export type SymbolicateRequest = http.IncomingMessage & IncomingMessageExtended & {
4
+ rawBody: string;
5
+ };
6
+ export type SymbolicateReply = http.ServerResponse;
7
+ type SymbolicatePluginOptions = {
8
+ onSymbolicate: (request: SymbolicateRequest, reply: SymbolicateReply) => void;
9
+ };
10
+ export declare const symbolicatePlugin: import("fastify").FastifyPluginCallback<SymbolicatePluginOptions, import("fastify").RawServerDefault, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
11
+ export {};
@@ -5,17 +5,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.symbolicatePlugin = void 0;
7
7
  const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
8
- exports.symbolicatePlugin = (0, fastify_plugin_1.default)(async (instance) => {
9
- instance.post("/symbolicate", async (request, reply) => {
10
- instance.log.info("Symbolicate endpoint hit", request.body);
8
+ exports.symbolicatePlugin = (0, fastify_plugin_1.default)(async (instance, options) => {
9
+ instance.log.info("Symbolicate plugin registered");
10
+ instance.use((request, reply, next) => {
11
+ if (request.url !== "/symbolicate") {
12
+ next();
13
+ return;
14
+ }
15
+ instance.log.info("symbolicate onRequest", request.url);
11
16
  const requestWithBody = request;
12
17
  requestWithBody.rawBody = "";
13
- requestWithBody.raw.setEncoding("utf8");
14
- request.raw.on("data", (chunk) => {
18
+ requestWithBody.setEncoding("utf8");
19
+ requestWithBody.on("data", (chunk) => {
15
20
  requestWithBody.rawBody += chunk;
16
21
  });
17
- requestWithBody.raw.on("end", () => {
18
- reply.send(requestWithBody.rawBody);
22
+ requestWithBody.on("end", () => {
23
+ options.onSymbolicate(requestWithBody, reply);
24
+ next();
19
25
  });
20
26
  });
21
27
  }, {
@@ -59,12 +59,14 @@ class TeardownTerminalReporter extends base_terminal_reporter_1.BaseTerminalRepo
59
59
  });
60
60
  }
61
61
  update(event) {
62
- super.update(event);
63
62
  this.devServer?.reportMetroEvent(event);
64
63
  switch (event.type) {
65
64
  case "initialize_done":
66
65
  this.devServer.onInitializeDone?.();
67
66
  break;
67
+ default:
68
+ super.update(event);
69
+ break;
68
70
  }
69
71
  }
70
72
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teardown/cli",
3
- "version": "1.2.26",
3
+ "version": "1.2.27",
4
4
  "description": "Teardown CLI",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -20,19 +20,21 @@
20
20
  "dependencies": {
21
21
  "@babel/code-frame": "^7.26.2",
22
22
  "@fastify/compress": "^8.0.1",
23
+ "@fastify/cors": "^10.0.1",
23
24
  "@fastify/middie": "^9.0.2",
24
25
  "@fastify/sensible": "^6.0.1",
25
26
  "@react-native-community/cli-server-api": "^15.0.1",
26
- "@react-native/metro-config": "^0.76.1",
27
+ "@react-native/dev-middleware": "0.76.1",
28
+ "@react-native/metro-config": "0.76.1",
27
29
  "@types/bun": "^1.1.13",
28
- "bun": "^1.1.34",
30
+ "bun": "1.1.34",
29
31
  "chalk": "^5.3.0",
30
32
  "cli-progress": "^3.12.0",
31
33
  "commander": "^11.0.0",
32
34
  "compression": "^1.7.5",
33
35
  "connect": "^3.7.0",
34
36
  "debug": "^4.3.7",
35
- "devtools-protocol": "^0.0.1376744",
37
+ "devtools-protocol": "^0.0.1380148",
36
38
  "fastify": "^5.1.0",
37
39
  "fastify-favicon": "^5.0.0",
38
40
  "fastify-plugin": "^5.0.1",
@@ -40,6 +42,7 @@
40
42
  "metro": "^0.81.0",
41
43
  "metro-config": "^0.81.0",
42
44
  "metro-core": "^0.81.0",
45
+ "metro-runtime": "^0.81.0",
43
46
  "pretty-format": "^29.7.0",
44
47
  "prompts": "^2.4.2",
45
48
  "source-map": "^0.7.4"
@@ -1,2 +0,0 @@
1
- export * from "./sybmolicatePlugin";
2
- export * from "./types";
@@ -1,18 +0,0 @@
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("./sybmolicatePlugin"), exports);
18
- __exportStar(require("./types"), exports);
@@ -1 +0,0 @@
1
- export declare const symbolicatePlugin: (instance: import("fastify").FastifyInstance<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>) => Promise<void>;
@@ -1,64 +0,0 @@
1
- /**
2
- * Raw React Native stack frame.
3
- */
4
- export interface ReactNativeStackFrame {
5
- lineNumber: number | null;
6
- column: number | null;
7
- file: string | null;
8
- methodName: string;
9
- }
10
- /**
11
- * React Native stack frame used as input when processing by {@link Symbolicator}.
12
- */
13
- export interface InputStackFrame extends ReactNativeStackFrame {
14
- file: string;
15
- }
16
- /**
17
- * Final symbolicated stack frame.
18
- */
19
- export interface StackFrame extends InputStackFrame {
20
- collapse: boolean;
21
- }
22
- /**
23
- * Represents [@babel/core-frame](https://babeljs.io/docs/en/babel-code-frame).
24
- */
25
- export interface CodeFrame {
26
- content: string;
27
- location: {
28
- row: number;
29
- column: number;
30
- };
31
- fileName: string;
32
- }
33
- /**
34
- * Represents results of running {@link process} method on {@link Symbolicator} instance.
35
- */
36
- export interface SymbolicatorResults {
37
- codeFrame: CodeFrame | null;
38
- stack: StackFrame[];
39
- }
40
- /**
41
- * Delegate with implementation for symbolication functions.
42
- */
43
- export interface SymbolicatorDelegate {
44
- /**
45
- * Get source code of file in the URL.
46
- *
47
- * @param fileUrl A full URL pointing to a file.
48
- */
49
- getSource: (fileUrl: string) => Promise<string | Buffer>;
50
- /**
51
- * Get source map for the file in the URL.
52
- *
53
- * @param fileUrl A full (usually `http:`) URL pointing to a compiled file.
54
- * The URL points to a file for which to return source map, not to the source map file itself,
55
- * e.g: `http://localhost:8081/index.bundle?platform=ios`.
56
- */
57
- getSourceMap: (fileUrl: string) => Promise<string | Buffer>;
58
- /**
59
- * Check if given stack frame should be included in the new symbolicated stack.
60
- *
61
- * @param frame Stack frame to check.
62
- */
63
- shouldIncludeFrame: (frame: StackFrame) => boolean;
64
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,27 +0,0 @@
1
- export type { SymbolicatorDelegate, ReactNativeStackFrame, InputStackFrame, StackFrame, CodeFrame, SymbolicatorResults, } from './plugins/symbolicate';
2
- /** Representation of the compilation progress. */
3
- export interface ProgressData {
4
- /** Number of modules built. */
5
- completed: number;
6
- /** Total number of modules detect as part of compilation. */
7
- total: number;
8
- }
9
- /**
10
- * Type representing a function to send the progress.
11
- *
12
- * Used by {@link CompilerDelegate} in `getAsset` function to send the compilation
13
- * progress to the client who requested the asset.
14
- */
15
- export type SendProgress = (data: ProgressData) => void;
16
- /**
17
- * Internal types. Do not use.
18
- *
19
- * @internal
20
- */
21
- export declare namespace Internal {
22
- enum EventTypes {
23
- BuildStart = "BuildStart",
24
- BuildEnd = "BuildEnd",
25
- HmrEvent = "HmrEvent"
26
- }
27
- }
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Internal = void 0;
4
- /**
5
- * Internal types. Do not use.
6
- *
7
- * @internal
8
- */
9
- var Internal;
10
- (function (Internal) {
11
- let EventTypes;
12
- (function (EventTypes) {
13
- EventTypes["BuildStart"] = "BuildStart";
14
- EventTypes["BuildEnd"] = "BuildEnd";
15
- EventTypes["HmrEvent"] = "HmrEvent";
16
- })(EventTypes = Internal.EventTypes || (Internal.EventTypes = {}));
17
- })(Internal || (exports.Internal = Internal = {}));