appium-mac2-driver 4.3.6 → 4.4.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 (56) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/WebDriverAgentMac/IntegrationTests/AMSessionTests.m +14 -0
  3. package/WebDriverAgentMac/WebDriverAgentLib/Commands/FBSessionCommands.m +17 -5
  4. package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBSession.m +5 -1
  5. package/build/lib/driver.d.ts +3 -0
  6. package/build/lib/driver.d.ts.map +1 -1
  7. package/build/lib/driver.js +52 -32
  8. package/build/lib/driver.js.map +1 -1
  9. package/build/lib/session-claim-handler.d.ts +41 -0
  10. package/build/lib/session-claim-handler.d.ts.map +1 -0
  11. package/build/lib/session-claim-handler.js +236 -0
  12. package/build/lib/session-claim-handler.js.map +1 -0
  13. package/build/lib/wda-mac.d.ts +6 -2
  14. package/build/lib/wda-mac.d.ts.map +1 -1
  15. package/build/lib/wda-mac.js +39 -9
  16. package/build/lib/wda-mac.js.map +1 -1
  17. package/lib/driver.ts +55 -31
  18. package/lib/session-claim-handler.ts +306 -0
  19. package/lib/wda-mac.ts +41 -10
  20. package/node_modules/appium-xcode/CHANGELOG.md +7 -0
  21. package/node_modules/appium-xcode/package.json +4 -4
  22. package/node_modules/async-lock/AUTHORS +21 -0
  23. package/node_modules/async-lock/History.md +132 -0
  24. package/node_modules/async-lock/LICENSE +22 -0
  25. package/node_modules/async-lock/README.md +177 -0
  26. package/node_modules/async-lock/index.js +2 -0
  27. package/node_modules/async-lock/lib/index.js +312 -0
  28. package/node_modules/async-lock/package.json +48 -0
  29. package/node_modules/bare-fs/binding.c +1 -1
  30. package/node_modules/bare-fs/index.js +30 -6
  31. package/node_modules/bare-fs/package.json +1 -1
  32. package/node_modules/bare-fs/prebuilds/android-arm/bare-fs.bare +0 -0
  33. package/node_modules/bare-fs/prebuilds/android-arm64/bare-fs.bare +0 -0
  34. package/node_modules/bare-fs/prebuilds/android-ia32/bare-fs.bare +0 -0
  35. package/node_modules/bare-fs/prebuilds/android-x64/bare-fs.bare +0 -0
  36. package/node_modules/bare-fs/prebuilds/darwin-arm64/bare-fs.bare +0 -0
  37. package/node_modules/bare-fs/prebuilds/darwin-x64/bare-fs.bare +0 -0
  38. package/node_modules/bare-fs/prebuilds/ios-arm64/bare-fs.bare +0 -0
  39. package/node_modules/bare-fs/prebuilds/ios-arm64-simulator/bare-fs.bare +0 -0
  40. package/node_modules/bare-fs/prebuilds/ios-x64-simulator/bare-fs.bare +0 -0
  41. package/node_modules/bare-fs/prebuilds/linux-arm64/bare-fs.bare +0 -0
  42. package/node_modules/bare-fs/prebuilds/linux-x64/bare-fs.bare +0 -0
  43. package/node_modules/bare-fs/prebuilds/win32-arm64/bare-fs.bare +0 -0
  44. package/node_modules/bare-fs/prebuilds/win32-x64/bare-fs.bare +0 -0
  45. package/node_modules/readable-stream/lib/internal/shims/process.js +19 -0
  46. package/node_modules/readable-stream/lib/internal/streams/destroy.js +1 -1
  47. package/node_modules/readable-stream/lib/internal/streams/duplexify.js +1 -1
  48. package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +1 -1
  49. package/node_modules/readable-stream/lib/internal/streams/from.js +1 -1
  50. package/node_modules/readable-stream/lib/internal/streams/legacy.js +6 -1
  51. package/node_modules/readable-stream/lib/internal/streams/pipeline.js +1 -1
  52. package/node_modules/readable-stream/lib/internal/streams/readable.js +1 -1
  53. package/node_modules/readable-stream/lib/internal/streams/writable.js +1 -1
  54. package/node_modules/readable-stream/package.json +3 -2
  55. package/node_modules/tar-stream/package.json +7 -7
  56. package/package.json +4 -2
