appium-mac2-driver 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +16 -0
- package/build/lib/commands/bidi/constants.d.ts +3 -0
- package/build/lib/commands/bidi/constants.d.ts.map +1 -0
- package/build/lib/commands/bidi/constants.js +7 -0
- package/build/lib/commands/bidi/constants.js.map +1 -0
- package/build/lib/commands/bidi/models.d.ts +3 -0
- package/build/lib/commands/bidi/models.d.ts.map +1 -0
- package/build/lib/commands/bidi/models.js +14 -0
- package/build/lib/commands/bidi/models.js.map +1 -0
- package/build/lib/commands/bidi/types.d.ts +12 -0
- package/build/lib/commands/bidi/types.d.ts.map +1 -0
- package/build/lib/commands/bidi/types.js +3 -0
- package/build/lib/commands/bidi/types.js.map +1 -0
- package/build/lib/commands/native-record-screen.d.ts +21 -10
- package/build/lib/commands/native-record-screen.d.ts.map +1 -1
- package/build/lib/commands/native-record-screen.js +201 -35
- package/build/lib/commands/native-record-screen.js.map +1 -1
- package/build/lib/driver.d.ts +4 -4
- package/build/lib/driver.d.ts.map +1 -1
- package/build/lib/driver.js +3 -3
- package/build/lib/driver.js.map +1 -1
- package/build/lib/execute-method-map.d.ts +1 -1
- package/build/lib/execute-method-map.d.ts.map +1 -1
- package/build/lib/execute-method-map.js +2 -1
- package/build/lib/execute-method-map.js.map +1 -1
- package/lib/commands/bidi/constants.ts +3 -0
- package/lib/commands/bidi/models.ts +15 -0
- package/lib/commands/bidi/types.ts +11 -0
- package/lib/commands/native-record-screen.ts +198 -39
- package/lib/driver.js +7 -7
- package/lib/execute-method-map.ts +2 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
## [2.2.0](https://github.com/appium/appium-mac2-driver/compare/v2.1.1...v2.2.0) (2025-02-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Publish native video chunks over bidi ([#333](https://github.com/appium/appium-mac2-driver/issues/333)) ([6cf4f6d](https://github.com/appium/appium-mac2-driver/commit/6cf4f6d341798290e8416120de2ac93e1263f051))
|
|
7
|
+
|
|
8
|
+
## [2.1.1](https://github.com/appium/appium-mac2-driver/compare/v2.1.0...v2.1.1) (2025-02-08)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Miscellaneous Chores
|
|
12
|
+
|
|
13
|
+
* Update the documentation for the `macos: stopNativeScreenRecording` API ([#331](https://github.com/appium/appium-mac2-driver/issues/331)) ([612b0a0](https://github.com/appium/appium-mac2-driver/commit/612b0a04814fdebd4ec910ad0691aed460251d47))
|
|
14
|
+
|
|
1
15
|
## [2.1.0](https://github.com/appium/appium-mac2-driver/compare/v2.0.0...v2.1.0) (2025-02-07)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -617,6 +617,12 @@ then it would be stopped automatically upon the test session termination,
|
|
|
617
617
|
and leftover videos would be deleted as well.
|
|
618
618
|
Xcode must be at version 15+.
|
|
619
619
|
|
|
620
|
+
> [!TIP]
|
|
621
|
+
> Invocation of this API also triggers broadcasting of
|
|
622
|
+
> [appium:mac2.nativeVideoRecordingChunkAdded](./docs/bidi.md#appiummac2nativevideorecordingchunkadded)
|
|
623
|
+
> BiDi events. Make sure to subscribe to such events **before** this API is invoked to ensure
|
|
624
|
+
> all video chunks are being properly consumed on the client side.
|
|
625
|
+
|
|
620
626
|
#### Arguments
|
|
621
627
|
|
|
622
628
|
Name | Type | Required | Description | Example
|
|
@@ -657,6 +663,15 @@ successfully consumed.
|
|
|
657
663
|
If no screen recording has been started before then this API throws an exception.
|
|
658
664
|
Xcode must be at version 15+.
|
|
659
665
|
|
|
666
|
+
> [!IMPORTANT]
|
|
667
|
+
> In order to retrieve the recorded video from the local file system the Appium Server process itself
|
|
668
|
+
> or its parent process (e.g. Terminal) must have the "Full Disk Access" permission granted
|
|
669
|
+
> in 'System Preferences'→'Privacy & Security' tab.
|
|
670
|
+
|
|
671
|
+
> [!NOTE]
|
|
672
|
+
> Be careful while recording lengthy videos. They could be pretty large, and may easily exceed
|
|
673
|
+
> the free space on the home partition.
|
|
674
|
+
|
|
660
675
|
#### Arguments
|
|
661
676
|
|
|
662
677
|
Name | Type | Required | Description | Example
|
|
@@ -668,6 +683,7 @@ method | string | no | The http multipart upload method name. The 'PUT' one is u
|
|
|
668
683
|
headers | map | no | Additional headers mapping for multipart http(s) uploads | `{"header": "value"}`
|
|
669
684
|
fileFieldName | string | no | The name of the form field, where the file content BLOB should be stored for http(s) uploads. `file` by default | payload
|
|
670
685
|
formFields | Map or `Array<Pair>` | no | Additional form fields for multipart http(s) uploads | `{"field1": "value1", "field2": "value2"}` or `[["field1", "value1"], ["field2", "value2"]]`
|
|
686
|
+
ignorePayload | boolean | no | Whether to ignore the resulting video payload and return an empty string. Useful if you prefer to fetch video chunks via the [appium:mac2.nativeVideoRecordingChunkAdded](./docs/bidi.md#appiummac2nativevideorecordingchunkadded) BiDi event. false by default. | true
|
|
671
687
|
|
|
672
688
|
#### Returns
|
|
673
689
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bidi/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,cAAc,CAAC;AAE3C,eAAO,MAAM,8BAA8B,+CAAoD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NATIVE_VIDEO_CHUNK_ADDED_EVENT = exports.BIDI_EVENT_NAME = void 0;
|
|
4
|
+
exports.BIDI_EVENT_NAME = 'bidiEvent';
|
|
5
|
+
const DOMAIN = 'mac2';
|
|
6
|
+
exports.NATIVE_VIDEO_CHUNK_ADDED_EVENT = `appium:${DOMAIN}.nativeVideoRecordingChunkAdded`;
|
|
7
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../lib/commands/bidi/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG,WAAW,CAAC;AAC3C,MAAM,MAAM,GAAG,MAAM,CAAC;AACT,QAAA,8BAA8B,GAAG,UAAU,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bidi/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAG1D,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,0BAA0B,CAQ5B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toNativeVideoChunkAddedEvent = toNativeVideoChunkAddedEvent;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
function toNativeVideoChunkAddedEvent(uuid, payload) {
|
|
6
|
+
return {
|
|
7
|
+
method: constants_1.NATIVE_VIDEO_CHUNK_ADDED_EVENT,
|
|
8
|
+
params: {
|
|
9
|
+
uuid,
|
|
10
|
+
payload: payload.toString('base64'),
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../lib/commands/bidi/models.ts"],"names":[],"mappings":";;AAGA,oEAWC;AAbD,2CAA6D;AAE7D,SAAgB,4BAA4B,CAC1C,IAAY,EACZ,OAAe;IAEf,OAAO;QACL,MAAM,EAAE,0CAA8B;QACtC,MAAM,EAAE;YACN,IAAI;YACJ,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;SACpC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface BiDiEvent<TParams> {
|
|
2
|
+
method: string;
|
|
3
|
+
params: TParams;
|
|
4
|
+
}
|
|
5
|
+
interface NativeVideoChunkAddedParams {
|
|
6
|
+
uuid: string;
|
|
7
|
+
payload: string;
|
|
8
|
+
}
|
|
9
|
+
export interface NativeVideoChunkAddedEvent extends BiDiEvent<NativeVideoChunkAddedParams> {
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../lib/commands/bidi/types.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS,CAAC,OAAO;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,2BAA2B;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,0BAA2B,SAAQ,SAAS,CAAC,2BAA2B,CAAC;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/commands/bidi/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { Mac2Driver } from '../driver';
|
|
2
|
-
import type { StringRecord } from '@appium/types';
|
|
2
|
+
import type { AppiumLogger, StringRecord } from '@appium/types';
|
|
3
|
+
import type EventEmitter from 'node:events';
|
|
4
|
+
export declare class NativeVideoChunksBroadcaster {
|
|
5
|
+
private _ee;
|
|
6
|
+
private _log;
|
|
7
|
+
private _publishers;
|
|
8
|
+
private _terminated;
|
|
9
|
+
constructor(ee: EventEmitter, log: AppiumLogger);
|
|
10
|
+
get hasPublishers(): boolean;
|
|
11
|
+
schedule(uuid: string): void;
|
|
12
|
+
waitFor(uuid: string): Promise<void>;
|
|
13
|
+
shutdown(timeoutMs: number): Promise<void>;
|
|
14
|
+
private _createPublisher;
|
|
15
|
+
private _wait;
|
|
16
|
+
private _cleanup;
|
|
17
|
+
}
|
|
3
18
|
/**
|
|
4
19
|
* Initiates a new native screen recording session via XCTest.
|
|
5
20
|
* If the screen recording is already running then this call results in noop.
|
|
@@ -40,20 +55,16 @@ export declare function macosGetNativeScreenRecordingInfo(this: Mac2Driver): Pro
|
|
|
40
55
|
* @param fileFieldName The name of the form field, where the file content BLOB should
|
|
41
56
|
* be stored for http(s) uploads
|
|
42
57
|
* @param formFields Additional form fields for multipart http(s) uploads
|
|
58
|
+
* @param ignorePayload Whether to ignore the resulting video payload
|
|
59
|
+
* and return an empty string. Useful if you prefer to fetch
|
|
60
|
+
* video chunks via a BiDi web socket.
|
|
43
61
|
* @returns Base64-encoded content of the recorded media file if 'remotePath'
|
|
44
|
-
* parameter is falsy or an empty string
|
|
62
|
+
* parameter is falsy or an empty string or ignorePayload is set to `true`.
|
|
45
63
|
* @throws {Error} If there was an error while getting the name of a media file
|
|
46
64
|
* or the file content cannot be uploaded to the remote location
|
|
47
65
|
* or screen recording is not supported on the device under test.
|
|
48
66
|
*/
|
|
49
|
-
export declare function macosStopNativeScreenRecording(this: Mac2Driver, remotePath?: string, user?: string, pass?: string, method?: string, headers?: StringRecord | [string, any][], fileFieldName?: string, formFields?: StringRecord | [string, string][]): Promise<string>;
|
|
50
|
-
/**
|
|
51
|
-
* Deletes previously recorded videos with given ids.
|
|
52
|
-
* This call is safe and does not raise any errors.
|
|
53
|
-
*
|
|
54
|
-
* @param uuids One or more video UUIDs to be deleted
|
|
55
|
-
*/
|
|
56
|
-
export declare function cleanupNativeRecordedVideos(this: Mac2Driver, uuids: string | Set<string>): Promise<void>;
|
|
67
|
+
export declare function macosStopNativeScreenRecording(this: Mac2Driver, remotePath?: string, user?: string, pass?: string, method?: string, headers?: StringRecord | [string, any][], fileFieldName?: string, formFields?: StringRecord | [string, string][], ignorePayload?: boolean): Promise<string>;
|
|
57
68
|
/**
|
|
58
69
|
* Fetches information about available displays
|
|
59
70
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-record-screen.d.ts","sourceRoot":"","sources":["../../../lib/commands/native-record-screen.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"native-record-screen.d.ts","sourceRoot":"","sources":["../../../lib/commands/native-record-screen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,aAAa,CAAC;AAW5C,qBAAa,4BAA4B;IACvC,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,WAAW,CAAU;gBAEhB,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY;IAOhD,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMtB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAYlC,gBAAgB;YA2DhB,KAAK;YAuBL,QAAQ;CAyBvB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAQ1B;AAED;;;;GAIG;AACH,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAEjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,8BAA8B,CAClD,IAAI,EAAE,UAAU,EAChB,UAAU,CAAC,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACtC,aAAa,CAAC,EAAE,MAAM,EACtB,UAAU,CAAC,EAAE,YAAY,GAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAC5C,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAAC,MAAM,CAAC,CAkDjB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAE5F;AAmBD,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;CACjB"}
|
|
@@ -1,17 +1,185 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.NativeVideoChunksBroadcaster = void 0;
|
|
6
40
|
exports.macosStartNativeScreenRecording = macosStartNativeScreenRecording;
|
|
7
41
|
exports.macosGetNativeScreenRecordingInfo = macosGetNativeScreenRecordingInfo;
|
|
8
42
|
exports.macosStopNativeScreenRecording = macosStopNativeScreenRecording;
|
|
9
|
-
exports.cleanupNativeRecordedVideos = cleanupNativeRecordedVideos;
|
|
10
43
|
exports.macosListDisplays = macosListDisplays;
|
|
11
44
|
const lodash_1 = __importDefault(require("lodash"));
|
|
45
|
+
const bluebird_1 = __importStar(require("bluebird"));
|
|
12
46
|
const node_path_1 = __importDefault(require("node:path"));
|
|
13
47
|
const support_1 = require("appium/support");
|
|
14
48
|
const helpers_1 = require("./helpers");
|
|
49
|
+
const asyncbox_1 = require("asyncbox");
|
|
50
|
+
const teen_process_1 = require("teen_process");
|
|
51
|
+
const constants_1 = require("./bidi/constants");
|
|
52
|
+
const models_1 = require("./bidi/models");
|
|
53
|
+
const RECORDING_STARTUP_TIMEOUT_MS = 5000;
|
|
54
|
+
const BUFFER_SIZE = 0xFFFF;
|
|
55
|
+
const MONITORING_INTERVAL_DURATION_MS = 1000;
|
|
56
|
+
const MAX_MONITORING_DURATION_MS = 24 * 60 * 60 * 1000; // 1 day
|
|
57
|
+
class NativeVideoChunksBroadcaster {
|
|
58
|
+
constructor(ee, log) {
|
|
59
|
+
this._ee = ee;
|
|
60
|
+
this._log = log;
|
|
61
|
+
this._publishers = new Map();
|
|
62
|
+
this._terminated = false;
|
|
63
|
+
}
|
|
64
|
+
get hasPublishers() {
|
|
65
|
+
return this._publishers.size > 0;
|
|
66
|
+
}
|
|
67
|
+
schedule(uuid) {
|
|
68
|
+
if (!this._publishers.has(uuid)) {
|
|
69
|
+
this._publishers.set(uuid, this._createPublisher(uuid));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async waitFor(uuid) {
|
|
73
|
+
const publisher = this._publishers.get(uuid);
|
|
74
|
+
if (publisher) {
|
|
75
|
+
await publisher;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async shutdown(timeoutMs) {
|
|
79
|
+
try {
|
|
80
|
+
await this._wait(timeoutMs);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
this._log.warn(e.message);
|
|
84
|
+
}
|
|
85
|
+
await this._cleanup();
|
|
86
|
+
this._publishers = new Map();
|
|
87
|
+
}
|
|
88
|
+
async _createPublisher(uuid) {
|
|
89
|
+
let fullPath = '';
|
|
90
|
+
let bytesRead = 0n;
|
|
91
|
+
try {
|
|
92
|
+
await (0, asyncbox_1.waitForCondition)(async () => {
|
|
93
|
+
const paths = await listAttachments();
|
|
94
|
+
const result = paths.find((name) => name.endsWith(uuid));
|
|
95
|
+
if (result) {
|
|
96
|
+
fullPath = result;
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}, {
|
|
101
|
+
waitMs: RECORDING_STARTUP_TIMEOUT_MS,
|
|
102
|
+
intervalMs: 300,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
throw new Error(`The video recording identified by ${uuid} did not ` +
|
|
107
|
+
`start within ${RECORDING_STARTUP_TIMEOUT_MS}ms timeout`);
|
|
108
|
+
}
|
|
109
|
+
const startedMs = performance.now();
|
|
110
|
+
while (!this._terminated && performance.now() - startedMs < MAX_MONITORING_DURATION_MS) {
|
|
111
|
+
const isCompleted = !(await isFileUsed(fullPath, 'testman'));
|
|
112
|
+
const { size } = await support_1.fs.stat(fullPath, { bigint: true });
|
|
113
|
+
if (bytesRead < size) {
|
|
114
|
+
const handle = await support_1.fs.open(fullPath, 'r');
|
|
115
|
+
try {
|
|
116
|
+
while (bytesRead < size) {
|
|
117
|
+
const bufferSize = Number(size - bytesRead > BUFFER_SIZE ? BUFFER_SIZE : size - bytesRead);
|
|
118
|
+
const buf = Buffer.alloc(bufferSize);
|
|
119
|
+
await support_1.fs.read(handle, buf, 0, bufferSize, bytesRead);
|
|
120
|
+
this._ee.emit(constants_1.BIDI_EVENT_NAME, (0, models_1.toNativeVideoChunkAddedEvent)(uuid, buf));
|
|
121
|
+
bytesRead += BigInt(bufferSize);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
await support_1.fs.close(handle);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (isCompleted) {
|
|
129
|
+
this._log.debug(`The native video recording identified by ${uuid} has been detected as completed`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
await bluebird_1.default.delay(MONITORING_INTERVAL_DURATION_MS);
|
|
133
|
+
}
|
|
134
|
+
this._log.warn(`Stopped monitoring of the native video recording identified by ${uuid} ` +
|
|
135
|
+
`because of the timeout`);
|
|
136
|
+
}
|
|
137
|
+
async _wait(timeoutMs) {
|
|
138
|
+
if (!this.hasPublishers) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const timer = setTimeout(() => {
|
|
142
|
+
this._terminated = true;
|
|
143
|
+
}, timeoutMs);
|
|
144
|
+
const publishingErrors = [];
|
|
145
|
+
for (const publisher of this._publishers.values()) {
|
|
146
|
+
try {
|
|
147
|
+
await publisher;
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
publishingErrors.push(e.message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
clearTimeout(timer);
|
|
154
|
+
if (!lodash_1.default.isEmpty(publishingErrors)) {
|
|
155
|
+
throw new Error(publishingErrors.join('\n'));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async _cleanup() {
|
|
159
|
+
if (!this.hasPublishers) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const attachments = await listAttachments();
|
|
163
|
+
if (lodash_1.default.isEmpty(attachments)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const tasks = attachments
|
|
167
|
+
.map((attachmentPath) => [node_path_1.default.basename(attachmentPath), attachmentPath])
|
|
168
|
+
.filter(([name,]) => this._publishers.has(name))
|
|
169
|
+
.map(([, attachmentPath]) => support_1.fs.rimraf(attachmentPath));
|
|
170
|
+
if (lodash_1.default.isEmpty(tasks)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
await Promise.all(tasks);
|
|
175
|
+
this._log.debug(`Successfully deleted ${support_1.util.pluralize('leftover video recording', tasks.length, true)}`);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
this._log.warn(`Could not cleanup some leftover video recordings: ${e.message}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.NativeVideoChunksBroadcaster = NativeVideoChunksBroadcaster;
|
|
15
183
|
/**
|
|
16
184
|
* Initiates a new native screen recording session via XCTest.
|
|
17
185
|
* If the screen recording is already running then this call results in noop.
|
|
@@ -33,7 +201,7 @@ async function macosStartNativeScreenRecording(fps, codec, displayId) {
|
|
|
33
201
|
codec,
|
|
34
202
|
displayId,
|
|
35
203
|
});
|
|
36
|
-
this.
|
|
204
|
+
this._videoChunksBroadcaster.schedule(result.uuid);
|
|
37
205
|
return result;
|
|
38
206
|
}
|
|
39
207
|
/**
|
|
@@ -62,21 +230,44 @@ async function macosGetNativeScreenRecordingInfo() {
|
|
|
62
230
|
* @param fileFieldName The name of the form field, where the file content BLOB should
|
|
63
231
|
* be stored for http(s) uploads
|
|
64
232
|
* @param formFields Additional form fields for multipart http(s) uploads
|
|
233
|
+
* @param ignorePayload Whether to ignore the resulting video payload
|
|
234
|
+
* and return an empty string. Useful if you prefer to fetch
|
|
235
|
+
* video chunks via a BiDi web socket.
|
|
65
236
|
* @returns Base64-encoded content of the recorded media file if 'remotePath'
|
|
66
|
-
* parameter is falsy or an empty string
|
|
237
|
+
* parameter is falsy or an empty string or ignorePayload is set to `true`.
|
|
67
238
|
* @throws {Error} If there was an error while getting the name of a media file
|
|
68
239
|
* or the file content cannot be uploaded to the remote location
|
|
69
240
|
* or screen recording is not supported on the device under test.
|
|
70
241
|
*/
|
|
71
|
-
async function macosStopNativeScreenRecording(remotePath, user, pass, method, headers, fileFieldName, formFields) {
|
|
242
|
+
async function macosStopNativeScreenRecording(remotePath, user, pass, method, headers, fileFieldName, formFields, ignorePayload) {
|
|
72
243
|
const response = (await this.wda.proxy.command('/wda/video/stop', 'POST', {}));
|
|
73
244
|
if (!response || !lodash_1.default.isPlainObject(response)) {
|
|
74
245
|
throw new Error('There is no active screen recording, thus nothing to stop. Did you start it before?');
|
|
75
246
|
}
|
|
76
247
|
const { uuid } = response;
|
|
248
|
+
try {
|
|
249
|
+
await bluebird_1.default.resolve(this._videoChunksBroadcaster.waitFor(uuid)).timeout(5000);
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
if (e instanceof bluebird_1.TimeoutError) {
|
|
253
|
+
this.log.debug(`The BiDi chunks broadcaster for the native screen recording identified ` +
|
|
254
|
+
`by ${uuid} cannot complete within 5000ms timeout`);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
this.log.debug(e.stack);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (ignorePayload) {
|
|
261
|
+
return '';
|
|
262
|
+
}
|
|
77
263
|
const matchedVideoPath = lodash_1.default.first((await listAttachments()).filter((name) => name.endsWith(uuid)));
|
|
78
264
|
if (!matchedVideoPath) {
|
|
79
|
-
throw new Error(`The screen recording identified by ${uuid}
|
|
265
|
+
throw new Error(`The screen recording identified by ${uuid} cannot be retrieved. ` +
|
|
266
|
+
`Make sure the Appium Server process or its parent process (e.g. Terminal) ` +
|
|
267
|
+
`has Full Disk Access permission enabled in 'System Preferences' -> 'Privacy & Security' tab. ` +
|
|
268
|
+
`You may verify the presence of the recorded video manually by running the ` +
|
|
269
|
+
`'find "$HOME/Library/Daemon Containers/" -type f -name "${uuid}"' command from Terminal ` +
|
|
270
|
+
`if the latter has been granted the above access permission.`);
|
|
80
271
|
}
|
|
81
272
|
const options = {
|
|
82
273
|
user,
|
|
@@ -86,36 +277,7 @@ async function macosStopNativeScreenRecording(remotePath, user, pass, method, he
|
|
|
86
277
|
fileFieldName,
|
|
87
278
|
formFields
|
|
88
279
|
};
|
|
89
|
-
|
|
90
|
-
await cleanupNativeRecordedVideos.bind(this)(uuid);
|
|
91
|
-
this._recordedVideoIds.delete(uuid);
|
|
92
|
-
return result;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Deletes previously recorded videos with given ids.
|
|
96
|
-
* This call is safe and does not raise any errors.
|
|
97
|
-
*
|
|
98
|
-
* @param uuids One or more video UUIDs to be deleted
|
|
99
|
-
*/
|
|
100
|
-
async function cleanupNativeRecordedVideos(uuids) {
|
|
101
|
-
const attachments = await listAttachments();
|
|
102
|
-
if (lodash_1.default.isEmpty(attachments)) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
const tasks = attachments
|
|
106
|
-
.map((attachmentPath) => [node_path_1.default.basename(attachmentPath), attachmentPath])
|
|
107
|
-
.filter(([name,]) => lodash_1.default.isString(uuids) ? uuids === name : uuids.has(name))
|
|
108
|
-
.map(([, attachmentPath]) => support_1.fs.rimraf(attachmentPath));
|
|
109
|
-
if (lodash_1.default.isEmpty(tasks)) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
try {
|
|
113
|
-
await Promise.all(tasks);
|
|
114
|
-
this.log.debug(`Successfully deleted ${support_1.util.pluralize('leftover video recording', tasks.length, true)}`);
|
|
115
|
-
}
|
|
116
|
-
catch (e) {
|
|
117
|
-
this.log.warn(`Could not cleanup some leftover video recordings: ${e.message}`);
|
|
118
|
-
}
|
|
280
|
+
return await helpers_1.uploadRecordedMedia.bind(this)(matchedVideoPath, remotePath, options);
|
|
119
281
|
}
|
|
120
282
|
/**
|
|
121
283
|
* Fetches information about available displays
|
|
@@ -135,5 +297,9 @@ async function listAttachments() {
|
|
|
135
297
|
absolute: true,
|
|
136
298
|
});
|
|
137
299
|
}
|
|
300
|
+
async function isFileUsed(fpath, userProcessName) {
|
|
301
|
+
const { stdout } = await (0, teen_process_1.exec)('lsof', [fpath]);
|
|
302
|
+
return stdout.includes(userProcessName);
|
|
303
|
+
}
|
|
138
304
|
// #endregion
|
|
139
305
|
//# sourceMappingURL=native-record-screen.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native-record-screen.js","sourceRoot":"","sources":["../../../lib/commands/native-record-screen.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"native-record-screen.js","sourceRoot":"","sources":["../../../lib/commands/native-record-screen.ts"],"names":[],"mappings":"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"}
|
package/build/lib/driver.d.ts
CHANGED
|
@@ -184,7 +184,7 @@ export class Mac2Driver extends BaseDriver<any, import("@appium/types").StringRe
|
|
|
184
184
|
readonly 'macos: stopNativeScreenRecording': {
|
|
185
185
|
readonly command: "macosStopNativeScreenRecording";
|
|
186
186
|
readonly params: {
|
|
187
|
-
readonly optional: readonly ["remotePath", "user", "pass", "method", "headers", "fileFieldName", "formFields"];
|
|
187
|
+
readonly optional: readonly ["remotePath", "user", "pass", "method", "headers", "fileFieldName", "formFields", "ignorePayload"];
|
|
188
188
|
};
|
|
189
189
|
};
|
|
190
190
|
readonly 'macos: listDisplays': {
|
|
@@ -196,8 +196,8 @@ export class Mac2Driver extends BaseDriver<any, import("@appium/types").StringRe
|
|
|
196
196
|
isProxyActive: boolean;
|
|
197
197
|
/** @type {import('./wda-mac').WDAMacServer} */
|
|
198
198
|
wda: import("./wda-mac").WDAMacServer;
|
|
199
|
-
/** @type {
|
|
200
|
-
|
|
199
|
+
/** @type {nativeScreenRecordingCommands.NativeVideoChunksBroadcaster} */
|
|
200
|
+
_videoChunksBroadcaster: nativeScreenRecordingCommands.NativeVideoChunksBroadcaster;
|
|
201
201
|
desiredCapConstraints: {
|
|
202
202
|
systemPort: {
|
|
203
203
|
isNumber: boolean;
|
|
@@ -298,6 +298,7 @@ export class Mac2Driver extends BaseDriver<any, import("@appium/types").StringRe
|
|
|
298
298
|
}
|
|
299
299
|
export default Mac2Driver;
|
|
300
300
|
import { BaseDriver } from 'appium/driver';
|
|
301
|
+
import * as nativeScreenRecordingCommands from './commands/native-record-screen';
|
|
301
302
|
import { DeviceSettings } from 'appium/driver';
|
|
302
303
|
import * as appManagemenetCommands from './commands/app-management';
|
|
303
304
|
import * as appleScriptCommands from './commands/applescript';
|
|
@@ -306,7 +307,6 @@ import * as findCommands from './commands/find';
|
|
|
306
307
|
import * as gesturesCommands from './commands/gestures';
|
|
307
308
|
import * as navigationCommands from './commands/navigation';
|
|
308
309
|
import * as recordScreenCommands from './commands/record-screen';
|
|
309
|
-
import * as nativeScreenRecordingCommands from './commands/native-record-screen';
|
|
310
310
|
import * as screenshotCommands from './commands/screenshots';
|
|
311
311
|
import * as sourceCommands from './commands/source';
|
|
312
312
|
//# sourceMappingURL=driver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../lib/driver.js"],"names":[],"mappings":"AA8BA;IAUE;;;;;;;;;;;;;;;;;MAAmC;IACnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAA2C;IAE3C,uBAqBC;IAjCD,sBAAsB;IACtB,eADW,OAAO,CACJ;IAEd,+CAA+C;IAC/C,KADW,OAAO,WAAW,EAAE,YAAY,CACvC;IAEJ,
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../lib/driver.js"],"names":[],"mappings":"AA8BA;IAUE;;;;;;;;;;;;;;;;;MAAmC;IACnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAA2C;IAE3C,uBAqBC;IAjCD,sBAAsB;IACtB,eADW,OAAO,CACJ;IAEd,+CAA+C;IAC/C,KADW,OAAO,WAAW,EAAE,YAAY,CACvC;IAEJ,yEAAyE;IACzE,yBADW,6BAA6B,CAAC,4BAA4B,CAC7C;IAQtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAAkD;IAiBlD,6BAAwE;IAG1E,yDAIC;IAED,mBASC;IANC,iBAAuB;IAKvB,qBAA2B;IAI7B,qCAEC;IAGD,0EAEC;IAED,oBAEC;IAED,mEAEC;IAGD,8BAEC;IAGD,kCAEC;IAGD,6FAwBC;IAED,+BA8BC;IAED,6DAAuD;IACvD,iEAA2D;IAC3D,mEAA6D;IAC7D,qEAA+D;IAE/D,sEAAgE;IAEhE,wCAAkC;IAElC,6CAAuC;IAEvC,qDAA+C;IAC/C,+CAAyC;IACzC,iDAA2C;IAC3C,+CAAyC;IACzC,yDAAmD;IACnD,+CAAyC;IACzC,2DAAqD;IACrD,6DAAuD;IACvD,2EAAqE;IACrE,6CAAuC;IACvC,6DAAuD;IACvD,2CAAqC;IACrC,uDAAiD;IACjD,6DAAuD;IACvD,2EAAqE;IAErE,uDAAiD;IAEjD,uEAAiE;IACjE,qEAA+D;IAE/D,sGAAgG;IAChG,0GAAoG;IACpG,oGAA8F;IAC9F,0EAAoE;IAEpE,6DAAuD;IAEvD,+CAAyC;CAC1C;;2BAjN0C,eAAe;+CAeX,iCAAiC;+BAfrC,eAAe;wCAGlB,2BAA2B;qCAC9B,wBAAwB;iCAC5B,oBAAoB;8BACvB,iBAAiB;kCACb,qBAAqB;oCACnB,uBAAuB;sCACrB,0BAA0B;oCAC5B,wBAAwB;gCAC5B,mBAAmB"}
|
package/build/lib/driver.js
CHANGED
|
@@ -125,7 +125,7 @@ class Mac2Driver extends driver_1.BaseDriver {
|
|
|
125
125
|
this.wda = null;
|
|
126
126
|
this.proxyReqRes = null;
|
|
127
127
|
this.isProxyActive = false;
|
|
128
|
-
this.
|
|
128
|
+
this._videoChunksBroadcaster = new nativeScreenRecordingCommands.NativeVideoChunksBroadcaster(this.eventEmitter, this.log);
|
|
129
129
|
this._screenRecorder = null;
|
|
130
130
|
}
|
|
131
131
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
@@ -179,12 +179,12 @@ class Mac2Driver extends driver_1.BaseDriver {
|
|
|
179
179
|
}
|
|
180
180
|
async deleteSession() {
|
|
181
181
|
await this._screenRecorder?.stop(true);
|
|
182
|
-
if (
|
|
182
|
+
if (this._videoChunksBroadcaster.hasPublishers) {
|
|
183
183
|
try {
|
|
184
184
|
await this.wda.proxy.command('/wda/video/stop', 'POST', {});
|
|
185
185
|
}
|
|
186
186
|
catch { }
|
|
187
|
-
await
|
|
187
|
+
await this._videoChunksBroadcaster.shutdown(5000);
|
|
188
188
|
}
|
|
189
189
|
await this.wda.stopSession();
|
|
190
190
|
if (this.opts.postrun) {
|
package/build/lib/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../lib/driver.js"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../../lib/driver.js"],"names":[],"mappings":"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"}
|
|
@@ -165,7 +165,7 @@ export declare const executeMethodMap: {
|
|
|
165
165
|
readonly 'macos: stopNativeScreenRecording': {
|
|
166
166
|
readonly command: "macosStopNativeScreenRecording";
|
|
167
167
|
readonly params: {
|
|
168
|
-
readonly optional: readonly ["remotePath", "user", "pass", "method", "headers", "fileFieldName", "formFields"];
|
|
168
|
+
readonly optional: readonly ["remotePath", "user", "pass", "method", "headers", "fileFieldName", "formFields", "ignorePayload"];
|
|
169
169
|
};
|
|
170
170
|
};
|
|
171
171
|
readonly 'macos: listDisplays': {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-method-map.d.ts","sourceRoot":"","sources":["../../lib/execute-method-map.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"execute-method-map.d.ts","sourceRoot":"","sources":["../../lib/execute-method-map.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Ua,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-method-map.js","sourceRoot":"","sources":["../../lib/execute-method-map.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"execute-method-map.js","sourceRoot":"","sources":["../../lib/execute-method-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { NativeVideoChunkAddedEvent } from './types';
|
|
2
|
+
import { NATIVE_VIDEO_CHUNK_ADDED_EVENT } from './constants';
|
|
3
|
+
|
|
4
|
+
export function toNativeVideoChunkAddedEvent(
|
|
5
|
+
uuid: string,
|
|
6
|
+
payload: Buffer,
|
|
7
|
+
): NativeVideoChunkAddedEvent {
|
|
8
|
+
return {
|
|
9
|
+
method: NATIVE_VIDEO_CHUNK_ADDED_EVENT,
|
|
10
|
+
params: {
|
|
11
|
+
uuid,
|
|
12
|
+
payload: payload.toString('base64'),
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -1,9 +1,171 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
|
+
import B, {TimeoutError} from 'bluebird';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { fs, util } from 'appium/support';
|
|
4
5
|
import type { Mac2Driver } from '../driver';
|
|
5
6
|
import { uploadRecordedMedia } from './helpers';
|
|
6
|
-
import type { StringRecord } from '@appium/types';
|
|
7
|
+
import type { AppiumLogger, StringRecord } from '@appium/types';
|
|
8
|
+
import type EventEmitter from 'node:events';
|
|
9
|
+
import { waitForCondition } from 'asyncbox';
|
|
10
|
+
import { exec } from 'teen_process';
|
|
11
|
+
import { BIDI_EVENT_NAME } from './bidi/constants';
|
|
12
|
+
import { toNativeVideoChunkAddedEvent } from './bidi/models';
|
|
13
|
+
|
|
14
|
+
const RECORDING_STARTUP_TIMEOUT_MS = 5000;
|
|
15
|
+
const BUFFER_SIZE = 0xFFFF;
|
|
16
|
+
const MONITORING_INTERVAL_DURATION_MS = 1000;
|
|
17
|
+
const MAX_MONITORING_DURATION_MS = 24 * 60 * 60 * 1000; // 1 day
|
|
18
|
+
|
|
19
|
+
export class NativeVideoChunksBroadcaster {
|
|
20
|
+
private _ee: EventEmitter;
|
|
21
|
+
private _log: AppiumLogger;
|
|
22
|
+
private _publishers: Map<string, Promise<void>>;
|
|
23
|
+
private _terminated: boolean;
|
|
24
|
+
|
|
25
|
+
constructor (ee: EventEmitter, log: AppiumLogger) {
|
|
26
|
+
this._ee = ee;
|
|
27
|
+
this._log = log;
|
|
28
|
+
this._publishers = new Map();
|
|
29
|
+
this._terminated = false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
get hasPublishers(): boolean {
|
|
33
|
+
return this._publishers.size > 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
schedule(uuid: string): void {
|
|
37
|
+
if (!this._publishers.has(uuid)) {
|
|
38
|
+
this._publishers.set(uuid, this._createPublisher(uuid));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async waitFor(uuid: string): Promise<void> {
|
|
43
|
+
const publisher = this._publishers.get(uuid);
|
|
44
|
+
if (publisher) {
|
|
45
|
+
await publisher;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async shutdown(timeoutMs: number): Promise<void> {
|
|
50
|
+
try {
|
|
51
|
+
await this._wait(timeoutMs);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
this._log.warn(e.message);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
await this._cleanup();
|
|
57
|
+
|
|
58
|
+
this._publishers = new Map();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
private async _createPublisher(uuid: string): Promise<void> {
|
|
62
|
+
let fullPath = '';
|
|
63
|
+
let bytesRead = 0n;
|
|
64
|
+
try {
|
|
65
|
+
await waitForCondition(async () => {
|
|
66
|
+
const paths = await listAttachments();
|
|
67
|
+
const result = paths.find((name) => name.endsWith(uuid));
|
|
68
|
+
if (result) {
|
|
69
|
+
fullPath = result;
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}, {
|
|
74
|
+
waitMs: RECORDING_STARTUP_TIMEOUT_MS,
|
|
75
|
+
intervalMs: 300,
|
|
76
|
+
});
|
|
77
|
+
} catch {
|
|
78
|
+
throw new Error(
|
|
79
|
+
`The video recording identified by ${uuid} did not ` +
|
|
80
|
+
`start within ${RECORDING_STARTUP_TIMEOUT_MS}ms timeout`
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const startedMs = performance.now();
|
|
85
|
+
while (!this._terminated && performance.now() - startedMs < MAX_MONITORING_DURATION_MS) {
|
|
86
|
+
const isCompleted = !(await isFileUsed(fullPath, 'testman'));
|
|
87
|
+
|
|
88
|
+
const { size } = await fs.stat(fullPath, {bigint: true});
|
|
89
|
+
if (bytesRead < size) {
|
|
90
|
+
const handle = await fs.open(fullPath, 'r');
|
|
91
|
+
try {
|
|
92
|
+
while (bytesRead < size) {
|
|
93
|
+
const bufferSize = Number(size - bytesRead > BUFFER_SIZE ? BUFFER_SIZE : size - bytesRead);
|
|
94
|
+
const buf = Buffer.alloc(bufferSize);
|
|
95
|
+
await fs.read(handle, buf as any, 0, bufferSize, bytesRead as any);
|
|
96
|
+
this._ee.emit(BIDI_EVENT_NAME, toNativeVideoChunkAddedEvent(uuid, buf));
|
|
97
|
+
bytesRead += BigInt(bufferSize);
|
|
98
|
+
}
|
|
99
|
+
} finally {
|
|
100
|
+
await fs.close(handle);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (isCompleted) {
|
|
105
|
+
this._log.debug(
|
|
106
|
+
`The native video recording identified by ${uuid} has been detected as completed`
|
|
107
|
+
);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
await B.delay(MONITORING_INTERVAL_DURATION_MS);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this._log.warn(
|
|
115
|
+
`Stopped monitoring of the native video recording identified by ${uuid} ` +
|
|
116
|
+
`because of the timeout`
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private async _wait(timeoutMs: number): Promise<void> {
|
|
121
|
+
if (!this.hasPublishers) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const timer = setTimeout(() => {
|
|
126
|
+
this._terminated = true;
|
|
127
|
+
}, timeoutMs);
|
|
128
|
+
const publishingErrors: string[] = [];
|
|
129
|
+
for (const publisher of this._publishers.values()) {
|
|
130
|
+
try {
|
|
131
|
+
await publisher;
|
|
132
|
+
} catch (e) {
|
|
133
|
+
publishingErrors.push(e.message);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
|
|
138
|
+
if (!_.isEmpty(publishingErrors)) {
|
|
139
|
+
throw new Error(publishingErrors.join('\n'));
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private async _cleanup(): Promise<void> {
|
|
144
|
+
if (!this.hasPublishers) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const attachments = await listAttachments();
|
|
149
|
+
if (_.isEmpty(attachments)) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const tasks: Promise<any>[] = attachments
|
|
153
|
+
.map((attachmentPath) => [path.basename(attachmentPath), attachmentPath])
|
|
154
|
+
.filter(([name,]) => this._publishers.has(name))
|
|
155
|
+
.map(([, attachmentPath]) => fs.rimraf(attachmentPath));
|
|
156
|
+
if (_.isEmpty(tasks)) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
await Promise.all(tasks);
|
|
161
|
+
this._log.debug(
|
|
162
|
+
`Successfully deleted ${util.pluralize('leftover video recording', tasks.length, true)}`
|
|
163
|
+
);
|
|
164
|
+
} catch (e) {
|
|
165
|
+
this._log.warn(`Could not cleanup some leftover video recordings: ${e.message}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
7
169
|
|
|
8
170
|
/**
|
|
9
171
|
* Initiates a new native screen recording session via XCTest.
|
|
@@ -31,7 +193,7 @@ export async function macosStartNativeScreenRecording(
|
|
|
31
193
|
codec,
|
|
32
194
|
displayId,
|
|
33
195
|
}) as ActiveVideoInfo;
|
|
34
|
-
this.
|
|
196
|
+
this._videoChunksBroadcaster.schedule(result.uuid);
|
|
35
197
|
return result;
|
|
36
198
|
}
|
|
37
199
|
|
|
@@ -64,8 +226,11 @@ export async function macosGetNativeScreenRecordingInfo(
|
|
|
64
226
|
* @param fileFieldName The name of the form field, where the file content BLOB should
|
|
65
227
|
* be stored for http(s) uploads
|
|
66
228
|
* @param formFields Additional form fields for multipart http(s) uploads
|
|
229
|
+
* @param ignorePayload Whether to ignore the resulting video payload
|
|
230
|
+
* and return an empty string. Useful if you prefer to fetch
|
|
231
|
+
* video chunks via a BiDi web socket.
|
|
67
232
|
* @returns Base64-encoded content of the recorded media file if 'remotePath'
|
|
68
|
-
* parameter is falsy or an empty string
|
|
233
|
+
* parameter is falsy or an empty string or ignorePayload is set to `true`.
|
|
69
234
|
* @throws {Error} If there was an error while getting the name of a media file
|
|
70
235
|
* or the file content cannot be uploaded to the remote location
|
|
71
236
|
* or screen recording is not supported on the device under test.
|
|
@@ -79,6 +244,7 @@ export async function macosStopNativeScreenRecording(
|
|
|
79
244
|
headers?: StringRecord|[string, any][],
|
|
80
245
|
fileFieldName?: string,
|
|
81
246
|
formFields?: StringRecord|[string, string][],
|
|
247
|
+
ignorePayload?: boolean,
|
|
82
248
|
): Promise<string> {
|
|
83
249
|
const response: ActiveVideoInfo | null = (
|
|
84
250
|
await this.wda.proxy.command('/wda/video/stop', 'POST', {})
|
|
@@ -90,12 +256,34 @@ export async function macosStopNativeScreenRecording(
|
|
|
90
256
|
}
|
|
91
257
|
|
|
92
258
|
const { uuid } = response;
|
|
259
|
+
try {
|
|
260
|
+
await B.resolve(this._videoChunksBroadcaster.waitFor(uuid)).timeout(5000);
|
|
261
|
+
} catch (e) {
|
|
262
|
+
if (e instanceof TimeoutError) {
|
|
263
|
+
this.log.debug(
|
|
264
|
+
`The BiDi chunks broadcaster for the native screen recording identified ` +
|
|
265
|
+
`by ${uuid} cannot complete within 5000ms timeout`
|
|
266
|
+
);
|
|
267
|
+
} else {
|
|
268
|
+
this.log.debug(e.stack);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (ignorePayload) {
|
|
273
|
+
return '';
|
|
274
|
+
}
|
|
275
|
+
|
|
93
276
|
const matchedVideoPath = _.first(
|
|
94
277
|
(await listAttachments()).filter((name) => name.endsWith(uuid))
|
|
95
278
|
);
|
|
96
279
|
if (!matchedVideoPath) {
|
|
97
280
|
throw new Error(
|
|
98
|
-
`The screen recording identified by ${uuid}
|
|
281
|
+
`The screen recording identified by ${uuid} cannot be retrieved. ` +
|
|
282
|
+
`Make sure the Appium Server process or its parent process (e.g. Terminal) ` +
|
|
283
|
+
`has Full Disk Access permission enabled in 'System Preferences' -> 'Privacy & Security' tab. ` +
|
|
284
|
+
`You may verify the presence of the recorded video manually by running the ` +
|
|
285
|
+
`'find "$HOME/Library/Daemon Containers/" -type f -name "${uuid}"' command from Terminal ` +
|
|
286
|
+
`if the latter has been granted the above access permission.`
|
|
99
287
|
);
|
|
100
288
|
}
|
|
101
289
|
const options = {
|
|
@@ -106,41 +294,7 @@ export async function macosStopNativeScreenRecording(
|
|
|
106
294
|
fileFieldName,
|
|
107
295
|
formFields
|
|
108
296
|
};
|
|
109
|
-
|
|
110
|
-
await cleanupNativeRecordedVideos.bind(this)(uuid);
|
|
111
|
-
this._recordedVideoIds.delete(uuid);
|
|
112
|
-
return result;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Deletes previously recorded videos with given ids.
|
|
117
|
-
* This call is safe and does not raise any errors.
|
|
118
|
-
*
|
|
119
|
-
* @param uuids One or more video UUIDs to be deleted
|
|
120
|
-
*/
|
|
121
|
-
export async function cleanupNativeRecordedVideos(
|
|
122
|
-
this: Mac2Driver,
|
|
123
|
-
uuids: string | Set<string>,
|
|
124
|
-
): Promise<void> {
|
|
125
|
-
const attachments = await listAttachments();
|
|
126
|
-
if (_.isEmpty(attachments)) {
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
const tasks: Promise<any>[] = attachments
|
|
130
|
-
.map((attachmentPath) => [path.basename(attachmentPath), attachmentPath])
|
|
131
|
-
.filter(([name,]) => _.isString(uuids) ? uuids === name : uuids.has(name))
|
|
132
|
-
.map(([, attachmentPath]) => fs.rimraf(attachmentPath));
|
|
133
|
-
if (_.isEmpty(tasks)) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
await Promise.all(tasks);
|
|
138
|
-
this.log.debug(
|
|
139
|
-
`Successfully deleted ${util.pluralize('leftover video recording', tasks.length, true)}`
|
|
140
|
-
);
|
|
141
|
-
} catch (e) {
|
|
142
|
-
this.log.warn(`Could not cleanup some leftover video recordings: ${e.message}`);
|
|
143
|
-
}
|
|
297
|
+
return await uploadRecordedMedia.bind(this)(matchedVideoPath, remotePath, options);
|
|
144
298
|
}
|
|
145
299
|
|
|
146
300
|
/**
|
|
@@ -164,6 +318,11 @@ async function listAttachments(): Promise<string[]> {
|
|
|
164
318
|
});
|
|
165
319
|
}
|
|
166
320
|
|
|
321
|
+
async function isFileUsed(fpath: string, userProcessName: string): Promise<boolean> {
|
|
322
|
+
const { stdout } = await exec('lsof', [fpath]);
|
|
323
|
+
return stdout.includes(userProcessName);
|
|
324
|
+
}
|
|
325
|
+
|
|
167
326
|
interface ActiveVideoInfo {
|
|
168
327
|
fps: number;
|
|
169
328
|
codec: number;
|
package/lib/driver.js
CHANGED
|
@@ -35,8 +35,8 @@ export class Mac2Driver extends BaseDriver {
|
|
|
35
35
|
/** @type {import('./wda-mac').WDAMacServer} */
|
|
36
36
|
wda;
|
|
37
37
|
|
|
38
|
-
/** @type {
|
|
39
|
-
|
|
38
|
+
/** @type {nativeScreenRecordingCommands.NativeVideoChunksBroadcaster} */
|
|
39
|
+
_videoChunksBroadcaster;
|
|
40
40
|
|
|
41
41
|
static newMethodMap = newMethodMap;
|
|
42
42
|
static executeMethodMap = executeMethodMap;
|
|
@@ -75,7 +75,9 @@ export class Mac2Driver extends BaseDriver {
|
|
|
75
75
|
this.wda = null;
|
|
76
76
|
this.proxyReqRes = null;
|
|
77
77
|
this.isProxyActive = false;
|
|
78
|
-
this.
|
|
78
|
+
this._videoChunksBroadcaster = new nativeScreenRecordingCommands.NativeVideoChunksBroadcaster(
|
|
79
|
+
this.eventEmitter, this.log
|
|
80
|
+
);
|
|
79
81
|
this._screenRecorder = null;
|
|
80
82
|
}
|
|
81
83
|
|
|
@@ -136,13 +138,11 @@ export class Mac2Driver extends BaseDriver {
|
|
|
136
138
|
|
|
137
139
|
async deleteSession () {
|
|
138
140
|
await this._screenRecorder?.stop(true);
|
|
139
|
-
if (
|
|
141
|
+
if (this._videoChunksBroadcaster.hasPublishers) {
|
|
140
142
|
try {
|
|
141
143
|
await this.wda.proxy.command('/wda/video/stop', 'POST', {});
|
|
142
144
|
} catch {}
|
|
143
|
-
await
|
|
144
|
-
this._recordedVideoIds
|
|
145
|
-
);
|
|
145
|
+
await this._videoChunksBroadcaster.shutdown(5000);
|
|
146
146
|
}
|
|
147
147
|
await this.wda.stopSession();
|
|
148
148
|
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-mac2-driver",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "appium-mac2-driver",
|
|
9
|
-
"version": "2.
|
|
9
|
+
"version": "2.2.0",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@appium/strongbox": "^0.x",
|