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.
Files changed (201) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/src/base-plist-service.d.ts +1 -1
  3. package/build/src/base-plist-service.d.ts.map +1 -1
  4. package/build/src/base-socket-service.d.ts +1 -1
  5. package/build/src/base-socket-service.d.ts.map +1 -1
  6. package/build/src/index.d.ts +3 -3
  7. package/build/src/index.d.ts.map +1 -1
  8. package/build/src/index.js +3 -3
  9. package/build/src/index.js.map +1 -1
  10. package/build/src/lib/lockdown/index.d.ts.map +1 -1
  11. package/build/src/lib/lockdown/index.js +3 -13
  12. package/build/src/lib/lockdown/index.js.map +1 -1
  13. package/build/src/lib/plist/plist-parser.js.map +1 -1
  14. package/build/src/lib/plist/plist-service.d.ts +2 -2
  15. package/build/src/lib/plist/plist-service.d.ts.map +1 -1
  16. package/build/src/lib/port-forwarding/connectors.d.ts +3 -4
  17. package/build/src/lib/port-forwarding/connectors.d.ts.map +1 -1
  18. package/build/src/lib/port-forwarding/connectors.js +13 -5
  19. package/build/src/lib/port-forwarding/connectors.js.map +1 -1
  20. package/build/src/lib/remote-xpc/handshake.d.ts +1 -1
  21. package/build/src/lib/remote-xpc/handshake.d.ts.map +1 -1
  22. package/build/src/lib/tunnel/constants.d.ts +2 -0
  23. package/build/src/lib/tunnel/constants.d.ts.map +1 -1
  24. package/build/src/lib/tunnel/constants.js +2 -0
  25. package/build/src/lib/tunnel/constants.js.map +1 -1
  26. package/build/src/lib/tunnel/index.d.ts +2 -10
  27. package/build/src/lib/tunnel/index.d.ts.map +1 -1
  28. package/build/src/lib/tunnel/index.js +2 -55
  29. package/build/src/lib/tunnel/index.js.map +1 -1
  30. package/build/src/lib/tunnel/tunnel-api-client.d.ts +11 -3
  31. package/build/src/lib/tunnel/tunnel-api-client.d.ts.map +1 -1
  32. package/build/src/lib/tunnel/tunnel-api-client.js +40 -19
  33. package/build/src/lib/tunnel/tunnel-api-client.js.map +1 -1
  34. package/build/src/lib/tunnel/tunnel-availability.d.ts +15 -7
  35. package/build/src/lib/tunnel/tunnel-availability.d.ts.map +1 -1
  36. package/build/src/lib/tunnel/tunnel-availability.js +27 -34
  37. package/build/src/lib/tunnel/tunnel-availability.js.map +1 -1
  38. package/build/src/lib/tunnel/tunnel-readiness.d.ts +18 -0
  39. package/build/src/lib/tunnel/tunnel-readiness.d.ts.map +1 -0
  40. package/build/src/lib/tunnel/tunnel-readiness.js +70 -0
  41. package/build/src/lib/tunnel/tunnel-readiness.js.map +1 -0
  42. package/build/src/lib/tunnel/tunnel-registry-server.d.ts +23 -4
  43. package/build/src/lib/tunnel/tunnel-registry-server.d.ts.map +1 -1
  44. package/build/src/lib/tunnel/tunnel-registry-server.js +100 -10
  45. package/build/src/lib/tunnel/tunnel-registry-server.js.map +1 -1
  46. package/build/src/lib/tunnel/tunnel-rsd-discovery.d.ts +10 -0
  47. package/build/src/lib/tunnel/tunnel-rsd-discovery.d.ts.map +1 -0
  48. package/build/src/lib/tunnel/tunnel-rsd-discovery.js +44 -0
  49. package/build/src/lib/tunnel/tunnel-rsd-discovery.js.map +1 -0
  50. package/build/src/lib/tunnel/tunnel-service-resolver.d.ts +24 -0
  51. package/build/src/lib/tunnel/tunnel-service-resolver.d.ts.map +1 -0
  52. package/build/src/lib/tunnel/tunnel-service-resolver.js +65 -0
  53. package/build/src/lib/tunnel/tunnel-service-resolver.js.map +1 -0
  54. package/build/src/lib/types.d.ts +19 -11
  55. package/build/src/lib/types.d.ts.map +1 -1
  56. package/build/src/lib/usbmux/index.d.ts +1 -1
  57. package/build/src/lib/usbmux/index.d.ts.map +1 -1
  58. package/build/src/lib/usbmux/index.js +1 -1
  59. package/build/src/lib/usbmux/index.js.map +1 -1
  60. package/build/src/services/ios/afc/codec.d.ts +1 -1
  61. package/build/src/services/ios/afc/codec.d.ts.map +1 -1
  62. package/build/src/services/ios/afc/codec.js.map +1 -1
  63. package/build/src/services/ios/afc/constants.d.ts.map +1 -1
  64. package/build/src/services/ios/afc/constants.js +2 -3
  65. package/build/src/services/ios/afc/constants.js.map +1 -1
  66. package/build/src/services/ios/afc/demux.d.ts.map +1 -1
  67. package/build/src/services/ios/afc/demux.js +1 -0
  68. package/build/src/services/ios/afc/demux.js.map +1 -1
  69. package/build/src/services/ios/afc/enums.d.ts +16 -1
  70. package/build/src/services/ios/afc/enums.d.ts.map +1 -1
  71. package/build/src/services/ios/afc/enums.js +15 -0
  72. package/build/src/services/ios/afc/enums.js.map +1 -1
  73. package/build/src/services/ios/afc/index.d.ts +6 -8
  74. package/build/src/services/ios/afc/index.d.ts.map +1 -1
  75. package/build/src/services/ios/afc/index.js +19 -15
  76. package/build/src/services/ios/afc/index.js.map +1 -1
  77. package/build/src/services/ios/afc/stream-utils.d.ts.map +1 -1
  78. package/build/src/services/ios/afc/stream-utils.js +34 -20
  79. package/build/src/services/ios/afc/stream-utils.js.map +1 -1
  80. package/build/src/services/ios/base-service.d.ts +6 -11
  81. package/build/src/services/ios/base-service.d.ts.map +1 -1
  82. package/build/src/services/ios/base-service.js +16 -16
  83. package/build/src/services/ios/base-service.js.map +1 -1
  84. package/build/src/services/ios/crash-reports/index.d.ts +3 -9
  85. package/build/src/services/ios/crash-reports/index.d.ts.map +1 -1
  86. package/build/src/services/ios/crash-reports/index.js +8 -13
  87. package/build/src/services/ios/crash-reports/index.js.map +1 -1
  88. package/build/src/services/ios/diagnostic-service/index.d.ts +0 -2
  89. package/build/src/services/ios/diagnostic-service/index.d.ts.map +1 -1
  90. package/build/src/services/ios/diagnostic-service/index.js +1 -10
  91. package/build/src/services/ios/diagnostic-service/index.js.map +1 -1
  92. package/build/src/services/ios/dvt/index.d.ts +1 -1
  93. package/build/src/services/ios/dvt/index.d.ts.map +1 -1
  94. package/build/src/services/ios/dvt/index.js +3 -7
  95. package/build/src/services/ios/dvt/index.js.map +1 -1
  96. package/build/src/services/ios/dvt/instruments/device-info.d.ts +2 -0
  97. package/build/src/services/ios/dvt/instruments/device-info.d.ts.map +1 -1
  98. package/build/src/services/ios/dvt/instruments/device-info.js +15 -2
  99. package/build/src/services/ios/dvt/instruments/device-info.js.map +1 -1
  100. package/build/src/services/ios/house-arrest/index.d.ts +0 -1
  101. package/build/src/services/ios/house-arrest/index.d.ts.map +1 -1
  102. package/build/src/services/ios/house-arrest/index.js +1 -8
  103. package/build/src/services/ios/house-arrest/index.js.map +1 -1
  104. package/build/src/services/ios/installation-proxy/index.d.ts +1 -1
  105. package/build/src/services/ios/installation-proxy/index.d.ts.map +1 -1
  106. package/build/src/services/ios/installation-proxy/index.js +3 -7
  107. package/build/src/services/ios/installation-proxy/index.js.map +1 -1
  108. package/build/src/services/ios/misagent/index.d.ts +1 -2
  109. package/build/src/services/ios/misagent/index.d.ts.map +1 -1
  110. package/build/src/services/ios/misagent/index.js +1 -8
  111. package/build/src/services/ios/misagent/index.js.map +1 -1
  112. package/build/src/services/ios/mobile-config/index.d.ts +1 -3
  113. package/build/src/services/ios/mobile-config/index.d.ts.map +1 -1
  114. package/build/src/services/ios/mobile-config/index.js +1 -11
  115. package/build/src/services/ios/mobile-config/index.js.map +1 -1
  116. package/build/src/services/ios/mobile-image-mounter/index.d.ts +0 -1
  117. package/build/src/services/ios/mobile-image-mounter/index.d.ts.map +1 -1
  118. package/build/src/services/ios/mobile-image-mounter/index.js +1 -7
  119. package/build/src/services/ios/mobile-image-mounter/index.js.map +1 -1
  120. package/build/src/services/ios/notification-proxy/index.d.ts +2 -3
  121. package/build/src/services/ios/notification-proxy/index.d.ts.map +1 -1
  122. package/build/src/services/ios/notification-proxy/index.js +3 -11
  123. package/build/src/services/ios/notification-proxy/index.js.map +1 -1
  124. package/build/src/services/ios/power-assertion/index.d.ts.map +1 -1
  125. package/build/src/services/ios/power-assertion/index.js +2 -6
  126. package/build/src/services/ios/power-assertion/index.js.map +1 -1
  127. package/build/src/services/ios/springboard-service/index.d.ts +1 -3
  128. package/build/src/services/ios/springboard-service/index.d.ts.map +1 -1
  129. package/build/src/services/ios/springboard-service/index.js +1 -11
  130. package/build/src/services/ios/springboard-service/index.js.map +1 -1
  131. package/build/src/services/ios/syslog-service/index.d.ts +3 -2
  132. package/build/src/services/ios/syslog-service/index.d.ts.map +1 -1
  133. package/build/src/services/ios/syslog-service/index.js +7 -5
  134. package/build/src/services/ios/syslog-service/index.js.map +1 -1
  135. package/build/src/services/ios/testmanagerd/index.d.ts +1 -1
  136. package/build/src/services/ios/testmanagerd/index.d.ts.map +1 -1
  137. package/build/src/services/ios/testmanagerd/index.js +3 -7
  138. package/build/src/services/ios/testmanagerd/index.js.map +1 -1
  139. package/build/src/services/ios/webinspector/index.d.ts +1 -1
  140. package/build/src/services/ios/webinspector/index.d.ts.map +1 -1
  141. package/build/src/services/ios/webinspector/index.js +3 -7
  142. package/build/src/services/ios/webinspector/index.js.map +1 -1
  143. package/build/src/services/ios/zipconduit/index.d.ts +2 -2
  144. package/build/src/services/ios/zipconduit/index.d.ts.map +1 -1
  145. package/build/src/services/ios/zipconduit/index.js +6 -4
  146. package/build/src/services/ios/zipconduit/index.js.map +1 -1
  147. package/build/src/services.d.ts +6 -27
  148. package/build/src/services.d.ts.map +1 -1
  149. package/build/src/services.js +67 -199
  150. package/build/src/services.js.map +1 -1
  151. package/package.json +2 -1
  152. package/scripts/start-appletv-tunnel.mjs +93 -44
  153. package/scripts/tunnel-creation.mjs +121 -101
  154. package/src/base-plist-service.ts +1 -1
  155. package/src/base-socket-service.ts +1 -1
  156. package/src/index.ts +11 -3
  157. package/src/lib/lockdown/index.ts +7 -15
  158. package/src/lib/plist/plist-parser.ts +1 -1
  159. package/src/lib/plist/plist-service.ts +2 -2
  160. package/src/lib/port-forwarding/connectors.ts +22 -7
  161. package/src/lib/remote-xpc/handshake.ts +1 -1
  162. package/src/lib/tunnel/constants.ts +3 -0
  163. package/src/lib/tunnel/index.ts +2 -84
  164. package/src/lib/tunnel/tunnel-api-client.ts +62 -24
  165. package/src/lib/tunnel/tunnel-availability.ts +37 -35
  166. package/src/lib/tunnel/tunnel-readiness.ts +82 -0
  167. package/src/lib/tunnel/tunnel-registry-server.ts +132 -9
  168. package/src/lib/tunnel/tunnel-rsd-discovery.ts +59 -0
  169. package/src/lib/tunnel/tunnel-service-resolver.ts +112 -0
  170. package/src/lib/types.ts +18 -11
  171. package/src/lib/usbmux/index.ts +6 -1
  172. package/src/services/ios/afc/codec.ts +1 -1
  173. package/src/services/ios/afc/constants.ts +2 -3
  174. package/src/services/ios/afc/demux.ts +1 -0
  175. package/src/services/ios/afc/enums.ts +15 -0
  176. package/src/services/ios/afc/index.ts +32 -14
  177. package/src/services/ios/afc/stream-utils.ts +40 -24
  178. package/src/services/ios/base-service.ts +23 -16
  179. package/src/services/ios/crash-reports/index.ts +17 -18
  180. package/src/services/ios/diagnostic-service/index.ts +3 -12
  181. package/src/services/ios/dvt/index.ts +7 -10
  182. package/src/services/ios/dvt/instruments/device-info.ts +27 -2
  183. package/src/services/ios/house-arrest/index.ts +3 -9
  184. package/src/services/ios/installation-proxy/index.ts +9 -11
  185. package/src/services/ios/misagent/index.ts +4 -10
  186. package/src/services/ios/mobile-config/index.ts +4 -16
  187. package/src/services/ios/mobile-image-mounter/index.ts +5 -10
  188. package/src/services/ios/notification-proxy/index.ts +7 -16
  189. package/src/services/ios/power-assertion/index.ts +4 -8
  190. package/src/services/ios/springboard-service/index.ts +4 -17
  191. package/src/services/ios/syslog-service/index.ts +10 -6
  192. package/src/services/ios/testmanagerd/index.ts +7 -10
  193. package/src/services/ios/testmanagerd/xcuitest.ts +1 -1
  194. package/src/services/ios/webinspector/index.ts +6 -9
  195. package/src/services/ios/zipconduit/index.ts +10 -4
  196. package/src/services.ts +86 -269
  197. package/build/src/lib/tunnel/rsd-session-lock.d.ts +0 -9
  198. package/build/src/lib/tunnel/rsd-session-lock.d.ts.map +0 -1
  199. package/build/src/lib/tunnel/rsd-session-lock.js +0 -17
  200. package/build/src/lib/tunnel/rsd-session-lock.js.map +0 -1
  201. 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(`Failed to fetch tunnel registry from API: HTTP ${response.status}`);
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
- * @returns Tunnel registry entry or null if not found
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(`${this.apiBaseUrl}/${udid}`);
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(`Failed to fetch tunnel for UDID ${udid}: HTTP ${response.status}`);
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(`Failed to fetch tunnel for device ID ${deviceId}: HTTP ${response.status}`);
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 message = `${messagePrefix}: ${detail}`;
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(), this.timeoutMs);
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 ${this.timeoutMs}ms`, { cause: error });
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":"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"}
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":"AAWA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAInC;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,CAAC,CAWzB;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG7D"}
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 entry = await client.getTunnelByUdid(udid);
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
- * Read the tunnel registry HTTP port from strongbox.
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":"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"}
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
- constructor(tunnelsInfo: TunnelRegistry | undefined, port: number);
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,EAAuB,MAAM,aAAa,CAAC;AASvE,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAQlD;;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;gBAEU,WAAW,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM;IAKjE;;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;IAwB7B;;OAEG;YACW,mBAAmB;IAgCjC;;OAEG;YACW,YAAY;IAqD1B;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAwCjC;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,cAAc,GAAG,SAAS,EACvC,IAAI,GAAE,MAAqC,GAC1C,OAAO,CAAC,oBAAoB,CAAC,CAY/B"}
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
- constructor(tunnelsInfo, port) {
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 tunnel = this.tunnels[udid];
177
- if (!tunnel) {
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
- sendJSON(res, 200, tunnel);
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 (_req, res, params) => this.getTunnelByUdid(res, params.udid),
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