@appium/base-driver 9.7.0 → 9.8.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.
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":"AAmIA;;;;GAIG;AACH,kCAHW,MAAM,YACN,MAAM,GAAC,MAAM,EAAE,GAAC,OAAO,eAAe,EAAE,mBAAmB,gBAqQrE;AAkKD;;;GAGG;AACH,uCAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;;;;;;GASG;AACH,oFAuBC;AAED;;;;;GAKG;AACH,oCAFW,MAAM,GAAC,aAAa,SAoB9B;AAED;;;;;;GAMG;AACH,kIAHW,MAAM,UACJ,MAAM,CAKlB;;wBAEU,OAAO,eAAe,EAAE,aAAa;;;kBAWlC,IAAI;eACJ,OAAO;YACP,MAAM;UACN,MAAM;;;;;;;;;YAKN,MAAM;;;;YACN,OAAO,QAAQ,EAAE,QAAQ;;;;aACzB,OAAO,OAAO,EAAE,uBAAuB,GAAG,OAAO,OAAO,EAAE,oBAAoB"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":"AA+DA;;;;GAIG;AACH,kCAHW,MAAM,YACN,MAAM,GAAC,MAAM,EAAE,GAAC,OAAO,eAAe,EAAE,mBAAmB,gBAsQrE;AAED;;;GAGG;AACH,uCAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;;;;;;GASG;AACH,oFAuBC;AAED;;;;;GAKG;AACH,oCAFW,MAAM,GAAC,aAAa,SAoB9B;AAED;;;;;;GAMG;AACH,kIAHW,MAAM,UACJ,MAAM,CAKlB;;wBA8SU,OAAO,eAAe,EAAE,aAAa;;;kBAWlC,IAAI;eACJ,OAAO;YACP,MAAM;UACN,MAAM;;;;;;;;;YAKN,MAAM;;;;YACN,OAAO,QAAQ,EAAE,QAAQ;;;;aACzB,OAAO,OAAO,EAAE,uBAAuB,GAAG,OAAO,OAAO,EAAE,oBAAoB"}
@@ -60,66 +60,6 @@ process.on('exit', () => {
60
60
  }
61
61
  }
62
62
  });
