appium-ios-remotexpc 5.14.1 → 5.14.3
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 +12 -0
- package/build/src/services/ios/display/audio/audio-stream-capture.d.ts.map +1 -1
- package/build/src/services/ios/display/audio/audio-stream-capture.js +16 -1
- package/build/src/services/ios/display/audio/audio-stream-capture.js.map +1 -1
- package/build/src/services/ios/display/recording/av-capture.d.ts.map +1 -1
- package/build/src/services/ios/display/recording/av-capture.js +31 -3
- package/build/src/services/ios/display/recording/av-capture.js.map +1 -1
- package/package.json +1 -1
- package/src/services/ios/display/audio/audio-stream-capture.ts +19 -1
- package/src/services/ios/display/recording/av-capture.ts +33 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [5.14.3](https://github.com/appium/appium-ios-remotexpc/compare/v5.14.2...v5.14.3) (2026-08-11)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* **display:** close the video writer when the audio writer's close throws ([#291](https://github.com/appium/appium-ios-remotexpc/issues/291)) ([ee8f381](https://github.com/appium/appium-ios-remotexpc/commit/ee8f381d867dfe703e407462ad7da0184b59a67d))
|
|
6
|
+
|
|
7
|
+
## [5.14.2](https://github.com/appium/appium-ios-remotexpc/compare/v5.14.1...v5.14.2) (2026-08-11)
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **display:** stop captures when the recording's output file cannot be created ([#290](https://github.com/appium/appium-ios-remotexpc/issues/290)) ([18ad748](https://github.com/appium/appium-ios-remotexpc/commit/18ad7480bf5a82888a7ea9a574e937ce11b5eaba))
|
|
12
|
+
|
|
1
13
|
## [5.14.1](https://github.com/appium/appium-ios-remotexpc/compare/v5.14.0...v5.14.1) (2026-08-11)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-stream-capture.d.ts","sourceRoot":"","sources":["../../../../../../src/services/ios/display/audio/audio-stream-capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAE,iBAAiB,EAAE,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAI5F,OAAO,EAAiB,KAAK,YAAY,EAAmB,MAAM,cAAc,CAAC;AAKjF,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,oDAAoD;AACpD,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACxE,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,kBAAkB;IAiB3B,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAhBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IAErE,OAAO,CAAC,aAAa,CAAiF;IACtG,OAAO,CAAC,YAAY,CAAqB;IACzC,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAA4B;IAC7C,kFAAkF;IAClF,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO;IASP;;;;;;;;OAQG;WACU,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuBjH,2EAA2E;IAC3E,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,0CAA0C;IAC1C,IAAI,KAAK,IAAI,gBAAgB,CAE5B;IAED;;;;OAIG;IACI,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC;IAgCxF;;;;;;;OAOG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,QAAQ;CAOvB;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB;IACnE,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,oDAAoD;IACpD,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"audio-stream-capture.d.ts","sourceRoot":"","sources":["../../../../../../src/services/ios/display/audio/audio-stream-capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAE,iBAAiB,EAAE,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAI5F,OAAO,EAAiB,KAAK,YAAY,EAAmB,MAAM,cAAc,CAAC;AAKjF,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qCAAqC;AACrC,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,eAAe,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,oDAAoD;AACpD,MAAM,WAAW,yBAA0B,SAAQ,uBAAuB;IACxE,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,kBAAkB;IAiB3B,QAAQ,CAAC,MAAM,EAAE,iBAAiB;IAhBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwC;IAErE,OAAO,CAAC,aAAa,CAAiF;IACtG,OAAO,CAAC,YAAY,CAAqB;IACzC,wEAAwE;IACxE,OAAO,CAAC,SAAS,CAA4B;IAC7C,kFAAkF;IAClF,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO;IASP;;;;;;;;OAQG;WACU,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuBjH,2EAA2E;IAC3E,IAAI,MAAM,IAAI,YAAY,CAEzB;IAED,0CAA0C;IAC1C,IAAI,KAAK,IAAI,gBAAgB,CAE5B;IAED;;;;OAIG;IACI,WAAW,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,OAAO,CAAC;IAgCxF;;;;;;;OAOG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAKb,QAAQ;CAOvB;AAED,6CAA6C;AAC7C,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB;IACnE,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+CAA+C;AAC/C,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,oDAAoD;IACpD,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAgD5B"}
|
|
@@ -171,7 +171,22 @@ export async function recordAudioToFile(service, outputPath, options = {}) {
|
|
|
171
171
|
const controller = new AbortController();
|
|
172
172
|
const timer = setTimeout(() => controller.abort(), durationMs);
|
|
173
173
|
timer.unref?.();
|
|
174
|
-
|
|
174
|
+
let writer;
|
|
175
|
+
try {
|
|
176
|
+
writer = await M4aFileWriter.create(outputPath);
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
// The capture is already streaming and never escapes this function, so a
|
|
180
|
+
// caller cannot stop it. Left running, the device keeps sending into a
|
|
181
|
+
// receiver whose queue nobody drains.
|
|
182
|
+
clearTimeout(timer);
|
|
183
|
+
// Swallowed so it cannot mask the error being thrown, but logged: a failed
|
|
184
|
+
// stop means the device is still streaming, which is the leak itself.
|
|
185
|
+
await capture.stop().catch((stopError) => {
|
|
186
|
+
log.debug(`Failed to stop the audio stream after the output file could not be created: ${stopError instanceof Error ? stopError.message : String(stopError)}`);
|
|
187
|
+
});
|
|
188
|
+
throw error;
|
|
189
|
+
}
|
|
175
190
|
let written;
|
|
176
191
|
try {
|
|
177
192
|
for await (const unit of capture.accessUnits(controller.signal)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-stream-capture.js","sourceRoot":"","sources":["../../../../../../src/services/ios/display/audio/audio-stream-capture.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"audio-stream-capture.js","sourceRoot":"","sources":["../../../../../../src/services/ios/display/audio/audio-stream-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"av-capture.d.ts","sourceRoot":"","sources":["../../../../../../src/services/ios/display/recording/av-capture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAqB,KAAK,gBAAgB,EAAC,MAAM,kCAAkC,CAAC;AAE3F,OAAO,EAAC,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAE9E,OAAO,EAAwC,KAAK,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AAChH,OAAO,EAAC,KAAK,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAI1E,uDAAuD;AACvD,MAAM,WAAW,2BAA4B,SAAQ,uBAAuB;IAC1E,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yDAAyD;AACzD,MAAM,WAAW,0BAA0B;IACzC,uBAAuB;IACvB,KAAK,EAAE;QACL,uDAAuD;QACvD,IAAI,EAAE,MAAM,CAAC;QACb,qCAAqC;QACrC,aAAa,EAAE,MAAM,CAAC;QACtB,qBAAqB;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,0EAA0E;QAC1E,UAAU,EAAE,MAAM,CAAC;QACnB;;;;;;WAMG;QACH,SAAS,EAAE,MAAM,CAAC;QAClB,mEAAmE;QACnE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,wBAAwB;QACxB,KAAK,EAAE,iBAAiB,CAAC;KAC1B,CAAC;IACF,uBAAuB;IACvB,KAAK,EAAE;QACL,oCAAoC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,4BAA4B;QAC5B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,qBAAqB;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB;;;;;WAKG;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,iCAAiC;QACjC,MAAM,EAAE,YAAY,CAAC;QACrB,wBAAwB;QACxB,KAAK,EAAE,gBAAgB,CAAC;KACzB,CAAC;IACF;;;;;;;OAOG;IACH,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,
|
|
1
|
+
{"version":3,"file":"av-capture.d.ts","sourceRoot":"","sources":["../../../../../../src/services/ios/display/recording/av-capture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAqB,KAAK,gBAAgB,EAAC,MAAM,kCAAkC,CAAC;AAE3F,OAAO,EAAC,KAAK,cAAc,EAAE,KAAK,uBAAuB,EAAC,MAAM,aAAa,CAAC;AAE9E,OAAO,EAAwC,KAAK,iBAAiB,EAAC,MAAM,mCAAmC,CAAC;AAChH,OAAO,EAAC,KAAK,UAAU,EAA0B,MAAM,kBAAkB,CAAC;AAI1E,uDAAuD;AACvD,MAAM,WAAW,2BAA4B,SAAQ,uBAAuB;IAC1E,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yDAAyD;AACzD,MAAM,WAAW,0BAA0B;IACzC,uBAAuB;IACvB,KAAK,EAAE;QACL,uDAAuD;QACvD,IAAI,EAAE,MAAM,CAAC;QACb,qCAAqC;QACrC,aAAa,EAAE,MAAM,CAAC;QACtB,qBAAqB;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,0EAA0E;QAC1E,UAAU,EAAE,MAAM,CAAC;QACnB;;;;;;WAMG;QACH,SAAS,EAAE,MAAM,CAAC;QAClB,mEAAmE;QACnE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,wBAAwB;QACxB,KAAK,EAAE,iBAAiB,CAAC;KAC1B,CAAC;IACF,uBAAuB;IACvB,KAAK,EAAE;QACL,oCAAoC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,4BAA4B;QAC5B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,qBAAqB;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB;;;;;WAKG;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,iCAAiC;QACjC,MAAM,EAAE,YAAY,CAAC;QACrB,wBAAwB;QACxB,KAAK,EAAE,gBAAgB,CAAC;KACzB,CAAC;IACF;;;;;;;OAOG;IACH,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,0BAA0B,CAAC,CAsIrC"}
|
|
@@ -51,7 +51,26 @@ export async function recordScreenAndAudioToFiles(service, options) {
|
|
|
51
51
|
throw error;
|
|
52
52
|
}
|
|
53
53
|
const videoOut = new AnnexBFileWriter(videoPath);
|
|
54
|
-
|
|
54
|
+
let audioOut;
|
|
55
|
+
try {
|
|
56
|
+
audioOut = await M4aFileWriter.create(audioPath);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// Both captures are already streaming by now, and neither they nor the
|
|
60
|
+
// video writer escape this function, so a caller cannot release them. Left
|
|
61
|
+
// running, the device keeps encoding into a receiver whose queue nobody
|
|
62
|
+
// drains, and its RTCP keepalive keeps the session alive indefinitely.
|
|
63
|
+
// Each failure is swallowed so it cannot mask the error being thrown. The
|
|
64
|
+
// stop is still logged: if it fails the device is left streaming, which is
|
|
65
|
+
// the leak itself. One stop tears down both streams, so the second call and
|
|
66
|
+
// the file close are quiet.
|
|
67
|
+
await videoCapture.stop().catch((stopError) => {
|
|
68
|
+
log.debug(`Failed to stop cleanly after the audio file could not be created: ${stopError instanceof Error ? stopError.message : String(stopError)}`);
|
|
69
|
+
});
|
|
70
|
+
await audioCapture.stop().catch(() => undefined);
|
|
71
|
+
await videoOut.close().catch(() => undefined);
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
55
74
|
let framesWritten = 0;
|
|
56
75
|
let videoBytes = 0;
|
|
57
76
|
let sawKeyFrame = false;
|
|
@@ -97,8 +116,17 @@ export async function recordScreenAndAudioToFiles(service, options) {
|
|
|
97
116
|
log.debug(`Failed to stop cleanly: ${error instanceof Error ? error.message : String(error)}`);
|
|
98
117
|
});
|
|
99
118
|
await audioCapture.stop().catch(() => undefined);
|
|
100
|
-
|
|
101
|
-
|
|
119
|
+
// The video writer closes even when the audio writer throws. M4aFileWriter
|
|
120
|
+
// finalizes by reopening the finished file to patch mdat's length, so it can
|
|
121
|
+
// fail on a full disk long after every frame is safely on disk. Sequencing
|
|
122
|
+
// the two closes would leak the video file descriptor for the life of the
|
|
123
|
+
// process, and the error its stream is holding would never be read.
|
|
124
|
+
try {
|
|
125
|
+
audioWritten = await audioOut.close();
|
|
126
|
+
}
|
|
127
|
+
finally {
|
|
128
|
+
await videoOut.close();
|
|
129
|
+
}
|
|
102
130
|
}
|
|
103
131
|
const audioDurationMs = aacEldDurationMs(audioWritten.sampleCount);
|
|
104
132
|
// Measure against the video's own capture window, never the audio clock: if
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"av-capture.js","sourceRoot":"","sources":["../../../../../../src/services/ios/display/recording/av-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAC,OAAO,EAAC,MAAM,wCAAwC,CAAC;AAC/D,OAAO,EAAoB,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAC,kBAAkB,EAAwB,MAAM,kCAAkC,CAAC;AAC3F,OAAO,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAC,QAAQ,EAAC,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAC,gBAAgB,EAAE,mBAAmB,EAAyB,MAAM,mCAAmC,CAAC;AAChH,OAAO,EAAkB,uBAAuB,EAAC,MAAM,kBAAkB,CAAC;AAE1E,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AAoEnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAuB,EACvB,OAAoC;IAEpC,MAAM,EAAC,SAAS,EAAE,SAAS,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,YAAY,EAAC,GAAG,OAAO,CAAC;IAE5E,6DAA6D;IAC7D,MAAM,eAAe,GAAG,YAAY,CAAC,eAAe,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAEzE,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAC,GAAG,YAAY,EAAE,eAAe,EAAC,CAAC,CAAC;IAClG,IAAI,YAAgC,CAAC;IACrC,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAC,eAAe,EAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAS,EAAE,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACjD,
|
|
1
|
+
{"version":3,"file":"av-capture.js","sourceRoot":"","sources":["../../../../../../src/services/ios/display/recording/av-capture.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -242,7 +242,25 @@ export async function recordAudioToFile(
|
|
|
242
242
|
const timer = setTimeout(() => controller.abort(), durationMs);
|
|
243
243
|
timer.unref?.();
|
|
244
244
|
|
|
245
|
-
|
|
245
|
+
let writer: M4aFileWriter;
|
|
246
|
+
try {
|
|
247
|
+
writer = await M4aFileWriter.create(outputPath);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
// The capture is already streaming and never escapes this function, so a
|
|
250
|
+
// caller cannot stop it. Left running, the device keeps sending into a
|
|
251
|
+
// receiver whose queue nobody drains.
|
|
252
|
+
clearTimeout(timer);
|
|
253
|
+
// Swallowed so it cannot mask the error being thrown, but logged: a failed
|
|
254
|
+
// stop means the device is still streaming, which is the leak itself.
|
|
255
|
+
await capture.stop().catch((stopError: unknown) => {
|
|
256
|
+
log.debug(
|
|
257
|
+
`Failed to stop the audio stream after the output file could not be created: ${
|
|
258
|
+
stopError instanceof Error ? stopError.message : String(stopError)
|
|
259
|
+
}`,
|
|
260
|
+
);
|
|
261
|
+
});
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
246
264
|
let written;
|
|
247
265
|
try {
|
|
248
266
|
for await (const unit of capture.accessUnits(controller.signal)) {
|
|
@@ -125,7 +125,29 @@ export async function recordScreenAndAudioToFiles(
|
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
const videoOut = new AnnexBFileWriter(videoPath);
|
|
128
|
-
|
|
128
|
+
let audioOut: M4aFileWriter;
|
|
129
|
+
try {
|
|
130
|
+
audioOut = await M4aFileWriter.create(audioPath);
|
|
131
|
+
} catch (error) {
|
|
132
|
+
// Both captures are already streaming by now, and neither they nor the
|
|
133
|
+
// video writer escape this function, so a caller cannot release them. Left
|
|
134
|
+
// running, the device keeps encoding into a receiver whose queue nobody
|
|
135
|
+
// drains, and its RTCP keepalive keeps the session alive indefinitely.
|
|
136
|
+
// Each failure is swallowed so it cannot mask the error being thrown. The
|
|
137
|
+
// stop is still logged: if it fails the device is left streaming, which is
|
|
138
|
+
// the leak itself. One stop tears down both streams, so the second call and
|
|
139
|
+
// the file close are quiet.
|
|
140
|
+
await videoCapture.stop().catch((stopError: unknown) => {
|
|
141
|
+
log.debug(
|
|
142
|
+
`Failed to stop cleanly after the audio file could not be created: ${
|
|
143
|
+
stopError instanceof Error ? stopError.message : String(stopError)
|
|
144
|
+
}`,
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
await audioCapture.stop().catch((): void => undefined);
|
|
148
|
+
await videoOut.close().catch((): void => undefined);
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
129
151
|
let framesWritten = 0;
|
|
130
152
|
let videoBytes = 0;
|
|
131
153
|
let sawKeyFrame = false;
|
|
@@ -174,8 +196,16 @@ export async function recordScreenAndAudioToFiles(
|
|
|
174
196
|
log.debug(`Failed to stop cleanly: ${error instanceof Error ? error.message : String(error)}`);
|
|
175
197
|
});
|
|
176
198
|
await audioCapture.stop().catch((): void => undefined);
|
|
177
|
-
|
|
178
|
-
|
|
199
|
+
// The video writer closes even when the audio writer throws. M4aFileWriter
|
|
200
|
+
// finalizes by reopening the finished file to patch mdat's length, so it can
|
|
201
|
+
// fail on a full disk long after every frame is safely on disk. Sequencing
|
|
202
|
+
// the two closes would leak the video file descriptor for the life of the
|
|
203
|
+
// process, and the error its stream is holding would never be read.
|
|
204
|
+
try {
|
|
205
|
+
audioWritten = await audioOut.close();
|
|
206
|
+
} finally {
|
|
207
|
+
await videoOut.close();
|
|
208
|
+
}
|
|
179
209
|
}
|
|
180
210
|
|
|
181
211
|
const audioDurationMs = aacEldDurationMs(audioWritten.sampleCount);
|