react-native-ai-debugger 1.0.4 → 1.0.6

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.
@@ -0,0 +1,622 @@
1
+ import { createServer } from "http";
2
+ import { logBuffer, networkBuffer, bundleErrorBuffer, connectedApps } from "./state.js";
3
+ const DEFAULT_HTTP_PORT = 3456;
4
+ const MAX_PORT_ATTEMPTS = 20;
5
+ // Store the active port for querying via MCP tool
6
+ let activeDebugServerPort = null;
7
+ /**
8
+ * Get the port the debug HTTP server is running on (if started)
9
+ */
10
+ export function getDebugServerPort() {
11
+ return activeDebugServerPort;
12
+ }
13
+ // HTML template with highlight.js and auto-refresh
14
+ function htmlTemplate(title, content, refreshInterval = 3000) {
15
+ return `<!DOCTYPE html>
16
+ <html lang="en">
17
+ <head>
18
+ <meta charset="UTF-8">
19
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
20
+ <title>${title} - RN Debugger</title>
21
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css">
22
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
23
+ <style>
24
+ * { box-sizing: border-box; margin: 0; padding: 0; }
25
+ body {
26
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
27
+ background: #0d1117;
28
+ color: #c9d1d9;
29
+ padding: 20px;
30
+ line-height: 1.5;
31
+ }
32
+ nav {
33
+ background: #161b22;
34
+ padding: 12px 20px;
35
+ margin: -20px -20px 20px -20px;
36
+ border-bottom: 1px solid #30363d;
37
+ display: flex;
38
+ gap: 20px;
39
+ align-items: center;
40
+ }
41
+ nav a {
42
+ color: #58a6ff;
43
+ text-decoration: none;
44
+ padding: 6px 12px;
45
+ border-radius: 6px;
46
+ transition: background 0.2s;
47
+ }
48
+ nav a:hover { background: #21262d; }
49
+ nav a.active { background: #388bfd; color: white; }
50
+ .logo { font-weight: 600; color: #f0f6fc; margin-right: auto; }
51
+ h1 { margin-bottom: 16px; font-size: 1.5em; }
52
+ .stats {
53
+ display: flex;
54
+ gap: 16px;
55
+ margin-bottom: 20px;
56
+ flex-wrap: wrap;
57
+ }
58
+ .stat {
59
+ background: #161b22;
60
+ padding: 12px 20px;
61
+ border-radius: 8px;
62
+ border: 1px solid #30363d;
63
+ }
64
+ .stat-value { font-size: 1.5em; font-weight: 600; color: #58a6ff; }
65
+ .stat-label { font-size: 0.85em; color: #8b949e; }
66
+ pre {
67
+ background: #161b22;
68
+ border: 1px solid #30363d;
69
+ border-radius: 8px;
70
+ padding: 16px;
71
+ overflow-x: auto;
72
+ font-size: 13px;
73
+ }
74
+ code { font-family: 'SF Mono', Consolas, 'Liberation Mono', Menlo, monospace; }
75
+ .log-entry {
76
+ padding: 8px 12px;
77
+ border-bottom: 1px solid #21262d;
78
+ font-family: 'SF Mono', Consolas, monospace;
79
+ font-size: 13px;
80
+ }
81
+ .log-entry:last-child { border-bottom: none; }
82
+ .log-entry.log { color: #c9d1d9; }
83
+ .log-entry.info { color: #58a6ff; }
84
+ .log-entry.warn { color: #d29922; background: #d299221a; }
85
+ .log-entry.error { color: #f85149; background: #f851491a; }
86
+ .log-entry.debug { color: #8b949e; }
87
+ .log-time { color: #6e7681; margin-right: 12px; }
88
+ .log-level {
89
+ display: inline-block;
90
+ width: 50px;
91
+ text-transform: uppercase;
92
+ font-size: 11px;
93
+ font-weight: 600;
94
+ }
95
+ .network-item { border-bottom: 1px solid #21262d; }
96
+ .network-item:last-child { border-bottom: none; }
97
+ .network-entry {
98
+ padding: 12px;
99
+ display: grid;
100
+ grid-template-columns: 70px 60px 1fr 100px 30px;
101
+ gap: 8px 12px;
102
+ align-items: start;
103
+ font-size: 13px;
104
+ cursor: pointer;
105
+ transition: background 0.15s;
106
+ }
107
+ .network-entry:hover { background: #21262d; }
108
+ .network-main-row {
109
+ display: contents;
110
+ }
111
+ .url-cell {
112
+ display: flex;
113
+ flex-direction: column;
114
+ overflow: hidden;
115
+ }
116
+ .method { font-weight: 600; font-family: monospace; }
117
+ .method.GET { color: #58a6ff; }
118
+ .method.POST { color: #3fb950; }
119
+ .method.PUT { color: #d29922; }
120
+ .method.DELETE { color: #f85149; }
121
+ .method.PATCH { color: #a371f7; }
122
+ .status { font-family: monospace; font-weight: 600; }
123
+ .status.s2xx { color: #3fb950; }
124
+ .status.s3xx { color: #58a6ff; }
125
+ .status.s4xx { color: #d29922; }
126
+ .status.s5xx { color: #f85149; }
127
+ .url { color: #c9d1d9; word-break: break-all; font-family: monospace; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
128
+ .duration { color: #8b949e; text-align: right; }
129
+ .expand-icon { color: #6e7681; text-align: center; transition: transform 0.2s; }
130
+ .network-item.expanded .expand-icon { transform: rotate(90deg); }
131
+ .network-details {
132
+ display: none;
133
+ padding: 12px 16px;
134
+ background: #0d1117;
135
+ border-top: 1px solid #21262d;
136
+ font-size: 12px;
137
+ }
138
+ .network-item.expanded .network-details { display: block; }
139
+ .detail-section { margin-bottom: 12px; }
140
+ .detail-section:last-child { margin-bottom: 0; }
141
+ .detail-label { color: #8b949e; font-size: 11px; text-transform: uppercase; margin-bottom: 4px; font-weight: 600; }
142
+ .detail-value { font-family: 'SF Mono', Consolas, monospace; white-space: pre-wrap; word-break: break-all; }
143
+ .detail-value.url-full { color: #58a6ff; }
144
+ .headers-grid { display: grid; grid-template-columns: auto 1fr; gap: 4px 12px; }
145
+ .header-name { color: #a371f7; }
146
+ .header-value { color: #c9d1d9; word-break: break-all; }
147
+ .operation-info {
148
+ font-size: 11px;
149
+ color: #8b949e;
150
+ margin-top: 2px;
151
+ font-family: 'SF Mono', Consolas, monospace;
152
+ overflow: hidden;
153
+ text-overflow: ellipsis;
154
+ white-space: nowrap;
155
+ }
156
+ .operation-name { color: #d2a8ff; font-weight: 500; }
157
+ .operation-vars { color: #7ee787; }
158
+ .empty { color: #8b949e; text-align: center; padding: 40px; }
159
+ .app-card {
160
+ background: #161b22;
161
+ border: 1px solid #30363d;
162
+ border-radius: 8px;
163
+ padding: 16px;
164
+ margin-bottom: 12px;
165
+ }
166
+ .app-card h3 { margin-bottom: 8px; }
167
+ .app-status { display: inline-block; padding: 2px 8px; border-radius: 12px; font-size: 12px; }
168
+ .app-status.connected { background: #238636; color: white; }
169
+ .app-status.disconnected { background: #6e7681; color: white; }
170
+ .app-detail { color: #8b949e; font-size: 13px; margin-top: 4px; }
171
+ #content { min-height: 200px; }
172
+ </style>
173
+ </head>
174
+ <body>
175
+ <nav>
176
+ <span class="logo">RN Debugger</span>
177
+ <a href="/" ${title === 'Dashboard' ? 'class="active"' : ''}>Dashboard</a>
178
+ <a href="/logs" ${title === 'Logs' ? 'class="active"' : ''}>Logs</a>
179
+ <a href="/network" ${title === 'Network' ? 'class="active"' : ''}>Network</a>
180
+ <a href="/apps" ${title === 'Apps' ? 'class="active"' : ''}>Apps</a>
181
+ </nav>
182
+ <div id="content">${content}</div>
183
+ <script>
184
+ hljs.highlightAll();
185
+
186
+ function toggleNetworkItem(el) {
187
+ el.closest('.network-item').classList.toggle('expanded');
188
+ }
189
+
190
+ ${refreshInterval > 0 ? `
191
+ setInterval(() => {
192
+ fetch(window.location.pathname + '?t=' + Date.now(), {
193
+ headers: { 'Accept': 'text/html' }
194
+ })
195
+ .then(r => r.text())
196
+ .then(html => {
197
+ const parser = new DOMParser();
198
+ const doc = parser.parseFromString(html, 'text/html');
199
+ const newContent = doc.getElementById('content');
200
+ const oldContent = document.getElementById('content');
201
+ if (newContent && oldContent && newContent.innerHTML !== oldContent.innerHTML) {
202
+ // Preserve expanded state
203
+ const expanded = new Set();
204
+ oldContent.querySelectorAll('.network-item.expanded').forEach(el => {
205
+ const id = el.getAttribute('data-id');
206
+ if (id) expanded.add(id);
207
+ });
208
+
209
+ oldContent.innerHTML = newContent.innerHTML;
210
+
211
+ // Restore expanded state
212
+ expanded.forEach(id => {
213
+ const el = oldContent.querySelector('.network-item[data-id="' + id + '"]');
214
+ if (el) el.classList.add('expanded');
215
+ });
216
+
217
+ hljs.highlightAll();
218
+ }
219
+ });
220
+ }, ${refreshInterval});
221
+ ` : ''}
222
+ </script>
223
+ </body>
224
+ </html>`;
225
+ }
226
+ function formatTime(date) {
227
+ return date.toLocaleTimeString('en-US', { hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });
228
+ }
229
+ function escapeHtml(str) {
230
+ return str
231
+ .replace(/&/g, '&amp;')
232
+ .replace(/</g, '&lt;')
233
+ .replace(/>/g, '&gt;')
234
+ .replace(/"/g, '&quot;');
235
+ }
236
+ function renderDashboard() {
237
+ const logs = logBuffer.size;
238
+ const network = networkBuffer.size;
239
+ const errors = bundleErrorBuffer.get().length;
240
+ const apps = connectedApps.size;
241
+ const status = bundleErrorBuffer.getStatus();
242
+ return htmlTemplate('Dashboard', `
243
+ <h1>Dashboard</h1>
244
+ <div class="stats">
245
+ <div class="stat">
246
+ <div class="stat-value">${logs}</div>
247
+ <div class="stat-label">Console Logs</div>
248
+ </div>
249
+ <div class="stat">
250
+ <div class="stat-value">${network}</div>
251
+ <div class="stat-label">Network Requests</div>
252
+ </div>
253
+ <div class="stat">
254
+ <div class="stat-value">${errors}</div>
255
+ <div class="stat-label">Bundle Errors</div>
256
+ </div>
257
+ <div class="stat">
258
+ <div class="stat-value">${apps}</div>
259
+ <div class="stat-label">Connected Apps</div>
260
+ </div>
261
+ </div>
262
+ <h2 style="margin: 20px 0 12px;">Bundle Status</h2>
263
+ <pre><code class="language-json">${escapeHtml(JSON.stringify(status, null, 2))}</code></pre>
264
+ `);
265
+ }
266
+ function renderLogs() {
267
+ const logs = logBuffer.getAll();
268
+ if (logs.length === 0) {
269
+ return htmlTemplate('Logs', '<div class="empty">No logs captured yet. Connect to a Metro server and interact with your app.</div>');
270
+ }
271
+ const logsHtml = logs.map(log => {
272
+ const time = formatTime(log.timestamp);
273
+ const message = escapeHtml(log.message);
274
+ return `<div class="log-entry ${log.level}">
275
+ <span class="log-time">${time}</span>
276
+ <span class="log-level">${log.level}</span>
277
+ ${message}
278
+ </div>`;
279
+ }).join('');
280
+ return htmlTemplate('Logs', `
281
+ <h1>Console Logs <span style="color: #8b949e; font-weight: normal;">(${logs.length})</span></h1>
282
+ <pre style="padding: 0;">${logsHtml}</pre>
283
+ `);
284
+ }
285
+ function formatHeaders(headers) {
286
+ if (!headers || Object.keys(headers).length === 0) {
287
+ return '<span style="color: #6e7681;">No headers</span>';
288
+ }
289
+ return Object.entries(headers)
290
+ .map(([name, value]) => `<span class="header-name">${escapeHtml(name)}:</span> <span class="header-value">${escapeHtml(value)}</span>`)
291
+ .join('<br>');
292
+ }
293
+ function parseRequestBody(postData) {
294
+ if (!postData)
295
+ return null;
296
+ try {
297
+ const parsed = JSON.parse(postData);
298
+ // Check if it's GraphQL
299
+ if (parsed.query || parsed.operationName) {
300
+ return {
301
+ isGraphQL: true,
302
+ operationName: parsed.operationName,
303
+ variables: parsed.variables
304
+ };
305
+ }
306
+ // REST API - return body preview
307
+ const preview = JSON.stringify(parsed);
308
+ return {
309
+ isGraphQL: false,
310
+ bodyPreview: preview.length > 100 ? preview.substring(0, 100) + '...' : preview
311
+ };
312
+ }
313
+ catch {
314
+ // Not JSON - return raw preview
315
+ return {
316
+ isGraphQL: false,
317
+ bodyPreview: postData.length > 100 ? postData.substring(0, 100) + '...' : postData
318
+ };
319
+ }
320
+ }
321
+ function formatVariablesCompact(variables) {
322
+ if (!variables || Object.keys(variables).length === 0)
323
+ return '';
324
+ const parts = Object.entries(variables).map(([key, value]) => {
325
+ let valStr;
326
+ if (typeof value === 'string') {
327
+ valStr = `"${value.length > 15 ? value.substring(0, 15) + '...' : value}"`;
328
+ }
329
+ else if (typeof value === 'object' && value !== null) {
330
+ valStr = Array.isArray(value) ? `[${value.length}]` : '{...}';
331
+ }
332
+ else {
333
+ valStr = String(value);
334
+ }
335
+ return `${key}: ${valStr}`;
336
+ });
337
+ const result = parts.join(', ');
338
+ return result.length > 60 ? result.substring(0, 60) + '...' : result;
339
+ }
340
+ function renderNetwork() {
341
+ const requests = networkBuffer.getAll({});
342
+ if (requests.length === 0) {
343
+ return htmlTemplate('Network', '<div class="empty">No network requests captured yet. Connect to a Metro server and interact with your app.</div>');
344
+ }
345
+ const requestsHtml = requests.map(req => {
346
+ const statusClass = req.status ? `s${Math.floor(req.status / 100)}xx` : '';
347
+ const duration = req.timing?.duration ? `${Math.round(req.timing.duration)}ms` : '-';
348
+ const url = escapeHtml(req.url);
349
+ const requestId = escapeHtml(req.requestId);
350
+ // Parse body for operation info
351
+ const parsedBody = parseRequestBody(req.postData);
352
+ // Build details section
353
+ const details = [];
354
+ // Full URL
355
+ details.push(`
356
+ <div class="detail-section">
357
+ <div class="detail-label">URL</div>
358
+ <div class="detail-value url-full">${url}</div>
359
+ </div>
360
+ `);
361
+ // Timing
362
+ if (req.timing) {
363
+ details.push(`
364
+ <div class="detail-section">
365
+ <div class="detail-label">Timing</div>
366
+ <div class="detail-value">Duration: ${duration}</div>
367
+ </div>
368
+ `);
369
+ }
370
+ // Request Headers
371
+ details.push(`
372
+ <div class="detail-section">
373
+ <div class="detail-label">Request Headers</div>
374
+ <div class="detail-value">${formatHeaders(req.headers)}</div>
375
+ </div>
376
+ `);
377
+ // Request Body (POST data)
378
+ if (req.postData) {
379
+ let formattedBody = escapeHtml(req.postData);
380
+ try {
381
+ const parsed = JSON.parse(req.postData);
382
+ formattedBody = `<code class="language-json">${escapeHtml(JSON.stringify(parsed, null, 2))}</code>`;
383
+ }
384
+ catch {
385
+ // Not JSON, use as-is
386
+ }
387
+ details.push(`
388
+ <div class="detail-section">
389
+ <div class="detail-label">Request Body</div>
390
+ <pre style="margin: 0; padding: 8px; font-size: 11px;">${formattedBody}</pre>
391
+ </div>
392
+ `);
393
+ }
394
+ // Response Headers
395
+ if (req.responseHeaders && Object.keys(req.responseHeaders).length > 0) {
396
+ details.push(`
397
+ <div class="detail-section">
398
+ <div class="detail-label">Response Headers</div>
399
+ <div class="detail-value">${formatHeaders(req.responseHeaders)}</div>
400
+ </div>
401
+ `);
402
+ }
403
+ // Response info
404
+ if (req.mimeType || req.contentLength) {
405
+ const info = [];
406
+ if (req.mimeType)
407
+ info.push(`Type: ${escapeHtml(req.mimeType)}`);
408
+ if (req.contentLength)
409
+ info.push(`Size: ${req.contentLength} bytes`);
410
+ details.push(`
411
+ <div class="detail-section">
412
+ <div class="detail-label">Response Info</div>
413
+ <div class="detail-value">${info.join(' | ')}</div>
414
+ </div>
415
+ `);
416
+ }
417
+ // Error
418
+ if (req.error) {
419
+ details.push(`
420
+ <div class="detail-section">
421
+ <div class="detail-label" style="color: #f85149;">Error</div>
422
+ <div class="detail-value" style="color: #f85149;">${escapeHtml(req.error)}</div>
423
+ </div>
424
+ `);
425
+ }
426
+ // Build operation info line for compact view
427
+ let operationInfo = '';
428
+ if (parsedBody) {
429
+ if (parsedBody.isGraphQL && parsedBody.operationName) {
430
+ const varsStr = formatVariablesCompact(parsedBody.variables);
431
+ operationInfo = `<div class="operation-info"><span class="operation-name">${escapeHtml(parsedBody.operationName)}</span>${varsStr ? ` <span class="operation-vars">(${escapeHtml(varsStr)})</span>` : ''}</div>`;
432
+ }
433
+ else if (!parsedBody.isGraphQL && parsedBody.bodyPreview) {
434
+ operationInfo = `<div class="operation-info">${escapeHtml(parsedBody.bodyPreview)}</div>`;
435
+ }
436
+ }
437
+ return `<div class="network-item" data-id="${requestId}">
438
+ <div class="network-entry" onclick="toggleNetworkItem(this)">
439
+ <span class="method ${req.method}">${req.method}</span>
440
+ <span class="status ${statusClass}">${req.status || '-'}</span>
441
+ <div class="url-cell">
442
+ <span class="url" title="${url}">${url}</span>
443
+ ${operationInfo}
444
+ </div>
445
+ <span class="duration">${duration}</span>
446
+ <span class="expand-icon">▶</span>
447
+ </div>
448
+ <div class="network-details">
449
+ ${details.join('')}
450
+ </div>
451
+ </div>`;
452
+ }).join('');
453
+ return htmlTemplate('Network', `
454
+ <h1>Network Requests <span style="color: #8b949e; font-weight: normal;">(${requests.length})</span></h1>
455
+ <div style="background: #161b22; border: 1px solid #30363d; border-radius: 8px; overflow: hidden;">${requestsHtml}</div>
456
+ `);
457
+ }
458
+ function renderApps() {
459
+ const apps = Array.from(connectedApps.entries()).map(([id, app]) => ({
460
+ id,
461
+ deviceInfo: app.deviceInfo,
462
+ port: app.port,
463
+ connected: app.ws.readyState === 1
464
+ }));
465
+ if (apps.length === 0) {
466
+ return htmlTemplate('Apps', '<div class="empty">No apps connected. Use scan_metro to connect to a running Metro server.</div>');
467
+ }
468
+ const appsHtml = apps.map(app => `
469
+ <div class="app-card">
470
+ <h3>${escapeHtml(app.deviceInfo.title)}</h3>
471
+ <span class="app-status ${app.connected ? 'connected' : 'disconnected'}">
472
+ ${app.connected ? 'Connected' : 'Disconnected'}
473
+ </span>
474
+ <div class="app-detail">Device: ${escapeHtml(app.deviceInfo.deviceName)}</div>
475
+ <div class="app-detail">Metro Port: ${app.port}</div>
476
+ <div class="app-detail">ID: ${escapeHtml(app.id)}</div>
477
+ </div>
478
+ `).join('');
479
+ return htmlTemplate('Apps', `
480
+ <h1>Connected Apps</h1>
481
+ ${appsHtml}
482
+ `);
483
+ }
484
+ function createRequestHandler() {
485
+ return (req, res) => {
486
+ // Set CORS headers for browser access
487
+ res.setHeader("Access-Control-Allow-Origin", "*");
488
+ res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
489
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
490
+ if (req.method === "OPTIONS") {
491
+ res.statusCode = 204;
492
+ res.end();
493
+ return;
494
+ }
495
+ const url = (req.url ?? "/").split('?')[0]; // Remove query params
496
+ try {
497
+ // HTML endpoints
498
+ if (url === "/") {
499
+ res.setHeader("Content-Type", "text/html");
500
+ res.end(renderDashboard());
501
+ return;
502
+ }
503
+ if (url === "/logs") {
504
+ res.setHeader("Content-Type", "text/html");
505
+ res.end(renderLogs());
506
+ return;
507
+ }
508
+ if (url === "/network") {
509
+ res.setHeader("Content-Type", "text/html");
510
+ res.end(renderNetwork());
511
+ return;
512
+ }
513
+ if (url === "/apps") {
514
+ res.setHeader("Content-Type", "text/html");
515
+ res.end(renderApps());
516
+ return;
517
+ }
518
+ // JSON API endpoints
519
+ res.setHeader("Content-Type", "application/json");
520
+ if (url === "/api/logs" || url === "/api/logs/") {
521
+ const logs = logBuffer.getAll();
522
+ res.end(JSON.stringify({ count: logs.length, logs }, null, 2));
523
+ }
524
+ else if (url === "/api/network" || url === "/api/network/") {
525
+ const requests = networkBuffer.getAll({});
526
+ res.end(JSON.stringify({ count: requests.length, requests }, null, 2));
527
+ }
528
+ else if (url === "/api/bundle-errors" || url === "/api/bundle-errors/") {
529
+ const errors = bundleErrorBuffer.get();
530
+ const status = bundleErrorBuffer.getStatus();
531
+ res.end(JSON.stringify({ status, count: errors.length, errors }, null, 2));
532
+ }
533
+ else if (url === "/api/apps" || url === "/api/apps/") {
534
+ const apps = Array.from(connectedApps.entries()).map(([id, app]) => ({
535
+ id,
536
+ deviceInfo: app.deviceInfo,
537
+ port: app.port,
538
+ connected: app.ws.readyState === 1 // WebSocket.OPEN
539
+ }));
540
+ res.end(JSON.stringify({ count: apps.length, apps }, null, 2));
541
+ }
542
+ else if (url === "/api/status" || url === "/api/status/") {
543
+ const status = {
544
+ logs: logBuffer.size,
545
+ networkRequests: networkBuffer.size,
546
+ bundleErrors: bundleErrorBuffer.get().length,
547
+ connectedApps: connectedApps.size,
548
+ bundleStatus: bundleErrorBuffer.getStatus()
549
+ };
550
+ res.end(JSON.stringify(status, null, 2));
551
+ }
552
+ else if (url === "/api" || url === "/api/") {
553
+ const endpoints = {
554
+ message: "React Native AI Debugger - Debug HTTP Server",
555
+ html: {
556
+ "/": "Dashboard",
557
+ "/logs": "Console logs (colored)",
558
+ "/network": "Network requests",
559
+ "/apps": "Connected apps"
560
+ },
561
+ api: {
562
+ "/api/status": "Overall server status and buffer sizes",
563
+ "/api/logs": "All captured console logs (JSON)",
564
+ "/api/network": "All captured network requests (JSON)",
565
+ "/api/bundle-errors": "Metro bundle/compilation errors (JSON)",
566
+ "/api/apps": "Connected React Native apps (JSON)"
567
+ }
568
+ };
569
+ res.end(JSON.stringify(endpoints, null, 2));
570
+ }
571
+ else {
572
+ res.statusCode = 404;
573
+ res.end(JSON.stringify({ error: "Not found", path: url }));
574
+ }
575
+ }
576
+ catch (error) {
577
+ res.statusCode = 500;
578
+ res.end(JSON.stringify({ error: String(error) }));
579
+ }
580
+ };
581
+ }
582
+ function tryListenOnPort(server, port) {
583
+ return new Promise((resolve, reject) => {
584
+ const onError = (err) => {
585
+ server.removeListener("error", onError);
586
+ if (err.code === "EADDRINUSE") {
587
+ reject(new Error(`Port ${port} in use`));
588
+ }
589
+ else {
590
+ reject(err);
591
+ }
592
+ };
593
+ server.once("error", onError);
594
+ server.listen(port, () => {
595
+ server.removeListener("error", onError);
596
+ resolve(port);
597
+ });
598
+ });
599
+ }
600
+ /**
601
+ * Start a debug HTTP server to expose buffer contents.
602
+ * Automatically finds an available port starting from the default.
603
+ */
604
+ export async function startDebugHttpServer(options = {}) {
605
+ const startPort = options.port ?? DEFAULT_HTTP_PORT;
606
+ const server = createServer(createRequestHandler());
607
+ for (let attempt = 0; attempt < MAX_PORT_ATTEMPTS; attempt++) {
608
+ const port = startPort + attempt;
609
+ try {
610
+ await tryListenOnPort(server, port);
611
+ activeDebugServerPort = port;
612
+ console.error(`[rn-ai-debugger] Debug HTTP server running on http://localhost:${port}`);
613
+ return port;
614
+ }
615
+ catch {
616
+ // Port in use, try next one
617
+ }
618
+ }
619
+ console.error(`[rn-ai-debugger] Could not find available port for debug HTTP server (tried ${startPort}-${startPort + MAX_PORT_ATTEMPTS - 1})`);
620
+ return null;
621
+ }
622
+ //# sourceMappingURL=httpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpServer.js","sourceRoot":"","sources":["../../src/core/httpServer.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ export { COMMON_PORTS, isPortOpen, scanMetroPorts, fetchDevices, selectMainDevic
6
6
  export { formatRemoteObject, handleCDPMessage, connectToDevice, getConnectedApps, getFirstConnectedApp, hasConnectedApp } from "./connection.js";
7
7
  export { executeInApp, listDebugGlobals, inspectGlobal, reloadApp } from "./executor.js";
8
8
  export { isAdbAvailable, listAndroidDevices, getDefaultAndroidDevice, androidScreenshot, androidInstallApp, androidLaunchApp, androidListPackages, ANDROID_KEY_EVENTS, androidTap, androidLongPress, androidSwipe, androidInputText, androidKeyEvent, androidGetScreenSize } from "./android.js";
9
- export { isSimctlAvailable, listIOSSimulators, getBootedSimulatorUdid, iosScreenshot, iosInstallApp, iosLaunchApp, iosOpenUrl, iosTerminateApp, iosBootSimulator } from "./ios.js";
9
+ export { isSimctlAvailable, listIOSSimulators, getBootedSimulatorUdid, iosScreenshot, iosInstallApp, iosLaunchApp, iosOpenUrl, iosTerminateApp, iosBootSimulator, isIdbAvailable, iosTap, iosTapElement, iosSwipe, iosInputText, iosButton, iosKeyEvent, iosKeySequence, iosDescribeAll, iosDescribePoint, IOS_BUTTON_TYPES } from "./ios.js";
10
+ export type { iOSButtonType, iOSAccessibilityElement, iOSDescribeResult } from "./ios.js";
10
11
  export { BundleErrorBuffer, parseMetroError, formatBundleError, formatBundleErrors, connectMetroBuildEvents, disconnectMetroBuildEvents, isConnectedToMetroBuildEvents, fetchBundleStatus, getBundleErrors, getBundleStatusWithErrors } from "./bundle.js";
12
+ export { startDebugHttpServer, getDebugServerPort } from "./httpServer.js";
11
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG7H,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvF,OAAO,EACH,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACH,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGzF,OAAO,EACH,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EAEnB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACvB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACH,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,eAAe,EACf,gBAAgB,EACnB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACH,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EAC5B,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG7H,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvF,OAAO,EACH,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EAClB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACH,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGzF,OAAO,EACH,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EAEnB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACvB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEH,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,eAAe,EACf,gBAAgB,EAEhB,cAAc,EACd,MAAM,EACN,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,WAAW,EACX,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EACnB,MAAM,UAAU,CAAC;AAGlB,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG1F,OAAO,EACH,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EAC5B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}