63
- /**
64
- *
65
- * @param {string} [envVarName]
66
- * @param {number} defaultValue
67
- * @returns {number}
68
- */
69
- function toNaturalNumber(defaultValue, envVarName) {
70
- if (!envVarName || lodash_1.default.isUndefined(process.env[envVarName])) {
71
- return defaultValue;
72
- }
73
- const num = parseInt(`${process.env[envVarName]}`, 10);
74
- return num > 0 ? num : defaultValue;
75
- }
76
- /**
77
- * @param {string} app
78
- * @param {string[]} supportedAppExtensions
79
- * @returns {string}
80
- */
81
- function verifyAppExtension(app, supportedAppExtensions) {
82
- if (supportedAppExtensions.map(lodash_1.default.toLower).includes(lodash_1.default.toLower(path_1.default.extname(app)))) {
83
- return app;
84
- }
85
- throw new Error(`New app path '${app}' did not have ` +
86
- `${support_1.util.pluralize('extension', supportedAppExtensions.length, false)}: ` +
87
- supportedAppExtensions);
88
- }
89
- /**
90
- * @param {string} folderPath
91
- * @returns {Promise<number>}
92
- */
93
- async function calculateFolderIntegrity(folderPath) {
94
- return (await support_1.fs.glob('**/*', { cwd: folderPath })).length;
95
- }
96
- /**
97
- * @param {string} filePath
98
- * @returns {Promise<string>}
99
- */
100
- async function calculateFileIntegrity(filePath) {
101
- return await support_1.fs.hash(filePath);
102
- }
103
- /**
104
- * @param {string} currentPath
105
- * @param {import('@appium/types').StringRecord} expectedIntegrity
106
- * @returns {Promise<boolean>}
107
- */
108
- async function isAppIntegrityOk(currentPath, expectedIntegrity = {}) {
109
- if (!(await support_1.fs.exists(currentPath))) {
110
- return false;
111
- }
112
- // Folder integrity check is simple:
113
- // Verify the previous amount of files is not greater than the current one.
114
- // We don't want to use equality comparison because of an assumption that the OS might
115
- // create some unwanted service files/cached inside of that folder or its subfolders.
116
- // Ofc, validating the hash sum of each file (or at least of file path) would be much
117
- // more precise, but we don't need to be very precise here and also don't want to
118
- // overuse RAM and have a performance drop.
119
- return (await support_1.fs.stat(currentPath)).isDirectory()
120
- ? (await calculateFolderIntegrity(currentPath)) >= expectedIntegrity?.folder
121
- : (await calculateFileIntegrity(currentPath)) === expectedIntegrity?.file;
122
- }
123
63
  /**
124
64
  *
125
65
  * @param {string} app
@@ -158,13 +98,14 @@ async function configureApp(app, options = /** @type {import('@appium/types').Co
158
98
  maxAge: null,
159
99
  etag: null,
160
100
  };
161
- const { protocol, pathname } = url_1.default.parse(newApp);
162
- const isUrl = protocol === null ? false : ['http:', 'https:'].includes(protocol);
163
- const cachedAppInfo = APPLICATIONS_CACHE.get(app);
101
+ const { protocol, pathname } = parseAppLink(app);
102
+ const isUrl = isSupportedUrl(app);
103
+ const appCacheKey = toCacheKey(app);
104
+ const cachedAppInfo = APPLICATIONS_CACHE.get(appCacheKey);
164
105
  if (cachedAppInfo) {
165
106
  logger_1.default.debug(`Cached app data: ${JSON.stringify(cachedAppInfo, null, 2)}`);
166
107
  }
167
- return await APPLICATIONS_CACHE_GUARD.acquire(app, async () => {
108
+ return await APPLICATIONS_CACHE_GUARD.acquire(appCacheKey, async () => {
168
109
  if (isUrl) {
169
110
  // Use the app from remote URL
170
111
  logger_1.default.info(`Using downloadable app '${newApp}'`);
@@ -206,7 +147,7 @@ async function configureApp(app, options = /** @type {import('@appium/types').Co
206
147
  }
207
148
  logger_1.default.info(`The application at '${cachedAppInfo.fullPath}' does not exist anymore ` +
208
149
  `or its integrity has been damaged. Deleting it from the internal cache`);
209
- APPLICATIONS_CACHE.delete(app);
150
+ APPLICATIONS_CACHE.delete(appCacheKey);
210
151
  if (!stream.closed) {
211
152
  stream.destroy();
212
153
  }
@@ -306,7 +247,7 @@ async function configureApp(app, options = /** @type {import('@appium/types').Co
306
247
  }
307
248
  logger_1.default.info(`The application at '${fullPath}' does not exist anymore ` +
308
249
  `or its integrity has been damaged. Deleting it from the cache`);
309
- APPLICATIONS_CACHE.delete(app);
250
+ APPLICATIONS_CACHE.delete(appCacheKey);
310
251
  }
311
252
  const tmpRoot = await support_1.tempDir.openDir();
312
253
  try {
@@ -337,7 +278,7 @@ async function configureApp(app, options = /** @type {import('@appium/types').Co
337
278
  else {
338
279
  integrity.file = await calculateFileIntegrity(appPathToCache);
339
280
  }
340
- APPLICATIONS_CACHE.set(app, {
281
+ APPLICATIONS_CACHE.set(appCacheKey, {
341
282
  ...remoteAppProps,
342
283
  timestamp: Date.now(),
343
284
  packageHash,
@@ -360,12 +301,92 @@ async function configureApp(app, options = /** @type {import('@appium/types').Co
360
301
  : await storeAppInCache(result.appPath);
361
302
  }
362
303
  verifyAppExtension(newApp, supportedAppExtensions);
363
- return app !== newApp && (packageHash || lodash_1.default.values(remoteAppProps).some(Boolean))
304
+ return appCacheKey !== toCacheKey(newApp) && (packageHash || lodash_1.default.values(remoteAppProps).some(Boolean))
364
305
  ? await storeAppInCache(newApp)
365
306
  : newApp;
366
307
  });
367
308
  }
368
309
  exports.configureApp = configureApp;
310
+ /**
311
+ * @param {string} app
312
+ * @returns {boolean}
313
+ */
314
+ function isPackageOrBundle(app) {
315
+ return /^([a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+)+$/.test(app);
316
+ }
317
+ exports.isPackageOrBundle = isPackageOrBundle;
318
+ /**
319
+ * Finds all instances 'firstKey' and create a duplicate with the key 'secondKey',
320
+ * Do the same thing in reverse. If we find 'secondKey', create a duplicate with the key 'firstKey'.
321
+ *
322
+ * This will cause keys to be overwritten if the object contains 'firstKey' and 'secondKey'.
323
+
324
+ * @param {*} input Any type of input
325
+ * @param {String} firstKey The first key to duplicate
326
+ * @param {String} secondKey The second key to duplicate
327
+ */
328
+ function duplicateKeys(input, firstKey, secondKey) {
329
+ // If array provided, recursively call on all elements
330
+ if (lodash_1.default.isArray(input)) {
331
+ return input.map((item) => duplicateKeys(item, firstKey, secondKey));
332
+ }
333
+ // If object, create duplicates for keys and then recursively call on values
334
+ if (lodash_1.default.isPlainObject(input)) {
335
+ const resultObj = {};
336
+ for (let [key, value] of lodash_1.default.toPairs(input)) {
337
+ const recursivelyCalledValue = duplicateKeys(value, firstKey, secondKey);
338
+ if (key === firstKey) {
339
+ resultObj[secondKey] = recursivelyCalledValue;
340
+ }
341
+ else if (key === secondKey) {
342
+ resultObj[firstKey] = recursivelyCalledValue;
343
+ }
344
+ resultObj[key] = recursivelyCalledValue;
345
+ }
346
+ return resultObj;
347
+ }
348
+ // Base case. Return primitives without doing anything.
349
+ return input;
350
+ }
351
+ exports.duplicateKeys = duplicateKeys;
352
+ /**
353
+ * Takes a desired capability and tries to JSON.parse it as an array,
354
+ * and either returns the parsed array or a singleton array.
355
+ *
356
+ * @param {string|Array<String>} cap A desired capability
357
+ */
358
+ function parseCapsArray(cap) {
359
+ if (lodash_1.default.isArray(cap)) {
360
+ return cap;
361
+ }
362
+ let parsedCaps;
363
+ try {
364
+ parsedCaps = JSON.parse(cap);
365
+ if (lodash_1.default.isArray(parsedCaps)) {
366
+ return parsedCaps;
367
+ }
368
+ }
369
+ catch (ign) {
370
+ logger_1.default.warn(`Failed to parse capability as JSON array`);
371
+ }
372
+ if (lodash_1.default.isString(cap)) {
373
+ return [cap];
374
+ }
375
+ throw new Error(`must provide a string or JSON Array; received ${cap}`);
376
+ }
377
+ exports.parseCapsArray = parseCapsArray;
378
+ /**
379
+ * Generate a string that uniquely describes driver instance
380
+ *
381
+ * @param {import('@appium/types').Core} obj driver instance
382
+ * @param {string?} sessionId session identifier (if exists)
383
+ * @returns {string}
384
+ */
385
+ function generateDriverLogPrefix(obj, sessionId = null) {
386
+ const instanceName = `${obj.constructor.name}@${support_1.node.getObjectId(obj).substring(0, 4)}`;
387
+ return sessionId ? `${instanceName} (${sessionId.substring(0, 8)})` : instanceName;
388
+ }
389
+ exports.generateDriverLogPrefix = generateDriverLogPrefix;
369
390
  /**
370
391
  * Sends a HTTP GET query to fetch the app with caching enabled.
371
392
  * Follows https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching
@@ -463,8 +484,7 @@ async function unzipApp(zipPath, dstRoot, supportedAppExtensions) {
463
484
  try {
464
485
  logger_1.default.debug(`Unzipping '${zipPath}'`);
465
486
  const timer = new support_1.timing.Timer().start();
466
- const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
467
- const useSystemUnzip = lodash_1.default.isEmpty(useSystemUnzipEnv) || !['0', 'false'].includes(lodash_1.default.toLower(useSystemUnzipEnv));
487
+ const useSystemUnzip = isEnvOptionEnabled('APPIUM_PREFER_SYSTEM_UNZIP', true);
468
488
  /**
469
489
  * Attempt to use use the system `unzip` (e.g., `/usr/bin/unzip`) due
470
490
  * to the significant performance improvement it provides over the native
@@ -504,85 +524,137 @@ async function unzipApp(zipPath, dstRoot, supportedAppExtensions) {
504
524
  }
505
525
  }
506
526
  /**
507
- * @param {string} app
508
- * @returns {boolean}
527
+ * Transforms the given app link to the cache key.
528
+ * This is necessary to properly cache apps
529
+ * having the same address, but different query strings,
530
+ * for example ones stored in S3 using presigned URLs.
531
+ *
532
+ * @param {string} app App link.
533
+ * @returns {string} Transformed app link or the original arg if
534
+ * no transfromation is needed.
509
535
  */
510
- function isPackageOrBundle(app) {
511
- return /^([a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+)+$/.test(app);
536
+ function toCacheKey(app) {
537
+ if (!isEnvOptionEnabled('APPIUM_APPS_CACHE_IGNORE_URL_QUERY') || !isSupportedUrl(app)) {
538
+ return app;
539
+ }
540
+ try {
541
+ const { href, search } = parseAppLink(app);
542
+ if (href && search) {
543
+ return href.replace(search, '');
544
+ }
545
+ if (href) {
546
+ return href;
547
+ }
548
+ }
549
+ catch { }
550
+ return app;
512
551
  }
513
- exports.isPackageOrBundle = isPackageOrBundle;
514
552
  /**
515
- * Finds all instances 'firstKey' and create a duplicate with the key 'secondKey',
516
- * Do the same thing in reverse. If we find 'secondKey', create a duplicate with the key 'firstKey'.
553
+ * Safely parses the given app link to a URL object
517
554
  *
518
- * This will cause keys to be overwritten if the object contains 'firstKey' and 'secondKey'.
519
-
520
- * @param {*} input Any type of input
521
- * @param {String} firstKey The first key to duplicate
522
- * @param {String} secondKey The second key to duplicate
555
+ * @param {string} appLink
556
+ * @returns {URL|import('@appium/types').StringRecord} Parsed URL object
557
+ * or an empty object if the parsing has failed
523
558
  */
524
- function duplicateKeys(input, firstKey, secondKey) {
525
- // If array provided, recursively call on all elements
526
- if (lodash_1.default.isArray(input)) {
527
- return input.map((item) => duplicateKeys(item, firstKey, secondKey));
559
+ function parseAppLink(appLink) {
560
+ try {
561
+ return new URL(appLink);
528
562
  }
529
- // If object, create duplicates for keys and then recursively call on values
530
- if (lodash_1.default.isPlainObject(input)) {
531
- const resultObj = {};
532
- for (let [key, value] of lodash_1.default.toPairs(input)) {
533
- const recursivelyCalledValue = duplicateKeys(value, firstKey, secondKey);
534
- if (key === firstKey) {
535
- resultObj[secondKey] = recursivelyCalledValue;
536
- }
537
- else if (key === secondKey) {
538
- resultObj[firstKey] = recursivelyCalledValue;
539
- }
540
- resultObj[key] = recursivelyCalledValue;
541
- }
542
- return resultObj;
563
+ catch {
564
+ return {};
543
565
  }
544
- // Base case. Return primitives without doing anything.
545
- return input;
546
566
  }
547
- exports.duplicateKeys = duplicateKeys;
548
567
  /**
549
- * Takes a desired capability and tries to JSON.parse it as an array,
550
- * and either returns the parsed array or a singleton array.
568
+ * Checks whether we can threat the given app link
569
+ * as a URL,
551
570
  *
552
- * @param {string|Array<String>} cap A desired capability
571
+ * @param {string} app
572
+ * @returns {boolean} True if app is a supported URL
553
573
  */
554
- function parseCapsArray(cap) {
555
- if (lodash_1.default.isArray(cap)) {
556
- return cap;
557
- }
558
- let parsedCaps;
574
+ function isSupportedUrl(app) {
559
575
  try {
560
- parsedCaps = JSON.parse(cap);
561
- if (lodash_1.default.isArray(parsedCaps)) {
562
- return parsedCaps;
563
- }
576
+ const { protocol } = parseAppLink(app);
577
+ return ['http:', 'https:'].includes(protocol);
564
578
  }
565
- catch (ign) {
566
- logger_1.default.warn(`Failed to parse capability as JSON array`);
579
+ catch {
580
+ return false;
567
581
  }
568
- if (lodash_1.default.isString(cap)) {
569
- return [cap];
582
+ }
583
+ /**
584
+ * Check if the given environment option is enabled
585
+ *
586
+ * @param {string} optionName Option name
587
+ * @param {boolean|null} [defaultValue=null] The value to return if the given env value
588
+ * is not set explcitly
589
+ * @returns {boolean} True if the option is enabled
590
+ */
591
+ function isEnvOptionEnabled(optionName, defaultValue = null) {
592
+ const value = process.env[optionName];
593
+ if (!lodash_1.default.isNull(defaultValue) && lodash_1.default.isEmpty(value)) {
594
+ return defaultValue;
570
595
  }
571
- throw new Error(`must provide a string or JSON Array; received ${cap}`);
596
+ return !lodash_1.default.isEmpty(value) && !['0', 'false', 'no'].includes(lodash_1.default.toLower(value));
572
597
  }
573
- exports.parseCapsArray = parseCapsArray;
574
598
  /**
575
- * Generate a string that uniquely describes driver instance
576
599
  *
577
- * @param {import('@appium/types').Core} obj driver instance
578
- * @param {string?} sessionId session identifier (if exists)
600
+ * @param {string} [envVarName]
601
+ * @param {number} defaultValue
602
+ * @returns {number}
603
+ */
604
+ function toNaturalNumber(defaultValue, envVarName) {
605
+ if (!envVarName || lodash_1.default.isUndefined(process.env[envVarName])) {
606
+ return defaultValue;
607
+ }
608
+ const num = parseInt(`${process.env[envVarName]}`, 10);
609
+ return num > 0 ? num : defaultValue;
610
+ }
611
+ /**
612
+ * @param {string} app
613
+ * @param {string[]} supportedAppExtensions
579
614
  * @returns {string}
580
615
  */
581
- function generateDriverLogPrefix(obj, sessionId = null) {
582
- const instanceName = `${obj.constructor.name}@${support_1.node.getObjectId(obj).substring(0, 4)}`;
583
- return sessionId ? `${instanceName} (${sessionId.substring(0, 8)})` : instanceName;
616
+ function verifyAppExtension(app, supportedAppExtensions) {
617
+ if (supportedAppExtensions.map(lodash_1.default.toLower).includes(lodash_1.default.toLower(path_1.default.extname(app)))) {
618
+ return app;
619
+ }
620
+ throw new Error(`New app path '${app}' did not have ` +
621
+ `${support_1.util.pluralize('extension', supportedAppExtensions.length, false)}: ` +
622
+ supportedAppExtensions);
623
+ }
624
+ /**
625
+ * @param {string} folderPath
626
+ * @returns {Promise<number>}
627
+ */
628
+ async function calculateFolderIntegrity(folderPath) {
629
+ return (await support_1.fs.glob('**/*', { cwd: folderPath })).length;
630
+ }
631
+ /**
632
+ * @param {string} filePath
633
+ * @returns {Promise<string>}
634
+ */
635
+ async function calculateFileIntegrity(filePath) {
636
+ return await support_1.fs.hash(filePath);
637
+ }
638
+ /**
639
+ * @param {string} currentPath
640
+ * @param {import('@appium/types').StringRecord} expectedIntegrity
641
+ * @returns {Promise<boolean>}
642
+ */
643
+ async function isAppIntegrityOk(currentPath, expectedIntegrity = {}) {
644
+ if (!(await support_1.fs.exists(currentPath))) {
645
+ return false;
646
+ }
647
+ // Folder integrity check is simple:
648
+ // Verify the previous amount of files is not greater than the current one.
649
+ // We don't want to use equality comparison because of an assumption that the OS might
650
+ // create some unwanted service files/cached inside of that folder or its subfolders.
651
+ // Ofc, validating the hash sum of each file (or at least of file path) would be much
652
+ // more precise, but we don't need to be very precise here and also don't want to
653
+ // overuse RAM and have a performance drop.
654
+ return (await support_1.fs.stat(currentPath)).isDirectory()
655
+ ? (await calculateFolderIntegrity(currentPath)) >= expectedIntegrity?.folder
656
+ : (await calculateFileIntegrity(currentPath)) === expectedIntegrity?.file;
584
657
  }
585
- exports.generateDriverLogPrefix = generateDriverLogPrefix;
586
658
  /** @type {import('@appium/types').DriverHelpers} */
587
659
  exports.default = {
588
660
  configureApp,
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../lib/basedriver/helpers.js"],"names":[],"mappings":"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"}
@@ -61,74 +61,6 @@ process.on('exit', () => {
61
61
  }
62
62
  });
63
63
 
64
- /**
65
- *
66
- * @param {string} [envVarName]
67
- * @param {number} defaultValue
68
- * @returns {number}
69
- */
70
- function toNaturalNumber(defaultValue, envVarName) {
71
- if (!envVarName || _.isUndefined(process.env[envVarName])) {
72
- return defaultValue;
73
- }
74
- const num = parseInt(`${process.env[envVarName]}`, 10);
75
- return num > 0 ? num : defaultValue;
76
- }
77
-
78
- /**
79
- * @param {string} app
80
- * @param {string[]} supportedAppExtensions
81
- * @returns {string}
82
- */
83
- function verifyAppExtension(app, supportedAppExtensions) {
84
- if (supportedAppExtensions.map(_.toLower).includes(_.toLower(path.extname(app)))) {
85
- return app;
86
- }
87
- throw new Error(
88
- `New app path '${app}' did not have ` +
89
- `${util.pluralize('extension', supportedAppExtensions.length, false)}: ` +
90
- supportedAppExtensions
91
- );
92
- }
93
-
94
- /**
95
- * @param {string} folderPath
96
- * @returns {Promise<number>}
97
- */
98
- async function calculateFolderIntegrity(folderPath) {
99
- return (await fs.glob('**/*', {cwd: folderPath})).length;
100
- }
101
-
102
- /**
103
- * @param {string} filePath
104
- * @returns {Promise<string>}
105
- */
106
- async function calculateFileIntegrity(filePath) {
107
- return await fs.hash(filePath);
108
- }
109
-
110
- /**
111
- * @param {string} currentPath
112
- * @param {import('@appium/types').StringRecord} expectedIntegrity
113
- * @returns {Promise<boolean>}
114
- */
115
- async function isAppIntegrityOk(currentPath, expectedIntegrity = {}) {
116
- if (!(await fs.exists(currentPath))) {
117
- return false;
118
- }
119
-
120
- // Folder integrity check is simple:
121
- // Verify the previous amount of files is not greater than the current one.
122
- // We don't want to use equality comparison because of an assumption that the OS might
123
- // create some unwanted service files/cached inside of that folder or its subfolders.
124
- // Ofc, validating the hash sum of each file (or at least of file path) would be much
125
- // more precise, but we don't need to be very precise here and also don't want to
126
- // overuse RAM and have a performance drop.
127
- return (await fs.stat(currentPath)).isDirectory()
128
- ? (await calculateFolderIntegrity(currentPath)) >= expectedIntegrity?.folder
129
- : (await calculateFileIntegrity(currentPath)) === expectedIntegrity?.file;
130
- }
131
-
132
64
  /**
133
65
  *
134
66
  * @param {string} app
@@ -171,15 +103,16 @@ export async function configureApp(
171
103
  maxAge: null,
172
104
  etag: null,
173
105
  };
174
- const {protocol, pathname} = url.parse(newApp);
175
- const isUrl = protocol === null ? false : ['http:', 'https:'].includes(protocol);
106
+ const {protocol, pathname} = parseAppLink(app);
107
+ const isUrl = isSupportedUrl(app);
108
+ const appCacheKey = toCacheKey(app);
176
109
 
177
- const cachedAppInfo = APPLICATIONS_CACHE.get(app);
110
+ const cachedAppInfo = APPLICATIONS_CACHE.get(appCacheKey);
178
111
  if (cachedAppInfo) {
179
112
  logger.debug(`Cached app data: ${JSON.stringify(cachedAppInfo, null, 2)}`);
180
113
  }
181
114
 
182
- return await APPLICATIONS_CACHE_GUARD.acquire(app, async () => {
115
+ return await APPLICATIONS_CACHE_GUARD.acquire(appCacheKey, async () => {
183
116
  if (isUrl) {
184
117
  // Use the app from remote URL
185
118
  logger.info(`Using downloadable app '${newApp}'`);
@@ -223,7 +156,7 @@ export async function configureApp(
223
156
  `The application at '${cachedAppInfo.fullPath}' does not exist anymore ` +
224
157
  `or its integrity has been damaged. Deleting it from the internal cache`
225
158
  );
226
- APPLICATIONS_CACHE.delete(app);
159
+ APPLICATIONS_CACHE.delete(appCacheKey);
227
160
 
228
161
  if (!stream.closed) {
229
162
  stream.destroy();
@@ -332,7 +265,7 @@ export async function configureApp(
332
265
  `The application at '${fullPath}' does not exist anymore ` +
333
266
  `or its integrity has been damaged. Deleting it from the cache`
334
267
  );
335
- APPLICATIONS_CACHE.delete(app);
268
+ APPLICATIONS_CACHE.delete(appCacheKey);
336
269
  }
337
270
  const tmpRoot = await tempDir.openDir();
338
271
  try {
@@ -363,7 +296,7 @@ export async function configureApp(
363
296
  } else {
364
297
  integrity.file = await calculateFileIntegrity(appPathToCache);
365
298
  }
366
- APPLICATIONS_CACHE.set(app, {
299
+ APPLICATIONS_CACHE.set(appCacheKey, {
367
300
  ...remoteAppProps,
368
301
  timestamp: Date.now(),
369
302
  packageHash,
@@ -389,12 +322,94 @@ export async function configureApp(
389
322
  }
390
323
 
391
324
  verifyAppExtension(newApp, supportedAppExtensions);
392
- return app !== newApp && (packageHash || _.values(remoteAppProps).some(Boolean))
325
+ return appCacheKey !== toCacheKey(newApp) && (packageHash || _.values(remoteAppProps).some(Boolean))
393
326
  ? await storeAppInCache(newApp)
394
327
  : newApp;
395
328
  });
396
329
  }
397
330
 
331
+ /**
332
+ * @param {string} app
333
+ * @returns {boolean}
334
+ */
335
+ export function isPackageOrBundle(app) {
336
+ return /^([a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+)+$/.test(app);
337
+ }
338
+
339
+ /**
340
+ * Finds all instances 'firstKey' and create a duplicate with the key 'secondKey',
341
+ * Do the same thing in reverse. If we find 'secondKey', create a duplicate with the key 'firstKey'.
342
+ *
343
+ * This will cause keys to be overwritten if the object contains 'firstKey' and 'secondKey'.
344
+
345
+ * @param {*} input Any type of input
346
+ * @param {String} firstKey The first key to duplicate
347
+ * @param {String} secondKey The second key to duplicate
348
+ */
349
+ export function duplicateKeys(input, firstKey, secondKey) {
350
+ // If array provided, recursively call on all elements
351
+ if (_.isArray(input)) {
352
+ return input.map((item) => duplicateKeys(item, firstKey, secondKey));
353
+ }
354
+
355
+ // If object, create duplicates for keys and then recursively call on values
356
+ if (_.isPlainObject(input)) {
357
+ const resultObj = {};
358
+ for (let [key, value] of _.toPairs(input)) {
359
+ const recursivelyCalledValue = duplicateKeys(value, firstKey, secondKey);
360
+ if (key === firstKey) {
361
+ resultObj[secondKey] = recursivelyCalledValue;
362
+ } else if (key === secondKey) {
363
+ resultObj[firstKey] = recursivelyCalledValue;
364
+ }
365
+ resultObj[key] = recursivelyCalledValue;
366
+ }
367
+ return resultObj;
368
+ }
369
+
370
+ // Base case. Return primitives without doing anything.
371
+ return input;
372
+ }
373
+
374
+ /**
375
+ * Takes a desired capability and tries to JSON.parse it as an array,
376
+ * and either returns the parsed array or a singleton array.
377
+ *
378
+ * @param {string|Array<String>} cap A desired capability
379
+ */
380
+ export function parseCapsArray(cap) {
381
+ if (_.isArray(cap)) {
382
+ return cap;
383
+ }
384
+
385
+ let parsedCaps;
386
+ try {
387
+ parsedCaps = JSON.parse(cap);
388
+ if (_.isArray(parsedCaps)) {
389
+ return parsedCaps;
390
+ }
391
+ } catch (ign) {
392
+ logger.warn(`Failed to parse capability as JSON array`);
393
+ }
394
+ if (_.isString(cap)) {
395
+ return [cap];
396
+ }
397
+ throw new Error(`must provide a string or JSON Array; received ${cap}`);
398
+ }
399
+
400
+ /**
401
+ * Generate a string that uniquely describes driver instance
402
+ *
403
+ * @param {import('@appium/types').Core} obj driver instance
404
+ * @param {string?} sessionId session identifier (if exists)
405
+ * @returns {string}
406
+ */
407
+ export function generateDriverLogPrefix(obj, sessionId = null) {
408
+ const instanceName = `${obj.constructor.name}@${node.getObjectId(obj).substring(0, 4)}`;
409
+ return sessionId ? `${instanceName} (${sessionId.substring(0, 8)})` : instanceName;
410
+ }
411
+
412
+
398
413
  /**
399
414
  * Sends a HTTP GET query to fetch the app with caching enabled.
400
415
  * Follows https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching
@@ -500,9 +515,7 @@ async function unzipApp(zipPath, dstRoot, supportedAppExtensions) {
500
515
  try {
501
516
  logger.debug(`Unzipping '${zipPath}'`);
502
517
  const timer = new timing.Timer().start();
503
- const useSystemUnzipEnv = process.env.APPIUM_PREFER_SYSTEM_UNZIP;
504
- const useSystemUnzip =
505
- _.isEmpty(useSystemUnzipEnv) || !['0', 'false'].includes(_.toLower(useSystemUnzipEnv));
518
+ const useSystemUnzip = isEnvOptionEnabled('APPIUM_PREFER_SYSTEM_UNZIP', true);
506
519
  /**
507
520
  * Attempt to use use the system `unzip` (e.g., `/usr/bin/unzip`) due
508
521
  * to the significant performance improvement it provides over the native
@@ -556,84 +569,144 @@ async function unzipApp(zipPath, dstRoot, supportedAppExtensions) {
556
569
  }
557
570
 
558
571
  /**
559
- * @param {string} app
560
- * @returns {boolean}
572
+ * Transforms the given app link to the cache key.
573
+ * This is necessary to properly cache apps
574
+ * having the same address, but different query strings,
575
+ * for example ones stored in S3 using presigned URLs.
576
+ *
577
+ * @param {string} app App link.
578
+ * @returns {string} Transformed app link or the original arg if
579
+ * no transfromation is needed.
561
580
  */
562
- export function isPackageOrBundle(app) {
563
- return /^([a-zA-Z0-9\-_]+\.[a-zA-Z0-9\-_]+)+$/.test(app);
581
+ function toCacheKey(app) {
582
+ if (!isEnvOptionEnabled('APPIUM_APPS_CACHE_IGNORE_URL_QUERY') || !isSupportedUrl(app)) {
583
+ return app;
584
+ }
585
+ try {
586
+ const {href, search} = parseAppLink(app);
587
+ if (href && search) {
588
+ return href.replace(search, '');
589
+ }
590
+ if (href) {
591
+ return href;
592
+ }
593
+ } catch {}
594
+ return app;
564
595
  }
565
596
 
566
597
  /**
567
- * Finds all instances 'firstKey' and create a duplicate with the key 'secondKey',
568
- * Do the same thing in reverse. If we find 'secondKey', create a duplicate with the key 'firstKey'.
598
+ * Safely parses the given app link to a URL object
569
599
  *
570
- * This will cause keys to be overwritten if the object contains 'firstKey' and 'secondKey'.
571
-
572
- * @param {*} input Any type of input
573
- * @param {String} firstKey The first key to duplicate
574
- * @param {String} secondKey The second key to duplicate
600
+ * @param {string} appLink
601
+ * @returns {URL|import('@appium/types').StringRecord} Parsed URL object
602
+ * or an empty object if the parsing has failed
575
603
  */
576
- export function duplicateKeys(input, firstKey, secondKey) {
577
- // If array provided, recursively call on all elements
578
- if (_.isArray(input)) {
579
- return input.map((item) => duplicateKeys(item, firstKey, secondKey));
604
+ function parseAppLink(appLink) {
605
+ try {
606
+ return new URL(appLink);
607
+ } catch {
608
+ return {};
580
609
  }
610
+ }
581
611
 
582
- // If object, create duplicates for keys and then recursively call on values
583
- if (_.isPlainObject(input)) {
584
- const resultObj = {};
585
- for (let [key, value] of _.toPairs(input)) {
586
- const recursivelyCalledValue = duplicateKeys(value, firstKey, secondKey);
587
- if (key === firstKey) {
588
- resultObj[secondKey] = recursivelyCalledValue;
589
- } else if (key === secondKey) {
590
- resultObj[firstKey] = recursivelyCalledValue;
591
- }
592
- resultObj[key] = recursivelyCalledValue;
593
- }
594
- return resultObj;
612
+ /**
613
+ * Checks whether we can threat the given app link
614
+ * as a URL,
615
+ *
616
+ * @param {string} app
617
+ * @returns {boolean} True if app is a supported URL
618
+ */
619
+ function isSupportedUrl(app) {
620
+ try {
621
+ const {protocol} = parseAppLink(app);
622
+ return ['http:', 'https:'].includes(protocol);
623
+ } catch {
624
+ return false;
595
625
  }
596
-
597
- // Base case. Return primitives without doing anything.
598
- return input;
599
626
  }
600
627
 
601
628
  /**
602
- * Takes a desired capability and tries to JSON.parse it as an array,
603
- * and either returns the parsed array or a singleton array.
629
+ * Check if the given environment option is enabled
604
630
  *
605
- * @param {string|Array<String>} cap A desired capability
631
+ * @param {string} optionName Option name
632
+ * @param {boolean|null} [defaultValue=null] The value to return if the given env value
633
+ * is not set explcitly
634
+ * @returns {boolean} True if the option is enabled
606
635
  */
607
- export function parseCapsArray(cap) {
608
- if (_.isArray(cap)) {
609
- return cap;
636
+ function isEnvOptionEnabled(optionName, defaultValue = null) {
637
+ const value = process.env[optionName];
638
+ if (!_.isNull(defaultValue) && _.isEmpty(value)) {
639
+ return defaultValue;
610
640
  }
641
+ return !_.isEmpty(value) && !['0', 'false', 'no'].includes(_.toLower(value));
642
+ }
611
643
 
612
- let parsedCaps;
613
- try {
614
- parsedCaps = JSON.parse(cap);
615
- if (_.isArray(parsedCaps)) {
616
- return parsedCaps;
617
- }
618
- } catch (ign) {
619
- logger.warn(`Failed to parse capability as JSON array`);
620
- }
621
- if (_.isString(cap)) {
622
- return [cap];
644
+ /**
645
+ *
646
+ * @param {string} [envVarName]
647
+ * @param {number} defaultValue
648
+ * @returns {number}
649
+ */
650
+ function toNaturalNumber(defaultValue, envVarName) {
651
+ if (!envVarName || _.isUndefined(process.env[envVarName])) {
652
+ return defaultValue;
623
653
  }
624
- throw new Error(`must provide a string or JSON Array; received ${cap}`);
654
+ const num = parseInt(`${process.env[envVarName]}`, 10);
655
+ return num > 0 ? num : defaultValue;
625
656
  }
626
657
 
627
658
  /**
628
- * Generate a string that uniquely describes driver instance
629
- *
630
- * @param {import('@appium/types').Core} obj driver instance
631
- * @param {string?} sessionId session identifier (if exists)
659
+ * @param {string} app
660
+ * @param {string[]} supportedAppExtensions
632
661
  * @returns {string}
633
662
  */
634
- export function generateDriverLogPrefix(obj, sessionId = null) {
635
- const instanceName = `${obj.constructor.name}@${node.getObjectId(obj).substring(0, 4)}`;
636
- return sessionId ? `${instanceName} (${sessionId.substring(0, 8)})` : instanceName;
663
+ function verifyAppExtension(app, supportedAppExtensions) {
664
+ if (supportedAppExtensions.map(_.toLower).includes(_.toLower(path.extname(app)))) {
665
+ return app;
666
+ }
667
+ throw new Error(
668
+ `New app path '${app}' did not have ` +
669
+ `${util.pluralize('extension', supportedAppExtensions.length, false)}: ` +
670
+ supportedAppExtensions
671
+ );
672
+ }
673
+
674
+ /**
675
+ * @param {string} folderPath
676
+ * @returns {Promise<number>}
677
+ */
678
+ async function calculateFolderIntegrity(folderPath) {
679
+ return (await fs.glob('**/*', {cwd: folderPath})).length;
680
+ }
681
+
682
+ /**
683
+ * @param {string} filePath
684
+ * @returns {Promise<string>}
685
+ */
686
+ async function calculateFileIntegrity(filePath) {
687
+ return await fs.hash(filePath);
688
+ }
689
+
690
+ /**
691
+ * @param {string} currentPath
692
+ * @param {import('@appium/types').StringRecord} expectedIntegrity
693
+ * @returns {Promise<boolean>}
694
+ */
695
+ async function isAppIntegrityOk(currentPath, expectedIntegrity = {}) {
696
+ if (!(await fs.exists(currentPath))) {
697
+ return false;
698
+ }
699
+
700
+ // Folder integrity check is simple:
701
+ // Verify the previous amount of files is not greater than the current one.
702
+ // We don't want to use equality comparison because of an assumption that the OS might
703
+ // create some unwanted service files/cached inside of that folder or its subfolders.
704
+ // Ofc, validating the hash sum of each file (or at least of file path) would be much
705
+ // more precise, but we don't need to be very precise here and also don't want to
706
+ // overuse RAM and have a performance drop.
707
+ return (await fs.stat(currentPath)).isDirectory()
708
+ ? (await calculateFolderIntegrity(currentPath)) >= expectedIntegrity?.folder
709
+ : (await calculateFileIntegrity(currentPath)) === expectedIntegrity?.file;
637
710
  }
638
711
 
639
712
  /** @type {import('@appium/types').DriverHelpers} */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appium/base-driver",
3
- "version": "9.7.0",
3
+ "version": "9.8.0",
4
4
  "description": "Base driver class for Appium drivers",
5
5
  "keywords": [
6
6
  "automation",
@@ -44,8 +44,8 @@
44
44
  "test:types": "tsd"
45
45
  },
46
46
  "dependencies": {
47
- "@appium/support": "^4.2.6",
48
- "@appium/types": "^0.18.0",
47
+ "@appium/support": "^4.3.0",
48
+ "@appium/types": "^0.19.0",
49
49
  "@colors/colors": "1.6.0",
50
50
  "@types/async-lock": "1.4.2",
51
51
  "@types/bluebird": "3.5.42",
@@ -67,7 +67,7 @@
67
67
  "path-to-regexp": "6.2.2",
68
68
  "serve-favicon": "2.5.0",
69
69
  "source-map-support": "0.5.21",
70
- "type-fest": "4.18.3",
70
+ "type-fest": "4.19.0",
71
71
  "validate.js": "0.13.1"
72
72
  },
73
73
  "optionalDependencies": {
@@ -80,7 +80,7 @@
80
80
  "publishConfig": {
81
81
  "access": "public"
82
82
  },
83
- "gitHead": "a4138c6ec9524594519f29938008500b7cdcc0b8",
83
+ "gitHead": "339acd345fafa1292c8d286261553fcc6b440e46",
84
84
  "tsd": {
85
85
  "directory": "test/types"
86
86
  }