appium-ios-remotexpc 2.4.0 → 3.0.0
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/CHANGELOG.md +14 -0
- package/build/src/base-plist-service.d.ts +1 -1
- package/build/src/base-plist-service.d.ts.map +1 -1
- package/build/src/base-socket-service.d.ts +1 -1
- package/build/src/base-socket-service.d.ts.map +1 -1
- package/build/src/index.d.ts +3 -3
- package/build/src/index.d.ts.map +1 -1
- package/build/src/index.js +3 -3
- package/build/src/index.js.map +1 -1
- package/build/src/lib/lockdown/index.d.ts.map +1 -1
- package/build/src/lib/lockdown/index.js +3 -13
- package/build/src/lib/lockdown/index.js.map +1 -1
- package/build/src/lib/plist/plist-parser.js.map +1 -1
- package/build/src/lib/plist/plist-service.d.ts +2 -2
- package/build/src/lib/plist/plist-service.d.ts.map +1 -1
- package/build/src/lib/port-forwarding/connectors.d.ts +3 -4
- package/build/src/lib/port-forwarding/connectors.d.ts.map +1 -1
- package/build/src/lib/port-forwarding/connectors.js +13 -5
- package/build/src/lib/port-forwarding/connectors.js.map +1 -1
- package/build/src/lib/remote-xpc/handshake.d.ts +1 -1
- package/build/src/lib/remote-xpc/handshake.d.ts.map +1 -1
- package/build/src/lib/tunnel/constants.d.ts +2 -0
- package/build/src/lib/tunnel/constants.d.ts.map +1 -1
- package/build/src/lib/tunnel/constants.js +2 -0
- package/build/src/lib/tunnel/constants.js.map +1 -1
- package/build/src/lib/tunnel/index.d.ts +2 -10
- package/build/src/lib/tunnel/index.d.ts.map +1 -1
- package/build/src/lib/tunnel/index.js +2 -55
- package/build/src/lib/tunnel/index.js.map +1 -1
- package/build/src/lib/tunnel/tunnel-api-client.d.ts +11 -3
- package/build/src/lib/tunnel/tunnel-api-client.d.ts.map +1 -1
- package/build/src/lib/tunnel/tunnel-api-client.js +40 -19
- package/build/src/lib/tunnel/tunnel-api-client.js.map +1 -1
- package/build/src/lib/tunnel/tunnel-availability.d.ts +15 -7
- package/build/src/lib/tunnel/tunnel-availability.d.ts.map +1 -1
- package/build/src/lib/tunnel/tunnel-availability.js +27 -34
- package/build/src/lib/tunnel/tunnel-availability.js.map +1 -1
- package/build/src/lib/tunnel/tunnel-readiness.d.ts +18 -0
- package/build/src/lib/tunnel/tunnel-readiness.d.ts.map +1 -0
- package/build/src/lib/tunnel/tunnel-readiness.js +70 -0
- package/build/src/lib/tunnel/tunnel-readiness.js.map +1 -0
- package/build/src/lib/tunnel/tunnel-registry-server.d.ts +23 -4
- package/build/src/lib/tunnel/tunnel-registry-server.d.ts.map +1 -1
- package/build/src/lib/tunnel/tunnel-registry-server.js +100 -10
- package/build/src/lib/tunnel/tunnel-registry-server.js.map +1 -1
- package/build/src/lib/tunnel/tunnel-rsd-discovery.d.ts +10 -0
- package/build/src/lib/tunnel/tunnel-rsd-discovery.d.ts.map +1 -0
- package/build/src/lib/tunnel/tunnel-rsd-discovery.js +44 -0
- package/build/src/lib/tunnel/tunnel-rsd-discovery.js.map +1 -0
- package/build/src/lib/tunnel/tunnel-service-resolver.d.ts +24 -0
- package/build/src/lib/tunnel/tunnel-service-resolver.d.ts.map +1 -0
- package/build/src/lib/tunnel/tunnel-service-resolver.js +65 -0
- package/build/src/lib/tunnel/tunnel-service-resolver.js.map +1 -0
- package/build/src/lib/types.d.ts +19 -11
- package/build/src/lib/types.d.ts.map +1 -1
- package/build/src/lib/usbmux/index.d.ts +1 -1
- package/build/src/lib/usbmux/index.d.ts.map +1 -1
- package/build/src/lib/usbmux/index.js +1 -1
- package/build/src/lib/usbmux/index.js.map +1 -1
- package/build/src/services/ios/afc/codec.d.ts +1 -1
- package/build/src/services/ios/afc/codec.d.ts.map +1 -1
- package/build/src/services/ios/afc/codec.js.map +1 -1
- package/build/src/services/ios/afc/constants.d.ts.map +1 -1
- package/build/src/services/ios/afc/constants.js +2 -3
- package/build/src/services/ios/afc/constants.js.map +1 -1
- package/build/src/services/ios/afc/demux.d.ts.map +1 -1
- package/build/src/services/ios/afc/demux.js +1 -0
- package/build/src/services/ios/afc/demux.js.map +1 -1
- package/build/src/services/ios/afc/enums.d.ts +16 -1
- package/build/src/services/ios/afc/enums.d.ts.map +1 -1
- package/build/src/services/ios/afc/enums.js +15 -0
- package/build/src/services/ios/afc/enums.js.map +1 -1
- package/build/src/services/ios/afc/index.d.ts +6 -8
- package/build/src/services/ios/afc/index.d.ts.map +1 -1
- package/build/src/services/ios/afc/index.js +19 -15
- package/build/src/services/ios/afc/index.js.map +1 -1
- package/build/src/services/ios/afc/stream-utils.d.ts.map +1 -1
- package/build/src/services/ios/afc/stream-utils.js +34 -20
- package/build/src/services/ios/afc/stream-utils.js.map +1 -1
- package/build/src/services/ios/base-service.d.ts +6 -11
- package/build/src/services/ios/base-service.d.ts.map +1 -1
- package/build/src/services/ios/base-service.js +16 -16
- package/build/src/services/ios/base-service.js.map +1 -1
- package/build/src/services/ios/crash-reports/index.d.ts +3 -9
- package/build/src/services/ios/crash-reports/index.d.ts.map +1 -1
- package/build/src/services/ios/crash-reports/index.js +8 -13
- package/build/src/services/ios/crash-reports/index.js.map +1 -1
- package/build/src/services/ios/diagnostic-service/index.d.ts +0 -2
- package/build/src/services/ios/diagnostic-service/index.d.ts.map +1 -1
- package/build/src/services/ios/diagnostic-service/index.js +1 -10
- package/build/src/services/ios/diagnostic-service/index.js.map +1 -1
- package/build/src/services/ios/dvt/index.d.ts +1 -1
- package/build/src/services/ios/dvt/index.d.ts.map +1 -1
- package/build/src/services/ios/dvt/index.js +3 -7
- package/build/src/services/ios/dvt/index.js.map +1 -1
- package/build/src/services/ios/dvt/instruments/device-info.d.ts +2 -0
- package/build/src/services/ios/dvt/instruments/device-info.d.ts.map +1 -1
- package/build/src/services/ios/dvt/instruments/device-info.js +15 -2
- package/build/src/services/ios/dvt/instruments/device-info.js.map +1 -1
- package/build/src/services/ios/house-arrest/index.d.ts +0 -1
- package/build/src/services/ios/house-arrest/index.d.ts.map +1 -1
- package/build/src/services/ios/house-arrest/index.js +1 -8
- package/build/src/services/ios/house-arrest/index.js.map +1 -1
- package/build/src/services/ios/installation-proxy/index.d.ts +1 -1
- package/build/src/services/ios/installation-proxy/index.d.ts.map +1 -1
- package/build/src/services/ios/installation-proxy/index.js +3 -7
- package/build/src/services/ios/installation-proxy/index.js.map +1 -1
- package/build/src/services/ios/misagent/index.d.ts +1 -2
- package/build/src/services/ios/misagent/index.d.ts.map +1 -1
- package/build/src/services/ios/misagent/index.js +1 -8
- package/build/src/services/ios/misagent/index.js.map +1 -1
- package/build/src/services/ios/mobile-config/index.d.ts +1 -3
- package/build/src/services/ios/mobile-config/index.d.ts.map +1 -1
- package/build/src/services/ios/mobile-config/index.js +1 -11
- package/build/src/services/ios/mobile-config/index.js.map +1 -1
- package/build/src/services/ios/mobile-image-mounter/index.d.ts +0 -1
- package/build/src/services/ios/mobile-image-mounter/index.d.ts.map +1 -1
- package/build/src/services/ios/mobile-image-mounter/index.js +1 -7
- package/build/src/services/ios/mobile-image-mounter/index.js.map +1 -1
- package/build/src/services/ios/notification-proxy/index.d.ts +2 -3
- package/build/src/services/ios/notification-proxy/index.d.ts.map +1 -1
- package/build/src/services/ios/notification-proxy/index.js +3 -11
- package/build/src/services/ios/notification-proxy/index.js.map +1 -1
- package/build/src/services/ios/power-assertion/index.d.ts.map +1 -1
- package/build/src/services/ios/power-assertion/index.js +2 -6
- package/build/src/services/ios/power-assertion/index.js.map +1 -1
- package/build/src/services/ios/springboard-service/index.d.ts +1 -3
- package/build/src/services/ios/springboard-service/index.d.ts.map +1 -1
- package/build/src/services/ios/springboard-service/index.js +1 -11
- package/build/src/services/ios/springboard-service/index.js.map +1 -1
- package/build/src/services/ios/syslog-service/index.d.ts +3 -2
- package/build/src/services/ios/syslog-service/index.d.ts.map +1 -1
- package/build/src/services/ios/syslog-service/index.js +7 -5
- package/build/src/services/ios/syslog-service/index.js.map +1 -1
- package/build/src/services/ios/testmanagerd/index.d.ts +1 -1
- package/build/src/services/ios/testmanagerd/index.d.ts.map +1 -1
- package/build/src/services/ios/testmanagerd/index.js +3 -7
- package/build/src/services/ios/testmanagerd/index.js.map +1 -1
- package/build/src/services/ios/webinspector/index.d.ts +1 -1
- package/build/src/services/ios/webinspector/index.d.ts.map +1 -1
- package/build/src/services/ios/webinspector/index.js +3 -7
- package/build/src/services/ios/webinspector/index.js.map +1 -1
- package/build/src/services/ios/zipconduit/index.d.ts +2 -2
- package/build/src/services/ios/zipconduit/index.d.ts.map +1 -1
- package/build/src/services/ios/zipconduit/index.js +6 -4
- package/build/src/services/ios/zipconduit/index.js.map +1 -1
- package/build/src/services.d.ts +6 -27
- package/build/src/services.d.ts.map +1 -1
- package/build/src/services.js +67 -199
- package/build/src/services.js.map +1 -1
- package/package.json +2 -1
- package/scripts/start-appletv-tunnel.mjs +93 -44
- package/scripts/tunnel-creation.mjs +121 -101
- package/src/base-plist-service.ts +1 -1
- package/src/base-socket-service.ts +1 -1
- package/src/index.ts +11 -3
- package/src/lib/lockdown/index.ts +7 -15
- package/src/lib/plist/plist-parser.ts +1 -1
- package/src/lib/plist/plist-service.ts +2 -2
- package/src/lib/port-forwarding/connectors.ts +22 -7
- package/src/lib/remote-xpc/handshake.ts +1 -1
- package/src/lib/tunnel/constants.ts +3 -0
- package/src/lib/tunnel/index.ts +2 -84
- package/src/lib/tunnel/tunnel-api-client.ts +62 -24
- package/src/lib/tunnel/tunnel-availability.ts +37 -35
- package/src/lib/tunnel/tunnel-readiness.ts +82 -0
- package/src/lib/tunnel/tunnel-registry-server.ts +132 -9
- package/src/lib/tunnel/tunnel-rsd-discovery.ts +59 -0
- package/src/lib/tunnel/tunnel-service-resolver.ts +112 -0
- package/src/lib/types.ts +18 -11
- package/src/lib/usbmux/index.ts +6 -1
- package/src/services/ios/afc/codec.ts +1 -1
- package/src/services/ios/afc/constants.ts +2 -3
- package/src/services/ios/afc/demux.ts +1 -0
- package/src/services/ios/afc/enums.ts +15 -0
- package/src/services/ios/afc/index.ts +32 -14
- package/src/services/ios/afc/stream-utils.ts +40 -24
- package/src/services/ios/base-service.ts +23 -16
- package/src/services/ios/crash-reports/index.ts +17 -18
- package/src/services/ios/diagnostic-service/index.ts +3 -12
- package/src/services/ios/dvt/index.ts +7 -10
- package/src/services/ios/dvt/instruments/device-info.ts +27 -2
- package/src/services/ios/house-arrest/index.ts +3 -9
- package/src/services/ios/installation-proxy/index.ts +9 -11
- package/src/services/ios/misagent/index.ts +4 -10
- package/src/services/ios/mobile-config/index.ts +4 -16
- package/src/services/ios/mobile-image-mounter/index.ts +5 -10
- package/src/services/ios/notification-proxy/index.ts +7 -16
- package/src/services/ios/power-assertion/index.ts +4 -8
- package/src/services/ios/springboard-service/index.ts +4 -17
- package/src/services/ios/syslog-service/index.ts +10 -6
- package/src/services/ios/testmanagerd/index.ts +7 -10
- package/src/services/ios/testmanagerd/xcuitest.ts +1 -1
- package/src/services/ios/webinspector/index.ts +6 -9
- package/src/services/ios/zipconduit/index.ts +10 -4
- package/src/services.ts +86 -269
- package/build/src/lib/tunnel/rsd-session-lock.d.ts +0 -9
- package/build/src/lib/tunnel/rsd-session-lock.d.ts.map +0 -1
- package/build/src/lib/tunnel/rsd-session-lock.js +0 -17
- package/build/src/lib/tunnel/rsd-session-lock.js.map +0 -1
- package/src/lib/tunnel/rsd-session-lock.ts +0 -23
|
@@ -10,6 +10,7 @@ const EMPTY_REGISTRY = {
|
|
|
10
10
|
},
|
|
11
11
|
};
|
|
12
12
|
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
13
|
+
const WAIT_REQUEST_BUFFER_MS = 1_000;
|
|
13
14
|
/**
|
|
14
15
|
* API client for tunnel registry operations
|
|
15
16
|
* This client handles communication with the API server for tunnel data
|
|
@@ -43,7 +44,7 @@ export class TunnelApiClient {
|
|
|
43
44
|
try {
|
|
44
45
|
const response = await this.fetchWithTimeout(this.apiBaseUrl);
|
|
45
46
|
if (!response.ok) {
|
|
46
|
-
throw new TunnelAvailabilityError(`
|
|
47
|
+
throw new TunnelAvailabilityError(`HTTP ${response.status}`);
|
|
47
48
|
}
|
|
48
49
|
return (await response.json());
|
|
49
50
|
}
|
|
@@ -53,18 +54,23 @@ export class TunnelApiClient {
|
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
/**
|
|
56
|
-
* Get a specific tunnel by UDID
|
|
57
|
+
* Get a specific tunnel by UDID.
|
|
57
58
|
* @param udid - Device UDID
|
|
58
|
-
* @
|
|
59
|
+
* @param options.waitMs - When > 0, long-poll until the tunnel is ready or timeout (408).
|
|
59
60
|
*/
|
|
60
|
-
async getTunnelByUdid(udid) {
|
|
61
|
+
async getTunnelByUdid(udid, options = {}) {
|
|
62
|
+
const waitMs = options.waitMs ?? 0;
|
|
63
|
+
const url = waitMs > 0
|
|
64
|
+
? `${this.apiBaseUrl}/${udid}?waitMs=${waitMs}`
|
|
65
|
+
: `${this.apiBaseUrl}/${udid}`;
|
|
66
|
+
const timeoutMs = waitMs > 0 ? waitMs + WAIT_REQUEST_BUFFER_MS : this.timeoutMs;
|
|
61
67
|
try {
|
|
62
|
-
const response = await this.fetchWithTimeout(
|
|
63
|
-
if (response.status === 404) {
|
|
68
|
+
const response = await this.fetchWithTimeout(url, undefined, timeoutMs);
|
|
69
|
+
if (response.status === 404 || response.status === 408) {
|
|
64
70
|
return null;
|
|
65
71
|
}
|
|
66
72
|
if (!response.ok) {
|
|
67
|
-
throw new TunnelAvailabilityError(`
|
|
73
|
+
throw new TunnelAvailabilityError(`HTTP ${response.status}`);
|
|
68
74
|
}
|
|
69
75
|
return (await response.json());
|
|
70
76
|
}
|
|
@@ -73,6 +79,25 @@ export class TunnelApiClient {
|
|
|
73
79
|
return null;
|
|
74
80
|
}
|
|
75
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Ask tunnel-creation to re-run RSD discover-and-close and return the updated entry.
|
|
84
|
+
*/
|
|
85
|
+
async refreshServiceCatalog(udid) {
|
|
86
|
+
try {
|
|
87
|
+
const response = await this.fetchWithTimeout(`${this.apiBaseUrl}/${udid}/refresh-services`, { method: 'POST' }, this.timeoutMs + DEFAULT_TIMEOUT_MS);
|
|
88
|
+
if (response.status === 404) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (!response.ok) {
|
|
92
|
+
throw new TunnelAvailabilityError(`HTTP ${response.status}`);
|
|
93
|
+
}
|
|
94
|
+
return (await response.json());
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
this.handleFetchError(`Failed to refresh service catalog for UDID ${udid}`, error);
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
76
101
|
/**
|
|
77
102
|
* Get tunnel by device ID
|
|
78
103
|
* @param deviceId - Device ID
|
|
@@ -85,7 +110,7 @@ export class TunnelApiClient {
|
|
|
85
110
|
return null;
|
|
86
111
|
}
|
|
87
112
|
if (!response.ok) {
|
|
88
|
-
throw new TunnelAvailabilityError(`
|
|
113
|
+
throw new TunnelAvailabilityError(`HTTP ${response.status}`);
|
|
89
114
|
}
|
|
90
115
|
return (await response.json());
|
|
91
116
|
}
|
|
@@ -203,15 +228,11 @@ export class TunnelApiClient {
|
|
|
203
228
|
* Otherwise logs and returns.
|
|
204
229
|
*/
|
|
205
230
|
handleFetchError(messagePrefix, error, logLevel = 'warn') {
|
|
206
|
-
if (error instanceof TunnelAvailabilityError) {
|
|
207
|
-
if (this.strict) {
|
|
208
|
-
throw error;
|
|
209
|
-
}
|
|
210
|
-
this.logFetchFailure(error.message, logLevel);
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
231
|
const detail = error instanceof Error ? error.message : String(error);
|
|
214
|
-
const
|
|
232
|
+
const prefixed = `${messagePrefix}: ${detail}`;
|
|
233
|
+
const message = detail === messagePrefix || detail.startsWith(`${messagePrefix}:`)
|
|
234
|
+
? detail
|
|
235
|
+
: prefixed;
|
|
215
236
|
if (this.strict) {
|
|
216
237
|
throw new TunnelAvailabilityError(message, { cause: error });
|
|
217
238
|
}
|
|
@@ -225,9 +246,9 @@ export class TunnelApiClient {
|
|
|
225
246
|
log.warn(message);
|
|
226
247
|
}
|
|
227
248
|
}
|
|
228
|
-
async fetchWithTimeout(url, init) {
|
|
249
|
+
async fetchWithTimeout(url, init, timeoutMs = this.timeoutMs) {
|
|
229
250
|
const controller = new AbortController();
|
|
230
|
-
const timeoutId = setTimeout(() => controller.abort(),
|
|
251
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
231
252
|
try {
|
|
232
253
|
const response = await fetch(url, {
|
|
233
254
|
...init,
|
|
@@ -240,7 +261,7 @@ export class TunnelApiClient {
|
|
|
240
261
|
throw error;
|
|
241
262
|
}
|
|
242
263
|
if (error instanceof Error && error.name === 'AbortError') {
|
|
243
|
-
throw new TunnelAvailabilityError(`Tunnel registry request timed out after ${
|
|
264
|
+
throw new TunnelAvailabilityError(`Tunnel registry request timed out after ${timeoutMs}ms`, { cause: error });
|
|
244
265
|
}
|
|
245
266
|
throw new TunnelAvailabilityError(`Tunnel registry request failed for ${url}`, { cause: error });
|
|
246
267
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-api-client.js","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,GAAG,GAAG,SAAS,CAAC,iBAAiB,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAmB;IACrC,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE;QACR,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,CAAC;KACjB;CACF,CAAC;AACF,MAAM,kBAAkB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel-api-client.js","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,27 @@
|
|
|
1
|
+
import type { TunnelRegistryEntry } from '../types.js';
|
|
1
2
|
import { TunnelAvailabilityError } from './errors.js';
|
|
2
|
-
import { type TunnelEndpoint } from './tunnel-api-client.js';
|
|
3
|
+
import { TunnelApiClient, type TunnelEndpoint } from './tunnel-api-client.js';
|
|
3
4
|
export { TunnelAvailabilityError };
|
|
5
|
+
export interface GetTunnelForDeviceOptions {
|
|
6
|
+
/** Long-poll budget passed to GET /tunnels/:udid?waitMs= (0 = immediate). */
|
|
7
|
+
waitMs?: number;
|
|
8
|
+
}
|
|
4
9
|
/**
|
|
5
10
|
* Resolve tunnel registry metadata for a device (host, RSD port, packet stream).
|
|
6
|
-
* Strongbox port, TCP probe, then a single `GET /remotexpc/tunnels/{udid}`.
|
|
7
11
|
* @throws {TunnelAvailabilityError} When registry or tunnel for the UDID is unavailable.
|
|
8
12
|
*/
|
|
9
|
-
export declare function getTunnelForDevice(udid: string): Promise<TunnelEndpoint>;
|
|
13
|
+
export declare function getTunnelForDevice(udid: string, options?: GetTunnelForDeviceOptions): Promise<TunnelEndpoint>;
|
|
10
14
|
/**
|
|
11
15
|
* Returns the list of device UDIDs currently in the tunnel registry.
|
|
12
|
-
* Used to include tunnel-only devices (e.g. Apple TV over WiFi)
|
|
13
|
-
* in the "connected devices" list for session validation.
|
|
14
|
-
*
|
|
15
|
-
* @returns UDIDs when the registry is reachable (possibly empty).
|
|
16
16
|
* @throws {TunnelAvailabilityError} When the registry port is missing or unreachable.
|
|
17
17
|
*/
|
|
18
18
|
export declare function getAvailableDevices(): Promise<string[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Strict registry client for internal catalog resolution (service resolver).
|
|
21
|
+
*/
|
|
22
|
+
export declare function createValidatedStrictRegistryClient(): Promise<TunnelApiClient>;
|
|
23
|
+
/** Map a registry entry to a flat tunnel endpoint. */
|
|
24
|
+
export declare function mapEntryToEndpoint(entry: TunnelRegistryEntry): TunnelEndpoint;
|
|
25
|
+
/** Whether a registry entry has a non-empty discovered RSD service catalog. */
|
|
26
|
+
export declare function isTunnelEntryReady(entry: TunnelRegistryEntry): boolean;
|
|
19
27
|
//# sourceMappingURL=tunnel-availability.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-availability.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-availability.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tunnel-availability.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-availability.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,eAAe,EAEf,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAInC,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,cAAc,CAAC,CAYzB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D;AAED;;GAEG;AACH,wBAAsB,mCAAmC,IAAI,OAAO,CAAC,eAAe,CAAC,CAOpF;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,CAO7E;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAMtE"}
|
|
@@ -8,12 +8,12 @@ export { TunnelAvailabilityError };
|
|
|
8
8
|
const TUNNEL_REGISTRY_PORT = 'tunnelRegistryPort';
|
|
9
9
|
/**
|
|
10
10
|
* Resolve tunnel registry metadata for a device (host, RSD port, packet stream).
|
|
11
|
-
* Strongbox port, TCP probe, then a single `GET /remotexpc/tunnels/{udid}`.
|
|
12
11
|
* @throws {TunnelAvailabilityError} When registry or tunnel for the UDID is unavailable.
|
|
13
12
|
*/
|
|
14
|
-
export async function getTunnelForDevice(udid) {
|
|
13
|
+
export async function getTunnelForDevice(udid, options = {}) {
|
|
15
14
|
const client = await createValidatedStrictRegistryClient();
|
|
16
|
-
const
|
|
15
|
+
const waitMs = options.waitMs ?? 0;
|
|
16
|
+
const entry = await client.getTunnelByUdid(udid, { waitMs });
|
|
17
17
|
if (!entry) {
|
|
18
18
|
throw new TunnelAvailabilityError(`No tunnel found for device ${udid}. Please run the tunnel creation script first`);
|
|
19
19
|
}
|
|
@@ -21,10 +21,6 @@ export async function getTunnelForDevice(udid) {
|
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* Returns the list of device UDIDs currently in the tunnel registry.
|
|
24
|
-
* Used to include tunnel-only devices (e.g. Apple TV over WiFi)
|
|
25
|
-
* in the "connected devices" list for session validation.
|
|
26
|
-
*
|
|
27
|
-
* @returns UDIDs when the registry is reachable (possibly empty).
|
|
28
24
|
* @throws {TunnelAvailabilityError} When the registry port is missing or unreachable.
|
|
29
25
|
*/
|
|
30
26
|
export async function getAvailableDevices() {
|
|
@@ -32,9 +28,31 @@ export async function getAvailableDevices() {
|
|
|
32
28
|
return await client.getAvailableDevices();
|
|
33
29
|
}
|
|
34
30
|
/**
|
|
35
|
-
*
|
|
36
|
-
* @throws {TunnelAvailabilityError} When the port was never stored or is not a valid TCP port.
|
|
31
|
+
* Strict registry client for internal catalog resolution (service resolver).
|
|
37
32
|
*/
|
|
33
|
+
export async function createValidatedStrictRegistryClient() {
|
|
34
|
+
const port = await readTunnelRegistryPort();
|
|
35
|
+
await assertRegistryPortAcceptingConnections(port);
|
|
36
|
+
return createTunnelRegistryClient(port, {
|
|
37
|
+
strict: true,
|
|
38
|
+
timeoutMs: TUNNEL_REGISTRY_HTTP_TIMEOUT_MS,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Map a registry entry to a flat tunnel endpoint. */
|
|
42
|
+
export function mapEntryToEndpoint(entry) {
|
|
43
|
+
return {
|
|
44
|
+
host: entry.address,
|
|
45
|
+
port: entry.rsdPort,
|
|
46
|
+
udid: entry.udid,
|
|
47
|
+
packetStreamPort: entry.packetStreamPort,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** Whether a registry entry has a non-empty discovered RSD service catalog. */
|
|
51
|
+
export function isTunnelEntryReady(entry) {
|
|
52
|
+
return (entry.services !== undefined &&
|
|
53
|
+
typeof entry.services === 'object' &&
|
|
54
|
+
Object.keys(entry.services).length > 0);
|
|
55
|
+
}
|
|
38
56
|
async function readTunnelRegistryPort() {
|
|
39
57
|
const box = strongbox(TUNNEL_CONTAINER_NAME);
|
|
40
58
|
const item = new BaseItem(TUNNEL_REGISTRY_PORT, box);
|
|
@@ -50,10 +68,6 @@ async function readTunnelRegistryPort() {
|
|
|
50
68
|
}
|
|
51
69
|
return port;
|
|
52
70
|
}
|
|
53
|
-
/**
|
|
54
|
-
* Verify the registry HTTP server is accepting TCP connections on localhost.
|
|
55
|
-
* @throws {TunnelAvailabilityError} When the port is closed or the probe times out.
|
|
56
|
-
*/
|
|
57
71
|
async function assertRegistryPortAcceptingConnections(port) {
|
|
58
72
|
const registryAddress = `${TUNNEL_REGISTRY_HOST}:${port}`;
|
|
59
73
|
const unreachableMessage = `Tunnel registry at ${registryAddress} is not reachable. Please run the tunnel creation script first`;
|
|
@@ -86,28 +100,7 @@ async function assertRegistryPortAcceptingConnections(port) {
|
|
|
86
100
|
});
|
|
87
101
|
});
|
|
88
102
|
}
|
|
89
|
-
/** Map a registry entry to a flat tunnel endpoint for RSD connect. */
|
|
90
|
-
function mapEntryToEndpoint(entry) {
|
|
91
|
-
return {
|
|
92
|
-
host: entry.address,
|
|
93
|
-
port: entry.rsdPort,
|
|
94
|
-
udid: entry.udid,
|
|
95
|
-
packetStreamPort: entry.packetStreamPort,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Build a strict tunnel registry API client (caller supplies port via base URL).
|
|
100
|
-
*/
|
|
101
103
|
function createTunnelRegistryClient(port, options = {}) {
|
|
102
104
|
return new TunnelApiClient(`http://${TUNNEL_REGISTRY_HOST}:${port}${TUNNEL_REGISTRY_API_BASE_PATH}`, options);
|
|
103
105
|
}
|
|
104
|
-
/** Strongbox port, TCP probe, then a strict registry client with the lookup timeout. */
|
|
105
|
-
async function createValidatedStrictRegistryClient() {
|
|
106
|
-
const port = await readTunnelRegistryPort();
|
|
107
|
-
await assertRegistryPortAcceptingConnections(port);
|
|
108
|
-
return createTunnelRegistryClient(port, {
|
|
109
|
-
strict: true,
|
|
110
|
-
timeoutMs: TUNNEL_REGISTRY_HTTP_TIMEOUT_MS,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
106
|
//# sourceMappingURL=tunnel-availability.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-availability.js","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-availability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,eAAe,GAGhB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel-availability.js","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-availability.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TunnelRegistryEntry } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-process readiness coordination for long-poll GET /tunnels/:udid?waitMs=.
|
|
4
|
+
* Lives in the tunnel-creation / registry server process only.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TunnelReadinessCoordinator {
|
|
7
|
+
private waitersByUdid;
|
|
8
|
+
/** Clear readiness; new waiters block until the next {@link resolveReady}. */
|
|
9
|
+
markPending(udid: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Wait until {@link resolveReady} for `udid`, or reject after `waitMs`.
|
|
12
|
+
*/
|
|
13
|
+
waitForReady(udid: string, waitMs: number): Promise<TunnelRegistryEntry>;
|
|
14
|
+
/** Unblock all waiters for `udid` with the published registry entry. */
|
|
15
|
+
resolveReady(udid: string, entry: TunnelRegistryEntry): void;
|
|
16
|
+
private removeWaiter;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tunnel-readiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel-readiness.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvD;;;GAGG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,aAAa,CAA+B;IAEpD,8EAA8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAY/B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyBxE,wEAAwE;IACxE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAY5D,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process readiness coordination for long-poll GET /tunnels/:udid?waitMs=.
|
|
3
|
+
* Lives in the tunnel-creation / registry server process only.
|
|
4
|
+
*/
|
|
5
|
+
export class TunnelReadinessCoordinator {
|
|
6
|
+
waitersByUdid = new Map();
|
|
7
|
+
/** Clear readiness; new waiters block until the next {@link resolveReady}. */
|
|
8
|
+
markPending(udid) {
|
|
9
|
+
const waiters = this.waitersByUdid.get(udid);
|
|
10
|
+
if (!waiters?.length) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
for (const waiter of waiters) {
|
|
14
|
+
clearTimeout(waiter.timer);
|
|
15
|
+
waiter.reject(new Error(`Tunnel ${udid} is not ready`));
|
|
16
|
+
}
|
|
17
|
+
this.waitersByUdid.delete(udid);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wait until {@link resolveReady} for `udid`, or reject after `waitMs`.
|
|
21
|
+
*/
|
|
22
|
+
waitForReady(udid, waitMs) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const timer = setTimeout(() => {
|
|
25
|
+
this.removeWaiter(udid, waiter);
|
|
26
|
+
reject(new Error('NOT_READY'));
|
|
27
|
+
}, waitMs);
|
|
28
|
+
const waiter = {
|
|
29
|
+
resolve: (entry) => {
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
resolve(entry);
|
|
32
|
+
},
|
|
33
|
+
reject: (error) => {
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
reject(error);
|
|
36
|
+
},
|
|
37
|
+
timer,
|
|
38
|
+
};
|
|
39
|
+
const list = this.waitersByUdid.get(udid) ?? [];
|
|
40
|
+
list.push(waiter);
|
|
41
|
+
this.waitersByUdid.set(udid, list);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Unblock all waiters for `udid` with the published registry entry. */
|
|
45
|
+
resolveReady(udid, entry) {
|
|
46
|
+
const waiters = this.waitersByUdid.get(udid);
|
|
47
|
+
if (!waiters?.length) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.waitersByUdid.delete(udid);
|
|
51
|
+
for (const waiter of waiters) {
|
|
52
|
+
clearTimeout(waiter.timer);
|
|
53
|
+
waiter.resolve(entry);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
removeWaiter(udid, target) {
|
|
57
|
+
const waiters = this.waitersByUdid.get(udid);
|
|
58
|
+
if (!waiters) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const next = waiters.filter((w) => w !== target);
|
|
62
|
+
if (next.length) {
|
|
63
|
+
this.waitersByUdid.set(udid, next);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.waitersByUdid.delete(udid);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=tunnel-readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel-readiness.js","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import type { TunnelRegistry } from '../types.js';
|
|
1
|
+
import type { TunnelRegistry, TunnelRegistryEntry } from '../types.js';
|
|
2
|
+
import { TunnelReadinessCoordinator } from './tunnel-readiness.js';
|
|
2
3
|
export declare const DEFAULT_TUNNEL_REGISTRY_PORT = 42314;
|
|
4
|
+
export interface TunnelRegistryServerOptions {
|
|
5
|
+
readiness?: TunnelReadinessCoordinator;
|
|
6
|
+
/**
|
|
7
|
+
* Re-run RSD discover-and-close for `udid` and return the updated registry entry.
|
|
8
|
+
* Wired by tunnel-creation; required for POST refresh-services.
|
|
9
|
+
*/
|
|
10
|
+
refreshServices?: (udid: string, entry: TunnelRegistryEntry) => Promise<TunnelRegistryEntry>;
|
|
11
|
+
}
|
|
3
12
|
/**
|
|
4
13
|
* Tunnel Registry Server - provides API endpoints for tunnel registry operations
|
|
5
14
|
*/
|
|
@@ -14,7 +23,16 @@ export declare class TunnelRegistryServer {
|
|
|
14
23
|
* @param port - Port to listen on
|
|
15
24
|
*/
|
|
16
25
|
private readonly dispatchRoute;
|
|
17
|
-
|
|
26
|
+
private readonly readiness;
|
|
27
|
+
private readonly refreshServices?;
|
|
28
|
+
constructor(tunnelsInfo: TunnelRegistry | undefined, port: number, options?: TunnelRegistryServerOptions);
|
|
29
|
+
/** Live registry object (mutated in place by tunnel-creation). */
|
|
30
|
+
getRegistry(): TunnelRegistry;
|
|
31
|
+
/** Publish a fully discovered tunnel entry and unblock long-poll waiters. */
|
|
32
|
+
upsertReadyEntry(udid: string, entry: TunnelRegistryEntry): void;
|
|
33
|
+
/** Remove a tunnel and mark readiness pending (e.g. upstream TLS death). */
|
|
34
|
+
removeTunnelEntry(udid: string): void;
|
|
35
|
+
markTunnelPending(udid: string): void;
|
|
18
36
|
/**
|
|
19
37
|
* Get tunnels from registry
|
|
20
38
|
*/
|
|
@@ -48,9 +66,10 @@ export declare class TunnelRegistryServer {
|
|
|
48
66
|
*/
|
|
49
67
|
private getRegistryMetadata;
|
|
50
68
|
/**
|
|
51
|
-
* Handler for getting a tunnel by UDID
|
|
69
|
+
* Handler for getting a tunnel by UDID (optional ?waitMs= long-poll).
|
|
52
70
|
*/
|
|
53
71
|
private getTunnelByUdid;
|
|
72
|
+
private refreshTunnelServices;
|
|
54
73
|
/**
|
|
55
74
|
* Handler for getting a tunnel by device ID
|
|
56
75
|
*/
|
|
@@ -74,5 +93,5 @@ export declare class TunnelRegistryServer {
|
|
|
74
93
|
* @param port - Port to listen on
|
|
75
94
|
* @returns The started TunnelRegistryServer instance
|
|
76
95
|
*/
|
|
77
|
-
export declare function startTunnelRegistryServer(tunnelInfos: TunnelRegistry | undefined, port?: number): Promise<TunnelRegistryServer>;
|
|
96
|
+
export declare function startTunnelRegistryServer(tunnelInfos: TunnelRegistry | undefined, port?: number, options?: TunnelRegistryServerOptions): Promise<TunnelRegistryServer>;
|
|
78
97
|
//# sourceMappingURL=tunnel-registry-server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel-registry-server.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-registry-server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"tunnel-registry-server.d.ts","sourceRoot":"","sources":["../../../../src/lib/tunnel/tunnel-registry-server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAMvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAQnE,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAKlD,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC;;;OAGG;IACH,eAAe,CAAC,EAAE,CAChB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,mBAAmB,KACvB,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACnC;AAKD;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAC,CAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAOd;IAEF;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IAEF,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiD;gBAGhF,WAAW,EAAE,cAAc,GAAG,SAAS,EACvC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,2BAAgC;IAQ3C,kEAAkE;IAClE,WAAW,IAAI,cAAc;IAI7B,6EAA6E;IAC7E,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAQhE,4EAA4E;IAC5E,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKrC,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIrC;;OAEG;IACH,OAAO,KAAK,OAAO,GAElB;IAED;;OAEG;IACH,OAAO,KAAK,QAAQ,GAOnB;IAED;;OAEG;IACH,OAAO,KAAK,YAAY,GAKvB;IAED;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB3B;;OAEG;YACW,aAAa;IAsB3B;;OAEG;YACW,aAAa;IAY3B;;OAEG;YACW,mBAAmB;IAYjC;;OAEG;YACW,eAAe;YAwCf,qBAAqB;IAgCnC;;OAEG;YACW,mBAAmB;IAgCjC;;OAEG;YACW,YAAY;IAqD1B;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAgDjC;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,cAAc,GAAG,SAAS,EACvC,IAAI,GAAE,MAAqC,EAC3C,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,oBAAoB,CAAC,CAY/B"}
|
|
@@ -2,7 +2,9 @@ import { BaseItem, strongbox } from '@appium/strongbox';
|
|
|
2
2
|
import * as http from 'node:http';
|
|
3
3
|
import { TUNNEL_CONTAINER_NAME } from '../../constants.js';
|
|
4
4
|
import { getLogger } from '../logger.js';
|
|
5
|
-
import { TUNNEL_REGISTRY_API_BASE_PATH } from './constants.js';
|
|
5
|
+
import { MAX_TUNNEL_REGISTRY_WAIT_MS, TUNNEL_REGISTRY_API_BASE_PATH, } from './constants.js';
|
|
6
|
+
import { isTunnelEntryReady } from './tunnel-availability.js';
|
|
7
|
+
import { TunnelReadinessCoordinator } from './tunnel-readiness.js';
|
|
6
8
|
import { createRouteDispatcher, getRequestPathname, } from './tunnel-registry-routes.js';
|
|
7
9
|
// Constants
|
|
8
10
|
export const DEFAULT_TUNNEL_REGISTRY_PORT = 42314;
|
|
@@ -31,9 +33,33 @@ export class TunnelRegistryServer {
|
|
|
31
33
|
* @param port - Port to listen on
|
|
32
34
|
*/
|
|
33
35
|
dispatchRoute = createRouteDispatcher(this.tunnelRegistryRouteTable());
|
|
34
|
-
|
|
36
|
+
readiness;
|
|
37
|
+
refreshServices;
|
|
38
|
+
constructor(tunnelsInfo, port, options = {}) {
|
|
35
39
|
this.port = port;
|
|
36
40
|
this.tunnelsInfo = tunnelsInfo;
|
|
41
|
+
this.readiness = options.readiness ?? new TunnelReadinessCoordinator();
|
|
42
|
+
this.refreshServices = options.refreshServices;
|
|
43
|
+
}
|
|
44
|
+
/** Live registry object (mutated in place by tunnel-creation). */
|
|
45
|
+
getRegistry() {
|
|
46
|
+
return this.registry;
|
|
47
|
+
}
|
|
48
|
+
/** Publish a fully discovered tunnel entry and unblock long-poll waiters. */
|
|
49
|
+
upsertReadyEntry(udid, entry) {
|
|
50
|
+
this.registry.tunnels[udid] = {
|
|
51
|
+
...entry,
|
|
52
|
+
lastUpdated: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
this.readiness.resolveReady(udid, this.registry.tunnels[udid]);
|
|
55
|
+
}
|
|
56
|
+
/** Remove a tunnel and mark readiness pending (e.g. upstream TLS death). */
|
|
57
|
+
removeTunnelEntry(udid) {
|
|
58
|
+
delete this.registry.tunnels[udid];
|
|
59
|
+
this.readiness.markPending(udid);
|
|
60
|
+
}
|
|
61
|
+
markTunnelPending(udid) {
|
|
62
|
+
this.readiness.markPending(udid);
|
|
37
63
|
}
|
|
38
64
|
/**
|
|
39
65
|
* Get tunnels from registry
|
|
@@ -168,19 +194,34 @@ export class TunnelRegistryServer {
|
|
|
168
194
|
}
|
|
169
195
|
}
|
|
170
196
|
/**
|
|
171
|
-
* Handler for getting a tunnel by UDID
|
|
197
|
+
* Handler for getting a tunnel by UDID (optional ?waitMs= long-poll).
|
|
172
198
|
*/
|
|
173
|
-
async getTunnelByUdid(res, udid) {
|
|
199
|
+
async getTunnelByUdid(req, res, udid) {
|
|
174
200
|
try {
|
|
175
201
|
await this.loadRegistry();
|
|
176
|
-
const
|
|
177
|
-
if (
|
|
202
|
+
const waitMs = parseWaitMsQuery(req);
|
|
203
|
+
if (waitMs === null) {
|
|
204
|
+
sendJSON(res, 400, { error: 'Invalid waitMs query parameter' });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
let tunnel = this.tunnels[udid];
|
|
208
|
+
if (tunnel && isTunnelEntryReady(tunnel)) {
|
|
209
|
+
sendJSON(res, 200, tunnel);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
if (waitMs <= 0) {
|
|
178
213
|
sendJSON(res, 404, {
|
|
179
214
|
error: `Tunnel not found for UDID: ${udid}`,
|
|
180
215
|
});
|
|
181
216
|
return;
|
|
182
217
|
}
|
|
183
|
-
|
|
218
|
+
try {
|
|
219
|
+
tunnel = await this.readiness.waitForReady(udid, waitMs);
|
|
220
|
+
sendJSON(res, 200, tunnel);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
sendJSON(res, 408, { status: 'NOT_READY' });
|
|
224
|
+
}
|
|
184
225
|
}
|
|
185
226
|
catch (error) {
|
|
186
227
|
log.error(`Error getting tunnel by UDID: ${error}`);
|
|
@@ -189,6 +230,33 @@ export class TunnelRegistryServer {
|
|
|
189
230
|
});
|
|
190
231
|
}
|
|
191
232
|
}
|
|
233
|
+
async refreshTunnelServices(res, udid) {
|
|
234
|
+
try {
|
|
235
|
+
await this.loadRegistry();
|
|
236
|
+
const entry = this.tunnels[udid];
|
|
237
|
+
if (!entry) {
|
|
238
|
+
sendJSON(res, 404, {
|
|
239
|
+
error: `Tunnel not found for UDID: ${udid}`,
|
|
240
|
+
});
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (!this.refreshServices) {
|
|
244
|
+
sendJSON(res, 503, {
|
|
245
|
+
error: 'Service catalog refresh is not configured',
|
|
246
|
+
});
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const updated = await this.refreshServices(udid, entry);
|
|
250
|
+
this.upsertReadyEntry(udid, updated);
|
|
251
|
+
sendJSON(res, 200, this.tunnels[udid]);
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
log.error(`Error refreshing services for ${udid}: ${error}`);
|
|
255
|
+
sendJSON(res, 500, {
|
|
256
|
+
error: 'Failed to refresh service catalog',
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
192
260
|
/**
|
|
193
261
|
* Handler for getting a tunnel by device ID
|
|
194
262
|
*/
|
|
@@ -310,12 +378,19 @@ export class TunnelRegistryServer {
|
|
|
310
378
|
name: 'get-by-device',
|
|
311
379
|
handler: async (_req, res, params) => this.getTunnelByDeviceId(res, parseInt(params.deviceId, 10)),
|
|
312
380
|
},
|
|
381
|
+
{
|
|
382
|
+
method: 'POST',
|
|
383
|
+
path: `${base}/:udid/refresh-services`,
|
|
384
|
+
name: 'refresh-services',
|
|
385
|
+
guard: (params) => !RESERVED_TUNNEL_UDID_SEGMENTS.has(params.udid),
|
|
386
|
+
handler: async (_req, res, params) => this.refreshTunnelServices(res, params.udid),
|
|
387
|
+
},
|
|
313
388
|
{
|
|
314
389
|
method: 'GET',
|
|
315
390
|
path: `${base}/:udid`,
|
|
316
391
|
name: 'get-by-udid',
|
|
317
392
|
guard: (params) => !RESERVED_TUNNEL_UDID_SEGMENTS.has(params.udid),
|
|
318
|
-
handler: async (
|
|
393
|
+
handler: async (req, res, params) => this.getTunnelByUdid(req, res, params.udid),
|
|
319
394
|
},
|
|
320
395
|
{
|
|
321
396
|
method: 'PUT',
|
|
@@ -333,8 +408,8 @@ export class TunnelRegistryServer {
|
|
|
333
408
|
* @param port - Port to listen on
|
|
334
409
|
* @returns The started TunnelRegistryServer instance
|
|
335
410
|
*/
|
|
336
|
-
export async function startTunnelRegistryServer(tunnelInfos, port = DEFAULT_TUNNEL_REGISTRY_PORT) {
|
|
337
|
-
const server = new TunnelRegistryServer(tunnelInfos, port);
|
|
411
|
+
export async function startTunnelRegistryServer(tunnelInfos, port = DEFAULT_TUNNEL_REGISTRY_PORT, options = {}) {
|
|
412
|
+
const server = new TunnelRegistryServer(tunnelInfos, port, options);
|
|
338
413
|
await server.start();
|
|
339
414
|
try {
|
|
340
415
|
const box = strongbox(TUNNEL_CONTAINER_NAME);
|
|
@@ -372,6 +447,21 @@ async function parseJSONBody(req) {
|
|
|
372
447
|
/**
|
|
373
448
|
* Send JSON response
|
|
374
449
|
*/
|
|
450
|
+
function parseWaitMsQuery(req) {
|
|
451
|
+
const url = new URL(req.url || '/', 'http://localhost');
|
|
452
|
+
const raw = url.searchParams.get('waitMs');
|
|
453
|
+
if (raw === null || raw === '') {
|
|
454
|
+
return 0;
|
|
455
|
+
}
|
|
456
|
+
const waitMs = Number.parseInt(raw, 10);
|
|
457
|
+
if (!Number.isInteger(waitMs) || waitMs < 0) {
|
|
458
|
+
return null;
|
|
459
|
+
}
|
|
460
|
+
if (waitMs > MAX_TUNNEL_REGISTRY_WAIT_MS) {
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
return waitMs;
|
|
464
|
+
}
|
|
375
465
|
function sendJSON(res, statusCode, data) {
|
|
376
466
|
const statusText = http.STATUS_CODES[statusCode] || '';
|
|
377
467
|
const responseBody = data && typeof data === 'object' && data !== null
|