@blitzdev/iphone-mcp 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +219 -0
- package/dist/child-env.d.ts +1 -0
- package/dist/child-env.js +61 -0
- package/dist/child-env.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +318 -0
- package/dist/cli.js.map +1 -0
- package/dist/device-client.d.ts +2 -0
- package/dist/device-client.js +15 -0
- package/dist/device-client.js.map +1 -0
- package/dist/execution-context.d.ts +33 -0
- package/dist/execution-context.js +66 -0
- package/dist/execution-context.js.map +1 -0
- package/dist/idb/ax-scan-client.d.ts +27 -0
- package/dist/idb/ax-scan-client.js +244 -0
- package/dist/idb/ax-scan-client.js.map +1 -0
- package/dist/idb/idb-client.d.ts +34 -0
- package/dist/idb/idb-client.js +288 -0
- package/dist/idb/idb-client.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.js +6 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp-server.d.ts +2 -0
- package/dist/mcp-server.js +649 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/ui-filters.d.ts +11 -0
- package/dist/ui-filters.js +100 -0
- package/dist/ui-filters.js.map +1 -0
- package/dist/viewer/server.d.ts +5 -0
- package/dist/viewer/server.js +233 -0
- package/dist/viewer/server.js.map +1 -0
- package/dist/wda/device-discovery.d.ts +12 -0
- package/dist/wda/device-discovery.js +91 -0
- package/dist/wda/device-discovery.js.map +1 -0
- package/dist/wda/wda-client.d.ts +38 -0
- package/dist/wda/wda-client.js +314 -0
- package/dist/wda/wda-client.js.map +1 -0
- package/dist/wda/wda-manager.d.ts +29 -0
- package/dist/wda/wda-manager.js +263 -0
- package/dist/wda/wda-manager.js.map +1 -0
- package/dist/wda/wda-scan.d.ts +3 -0
- package/dist/wda/wda-scan.js +41 -0
- package/dist/wda/wda-scan.js.map +1 -0
- package/package.json +40 -0
- package/src/idb/ax-scan/Makefile +30 -0
- package/src/idb/ax-scan/ax-scan.m +168 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export type ButtonType = 'HOME' | 'LOCK' | 'SIDE_BUTTON' | 'APPLE_PAY' | 'SIRI';
|
|
2
|
+
export interface DeviceActionMap {
|
|
3
|
+
tap: {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
duration?: number;
|
|
7
|
+
};
|
|
8
|
+
swipe: {
|
|
9
|
+
fromX: number;
|
|
10
|
+
fromY: number;
|
|
11
|
+
toX: number;
|
|
12
|
+
toY: number;
|
|
13
|
+
duration?: number;
|
|
14
|
+
delta?: number;
|
|
15
|
+
};
|
|
16
|
+
button: {
|
|
17
|
+
button: ButtonType;
|
|
18
|
+
duration?: number;
|
|
19
|
+
};
|
|
20
|
+
'input-text': {
|
|
21
|
+
text: string;
|
|
22
|
+
};
|
|
23
|
+
key: {
|
|
24
|
+
key: number | string;
|
|
25
|
+
duration?: number;
|
|
26
|
+
};
|
|
27
|
+
'key-sequence': {
|
|
28
|
+
keySequence: (number | string)[];
|
|
29
|
+
};
|
|
30
|
+
'describe-all': {
|
|
31
|
+
nested?: boolean;
|
|
32
|
+
};
|
|
33
|
+
'describe-point': {
|
|
34
|
+
x: number;
|
|
35
|
+
y: number;
|
|
36
|
+
nested?: boolean;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export type DeviceAction = keyof DeviceActionMap;
|
|
40
|
+
export interface DeviceClient {
|
|
41
|
+
tap(x: number, y: number, duration?: number): Promise<void>;
|
|
42
|
+
swipe(fromX: number, fromY: number, toX: number, toY: number, duration?: number, delta?: number): Promise<void>;
|
|
43
|
+
pressButton(button: ButtonType, duration?: number): Promise<void>;
|
|
44
|
+
inputText(text: string): Promise<void>;
|
|
45
|
+
pressKey(key: number | string, duration?: number): Promise<void>;
|
|
46
|
+
pressKeySequence(keySequence: (number | string)[]): Promise<void>;
|
|
47
|
+
describeAll(nested?: boolean): Promise<unknown>;
|
|
48
|
+
describePoint(x: number, y: number, nested?: boolean): Promise<unknown>;
|
|
49
|
+
screenshot(): Promise<Buffer>;
|
|
50
|
+
}
|
|
51
|
+
export declare function isPhysicalDeviceUdid(udid: string): boolean;
|
|
52
|
+
export interface UIElement {
|
|
53
|
+
type?: string;
|
|
54
|
+
AXLabel?: string | null;
|
|
55
|
+
label?: string | null;
|
|
56
|
+
title?: string | null;
|
|
57
|
+
name?: string | null;
|
|
58
|
+
AXValue?: string | null;
|
|
59
|
+
value?: string | null;
|
|
60
|
+
frame?: {
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
width: number;
|
|
64
|
+
height: number;
|
|
65
|
+
};
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
}
|
|
68
|
+
export type ScanRegion = 'full' | 'top-half' | 'bottom-half' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
|
|
69
|
+
export interface ScanCommand {
|
|
70
|
+
grid_step: number;
|
|
71
|
+
x_start: number;
|
|
72
|
+
y_start: number;
|
|
73
|
+
x_end: number;
|
|
74
|
+
y_end: number;
|
|
75
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const SIMULATOR_UUID_RE = /^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/;
|
|
2
|
+
export function isPhysicalDeviceUdid(udid) {
|
|
3
|
+
if (udid === 'booted')
|
|
4
|
+
return false;
|
|
5
|
+
return !SIMULATOR_UUID_RE.test(udid);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA2BA,MAAM,iBAAiB,GAAG,+EAA+E,CAAA;AAEzG,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACnC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { UIElement } from './types.js';
|
|
2
|
+
export declare function filterUnlabeledOther(elements: UIElement[]): UIElement[];
|
|
3
|
+
export declare function filterVisibleCoords(elements: UIElement[], screenWidth: number, screenHeight: number): UIElement[];
|
|
4
|
+
export declare function filterInteractiveTypes(elements: UIElement[]): UIElement[];
|
|
5
|
+
export declare function dedup(elements: UIElement[]): UIElement[];
|
|
6
|
+
export interface ScanResult {
|
|
7
|
+
elements: UIElement[];
|
|
8
|
+
warning?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function applyScanUiFilters(rawElements: UIElement[], screenWidth: number, screenHeight: number, query?: string): ScanResult;
|
|
11
|
+
export declare function applyDescribeScreenFilters(rawElements: UIElement[], screenWidth: number, screenHeight: number): UIElement[];
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const INTERACTIVE_TYPES = new Set([
|
|
2
|
+
'Button', 'Link', 'TextField', 'SecureTextField', 'TextView',
|
|
3
|
+
'SearchField', 'Switch', 'TabBar', 'Icon', 'Cell',
|
|
4
|
+
'Slider', 'Toggle', 'Picker', 'SegmentedControl', 'Stepper',
|
|
5
|
+
'MenuItem', 'MenuBarItem', 'Tab',
|
|
6
|
+
]);
|
|
7
|
+
export function filterUnlabeledOther(elements) {
|
|
8
|
+
return elements.filter(el => el.type !== 'Other' || Boolean(el.AXLabel || el.label || el.title || el.name));
|
|
9
|
+
}
|
|
10
|
+
export function filterVisibleCoords(elements, screenWidth, screenHeight) {
|
|
11
|
+
return elements.filter(el => {
|
|
12
|
+
const f = el.frame;
|
|
13
|
+
if (!f)
|
|
14
|
+
return false;
|
|
15
|
+
const cx = f.x + f.width / 2;
|
|
16
|
+
const cy = f.y + f.height / 2;
|
|
17
|
+
return cx >= 0 && cx <= screenWidth && cy >= 0 && cy <= screenHeight;
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export function filterInteractiveTypes(elements) {
|
|
21
|
+
return elements.filter(el => el.type && INTERACTIVE_TYPES.has(el.type));
|
|
22
|
+
}
|
|
23
|
+
export function dedup(elements) {
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
return elements.filter(el => {
|
|
26
|
+
const label = el.AXLabel ?? el.label ?? el.title ?? '';
|
|
27
|
+
const f = el.frame;
|
|
28
|
+
const key = `${el.type}|${label}|${f?.x},${f?.y},${f?.width},${f?.height}`;
|
|
29
|
+
if (seen.has(key))
|
|
30
|
+
return false;
|
|
31
|
+
seen.add(key);
|
|
32
|
+
return true;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function escapeRegex(s) {
|
|
36
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
37
|
+
}
|
|
38
|
+
function elementMatchesQuery(el, re) {
|
|
39
|
+
const fields = [el.AXLabel, el.label, el.title, el.name, el.AXValue, el.value];
|
|
40
|
+
for (const f of fields) {
|
|
41
|
+
if (f && re.test(f))
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
function grepElements(elements, query) {
|
|
47
|
+
const re = new RegExp(escapeRegex(query), 'i');
|
|
48
|
+
return elements.filter(el => elementMatchesQuery(el, re));
|
|
49
|
+
}
|
|
50
|
+
export function applyScanUiFilters(rawElements, screenWidth, screenHeight, query) {
|
|
51
|
+
const base = dedup(filterUnlabeledOther(rawElements));
|
|
52
|
+
const visible = filterVisibleCoords(base, screenWidth, screenHeight);
|
|
53
|
+
const interactive = filterInteractiveTypes(base);
|
|
54
|
+
const visibleInteractive = filterInteractiveTypes(visible);
|
|
55
|
+
if (!query) {
|
|
56
|
+
return { elements: visibleInteractive };
|
|
57
|
+
}
|
|
58
|
+
const p1 = grepElements(visibleInteractive, query);
|
|
59
|
+
if (p1.length > 0)
|
|
60
|
+
return { elements: p1 };
|
|
61
|
+
const p2 = grepElements(interactive, query);
|
|
62
|
+
if (p2.length > 0) {
|
|
63
|
+
return {
|
|
64
|
+
elements: p2,
|
|
65
|
+
warning: `Matched ${p2.length} interactive element(s) but they may be off-screen. Scroll to bring them into view.`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const p3 = grepElements(visible, query);
|
|
69
|
+
if (p3.length > 0) {
|
|
70
|
+
const hasOversizedContainer = p3.some(el => {
|
|
71
|
+
if (el.type !== 'Other')
|
|
72
|
+
return false;
|
|
73
|
+
const f = el.frame;
|
|
74
|
+
if (!f)
|
|
75
|
+
return false;
|
|
76
|
+
return f.width > screenWidth * 0.8 && f.height > screenHeight * 0.4;
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
elements: p3,
|
|
80
|
+
warning: hasOversizedContainer
|
|
81
|
+
? `Matched element(s) contain "${query}" in their label but are large container elements. The exact tap target is somewhere within that frame; use coordinate guessing or describe_point to narrow it down.`
|
|
82
|
+
: undefined,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const p4 = grepElements(base, query);
|
|
86
|
+
if (p4.length > 0) {
|
|
87
|
+
return {
|
|
88
|
+
elements: p4,
|
|
89
|
+
warning: `No visible interactive match. Found ${p4.length} element(s) matching "${query}" — may be off-screen or non-interactive.`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
elements: visibleInteractive,
|
|
94
|
+
warning: `No elements matching "${query}" found. Returning all ${visibleInteractive.length} visible interactive elements instead.`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export function applyDescribeScreenFilters(rawElements, screenWidth, screenHeight) {
|
|
98
|
+
return filterVisibleCoords(filterUnlabeledOther(rawElements), screenWidth, screenHeight);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ui-filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-filters.js","sourceRoot":"","sources":["../src/ui-filters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
4
|
+
import { log } from '../logger.js';
|
|
5
|
+
import { getDeviceClient } from '../device-client.js';
|
|
6
|
+
const VIEWER_HTML = `<!DOCTYPE html>
|
|
7
|
+
<html>
|
|
8
|
+
<head>
|
|
9
|
+
<meta charset="utf-8">
|
|
10
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
11
|
+
<title>blitz-iphone-mcp viewer</title>
|
|
12
|
+
<style>
|
|
13
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
14
|
+
body { background: #1a1a1a; display: flex; justify-content: center; align-items: center; height: 100vh; font-family: system-ui; }
|
|
15
|
+
.device-frame {
|
|
16
|
+
background: #2C2B2C;
|
|
17
|
+
border-radius: 44px;
|
|
18
|
+
padding: 16px;
|
|
19
|
+
box-shadow: 0 20px 60px rgba(0,0,0,0.5), inset 0 1px 0 rgba(255,255,255,0.05);
|
|
20
|
+
}
|
|
21
|
+
.screen-container {
|
|
22
|
+
background: #000;
|
|
23
|
+
border-radius: 32px;
|
|
24
|
+
overflow: hidden;
|
|
25
|
+
position: relative;
|
|
26
|
+
}
|
|
27
|
+
canvas {
|
|
28
|
+
display: block;
|
|
29
|
+
width: 100%;
|
|
30
|
+
height: 100%;
|
|
31
|
+
}
|
|
32
|
+
.status {
|
|
33
|
+
position: fixed;
|
|
34
|
+
bottom: 16px;
|
|
35
|
+
left: 50%;
|
|
36
|
+
transform: translateX(-50%);
|
|
37
|
+
color: #666;
|
|
38
|
+
font-size: 12px;
|
|
39
|
+
}
|
|
40
|
+
.no-device {
|
|
41
|
+
color: #888;
|
|
42
|
+
text-align: center;
|
|
43
|
+
padding: 40px;
|
|
44
|
+
font-size: 14px;
|
|
45
|
+
}
|
|
46
|
+
</style>
|
|
47
|
+
</head>
|
|
48
|
+
<body>
|
|
49
|
+
<div id="root">
|
|
50
|
+
<div class="no-device" id="no-device">Connecting to device...</div>
|
|
51
|
+
</div>
|
|
52
|
+
<div class="status" id="status"></div>
|
|
53
|
+
<script>
|
|
54
|
+
const params = new URLSearchParams(location.search);
|
|
55
|
+
const udid = params.get('udid');
|
|
56
|
+
if (!udid) {
|
|
57
|
+
document.getElementById('no-device').textContent = 'No device UDID specified. Use ?udid=DEVICE_UDID';
|
|
58
|
+
} else {
|
|
59
|
+
const root = document.getElementById('root');
|
|
60
|
+
root.innerHTML = '';
|
|
61
|
+
const frame = document.createElement('div');
|
|
62
|
+
frame.className = 'device-frame';
|
|
63
|
+
const container = document.createElement('div');
|
|
64
|
+
container.className = 'screen-container';
|
|
65
|
+
const canvas = document.createElement('canvas');
|
|
66
|
+
container.appendChild(canvas);
|
|
67
|
+
frame.appendChild(container);
|
|
68
|
+
root.appendChild(frame);
|
|
69
|
+
|
|
70
|
+
const ctx = canvas.getContext('2d');
|
|
71
|
+
const status = document.getElementById('status');
|
|
72
|
+
let frameCount = 0;
|
|
73
|
+
let lastFpsTime = Date.now();
|
|
74
|
+
|
|
75
|
+
const wsProto = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
76
|
+
const ws = new WebSocket(wsProto + '//' + location.host + '/stream/' + encodeURIComponent(udid));
|
|
77
|
+
ws.binaryType = 'arraybuffer';
|
|
78
|
+
|
|
79
|
+
ws.onopen = () => { status.textContent = 'Connected'; };
|
|
80
|
+
ws.onclose = () => { status.textContent = 'Disconnected'; };
|
|
81
|
+
ws.onerror = () => { status.textContent = 'Connection error'; };
|
|
82
|
+
|
|
83
|
+
ws.onmessage = (event) => {
|
|
84
|
+
const blob = new Blob([event.data], { type: 'image/png' });
|
|
85
|
+
const url = URL.createObjectURL(blob);
|
|
86
|
+
const img = new Image();
|
|
87
|
+
img.onload = () => {
|
|
88
|
+
if (canvas.width !== img.width || canvas.height !== img.height) {
|
|
89
|
+
canvas.width = img.width;
|
|
90
|
+
canvas.height = img.height;
|
|
91
|
+
const aspect = img.width / img.height;
|
|
92
|
+
const maxH = window.innerHeight - 100;
|
|
93
|
+
const h = Math.min(maxH, 800);
|
|
94
|
+
container.style.width = Math.round(h * aspect) + 'px';
|
|
95
|
+
container.style.height = h + 'px';
|
|
96
|
+
}
|
|
97
|
+
ctx.drawImage(img, 0, 0);
|
|
98
|
+
URL.revokeObjectURL(url);
|
|
99
|
+
frameCount++;
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
if (now - lastFpsTime >= 1000) {
|
|
102
|
+
status.textContent = frameCount + ' fps';
|
|
103
|
+
frameCount = 0;
|
|
104
|
+
lastFpsTime = now;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
img.src = url;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
</script>
|
|
111
|
+
</body>
|
|
112
|
+
</html>`;
|
|
113
|
+
const activeRelays = new Map();
|
|
114
|
+
const MAX_CONSECUTIVE_FAILURES = 10;
|
|
115
|
+
function startRelay(udid, client, ws) {
|
|
116
|
+
const existing = activeRelays.get(udid);
|
|
117
|
+
if (existing) {
|
|
118
|
+
existing.clients.add(ws);
|
|
119
|
+
log('ViewerRelay', 'log', `Client joined relay for ${udid} (${existing.clients.size} clients)`);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const clients = new Set([ws]);
|
|
123
|
+
let pending = false;
|
|
124
|
+
let consecutiveFailures = 0;
|
|
125
|
+
const intervalId = setInterval(async () => {
|
|
126
|
+
if (pending || clients.size === 0)
|
|
127
|
+
return;
|
|
128
|
+
pending = true;
|
|
129
|
+
try {
|
|
130
|
+
const pngBuffer = await client.screenshot();
|
|
131
|
+
consecutiveFailures = 0;
|
|
132
|
+
for (const c of clients) {
|
|
133
|
+
if (c.readyState === WebSocket.OPEN)
|
|
134
|
+
c.send(pngBuffer);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
consecutiveFailures++;
|
|
139
|
+
if (consecutiveFailures <= 3 || consecutiveFailures === MAX_CONSECUTIVE_FAILURES) {
|
|
140
|
+
log('ViewerRelay', 'warn', `Screenshot poll failed for ${udid} (${consecutiveFailures}/${MAX_CONSECUTIVE_FAILURES}): ${e}`);
|
|
141
|
+
}
|
|
142
|
+
if (consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {
|
|
143
|
+
log('ViewerRelay', 'warn', `Stopping relay for ${udid} after ${MAX_CONSECUTIVE_FAILURES} consecutive failures`);
|
|
144
|
+
for (const c of clients)
|
|
145
|
+
c.close(1011, 'WDA session lost');
|
|
146
|
+
clearInterval(intervalId);
|
|
147
|
+
activeRelays.delete(udid);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
pending = false;
|
|
152
|
+
}
|
|
153
|
+
}, 50);
|
|
154
|
+
activeRelays.set(udid, { clients, intervalId });
|
|
155
|
+
log('ViewerRelay', 'log', `Started relay for ${udid}`);
|
|
156
|
+
}
|
|
157
|
+
function removeClientFromRelay(udid, ws) {
|
|
158
|
+
const relay = activeRelays.get(udid);
|
|
159
|
+
if (!relay)
|
|
160
|
+
return;
|
|
161
|
+
relay.clients.delete(ws);
|
|
162
|
+
if (relay.clients.size === 0) {
|
|
163
|
+
clearInterval(relay.intervalId);
|
|
164
|
+
activeRelays.delete(udid);
|
|
165
|
+
log('ViewerRelay', 'log', `Stopped relay for ${udid} (no clients)`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export function createViewerServer() {
|
|
169
|
+
const app = express();
|
|
170
|
+
app.get('/', (_req, res) => {
|
|
171
|
+
res.type('html').send(VIEWER_HTML);
|
|
172
|
+
});
|
|
173
|
+
app.get('/health', (_req, res) => {
|
|
174
|
+
res.json({ ok: true });
|
|
175
|
+
});
|
|
176
|
+
const httpServer = createServer(app);
|
|
177
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
178
|
+
httpServer.on('upgrade', (req, socket, head) => {
|
|
179
|
+
const rawUrl = req.url ?? '';
|
|
180
|
+
let pathname = '';
|
|
181
|
+
try {
|
|
182
|
+
pathname = new URL(rawUrl, 'http://localhost').pathname;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const match = pathname.match(/^\/stream\/([^/]+)$/);
|
|
188
|
+
if (!match)
|
|
189
|
+
return;
|
|
190
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
191
|
+
wss.emit('connection', ws, req, match[1]);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
wss.on('connection', (ws, _req, udid) => {
|
|
195
|
+
const decodedUdid = decodeURIComponent(udid);
|
|
196
|
+
log('ViewerRelay', 'log', `WS connected for device ${decodedUdid}`);
|
|
197
|
+
void (async () => {
|
|
198
|
+
try {
|
|
199
|
+
const client = await getDeviceClient(decodedUdid);
|
|
200
|
+
startRelay(decodedUdid, client, ws);
|
|
201
|
+
ws.on('close', () => removeClientFromRelay(decodedUdid, ws));
|
|
202
|
+
ws.on('error', () => removeClientFromRelay(decodedUdid, ws));
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
log('ViewerRelay', 'error', `Failed to start relay for ${decodedUdid}: ${e}`);
|
|
206
|
+
ws.close(1011, 'Failed to connect to device');
|
|
207
|
+
}
|
|
208
|
+
})();
|
|
209
|
+
});
|
|
210
|
+
const start = (port) => {
|
|
211
|
+
return new Promise((resolve, reject) => {
|
|
212
|
+
const tryPort = (p) => {
|
|
213
|
+
httpServer.once('error', (err) => {
|
|
214
|
+
if (err.code === 'EADDRINUSE' && p < port + 50) {
|
|
215
|
+
tryPort(p + 1);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
reject(err);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
httpServer.listen(p, () => {
|
|
222
|
+
const addr = httpServer.address();
|
|
223
|
+
const boundPort = typeof addr === 'object' && addr ? addr.port : p;
|
|
224
|
+
log('Viewer', 'log', `Viewer server listening on http://localhost:${boundPort}`);
|
|
225
|
+
resolve(boundPort);
|
|
226
|
+
});
|
|
227
|
+
};
|
|
228
|
+
tryPort(port);
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
return { server: httpServer, start };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface PhysicalDevice {
|
|
2
|
+
udid: string;
|
|
3
|
+
name: string;
|
|
4
|
+
model: string;
|
|
5
|
+
connectionType: 'usb' | 'wifi' | 'both';
|
|
6
|
+
paired: boolean;
|
|
7
|
+
developerModeEnabled: boolean;
|
|
8
|
+
wdaInstalled: boolean;
|
|
9
|
+
wdaRunning: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function listPhysicalDevices(): Promise<PhysicalDevice[]>;
|
|
12
|
+
export declare function getPhysicalDevice(udid: string): Promise<PhysicalDevice | null>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { exec } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { log } from '../logger.js';
|
|
4
|
+
import { childEnv } from '../child-env.js';
|
|
5
|
+
import { WDAClient } from './wda-client.js';
|
|
6
|
+
const execAsync = promisify(exec);
|
|
7
|
+
export async function listPhysicalDevices() {
|
|
8
|
+
const devices = new Map();
|
|
9
|
+
try {
|
|
10
|
+
const { stdout } = await execAsync('xcrun devicectl list devices --json-output /dev/stdout 2>/dev/null', { env: childEnv() });
|
|
11
|
+
const jsonStart = stdout.indexOf('{');
|
|
12
|
+
if (jsonStart < 0)
|
|
13
|
+
throw new Error('No JSON in devicectl output');
|
|
14
|
+
const json = JSON.parse(stdout.substring(jsonStart));
|
|
15
|
+
const deviceList = json?.result?.devices ?? [];
|
|
16
|
+
for (const d of deviceList) {
|
|
17
|
+
const udid = d.hardwareProperties?.udid ?? d.identifier;
|
|
18
|
+
if (!udid)
|
|
19
|
+
continue;
|
|
20
|
+
if (d.connectionProperties?.transportType === 'localNetwork' && !d.hardwareProperties?.platform?.includes('iOS')) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const connectionType = d.connectionProperties?.transportType === 'wired' ? 'usb'
|
|
24
|
+
: d.connectionProperties?.transportType === 'localNetwork' ? 'wifi'
|
|
25
|
+
: 'usb';
|
|
26
|
+
devices.set(udid, {
|
|
27
|
+
udid,
|
|
28
|
+
name: d.deviceProperties?.name ?? 'iPhone',
|
|
29
|
+
model: d.hardwareProperties?.marketingName ?? d.hardwareProperties?.productType ?? 'iPhone',
|
|
30
|
+
connectionType,
|
|
31
|
+
paired: true,
|
|
32
|
+
developerModeEnabled: d.deviceProperties?.developerModeStatus === 'enabled',
|
|
33
|
+
wdaInstalled: false,
|
|
34
|
+
wdaRunning: false,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
log('DeviceDiscovery', 'log', 'xcrun devicectl not available, falling back to system_profiler');
|
|
40
|
+
}
|
|
41
|
+
if (devices.size === 0) {
|
|
42
|
+
try {
|
|
43
|
+
const { stdout } = await execAsync('system_profiler SPUSBDataType -json 2>/dev/null', { env: childEnv() });
|
|
44
|
+
const json = JSON.parse(stdout);
|
|
45
|
+
const usbItems = json?.SPUSBDataType ?? [];
|
|
46
|
+
const findIPhones = (items) => {
|
|
47
|
+
for (const item of items) {
|
|
48
|
+
const name = item._name;
|
|
49
|
+
const serial = item.serial_num;
|
|
50
|
+
if (name && serial && (name.includes('iPhone') || name.includes('iPad'))) {
|
|
51
|
+
devices.set(serial, {
|
|
52
|
+
udid: serial,
|
|
53
|
+
name,
|
|
54
|
+
model: name,
|
|
55
|
+
connectionType: 'usb',
|
|
56
|
+
paired: true,
|
|
57
|
+
developerModeEnabled: true,
|
|
58
|
+
wdaInstalled: false,
|
|
59
|
+
wdaRunning: false,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (item._items && Array.isArray(item._items)) {
|
|
63
|
+
findIPhones(item._items);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
findIPhones(usbItems);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
log('DeviceDiscovery', 'log', 'system_profiler fallback also failed');
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const deviceList = Array.from(devices.values());
|
|
74
|
+
await Promise.all(deviceList.map(async (device) => {
|
|
75
|
+
try {
|
|
76
|
+
const client = WDAClient.getInstance(device.udid);
|
|
77
|
+
const running = await client.isReachable();
|
|
78
|
+
device.wdaRunning = running;
|
|
79
|
+
device.wdaInstalled = running;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// WDA not reachable
|
|
83
|
+
}
|
|
84
|
+
}));
|
|
85
|
+
return deviceList;
|
|
86
|
+
}
|
|
87
|
+
export async function getPhysicalDevice(udid) {
|
|
88
|
+
const devices = await listPhysicalDevices();
|
|
89
|
+
return devices.find(d => d.udid === udid) ?? null;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=device-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-discovery.js","sourceRoot":"","sources":["../../src/wda/device-discovery.ts"],"names":[],"mappings":"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"}
|