screenci 0.0.75 → 0.0.76
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/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +150 -37
- package/dist/cli.js.map +1 -1
- package/dist/docs/manifest.d.ts +42 -11
- package/dist/docs/manifest.d.ts.map +1 -1
- package/dist/docs/manifest.js +14 -3
- package/dist/docs/manifest.js.map +1 -1
- package/dist/docs/video-sources/installation.screenci.js +7 -9
- package/dist/docs/video-sources/installation.screenci.js.map +1 -1
- package/dist/docs/video-sources/landing.screenci.js +6 -8
- package/dist/docs/video-sources/landing.screenci.js.map +1 -1
- package/dist/docs/video-sources/locator-highlight-animated.screenci.js +3 -4
- package/dist/docs/video-sources/locator-highlight-animated.screenci.js.map +1 -1
- package/dist/docs/video-sources/locator-highlight-still.screenci.js +3 -4
- package/dist/docs/video-sources/locator-highlight-still.screenci.js.map +1 -1
- package/dist/docs/video-sources/studio.screenci.js +8 -10
- package/dist/docs/video-sources/studio.screenci.js.map +1 -1
- package/dist/e2e/instrument.e2e.js +52 -1
- package/dist/e2e/instrument.e2e.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/src/asset.d.ts +20 -1
- package/dist/src/asset.d.ts.map +1 -1
- package/dist/src/asset.js +58 -7
- package/dist/src/asset.js.map +1 -1
- package/dist/src/audio.d.ts +16 -0
- package/dist/src/audio.d.ts.map +1 -1
- package/dist/src/audio.js +78 -1
- package/dist/src/audio.js.map +1 -1
- package/dist/src/autoZoom.d.ts.map +1 -1
- package/dist/src/autoZoom.js +3 -1
- package/dist/src/autoZoom.js.map +1 -1
- package/dist/src/browserLaunchOptions.d.ts +24 -2
- package/dist/src/browserLaunchOptions.d.ts.map +1 -1
- package/dist/src/browserLaunchOptions.js +57 -3
- package/dist/src/browserLaunchOptions.js.map +1 -1
- package/dist/src/builder.d.ts +135 -142
- package/dist/src/builder.d.ts.map +1 -1
- package/dist/src/builder.js +218 -77
- package/dist/src/builder.js.map +1 -1
- package/dist/src/callerFile.d.ts +12 -0
- package/dist/src/callerFile.d.ts.map +1 -0
- package/dist/src/callerFile.js +46 -0
- package/dist/src/callerFile.js.map +1 -0
- package/dist/src/changeFocus.d.ts.map +1 -1
- package/dist/src/changeFocus.js +6 -2
- package/dist/src/changeFocus.js.map +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +15 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/declare.d.ts +59 -0
- package/dist/src/declare.d.ts.map +1 -0
- package/dist/src/declare.js +93 -0
- package/dist/src/declare.js.map +1 -0
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +4 -3
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/events.d.ts +51 -1
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +107 -15
- package/dist/src/events.js.map +1 -1
- package/dist/src/init.d.ts.map +1 -1
- package/dist/src/init.js +32 -30
- package/dist/src/init.js.map +1 -1
- package/dist/src/instrument.d.ts.map +1 -1
- package/dist/src/instrument.js +139 -1
- package/dist/src/instrument.js.map +1 -1
- package/dist/src/localize.d.ts +1 -0
- package/dist/src/localize.d.ts.map +1 -1
- package/dist/src/localize.js +1 -1
- package/dist/src/localize.js.map +1 -1
- package/dist/src/localizeRuntime.d.ts +17 -26
- package/dist/src/localizeRuntime.d.ts.map +1 -1
- package/dist/src/localizeRuntime.js +63 -48
- package/dist/src/localizeRuntime.js.map +1 -1
- package/dist/src/manualZoom.d.ts.map +1 -1
- package/dist/src/manualZoom.js +8 -5
- package/dist/src/manualZoom.js.map +1 -1
- package/dist/src/openBrowser.d.ts +34 -0
- package/dist/src/openBrowser.d.ts.map +1 -0
- package/dist/src/openBrowser.js +62 -0
- package/dist/src/openBrowser.js.map +1 -0
- package/dist/src/recordingData.d.ts +20 -0
- package/dist/src/recordingData.d.ts.map +1 -1
- package/dist/src/screenAudio.d.ts +58 -0
- package/dist/src/screenAudio.d.ts.map +1 -0
- package/dist/src/screenAudio.js +145 -0
- package/dist/src/screenAudio.js.map +1 -0
- package/dist/src/screenAudioSink.d.ts +34 -0
- package/dist/src/screenAudioSink.d.ts.map +1 -0
- package/dist/src/screenAudioSink.js +47 -0
- package/dist/src/screenAudioSink.js.map +1 -0
- package/dist/src/screenshot.d.ts +20 -24
- package/dist/src/screenshot.d.ts.map +1 -1
- package/dist/src/screenshot.js +34 -19
- package/dist/src/screenshot.js.map +1 -1
- package/dist/src/stillCapture.d.ts +5 -0
- package/dist/src/stillCapture.d.ts.map +1 -1
- package/dist/src/stillCapture.js +11 -1
- package/dist/src/stillCapture.js.map +1 -1
- package/dist/src/studio.d.ts +3 -59
- package/dist/src/studio.d.ts.map +1 -1
- package/dist/src/studio.js +1 -41
- package/dist/src/studio.js.map +1 -1
- package/dist/src/types.d.ts +133 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/video.d.ts +63 -52
- package/dist/src/video.d.ts.map +1 -1
- package/dist/src/video.js +143 -32
- package/dist/src/video.js.map +1 -1
- package/dist/src/zoom.d.ts +1 -0
- package/dist/src/zoom.d.ts.map +1 -1
- package/dist/src/zoom.js +3 -0
- package/dist/src/zoom.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skills/screenci/SKILL.md +2 -2
- package/skills/screenci/references/init.md +4 -3
- package/skills/screenci/references/record.md +1 -1
- package/dist/docs/video-sources/public-urls.screenci.d.ts +0 -2
- package/dist/docs/video-sources/public-urls.screenci.d.ts.map +0 -1
- package/dist/docs/video-sources/public-urls.screenci.js +0 -41
- package/dist/docs/video-sources/public-urls.screenci.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localizeRuntime.js","sourceRoot":"","sources":["../../src/localizeRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"localizeRuntime.js","sourceRoot":"","sources":["../../src/localizeRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manualZoom.d.ts","sourceRoot":"","sources":["../../src/manualZoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"manualZoom.d.ts","sourceRoot":"","sources":["../../src/manualZoom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,kBAAkB,CAAA;AAsBrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AASjD,MAAM,MAAM,eAAe,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AACtD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,eAAe,CAAA;AAoIlD,wBAAsB,MAAM,CAC1B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,SAAS,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D5E"}
|
package/dist/src/manualZoom.js
CHANGED
|
@@ -2,7 +2,7 @@ import { DEFAULT_ZOOM_OPTIONS } from './defaults.js';
|
|
|
2
2
|
import { ScreenciError } from './errors.js';
|
|
3
3
|
import { changeFocus, resolveFixedFocusViewportSize, resolveTargetRectPosition, } from './changeFocus.js';
|
|
4
4
|
import { getActiveAutoZoomRecorder, getActiveZoomPage, getAutoZoomState, setCurrentZoomViewport, setZoomMode, } from './autoZoom.js';
|
|
5
|
-
import { buildZoomEvent, resolveAutoZoomOptions, resolveZoomTarget, } from './zoom.js';
|
|
5
|
+
import { buildZoomEvent, resolveAutoZoomOptions, resolveEffectiveDuration, resolveZoomTarget, } from './zoom.js';
|
|
6
6
|
import { resolveRecordingTimingDuration } from './runtimeMode.js';
|
|
7
7
|
function sleep(ms) {
|
|
8
8
|
return new Promise((resolve) => setTimeout(resolve, resolveRecordingTimingDuration(ms)));
|
|
@@ -59,13 +59,15 @@ async function zoomToPoint(point, options = {}) {
|
|
|
59
59
|
}),
|
|
60
60
|
currentZoomEnd,
|
|
61
61
|
});
|
|
62
|
+
const isZoomOut = targetViewport.width >= currentZoomEnd.size.widthPx;
|
|
63
|
+
const effectiveDuration = resolveEffectiveDuration(resolvedOptions, isZoomOut);
|
|
62
64
|
const focusChangeStartMs = Date.now();
|
|
63
65
|
if (resolvedOptions.preZoomDelay > 0) {
|
|
64
66
|
await sleep(resolvedOptions.preZoomDelay);
|
|
65
67
|
}
|
|
66
68
|
const zoomStartMs = Date.now();
|
|
67
|
-
if (
|
|
68
|
-
await sleep(
|
|
69
|
+
if (effectiveDuration > 0) {
|
|
70
|
+
await sleep(effectiveDuration);
|
|
69
71
|
}
|
|
70
72
|
const zoomEndMs = Date.now();
|
|
71
73
|
if (resolvedOptions.postZoomDelay > 0) {
|
|
@@ -142,13 +144,14 @@ export async function resetZoom(options = {}) {
|
|
|
142
144
|
heightPx: viewport.viewportSize.height,
|
|
143
145
|
},
|
|
144
146
|
};
|
|
147
|
+
const resetDuration = resolvedOptions.zoomOutDuration;
|
|
145
148
|
const focusChangeStartMs = Date.now();
|
|
146
149
|
if (resolvedOptions.preZoomDelay > 0) {
|
|
147
150
|
await sleep(resolvedOptions.preZoomDelay);
|
|
148
151
|
}
|
|
149
152
|
const zoomStartMs = Date.now();
|
|
150
|
-
if (
|
|
151
|
-
await sleep(
|
|
153
|
+
if (resetDuration > 0) {
|
|
154
|
+
await sleep(resetDuration);
|
|
152
155
|
}
|
|
153
156
|
const zoomEndMs = Date.now();
|
|
154
157
|
if (resolvedOptions.postZoomDelay > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manualZoom.js","sourceRoot":"","sources":["../../src/manualZoom.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"manualZoom.js","sourceRoot":"","sources":["../../src/manualZoom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EACL,WAAW,EACX,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,WAAW,GACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAA;AAEjE,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7B,UAAU,CAAC,OAAO,EAAE,8BAA8B,CAAC,EAAE,CAAC,CAAC,CACxD,CAAA;AACH,CAAC;AAKD,SAAS,SAAS,CAAC,MAAkB;IACnC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,UAAU,IAAI,MAAM,CAAA;AAC9E,CAAC;AAED,SAAS,uBAAuB,CAAC,GAA2B;IAC1D,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,aAAa,CAAC,eAAe,GAAG,+BAA+B,CAAC,CAAA;IAC5E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,IAAU;IAEV,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;IACpC,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAA;IAEtC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,UAAU;QACxB,MAAM,EAAE,MAAM,CAAC,WAAW;KAC3B,CAAC,CAAC,CAAA;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,KAAsB,EACtB,UAA2B,EAAE;IAE7B,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAA;IAChC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,aAAa,CACrB,oEAAoE,CACrE,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAA;IACpD,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC9D,MAAM,cAAc,GAAG,KAAK,CAAC,mBAAmB,EAAE,GAAG,IAAI;QACvD,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACvB,IAAI,EAAE;YACJ,OAAO,EAAE,YAAY,CAAC,KAAK;YAC3B,QAAQ,EAAE,YAAY,CAAC,MAAM;SAC9B;KACF,CAAA;IACD,MAAM,cAAc,GAAG,6BAA6B,CAClD,YAAY,EACZ,eAAe,CAAC,MAAM,CACvB,CAAA;IACD,MAAM,SAAS,GAAG;QAChB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAA;IACD,MAAM,UAAU,GAAG,iBAAiB,CAAC;QACnC,WAAW,EAAE,SAAS;QACtB,QAAQ,EAAE,YAAY;QACtB,cAAc;QACd,gCAAgC,EAAE,yBAAyB,CAAC;YAC1D,aAAa,EAAE,cAAc;YAC7B,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YACzC,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,eAAe,CAAC,SAAS;SACrC,CAAC;QACF,cAAc;KACf,CAAC,CAAA;IAEF,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAA;IACrE,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;IAE9E,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACrC,IAAI,eAAe,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC9B,IAAI,iBAAiB,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAChC,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAE5B,IAAI,eAAe,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAEnC,MAAM,SAAS,GAAG,cAAc,CAAC;QAC/B,MAAM,EAAE,UAAU;QAClB,cAAc;QACd,UAAU,EACR,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC;gBACE,OAAO,EAAE,WAAW;gBACpB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,eAAe,CAAC,MAAM;aAC/B;YACH,CAAC,CAAC,SAAS;KAChB,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACvB,IAAI,EAAE;YACJ,OAAO,EAAE,YAAY,CAAC,KAAK;YAC3B,QAAQ,EAAE,YAAY,CAAC,MAAM;SAC9B;KACF,CAAA;IAED,sBAAsB,CAAC;QACrB,UAAU,EAAE,KAAK;QACjB,GAAG,EAAE,UAAU,EAAE,GAAG,IAAI,eAAe;QACvC,YAAY;QACZ,aAAa,EAAE,UAAU,EAAE,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;KAC3D,CAAC,CAAA;IAEF,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACxD,WAAW,CAAC,QAAQ,CAAC,CAAA;IACvB,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE,gBAAgB;QACvB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAAkB,EAClB,UAA2B,EAAE;IAE7B,uBAAuB,CAAC,QAAQ,CAAC,CAAA;IAEjC,MAAM,QAAQ,GAAG,yBAAyB,EAAE,CAAA;IAC5C,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC,IAAI,CAAA;QAC5C,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAClE,WAAW,CACT,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAC3E,CAAA;QACD,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9D,OAAM;IACR,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACvD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA2B,EAAE;IAC3D,uBAAuB,CAAC,WAAW,CAAC,CAAA;IAEpC,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,mBAAmB,CAAA;IAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACjD,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAG,yBAAyB,EAAE,CAAA;IAC5C,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC9D,MAAM,eAAe,GAAG;QACtB,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QACvB,IAAI,EAAE;YACJ,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK;YACpC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;SACvC;KACF,CAAA;IACD,MAAM,aAAa,GAAG,eAAe,CAAC,eAAe,CAAA;IACrD,MAAM,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IACrC,IAAI,eAAe,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,KAAK,CAAC,eAAe,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC9B,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC,aAAa,CAAC,CAAA;IAC5B,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,IAAI,eAAe,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAEnC,MAAM,MAAM,GAAqB;QAC/B,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE,gBAAgB;QACvB,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxB,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxB,IAAI,EAAE;YACJ,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,eAAe,CAAC,MAAM,IAAI,oBAAoB,CAAC,MAAM;YAC7D,GAAG,EAAE,eAAe;SACrB;QACD,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;YACvC,CAAC,CAAC,EAAE,CAAC;KACR,CAAA;IAED,sBAAsB,CAAC;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,GAAG,EAAE,eAAe;QACpB,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,aAAa,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;QAC7B,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE;YACvC,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAA;IACF,WAAW,CAAC,MAAM,CAAC,CAAA;IAEnB,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;AAClE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
export type BrowserOpenSpec = {
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
};
|
|
6
|
+
export type OpenBrowserResult = {
|
|
7
|
+
opened: true;
|
|
8
|
+
} | {
|
|
9
|
+
opened: false;
|
|
10
|
+
reason: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the platform-specific command that opens a URL in the default
|
|
14
|
+
* browser: `open` on macOS, `cmd /c start` on Windows, and `xdg-open`
|
|
15
|
+
* everywhere else (Linux, BSD). The empty `""` on Windows is `start`'s window
|
|
16
|
+
* title argument, so a quoted URL is not consumed as the title.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveBrowserOpenSpec(url: string, platform?: NodeJS.Platform): BrowserOpenSpec;
|
|
19
|
+
/**
|
|
20
|
+
* Try to open `url` in the user's default browser. Best-effort: a synchronous
|
|
21
|
+
* spawn failure or an asynchronous launch error (e.g. `xdg-open` missing on a
|
|
22
|
+
* minimal Linux box) resolves to `{ opened: false, reason }` instead of
|
|
23
|
+
* throwing. A resolved `{ opened: true }` only means the launch was dispatched,
|
|
24
|
+
* not that a browser window actually appeared, so callers still surface the
|
|
25
|
+
* link as a fallback.
|
|
26
|
+
*
|
|
27
|
+
* Dependency-injected (`platform`, `spawnFn`) so tests can drive both outcomes
|
|
28
|
+
* without a real terminal or browser.
|
|
29
|
+
*/
|
|
30
|
+
export declare function openUrlInBrowser(url: string, options?: {
|
|
31
|
+
platform?: NodeJS.Platform;
|
|
32
|
+
spawnFn?: typeof spawn;
|
|
33
|
+
}): Promise<OpenBrowserResult>;
|
|
34
|
+
//# sourceMappingURL=openBrowser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openBrowser.d.ts","sourceRoot":"","sources":["../../src/openBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAQrC,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,EAAE,CAAA;CACf,CAAA;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,eAAe,CAQjB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAClB,GACL,OAAO,CAAC,iBAAiB,CAAC,CAqC5B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the platform-specific command that opens a URL in the default
|
|
4
|
+
* browser: `open` on macOS, `cmd /c start` on Windows, and `xdg-open`
|
|
5
|
+
* everywhere else (Linux, BSD). The empty `""` on Windows is `start`'s window
|
|
6
|
+
* title argument, so a quoted URL is not consumed as the title.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveBrowserOpenSpec(url, platform = process.platform) {
|
|
9
|
+
if (platform === 'darwin') {
|
|
10
|
+
return { command: 'open', args: [url] };
|
|
11
|
+
}
|
|
12
|
+
if (platform === 'win32') {
|
|
13
|
+
return { command: 'cmd', args: ['/c', 'start', '', url] };
|
|
14
|
+
}
|
|
15
|
+
return { command: 'xdg-open', args: [url] };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Try to open `url` in the user's default browser. Best-effort: a synchronous
|
|
19
|
+
* spawn failure or an asynchronous launch error (e.g. `xdg-open` missing on a
|
|
20
|
+
* minimal Linux box) resolves to `{ opened: false, reason }` instead of
|
|
21
|
+
* throwing. A resolved `{ opened: true }` only means the launch was dispatched,
|
|
22
|
+
* not that a browser window actually appeared, so callers still surface the
|
|
23
|
+
* link as a fallback.
|
|
24
|
+
*
|
|
25
|
+
* Dependency-injected (`platform`, `spawnFn`) so tests can drive both outcomes
|
|
26
|
+
* without a real terminal or browser.
|
|
27
|
+
*/
|
|
28
|
+
export async function openUrlInBrowser(url, options = {}) {
|
|
29
|
+
const platform = options.platform ?? process.platform;
|
|
30
|
+
const spawnFn = options.spawnFn ?? spawn;
|
|
31
|
+
const spec = resolveBrowserOpenSpec(url, platform);
|
|
32
|
+
let child;
|
|
33
|
+
try {
|
|
34
|
+
child = spawnFn(spec.command, spec.args, {
|
|
35
|
+
stdio: 'ignore',
|
|
36
|
+
detached: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
return {
|
|
41
|
+
opened: false,
|
|
42
|
+
reason: err instanceof Error ? err.message : String(err),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Keep an error listener attached for the child's lifetime so a late launch
|
|
46
|
+
// error (e.g. ENOENT) is handled rather than thrown as an unhandled event.
|
|
47
|
+
const launchError = new Promise((resolveError) => {
|
|
48
|
+
child.on('error', resolveError);
|
|
49
|
+
});
|
|
50
|
+
// Detach so the parent (login) can exit without waiting on the browser.
|
|
51
|
+
child.unref();
|
|
52
|
+
// ENOENT and friends surface on the next tick, ahead of this setImmediate, so
|
|
53
|
+
// a failed launch wins the race; otherwise we treat the dispatch as success.
|
|
54
|
+
const settled = new Promise((resolveTick) => {
|
|
55
|
+
setImmediate(() => resolveTick(null));
|
|
56
|
+
});
|
|
57
|
+
const result = await Promise.race([launchError, settled]);
|
|
58
|
+
return result === null
|
|
59
|
+
? { opened: true }
|
|
60
|
+
: { opened: false, reason: result.message };
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=openBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openBrowser.js","sourceRoot":"","sources":["../../src/openBrowser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAiBrC;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;IACzC,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAA;IAC3D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAA;AAC7C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,UAGI,EAAE;IAEN,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAA;IACrD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAA;IACxC,MAAM,IAAI,GAAG,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAElD,IAAI,KAA+B,CAAA;IACnC,IAAI,CAAC;QACH,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YACvC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,IAAI;SACC,CAAC,CAAA;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACzD,CAAA;IACH,CAAC;IAED,4EAA4E;IAC5E,2EAA2E;IAC3E,MAAM,WAAW,GAAG,IAAI,OAAO,CAAQ,CAAC,YAAY,EAAE,EAAE;QACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,wEAAwE;IACxE,KAAK,CAAC,KAAK,EAAE,CAAA;IAEb,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,WAAW,EAAE,EAAE;QAChD,YAAY,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;IACzD,OAAO,MAAM,KAAK,IAAI;QACpB,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;QAClB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;AAC/C,CAAC"}
|
|
@@ -166,6 +166,22 @@ export type VideoCueStartEvent = {
|
|
|
166
166
|
*/
|
|
167
167
|
volume?: number;
|
|
168
168
|
};
|
|
169
|
+
/**
|
|
170
|
+
* A per-language override of an overlay's file/options, used in shared-capture
|
|
171
|
+
* mode where one recording carries every language. The recorder folds the active
|
|
172
|
+
* language's translation into the top-level fields before serialization (see
|
|
173
|
+
* `filterEventTranslationsToLanguage`), so the renderer only ever sees a single
|
|
174
|
+
* resolved language.
|
|
175
|
+
*/
|
|
176
|
+
export type AssetTranslation = {
|
|
177
|
+
path: string;
|
|
178
|
+
fileHash?: string;
|
|
179
|
+
durationMs?: number;
|
|
180
|
+
audio?: number;
|
|
181
|
+
fullScreen?: boolean;
|
|
182
|
+
speed?: number;
|
|
183
|
+
time?: number;
|
|
184
|
+
};
|
|
169
185
|
export type ImageAssetStartEvent = {
|
|
170
186
|
type: 'assetStart';
|
|
171
187
|
timeMs: number;
|
|
@@ -175,6 +191,8 @@ export type ImageAssetStartEvent = {
|
|
|
175
191
|
fileHash?: string;
|
|
176
192
|
durationMs?: number;
|
|
177
193
|
fullScreen: boolean;
|
|
194
|
+
/** Per-language file overrides (shared-capture mode); folded before render. */
|
|
195
|
+
translations?: Record<string, AssetTranslation>;
|
|
178
196
|
};
|
|
179
197
|
export type VideoAssetStartEvent = {
|
|
180
198
|
type: 'assetStart';
|
|
@@ -193,6 +211,8 @@ export type VideoAssetStartEvent = {
|
|
|
193
211
|
speed?: number;
|
|
194
212
|
/** Target playback duration (ms); an alternative to {@link speed}. */
|
|
195
213
|
time?: number;
|
|
214
|
+
/** Per-language file overrides (shared-capture mode); folded before render. */
|
|
215
|
+
translations?: Record<string, AssetTranslation>;
|
|
196
216
|
};
|
|
197
217
|
export type AssetStartEvent = ImageAssetStartEvent | VideoAssetStartEvent;
|
|
198
218
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recordingData.d.ts","sourceRoot":"","sources":["../../src/recordingData.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"recordingData.d.ts","sourceRoot":"","sources":["../../src/recordingData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'child_process';
|
|
2
|
+
import { readFile as nodeReadFile } from 'fs/promises';
|
|
3
|
+
export declare const SCREEN_AUDIO_DOCS_URL = "https://screenci.com/docs/guides/screen-audio";
|
|
4
|
+
/**
|
|
5
|
+
* Screen audio capture is supported on Linux only. macOS and Windows have no
|
|
6
|
+
* way to route just the recording browser into an isolated capture device
|
|
7
|
+
* without third-party tooling, so capturing there would either pick up every
|
|
8
|
+
* app's sound or require muting the whole machine. On those platforms screenci
|
|
9
|
+
* skips capture and warns instead of writing a misleading track.
|
|
10
|
+
*/
|
|
11
|
+
export declare function isScreenAudioSupported(platform?: NodeJS.Platform): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Warning shown (at run start and end) when audio capture is requested on a
|
|
14
|
+
* platform where it is not supported. Returns `null` on supported platforms.
|
|
15
|
+
*/
|
|
16
|
+
export declare function screenAudioUnsupportedMessage(platform?: NodeJS.Platform): string | null;
|
|
17
|
+
/** Sets (or clears with `null`) the capture device for this worker. */
|
|
18
|
+
export declare function setActiveCaptureDevice(device: string | null): void;
|
|
19
|
+
/** @internal */
|
|
20
|
+
export type PlatformAudioArgs = {
|
|
21
|
+
/** Args that appear before `-i`, e.g. `['-f', 'pulse']`. */
|
|
22
|
+
inputArgs: string[];
|
|
23
|
+
/** The device string passed to `-i`. */
|
|
24
|
+
device: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Resolves the ffmpeg audio capture arguments for the current (or given)
|
|
28
|
+
* platform. Throws when the platform is not supported.
|
|
29
|
+
*
|
|
30
|
+
* When a capture device has been set for this worker (its dedicated null sink's
|
|
31
|
+
* monitor) it replaces the platform default device while keeping the platform's
|
|
32
|
+
* input format args.
|
|
33
|
+
*
|
|
34
|
+
* Exposed for testing; callers should use {@link startScreenAudioCapture}.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resolvePlatformAudioArgs(platform?: NodeJS.Platform, device?: string | null): PlatformAudioArgs;
|
|
37
|
+
export type ScreenAudioCaptureResult = {
|
|
38
|
+
path: string;
|
|
39
|
+
fileHash: string;
|
|
40
|
+
};
|
|
41
|
+
export type ScreenAudioCapture = {
|
|
42
|
+
stop(): Promise<ScreenAudioCaptureResult>;
|
|
43
|
+
};
|
|
44
|
+
/** @internal - injected in tests */
|
|
45
|
+
export type ScreenAudioDeps = {
|
|
46
|
+
spawn: typeof nodeSpawn;
|
|
47
|
+
readFile: typeof nodeReadFile;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Starts a background ffmpeg process that captures audio from the system's
|
|
51
|
+
* default input and writes it to `outputPath` as PCM WAV.
|
|
52
|
+
*
|
|
53
|
+
* Call the returned `stop()` to send a graceful quit signal and await the
|
|
54
|
+
* captured file. If ffmpeg fails to start or the output file is missing, the
|
|
55
|
+
* promise rejects with a message that links to the setup docs.
|
|
56
|
+
*/
|
|
57
|
+
export declare function startScreenAudioCapture(outputPath: string, deps?: ScreenAudioDeps): ScreenAudioCapture;
|
|
58
|
+
//# sourceMappingURL=screenAudio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenAudio.d.ts","sourceRoot":"","sources":["../../src/screenAudio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,eAAe,CAAA;AAElD,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AAEtD,eAAO,MAAM,qBAAqB,kDACe,CAAA;AAEjD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,GAAG,IAAI,CASf;AAWD,uEAAuE;AACvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAElE;AAED,gBAAgB;AAChB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,4DAA4D;IAC5D,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,MAAM,GAAE,MAAM,GAAG,IAA0B,GAC1C,iBAAiB,CAuBnB;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,IAAI,OAAO,CAAC,wBAAwB,CAAC,CAAA;CAC1C,CAAA;AAED,oCAAoC;AACpC,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,OAAO,SAAS,CAAA;IACvB,QAAQ,EAAE,OAAO,YAAY,CAAA;CAC9B,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,eAA8D,GACnE,kBAAkB,CA+EpB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'child_process';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { readFile as nodeReadFile } from 'fs/promises';
|
|
4
|
+
export const SCREEN_AUDIO_DOCS_URL = 'https://screenci.com/docs/guides/screen-audio';
|
|
5
|
+
/**
|
|
6
|
+
* Screen audio capture is supported on Linux only. macOS and Windows have no
|
|
7
|
+
* way to route just the recording browser into an isolated capture device
|
|
8
|
+
* without third-party tooling, so capturing there would either pick up every
|
|
9
|
+
* app's sound or require muting the whole machine. On those platforms screenci
|
|
10
|
+
* skips capture and warns instead of writing a misleading track.
|
|
11
|
+
*/
|
|
12
|
+
export function isScreenAudioSupported(platform = process.platform) {
|
|
13
|
+
return platform === 'linux';
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Warning shown (at run start and end) when audio capture is requested on a
|
|
17
|
+
* platform where it is not supported. Returns `null` on supported platforms.
|
|
18
|
+
*/
|
|
19
|
+
export function screenAudioUnsupportedMessage(platform = process.platform) {
|
|
20
|
+
if (isScreenAudioSupported(platform)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return (`[screenci] captureAudio is only supported on Linux. ` +
|
|
24
|
+
`This run on "${platform}" will record no audio (the video will be silent ` +
|
|
25
|
+
`where screen audio was expected). See ${SCREEN_AUDIO_DOCS_URL}`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The capture device for the current worker. Set by the recording browser
|
|
29
|
+
* fixture once it provisions this worker's dedicated null sink, so capture taps
|
|
30
|
+
* that sink's monitor; left `null` (capturing the default monitor) only as a
|
|
31
|
+
* fallback when a sink could not be created. Module-scoped, so it is private to
|
|
32
|
+
* one worker process.
|
|
33
|
+
*/
|
|
34
|
+
let activeCaptureDevice = null;
|
|
35
|
+
/** Sets (or clears with `null`) the capture device for this worker. */
|
|
36
|
+
export function setActiveCaptureDevice(device) {
|
|
37
|
+
activeCaptureDevice = device;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolves the ffmpeg audio capture arguments for the current (or given)
|
|
41
|
+
* platform. Throws when the platform is not supported.
|
|
42
|
+
*
|
|
43
|
+
* When a capture device has been set for this worker (its dedicated null sink's
|
|
44
|
+
* monitor) it replaces the platform default device while keeping the platform's
|
|
45
|
+
* input format args.
|
|
46
|
+
*
|
|
47
|
+
* Exposed for testing; callers should use {@link startScreenAudioCapture}.
|
|
48
|
+
*/
|
|
49
|
+
export function resolvePlatformAudioArgs(platform = process.platform, device = activeCaptureDevice) {
|
|
50
|
+
const withDevice = (args) => device ? { ...args, device } : args;
|
|
51
|
+
switch (platform) {
|
|
52
|
+
case 'linux':
|
|
53
|
+
return withDevice({
|
|
54
|
+
inputArgs: ['-f', 'pulse'],
|
|
55
|
+
device: 'default.monitor',
|
|
56
|
+
});
|
|
57
|
+
case 'darwin':
|
|
58
|
+
return withDevice({ inputArgs: ['-f', 'avfoundation'], device: ':0' });
|
|
59
|
+
case 'win32':
|
|
60
|
+
return withDevice({
|
|
61
|
+
inputArgs: ['-f', 'wasapi', '-loopback', '1'],
|
|
62
|
+
device: '',
|
|
63
|
+
});
|
|
64
|
+
default:
|
|
65
|
+
throw new Error(`[screenci] captureAudio is not supported on platform "${platform}". ` +
|
|
66
|
+
`See ${SCREEN_AUDIO_DOCS_URL}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Starts a background ffmpeg process that captures audio from the system's
|
|
71
|
+
* default input and writes it to `outputPath` as PCM WAV.
|
|
72
|
+
*
|
|
73
|
+
* Call the returned `stop()` to send a graceful quit signal and await the
|
|
74
|
+
* captured file. If ffmpeg fails to start or the output file is missing, the
|
|
75
|
+
* promise rejects with a message that links to the setup docs.
|
|
76
|
+
*/
|
|
77
|
+
export function startScreenAudioCapture(outputPath, deps = { spawn: nodeSpawn, readFile: nodeReadFile }) {
|
|
78
|
+
const { inputArgs, device } = resolvePlatformAudioArgs();
|
|
79
|
+
const args = [
|
|
80
|
+
'-loglevel',
|
|
81
|
+
'quiet',
|
|
82
|
+
...inputArgs,
|
|
83
|
+
'-i',
|
|
84
|
+
device,
|
|
85
|
+
'-c:a',
|
|
86
|
+
'pcm_s16le',
|
|
87
|
+
'-y',
|
|
88
|
+
outputPath,
|
|
89
|
+
];
|
|
90
|
+
// Use piped stdin so we can send 'q' for a clean shutdown on all platforms.
|
|
91
|
+
const proc = deps.spawn('ffmpeg', args, {
|
|
92
|
+
stdio: ['pipe', 'ignore', 'ignore'],
|
|
93
|
+
});
|
|
94
|
+
let spawnError = null;
|
|
95
|
+
let exited = false;
|
|
96
|
+
const exitSettlers = [];
|
|
97
|
+
proc.once('error', (err) => {
|
|
98
|
+
spawnError = new Error(`[screenci] captureAudio: could not start ffmpeg. ` +
|
|
99
|
+
`See ${SCREEN_AUDIO_DOCS_URL} for setup instructions. ` +
|
|
100
|
+
`Original error: ${err.message}`);
|
|
101
|
+
});
|
|
102
|
+
proc.once('exit', () => {
|
|
103
|
+
exited = true;
|
|
104
|
+
for (const settle of exitSettlers)
|
|
105
|
+
settle(spawnError);
|
|
106
|
+
exitSettlers.length = 0;
|
|
107
|
+
});
|
|
108
|
+
function waitForExit() {
|
|
109
|
+
if (exited)
|
|
110
|
+
return Promise.resolve();
|
|
111
|
+
return new Promise((resolve) => {
|
|
112
|
+
exitSettlers.push(() => resolve());
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
async stop() {
|
|
117
|
+
if (spawnError !== null)
|
|
118
|
+
throw spawnError;
|
|
119
|
+
// Send 'q' to stdin for a graceful shutdown. ffmpeg responds to this
|
|
120
|
+
// on all platforms and finalizes the output file cleanly before exiting.
|
|
121
|
+
try {
|
|
122
|
+
proc.stdin?.write('q');
|
|
123
|
+
proc.stdin?.end();
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// stdin may already be closed if the process exited early
|
|
127
|
+
}
|
|
128
|
+
await waitForExit();
|
|
129
|
+
if (spawnError !== null)
|
|
130
|
+
throw spawnError;
|
|
131
|
+
try {
|
|
132
|
+
const buffer = await deps.readFile(outputPath);
|
|
133
|
+
const fileHash = createHash('sha256').update(buffer).digest('hex');
|
|
134
|
+
return { path: outputPath, fileHash };
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
throw new Error(`[screenci] captureAudio: audio file was not written after recording. ` +
|
|
138
|
+
`Check that the audio device is available. ` +
|
|
139
|
+
`See ${SCREEN_AUDIO_DOCS_URL} for per-OS setup instructions. ` +
|
|
140
|
+
`Original error: ${err instanceof Error ? err.message : String(err)}`);
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=screenAudio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenAudio.js","sourceRoot":"","sources":["../../src/screenAudio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A dedicated PulseAudio/PipeWire null sink created for one recording worker.
|
|
3
|
+
* The worker's browser is routed into `sinkName` (so its audio is silent on the
|
|
4
|
+
* host and isolated from other apps), and the recorder captures `monitorSource`.
|
|
5
|
+
*/
|
|
6
|
+
export type NullSink = {
|
|
7
|
+
/** `pactl` module id, used to unload the sink on teardown. */
|
|
8
|
+
moduleId: string;
|
|
9
|
+
/** Sink name the browser plays into (via `PULSE_SINK`). */
|
|
10
|
+
sinkName: string;
|
|
11
|
+
/** Monitor source the recorder captures (`<sinkName>.monitor`). */
|
|
12
|
+
monitorSource: string;
|
|
13
|
+
};
|
|
14
|
+
/** @internal - injected in tests */
|
|
15
|
+
export type SinkDeps = {
|
|
16
|
+
run: (cmd: string, args: string[]) => Promise<{
|
|
17
|
+
stdout: string;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Deterministic, per-process sink name. Each Playwright worker is its own
|
|
22
|
+
* process with a unique pid, so this gives one sink per worker that is trivial
|
|
23
|
+
* to clean up and cannot collide with a concurrent worker.
|
|
24
|
+
*/
|
|
25
|
+
export declare function workerSinkName(pid?: number): string;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a null sink via `pactl load-module module-null-sink`. Returns the
|
|
28
|
+
* parsed module id and sink/monitor names, or `null` when `pactl` is missing or
|
|
29
|
+
* the command fails (callers fall back to the default device and warn).
|
|
30
|
+
*/
|
|
31
|
+
export declare function createNullSink(name?: string, deps?: SinkDeps): Promise<NullSink | null>;
|
|
32
|
+
/** Unloads a previously created null sink. Best effort: never throws. */
|
|
33
|
+
export declare function unloadNullSink(sink: NullSink, deps?: SinkDeps): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=screenAudioSink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenAudioSink.d.ts","sourceRoot":"","sources":["../../src/screenAudioSink.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;IAChB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,oCAAoC;AACpC,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAClE,CAAA;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAoB,GAAG,MAAM,CAEhE;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,IAAI,GAAE,MAAyB,EAC/B,IAAI,GAAE,QAAsB,GAC3B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAgB1B;AAED,yEAAyE;AACzE,wBAAsB,cAAc,CAClC,IAAI,EAAE,QAAQ,EACd,IAAI,GAAE,QAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { execFile as nodeExecFile } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const execFileAsync = promisify(nodeExecFile);
|
|
4
|
+
const defaultDeps = {
|
|
5
|
+
run: (cmd, args) => execFileAsync(cmd, args),
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Deterministic, per-process sink name. Each Playwright worker is its own
|
|
9
|
+
* process with a unique pid, so this gives one sink per worker that is trivial
|
|
10
|
+
* to clean up and cannot collide with a concurrent worker.
|
|
11
|
+
*/
|
|
12
|
+
export function workerSinkName(pid = process.pid) {
|
|
13
|
+
return `screenci_${pid}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates a null sink via `pactl load-module module-null-sink`. Returns the
|
|
17
|
+
* parsed module id and sink/monitor names, or `null` when `pactl` is missing or
|
|
18
|
+
* the command fails (callers fall back to the default device and warn).
|
|
19
|
+
*/
|
|
20
|
+
export async function createNullSink(name = workerSinkName(), deps = defaultDeps) {
|
|
21
|
+
try {
|
|
22
|
+
const { stdout } = await deps.run('pactl', [
|
|
23
|
+
'load-module',
|
|
24
|
+
'module-null-sink',
|
|
25
|
+
`sink_name=${name}`,
|
|
26
|
+
`sink_properties=device.description=${name}`,
|
|
27
|
+
]);
|
|
28
|
+
const moduleId = stdout.trim();
|
|
29
|
+
if (!/^\d+$/.test(moduleId)) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
return { moduleId, sinkName: name, monitorSource: `${name}.monitor` };
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/** Unloads a previously created null sink. Best effort: never throws. */
|
|
39
|
+
export async function unloadNullSink(sink, deps = defaultDeps) {
|
|
40
|
+
try {
|
|
41
|
+
await deps.run('pactl', ['unload-module', sink.moduleId]);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Best effort: the server may already be gone (e.g. on shutdown).
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=screenAudioSink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenAudioSink.js","sourceRoot":"","sources":["../../src/screenAudioSink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC,MAAM,aAAa,GAAG,SAAS,CAAC,YAAY,CAAC,CAAA;AAqB7C,MAAM,WAAW,GAAa;IAC5B,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC;CAC7C,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG;IACtD,OAAO,YAAY,GAAG,EAAE,CAAA;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,cAAc,EAAE,EAC/B,OAAiB,WAAW;IAE5B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE;YACzC,aAAa;YACb,kBAAkB;YAClB,aAAa,IAAI,EAAE;YACnB,sCAAsC,IAAI,EAAE;SAC7C,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,UAAU,EAAE,CAAA;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAc,EACd,OAAiB,WAAW;IAE5B,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,kEAAkE;IACpE,CAAC;AACH,CAAC"}
|