@@ -13,8 +13,12 @@ export declare class WDAMacServer {
13
13
  private _serverStartupTimeoutMs;
14
14
  private _isProxyingToRemoteServer;
15
15
  get proxy(): WDAMacProxy;
16
- startSession(caps: StartSessionCapabilities, opts?: SessionOptions): Promise<void>;
17
- stopSession(): Promise<void>;
16
+ /** Starts a WDA session, replacing the previous one. Returns the new WDA session id. */
17
+ startSession(caps: StartSessionCapabilities, opts?: SessionOptions): Promise<string>;
18
+ /** Whether the WDA session has not been replaced by a newer one. */
19
+ isSessionActive(sessionId: string | null | undefined): boolean;
20
+ /** Stops the WDA session. A replaced one is skipped, so the newer one is never affected. */
21
+ stopSession(sessionId: string | null | undefined): Promise<void>;
18
22
  private isProxyReady;
19
23
  /**
20
24
  * Returns proxy information where WDAMacServer proxy to.
@@ -1 +1 @@
1
- {"version":3,"file":"wda-mac.d.ts","sourceRoot":"","sources":["../../lib/wda-mac.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAe,MAAM,eAAe,CAAC;AACrF,OAAO,EAAC,cAAc,EAAS,MAAM,kBAAkB,CAAC;AAyBxD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+OD,qBAAa,WAAY,SAAQ,cAAc;IACtC,cAAc,EAAE,OAAO,CAAS;IAExB,YAAY,CACzB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE,QAAe,GACpB,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;CAStC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,uBAAuB,CAA8B;IAC7D,OAAO,CAAC,yBAAyB,CAAkB;IAEnD,IAAI,KAAK,IAAI,WAAW,CAKvB;IAEK,YAAY,CAAC,IAAI,EAAE,wBAAwB,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwFtF,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAepB,YAAY;IAgB1B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;CAgC7B;AAED,eAAO,MAAM,cAAc,cAAqB,CAAC;AAsDjD,UAAU,wBAAwB;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"wda-mac.d.ts","sourceRoot":"","sources":["../../lib/wda-mac.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAe,MAAM,eAAe,CAAC;AACrF,OAAO,EAAC,cAAc,EAAS,MAAM,kBAAkB,CAAC;AAyBxD,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+OD,qBAAa,WAAY,SAAQ,cAAc;IACtC,cAAc,EAAE,OAAO,CAAS;IAExB,YAAY,CACzB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE,QAAe,GACpB,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;CAStC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,uBAAuB,CAA8B;IAC7D,OAAO,CAAC,yBAAyB,CAAkB;IAEnD,IAAI,KAAK,IAAI,WAAW,CAKvB;IAED,wFAAwF;IAClF,YAAY,CAAC,IAAI,EAAE,wBAAwB,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoG9F,oEAAoE;IACpE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;IAI9D,4FAA4F;IACtF,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YA2BxD,YAAY;IAgB1B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;CAgC7B;AAED,eAAO,MAAM,cAAc,cAAqB,CAAC;AAsDjD,UAAU,wBAAwB;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
@@ -242,6 +242,7 @@ export class WDAMacServer {
242
242
  }
243
243
  return this._proxy;
244
244
  }
245
+ /** Starts a WDA session, replacing the previous one. Returns the new WDA session id. */
245
246
  async startSession(caps, opts = {}) {
246
247
  this._serverStartupTimeoutMs = caps.serverStartupTimeout ?? this._serverStartupTimeoutMs;
247
248
  this._isProxyingToRemoteServer = !!caps.webDriverAgentMacUrl;
@@ -318,21 +319,50 @@ export class WDAMacServer {
318
319
  else {
319
320
  log.info('The host process has already been listening. Proceeding with session creation');
320
321
  }
321
- await this._proxy.command('/session', 'POST', {
322
- capabilities: {
323
- firstMatch: [{}],
324
- alwaysMatch: caps,
325
- },
326
- });
322
+ // WDA drops the previous session as soon as it gets this request,
323
+ // so a failure must not leave the proxy pointing at the replaced one
324
+ try {
325
+ await this._proxy.command('/session', 'POST', {
326
+ capabilities: {
327
+ firstMatch: [{}],
328
+ alwaysMatch: caps,
329
+ },
330
+ });
331
+ }
332
+ catch (e) {
333
+ this._proxy.sessionId = null;
334
+ throw e;
335
+ }
336
+ const sessionId = this._proxy.sessionId;
337
+ if (!sessionId) {
338
+ throw new errors.SessionNotCreatedError('WebDriverAgentMac did not return a session id');
339
+ }
340
+ return sessionId;
327
341
  }
328
- async stopSession() {
342
+ /** Whether the WDA session has not been replaced by a newer one. */
343
+ isSessionActive(sessionId) {
344
+ return !!sessionId && this._proxy?.sessionId === sessionId;
345
+ }
346
+ /** Stops the WDA session. A replaced one is skipped, so the newer one is never affected. */
347
+ async stopSession(sessionId) {
329
348
  if (!this._isProxyingToRemoteServer && !this._process?.isRunning) {
330
349
  log.info(`Mac2Driver session cannot be stopped, because the server is not running`);
331
350
  return;
332
351
  }
333
- if (this._proxy?.sessionId) {
352
+ if (!this.isSessionActive(sessionId)) {
353
+ if (sessionId) {
354
+ log.info(`Mac2Driver session '${sessionId}' is not active anymore. Nothing to stop`);
355
+ }
356
+ return;
357
+ }
358
+ const proxy = this._proxy;
359
+ if (proxy) {
334
360
  try {
335
- await this._proxy.command(`/session/${this._proxy.sessionId}`, 'DELETE');
361
+ await proxy.command(`/session/${sessionId}`, 'DELETE');
362
+ // A newer session might have been created while the DELETE was pending
363
+ if (proxy.sessionId === sessionId) {
364
+ proxy.sessionId = null;
365
+ }
336
366
  }
337
367
  catch (e) {
338
368
  log.info(`Mac2Driver session cannot be deleted. Original error: ${e.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"wda-mac.js","sourceRoot":"","sources":["../../lib/wda-mac.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wda-mac.js","sourceRoot":"","sources":["../../lib/wda-mac.ts"],"names":[],"mappings":"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"}
package/lib/driver.ts CHANGED
@@ -11,7 +11,7 @@ import type {
11
11
  DriverOpts,
12
12
  W3CDriverCaps,
13
13
  } from '@appium/types';
14
- import {BaseDriver, DeviceSettings} from 'appium/driver.js';
14
+ import {BaseDriver, DeviceSettings, errors} from 'appium/driver.js';
15
15
 
16
16
  import * as appManagemenetCommands from './commands/app-management.js';
17
17
  import * as appleScriptCommands from './commands/applescript.js';
@@ -29,6 +29,7 @@ import MAC2_CONSTRAINTS, {type Mac2Constraints} from './constraints.js';
29
29
  import {executeMethodMap} from './execute-method-map.js';
30
30
  import log from './logger.js';
31
31
  import {newMethodMap} from './method-map.js';
32
+ import {sessionClaimHandler} from './session-claim-handler.js';
32
33
  import {WDA_MAC_SERVER, type WDAMacServer} from './wda-mac.js';
33
34
 
34
35
  const NO_PROXY: RouteMatcher[] = [
@@ -116,6 +117,8 @@ export class Mac2Driver
116
117
 
117
118
  private isProxyActive: boolean = false;
118
119
  private _wda: WDAMacServer | null = null;
120
+ private _wdaSessionId: string | null = null;
121
+ private _hasClaimedHost: boolean = false;
119
122
 
120
123
  constructor(opts: InitialOpts = {} as InitialOpts) {
121
124
  super(opts);
@@ -143,6 +146,13 @@ export class Mac2Driver
143
146
  if (!this._wda) {
144
147
  throw new Error('WDA server is not initialized');
145
148
  }
149
+ // The WDA server is shared and only supports a single session, so a newer
150
+ // session replaces this one. Never send commands on its behalf after that.
151
+ if (this._wdaSessionId && !this._wda.isSessionActive(this._wdaSessionId)) {
152
+ throw new errors.NoSuchDriverError(
153
+ 'This session has been replaced by a newer one, because this driver only supports a single session',
154
+ );
155
+ }
146
156
  return this._wda;
147
157
  }
148
158
 
@@ -150,7 +160,7 @@ export class Mac2Driver
150
160
  if (!this._wda) {
151
161
  return;
152
162
  }
153
- return await this._wda.proxy.command('/appium/settings', 'POST', {
163
+ return await this.wda.proxy.command('/appium/settings', 'POST', {
154
164
  settings: {[key]: value},
155
165
  });
156
166
  }
@@ -170,10 +180,7 @@ export class Mac2Driver
170
180
  }
171
181
 
172
182
  async proxyCommand(url: string, method: HTTPMethod, body: HTTPBody = null): Promise<any> {
173
- if (!this._wda) {
174
- throw new Error('WDA server is not initialized');
175
- }
176
- return await this._wda.proxy.command(url, method, body);
183
+ return await this.wda.proxy.command(url, method, body);
177
184
  }
178
185
 
179
186
  override async getStatus(): Promise<any> {
@@ -185,10 +192,7 @@ export class Mac2Driver
185
192
 
186
193
  // needed to make image plugin work
187
194
  async getWindowRect(): Promise<any> {
188
- if (!this._wda) {
189
- throw new Error('WDA server is not initialized');
190
- }
191
- return await this._wda.proxy.command('/window/rect', 'GET');
195
+ return await this.wda.proxy.command('/window/rect', 'GET');
192
196
  }
193
197
 
194
198
  override async createSession(
@@ -202,34 +206,51 @@ export class Mac2Driver
202
206
  this.caps = caps as Mac2DriverCaps;
203
207
  // oxlint-disable-next-line no-self-assign -- narrows this.opts' type for the rest of the method
204
208
  this.opts = this.opts as Mac2DriverOpts;
205
- try {
206
- const prerun = caps.prerun as PrerunCapability | undefined;
207
- if (prerun) {
208
- if (typeof prerun.command !== 'string' && typeof prerun.script !== 'string') {
209
- throw new Error(`'prerun' capability value must either contain 'script' or 'command' entry of string type`);
210
- }
211
- log.info('Executing prerun AppleScript');
212
- const output = await this.macosExecAppleScript(prerun.script, undefined, prerun.command);
213
- if (output.trim()) {
214
- log.info(`Prerun script output: ${output}`);
209
+ // The host supports a single session: the previous one has to quit first
210
+ await sessionClaimHandler.runExclusive(async () => {
211
+ // The session might have been deleted while it was waiting for its turn
212
+ if (!this._wda || !this.sessionId) {
213
+ throw new errors.NoSuchDriverError('The session has been deleted before it could start');
214
+ }
215
+ try {
216
+ await sessionClaimHandler.registerActiveSession(this);
217
+ await sessionClaimHandler.claimHost(this);
218
+ this._hasClaimedHost = true;
219
+ const prerun = caps.prerun as PrerunCapability | undefined;
220
+ if (prerun) {
221
+ if (typeof prerun.command !== 'string' && typeof prerun.script !== 'string') {
222
+ throw new Error(`'prerun' capability value must either contain 'script' or 'command' entry of string type`);
223
+ }
224
+ log.info('Executing prerun AppleScript');
225
+ const output = await this.macosExecAppleScript(prerun.script, undefined, prerun.command);
226
+ if (output.trim()) {
227
+ log.info(`Prerun script output: ${output}`);
228
+ }
215
229
  }
230
+ this._wdaSessionId = await this.wda.startSession(caps, {
231
+ reqBasePath: this.basePath,
232
+ });
233
+ } catch (e: any) {
234
+ await this.deleteSession();
235
+ throw e;
216
236
  }
217
- await this._wda.startSession(caps, {
218
- reqBasePath: this.basePath,
219
- });
220
- } catch (e: any) {
221
- await this.deleteSession();
222
- throw e;
223
- }
224
- this.proxyReqRes = this.wda.proxy.proxyReqRes.bind(this._wda.proxy);
237
+ });
238
+ this.proxyReqRes = (...args: any[]) =>
239
+ (this.wda.proxy.proxyReqRes as (...a: any[]) => any).apply(this.wda.proxy, args);
225
240
  this.isProxyActive = true;
226
241
  return [sessionId, caps];
227
242
  }
228
243
 
229
244
  override async deleteSession(): Promise<void> {
245
+ sessionClaimHandler.unregisterActiveSession(this);
246
+ // A new session waits for the teardown to complete before it starts
247
+ await sessionClaimHandler.trackTeardown(async () => await this.teardownSession());
248
+ }
249
+
250
+ private async teardownSession(): Promise<void> {
230
251
  await this._screenRecorder?.stop(true);
231
252
  if (this._videoChunksBroadcaster.hasPublishers) {
232
- if (this._wda) {
253
+ if (this._wda?.isSessionActive(this._wdaSessionId)) {
233
254
  try {
234
255
  await this.wda.proxy.command('/wda/video/stop', 'POST', {});
235
256
  } catch {}
@@ -237,10 +258,11 @@ export class Mac2Driver
237
258
  await this._videoChunksBroadcaster.shutdown(5000);
238
259
  }
239
260
  if (this._wda) {
240
- await this.wda.stopSession();
261
+ await this._wda.stopSession(this._wdaSessionId);
241
262
  }
242
263
 
243
- const postrun = this.opts.postrun as PostrunCapability | undefined;
264
+ // Skip postrun if the host was never acquired, as the previous session might still be using it
265
+ const postrun = this._hasClaimedHost ? (this.opts.postrun as PostrunCapability | undefined) : undefined;
244
266
  if (postrun) {
245
267
  if (typeof postrun.command !== 'string' && typeof postrun.script !== 'string') {
246
268
  log.error(`'postrun' capability value must either contain 'script' or 'command' entry of string type`);
@@ -264,6 +286,8 @@ export class Mac2Driver
264
286
 
265
287
  private resetState(): void {
266
288
  this._wda = null;
289
+ this._wdaSessionId = null;
290
+ this._hasClaimedHost = false;
267
291
  this.isProxyActive = false;
268
292
  this._videoChunksBroadcaster = new nativeScreenRecordingCommands.NativeVideoChunksBroadcaster(
269
293
  this.eventEmitter,
@@ -0,0 +1,306 @@
1
+ import {setTimeout as delay} from 'node:timers/promises';
2
+
3
+ import type {AppiumLogger, IAppiumIpc, IIpcSubscription, IpcMessage} from '@appium/types';
4
+ import {errors} from 'appium/driver.js';
5
+ import {node, util} from 'appium/support.js';
6
+ import AsyncLock from 'async-lock';
7
+ import {waitForCondition} from 'asyncbox';
8
+
9
+ import type {Mac2Driver} from './driver.js';
10
+
11
+ export type SessionIpcMessage = {
12
+ sessionId: string;
13
+ };
14
+
15
+ type AppiumIpcConstructor = new () => IAppiumIpc;
16
+ type IpcProvider = () => Promise<IAppiumIpc | undefined>;
17
+
18
+ /** Lets a new session make the previous one quit, over a driver-wide IPC (per-session IPCs are isolated). */
19
+ export class SessionClaimHandler {
20
+ static readonly CLAIMED_TOPIC = 'mac2:sessionClaimed';
21
+ static readonly CONTENDED_TOPIC = 'mac2:sessionContended';
22
+ static readonly RELEASED_TOPIC = 'mac2:sessionReleased';
23
+
24
+ private static readonly STARTUP_LOCK_KEY = 'mac2:sessionStartup';
25
+
26
+ private static readonly CONTENTION_PROBE_MS = 10;
27
+ private static readonly DEFAULT_RELEASE_WAIT_MS = 15000;
28
+
29
+ private readonly startupLock = new AsyncLock();
30
+ private readonly pendingTeardowns = new Set<Promise<void>>();
31
+ private readonly subscriptionsBySessionId = new Map<string, IIpcSubscription<SessionIpcMessage>>();
32
+
33
+ constructor(
34
+ private readonly getIpc: IpcProvider,
35
+ private readonly releaseWaitMs: number = SessionClaimHandler.DEFAULT_RELEASE_WAIT_MS,
36
+ ) {}
37
+
38
+ /** Serializes session startups so the newest wins. Enter before registering the session. */
39
+ async runExclusive<T>(fn: () => Promise<T>): Promise<T> {
40
+ return await this.startupLock.acquire(SessionClaimHandler.STARTUP_LOCK_KEY, fn);
41
+ }
42
+
43
+ /** Subscribe the session to claim messages from newer sessions. */
44
+ async registerActiveSession(driver: Mac2Driver): Promise<void> {
45
+ const ipc = await this.getIpc();
46
+ const sessionId = driver.sessionId;
47
+ if (!ipc || !sessionId) {
48
+ return;
49
+ }
50
+
51
+ this.unregisterActiveSession(driver);
52
+
53
+ const subscription = ipc.subscribe<SessionIpcMessage>(
54
+ SessionClaimHandler.CLAIMED_TOPIC,
55
+ this.getPublisherId(driver),
56
+ );
57
+ subscription.on('message', (message) => {
58
+ void this.dispatchClaimMessage(driver, sessionId, message);
59
+ });
60
+ this.subscriptionsBySessionId.set(sessionId, subscription);
61
+ }
62
+
63
+ /** Unsubscribe the session from claim messages. */
64
+ unregisterActiveSession(driver: Mac2Driver): void {
65
+ const sessionId = driver.sessionId;
66
+ if (!sessionId) {
67
+ return;
68
+ }
69
+
70
+ this.subscriptionsBySessionId.get(sessionId)?.unsubscribe();
71
+ this.subscriptionsBySessionId.delete(sessionId);
72
+ }
73
+
74
+ /** Tracks a session teardown, so that a new session does not start before it is complete. */
75
+ async trackTeardown(teardown: () => Promise<void>): Promise<void> {
76
+ const promise = teardown();
77
+ const tracked = (async () => {
78
+ try {
79
+ await promise;
80
+ } catch {
81
+ // the failure is reported to the caller of trackTeardown()
82
+ }
83
+ })();
84
+ this.pendingTeardowns.add(tracked);
85
+ try {
86
+ await promise;
87
+ } finally {
88
+ this.pendingTeardowns.delete(tracked);
89
+ }
90
+ }
91
+
92
+ /** Make any other active session quit and wait until it has released the host. */
93
+ async claimHost(driver: Mac2Driver): Promise<void> {
94
+ await this.requestRelease(driver);
95
+ await this.waitForPendingTeardowns(driver);
96
+ }
97
+
98
+ private async waitForPendingTeardowns(driver: Mac2Driver): Promise<void> {
99
+ if (this.pendingTeardowns.size === 0) {
100
+ return;
101
+ }
102
+
103
+ driver.log.debug(`Waiting for ${util.pluralize('session', this.pendingTeardowns.size, true)} to finish quitting`);
104
+ const timer = new AbortController();
105
+ const timedOut = Symbol('timedOut');
106
+ const timeout = (async () => {
107
+ try {
108
+ return await delay(this.releaseWaitMs, timedOut, {signal: timer.signal});
109
+ } catch {
110
+ return undefined; // aborted
111
+ }
112
+ })();
113
+ try {
114
+ if ((await Promise.race([Promise.all(this.pendingTeardowns), timeout])) === timedOut) {
115
+ // Starting now could let the old teardown (e.g. postrun) interfere with this session
116
+ throw new errors.SessionNotCreatedError(
117
+ `The previous session did not finish quitting within ${this.releaseWaitMs}ms`,
118
+ );
119
+ }
120
+ } finally {
121
+ timer.abort();
122
+ }
123
+ }
124
+
125
+ private async requestRelease(driver: Mac2Driver): Promise<void> {
126
+ const ipc = await this.getIpc();
127
+ if (!ipc) {
128
+ driver.log.debug('Driver-instance IPC is unavailable. Skipping the session claim.');
129
+ return;
130
+ }
131
+
132
+ const sessionId = driver.sessionId;
133
+ if (!sessionId) {
134
+ return;
135
+ }
136
+
137
+ const contendingSessionIds = new Set<string>();
138
+ const releasedSessionIds = new Set<string>();
139
+ const subscriptions: IIpcSubscription<SessionIpcMessage>[] = [];
140
+
141
+ try {
142
+ const contendedSubscription = ipc.subscribe<SessionIpcMessage>(
143
+ SessionClaimHandler.CONTENDED_TOPIC,
144
+ this.getPublisherId(driver),
145
+ );
146
+ subscriptions.push(contendedSubscription);
147
+ const releasedSubscription = ipc.subscribe<SessionIpcMessage>(
148
+ SessionClaimHandler.RELEASED_TOPIC,
149
+ this.getPublisherId(driver),
150
+ );
151
+ subscriptions.push(releasedSubscription);
152
+ contendedSubscription.on('message', (message) => {
153
+ if (message.data.sessionId !== sessionId) {
154
+ contendingSessionIds.add(message.data.sessionId);
155
+ }
156
+ });
157
+ releasedSubscription.on('message', (message) => {
158
+ if (message.data.sessionId !== sessionId) {
159
+ releasedSessionIds.add(message.data.sessionId);
160
+ }
161
+ });
162
+
163
+ await ipc.publish<SessionIpcMessage>(SessionClaimHandler.CLAIMED_TOPIC, this.getPublisherId(driver), {
164
+ sessionId,
165
+ });
166
+ // Older sessions reply synchronously to the claim, so a short wait is enough to learn about them
167
+ await delay(SessionClaimHandler.CONTENTION_PROBE_MS);
168
+
169
+ if (contendingSessionIds.size === 0) {
170
+ return;
171
+ }
172
+
173
+ try {
174
+ await waitForCondition(() => [...contendingSessionIds].every((id) => releasedSessionIds.has(id)), {
175
+ waitMs: this.releaseWaitMs,
176
+ intervalMs: 50,
177
+ });
178
+ driver.log.debug(
179
+ `Received release confirmation from ${util.pluralize('session', contendingSessionIds.size, true)}`,
180
+ );
181
+ } catch {
182
+ const pendingSessionIds = [...contendingSessionIds].filter((id) => !releasedSessionIds.has(id));
183
+ // Starting now could let the old session interfere with this one
184
+ throw new errors.SessionNotCreatedError(
185
+ `${util.pluralize('session', pendingSessionIds.length, true)} [${pendingSessionIds.join(', ')}] ` +
186
+ `did not quit within ${this.releaseWaitMs}ms`,
187
+ );
188
+ }
189
+ } finally {
190
+ subscriptions.forEach((sub) => sub.unsubscribe());
191
+ }
192
+ }
193
+
194
+ /** @internal Exposed for unit tests. */
195
+ resetForTesting(): void {
196
+ this.pendingTeardowns.clear();
197
+ for (const subscription of this.subscriptionsBySessionId.values()) {
198
+ subscription.unsubscribe();
199
+ }
200
+ this.subscriptionsBySessionId.clear();
201
+ }
202
+
203
+ private async dispatchClaimMessage(
204
+ driver: Mac2Driver,
205
+ sessionId: string,
206
+ message: IpcMessage<SessionIpcMessage>,
207
+ ): Promise<void> {
208
+ try {
209
+ await this.handleClaimMessage(driver, sessionId, message);
210
+ } catch (err) {
211
+ const msg = err instanceof Error ? err.message : String(err);
212
+ driver.log.warn(`Could not handle the session claim IPC message for session '${sessionId}': ${msg}`);
213
+ }
214
+ }
215
+
216
+ private async handleClaimMessage(
217
+ driver: Mac2Driver,
218
+ sessionId: string,
219
+ message: IpcMessage<SessionIpcMessage>,
220
+ ): Promise<void> {
221
+ if (message.data.sessionId === sessionId || driver.sessionId !== sessionId) {
222
+ return;
223
+ }
224
+
225
+ // Tell the claimer that it has to wait for us
226
+ await this.publish(driver, SessionClaimHandler.CONTENDED_TOPIC, sessionId);
227
+
228
+ driver.log.warn(
229
+ `Session '${message.data.sessionId}' is starting, while this session ('${sessionId}') is still active. ` +
230
+ `Only one session at a time is supported, since XCTest is single-threaded. ` +
231
+ `Consider enabling the Appium server's '--session-override' flag and make sure to properly ` +
232
+ `quit the previous session before starting a new one. Terminating the obsolete session.`,
233
+ );
234
+ await this.terminateSession(driver, sessionId);
235
+ }
236
+
237
+ private async terminateSession(driver: Mac2Driver, sessionId: string): Promise<void> {
238
+ const publisherId = this.getPublisherId(driver);
239
+ const {log} = driver;
240
+
241
+ try {
242
+ // Unlike deleteSession(), this also makes the server drop the session from its list
243
+ await driver.startUnexpectedShutdown(
244
+ new errors.NoSuchDriverError(
245
+ 'This session has been replaced by a newer one, because only a single session is supported',
246
+ ),
247
+ );
248
+ } catch (err) {
249
+ const msg = err instanceof Error ? err.message : String(err);
250
+ log.warn(`Could not terminate session '${sessionId}' on IPC request: ${msg}`);
251
+ }
252
+
253
+ await this.publish(driver, SessionClaimHandler.RELEASED_TOPIC, sessionId, publisherId, log);
254
+ }
255
+
256
+ private async publish(
257
+ driver: Mac2Driver,
258
+ topic: string,
259
+ sessionId: string,
260
+ publisherId: string = this.getPublisherId(driver),
261
+ log: AppiumLogger = driver.log,
262
+ ): Promise<void> {
263
+ try {
264
+ const ipc = await this.getIpc();
265
+ await ipc?.publish<SessionIpcMessage>(topic, publisherId, {sessionId});
266
+ } catch (err) {
267
+ const msg = err instanceof Error ? err.message : String(err);
268
+ log.warn(`Could not publish '${topic}' message for session '${sessionId}': ${msg}`);
269
+ }
270
+ }
271
+
272
+ private getPublisherId(driver: Mac2Driver): string {
273
+ return node.getObjectId(driver);
274
+ }
275
+ }
276
+
277
+ let sharedIpc: Promise<IAppiumIpc | undefined> | undefined;
278
+
279
+ async function loadSharedIpc(): Promise<IAppiumIpc | undefined> {
280
+ sharedIpc ??= (async () => {
281
+ try {
282
+ const {AppiumIpc} = (await import('appium/driver.js')) as {AppiumIpc?: AppiumIpcConstructor};
283
+ return AppiumIpc ? new AppiumIpc() : undefined;
284
+ } catch {
285
+ return undefined;
286
+ }
287
+ })();
288
+ return await sharedIpc;
289
+ }
290
+
291
+ export const sessionClaimHandler = new SessionClaimHandler(loadSharedIpc);
292
+
293
+ /**
294
+ * @internal Exposed for unit tests.
295
+ */
296
+ export function setSharedIpcForTesting(ipc: IAppiumIpc | undefined): void {
297
+ sharedIpc = Promise.resolve(ipc);
298
+ }
299
+
300
+ /**
301
+ * @internal Exposed for unit tests.
302
+ */
303
+ export function resetSharedIpcForTesting(): void {
304
+ sessionClaimHandler.resetForTesting();
305
+ sharedIpc = undefined;
306
+ }