screenci 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +44 -58
  2. package/dist/Dockerfile +16 -2
  3. package/dist/cli.d.ts +21 -1
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +1199 -420
  6. package/dist/cli.js.map +1 -1
  7. package/dist/e2e/instrument.e2e.js +12 -0
  8. package/dist/e2e/instrument.e2e.js.map +1 -1
  9. package/dist/index.d.ts +7 -7
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -2
  12. package/dist/index.js.map +1 -1
  13. package/dist/playwright.config.d.ts +1 -1
  14. package/dist/src/asset.d.ts +27 -67
  15. package/dist/src/asset.d.ts.map +1 -1
  16. package/dist/src/asset.js +44 -45
  17. package/dist/src/asset.js.map +1 -1
  18. package/dist/src/caption.d.ts +164 -54
  19. package/dist/src/caption.d.ts.map +1 -1
  20. package/dist/src/caption.js +304 -131
  21. package/dist/src/caption.js.map +1 -1
  22. package/dist/src/events.d.ts +67 -25
  23. package/dist/src/events.d.ts.map +1 -1
  24. package/dist/src/events.js +34 -18
  25. package/dist/src/events.js.map +1 -1
  26. package/dist/src/instrument.d.ts.map +1 -1
  27. package/dist/src/instrument.js +142 -35
  28. package/dist/src/instrument.js.map +1 -1
  29. package/dist/src/logger.d.ts.map +1 -1
  30. package/dist/src/logger.js +2 -1
  31. package/dist/src/logger.js.map +1 -1
  32. package/dist/src/recording.d.ts +1 -1
  33. package/dist/src/recording.d.ts.map +1 -1
  34. package/dist/src/recordingData.d.ts +145 -0
  35. package/dist/src/recordingData.d.ts.map +1 -0
  36. package/dist/src/recordingData.js +2 -0
  37. package/dist/src/recordingData.js.map +1 -0
  38. package/dist/src/types.d.ts +133 -66
  39. package/dist/src/types.d.ts.map +1 -1
  40. package/dist/src/video.d.ts.map +1 -1
  41. package/dist/src/video.js +28 -20
  42. package/dist/src/video.js.map +1 -1
  43. package/dist/src/voices.d.ts +344 -41
  44. package/dist/src/voices.d.ts.map +1 -1
  45. package/dist/src/voices.js +261 -30
  46. package/dist/src/voices.js.map +1 -1
  47. package/dist/test-fixtures/screenci.config.d.ts +5 -0
  48. package/dist/test-fixtures/screenci.config.d.ts.map +1 -0
  49. package/dist/test-fixtures/screenci.config.js +4 -0
  50. package/dist/test-fixtures/screenci.config.js.map +1 -0
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +34 -4
  53. package/skills/playwright-cli/SKILL.md +348 -0
  54. package/skills/screenci/SKILL.md +55 -0
  55. package/skills/screenci/references/init.md +47 -0
  56. package/skills/screenci/references/record.md +41 -0
  57. package/dist/reporter.d.ts +0 -9
  58. package/dist/reporter.d.ts.map +0 -1
  59. package/dist/reporter.js +0 -49
  60. package/dist/reporter.js.map +0 -1
  61. package/dist/src/caption.test-d.d.ts +0 -2
  62. package/dist/src/caption.test-d.d.ts.map +0 -1
  63. package/dist/src/caption.test-d.js +0 -50
  64. package/dist/src/caption.test-d.js.map +0 -1
  65. package/dist/src/captionHash.d.ts +0 -12
  66. package/dist/src/captionHash.d.ts.map +0 -1
  67. package/dist/src/captionHash.js +0 -17
  68. package/dist/src/captionHash.js.map +0 -1
@@ -1,13 +1,10 @@
1
+ import { isCustomVoiceRef } from './voices.js';
1
2
  import { isInsideHide } from './hide.js';
3
+ import { access, readFile } from 'fs/promises';
4
+ import { createHash } from 'crypto';
5
+ import { dirname, resolve } from 'path';
2
6
  // One frame at 24fps — ensures at least one rendered frame captures each caption state.
3
7
  export const ONE_FRAME_MS = 1000 / 24;
4
- function parsePercentage(percent) {
5
- const value = parseFloat(percent);
6
- if (!isFinite(value) || value < 0 || value > 100) {
7
- throw new Error(`Invalid percentage: "${percent}". Must be a finite number between 0 and 100 followed by %.`);
8
- }
9
- return value;
10
- }
11
8
  // Blocking sleep — spin until the elapsed time has passed
12
9
  let sleepFn = (ms) => {
13
10
  const end = performance.now() + ms;
@@ -20,146 +17,313 @@ export function setSleepFn(fn) {
20
17
  }
21
18
  let activeRecorder = null;
22
19
  let captionStarted = false;
20
+ const registeredCustomVoiceRefs = new Set();
21
+ /** Maps local asset path → SHA-256 hash, populated during validateCustomVoiceRefs. */
22
+ const videoCaptionFileHashes = new Map();
23
23
  export function setActiveCaptionRecorder(recorder) {
24
24
  activeRecorder = recorder;
25
25
  }
26
26
  export function resetCaptionChain() {
27
27
  captionStarted = false;
28
28
  }
29
- function captionWaitEnd() {
30
- if (activeRecorder === null)
29
+ export function resetRegisteredCustomVoiceRefs() {
30
+ registeredCustomVoiceRefs.clear();
31
+ videoCaptionFileHashes.clear();
32
+ }
33
+ export async function validateCustomVoiceRefs(testFilePath) {
34
+ const testDir = dirname(testFilePath);
35
+ for (const ref of registeredCustomVoiceRefs) {
36
+ const candidates = [ref.path, resolve(testDir, ref.path)];
37
+ let fileBuffer = null;
38
+ for (const candidate of candidates) {
39
+ try {
40
+ await access(candidate);
41
+ fileBuffer = await readFile(candidate);
42
+ break;
43
+ }
44
+ catch {
45
+ // try next candidate
46
+ }
47
+ }
48
+ if (fileBuffer === null) {
49
+ throw new Error(`Custom voice file not found: ${ref.path}`);
50
+ }
51
+ ;
52
+ ref.assetHash = createHash('sha256')
53
+ .update(fileBuffer)
54
+ .digest('hex');
55
+ }
56
+ for (const assetPath of videoCaptionFileHashes.keys()) {
57
+ const candidates = [assetPath, resolve(testDir, assetPath)];
58
+ let fileBuffer = null;
59
+ for (const candidate of candidates) {
60
+ try {
61
+ fileBuffer = await readFile(candidate);
62
+ break;
63
+ }
64
+ catch {
65
+ // try next candidate
66
+ }
67
+ }
68
+ if (fileBuffer === null) {
69
+ throw new Error(`Video caption asset file not found: ${assetPath}`);
70
+ }
71
+ videoCaptionFileHashes.set(assetPath, createHash('sha256').update(fileBuffer).digest('hex'));
72
+ }
73
+ }
74
+ function toRecordedVoice(voice) {
75
+ if (!isCustomVoiceRef(voice))
76
+ return voice;
77
+ if (!('assetHash' in voice) ||
78
+ typeof voice.assetHash !==
79
+ 'string') {
80
+ throw new Error(`Custom voice assetHash missing for path: ${voice.path}`);
81
+ }
82
+ return {
83
+ assetHash: voice.assetHash,
84
+ assetPath: voice.path,
85
+ };
86
+ }
87
+ /**
88
+ * Auto-ends any currently active caption before starting a new one.
89
+ * Called internally at the start of every voiceOver controller.
90
+ */
91
+ function captionAutoEnd() {
92
+ if (!captionStarted || activeRecorder === null)
31
93
  return;
32
- if (isInsideHide())
33
- throw new Error('Cannot call caption.waitEnd inside hide()');
34
- if (!captionStarted)
35
- throw new Error('No caption has been started');
36
- activeRecorder.addCaptionEnd();
94
+ activeRecorder.addCaptionEnd('auto');
37
95
  sleepFn(2 * ONE_FRAME_MS);
96
+ captionStarted = false;
38
97
  }
39
- function captionWaitUntil(percent) {
40
- if (activeRecorder === null)
98
+ async function doWaitEnd() {
99
+ if (activeRecorder === null || !captionStarted)
41
100
  return;
42
101
  if (isInsideHide())
43
- throw new Error('Cannot call caption.waitUntil inside hide()');
44
- if (!captionStarted)
45
- throw new Error('No caption has been started');
46
- const percentage = parsePercentage(percent);
47
- activeRecorder.addCaptionUntil(percentage);
102
+ throw new Error('Cannot call waitEnd inside hide()');
103
+ activeRecorder.addCaptionEnd('waitEnd');
48
104
  sleepFn(2 * ONE_FRAME_MS);
105
+ captionStarted = false;
49
106
  }
50
107
  /**
51
- * Creates a set of typed caption controllers, one per key in the map.
108
+ * Creates a set of typed voiceover controllers, one per key in the map.
109
+ *
110
+ * Each controller has `start()` and `end()`.
111
+ * At render time screenci generates a voiceover, and syncs the audio to the
112
+ * recording. You write text; the voice is handled for you.
52
113
  *
53
- * Each controller has `start()`, `waitUntil(percent)`, and `end()`.
54
- * At render time screenci sends the caption text to ElevenLabs, generates
55
- * a voiceover, and syncs the audio to the recording. You write text; the
56
- * voice is handled for you.
114
+ * The top-level `voice` applies to all languages. Override it per-language via
115
+ * the `voice` field inside each language entry. Only language-level overrides
116
+ * may set `seed`.
57
117
  *
58
118
  * TypeScript enforces that every language has the same caption keys.
59
119
  * Forget a translation key → compile error.
60
120
  *
61
121
  * @example
62
122
  * ```ts
63
- * const captions = createCaptions({
64
- * en: { voice: voices.en.Jude, captions: { intro: 'Welcome.' } },
65
- * fi: { voice: voices.fi.Martti, captions: { intro: 'Tervetuloa.' } },
123
+ * const voiceOvers = createVoiceOvers({
124
+ * voice: { name: voices.Ava, style: 'Clear and friendly' },
125
+ * languages: {
126
+ * en: { captions: { intro: 'Welcome.', next: 'Click here.' } },
127
+ * fi: {
128
+ * voice: { name: voices.Nora, style: 'Selkeä opastus', seed: 42 },
129
+ * captions: { intro: 'Tervetuloa.', next: 'Napsauta tästä.' },
130
+ * },
131
+ * },
66
132
  * })
133
+ *
134
+ * // Await a voiceOver directly to start it:
135
+ * await voiceOvers.intro
136
+ * await page.goto('/dashboard')
137
+ *
138
+ * // Consecutive voiceOvers sequence automatically:
139
+ * await voiceOvers.intro
140
+ * await voiceOvers.next // ends intro, then starts next
141
+ *
142
+ * // Wait for audio to finish before an action:
143
+ * await voiceOvers.intro
144
+ * await voiceOvers.waitEnd()
145
+ * await page.click('#start')
67
146
  * ```
68
147
  */
69
- export function createCaptions(languagesMap) {
70
- return buildMultiLangCaptions(languagesMap);
148
+ export function createVoiceOvers(input) {
149
+ return buildCaptionsFromInput(input.voice, input.languages);
71
150
  }
72
- function buildMultiLangCaptions(languagesMap) {
73
- const langs = Object.keys(languagesMap);
151
+ function voiceToKeyString(voice) {
152
+ if (isCustomVoiceRef(voice))
153
+ return `custom:${voice.path}`;
154
+ return voice;
155
+ }
156
+ function buildCaptionsFromInput(topVoice, languages) {
157
+ const langs = Object.keys(languages);
74
158
  const firstLang = langs[0];
75
- if (firstLang === undefined)
159
+ if (firstLang === undefined) {
160
+ throw new Error('createVoiceOvers requires at least one language in "languages"');
161
+ }
162
+ // Resolve effective voice and metadata per language
163
+ const resolvedVoices = new Map();
164
+ const resolvedVoiceMeta = new Map();
165
+ for (const lang of langs) {
166
+ const entry = languages[lang];
167
+ const langOverride = entry?.voice;
168
+ const effectiveVoiceName = langOverride?.name ?? topVoice.name;
169
+ const effectiveSeed = langOverride?.seed;
170
+ const effectiveRegion = entry?.region;
171
+ // If a lang override exists it owns style/accent/pacing entirely — no inheritance from the
172
+ // top-level voice. This prevents a top-level `style` from forcing `expressive` on a lang
173
+ // that explicitly sets `modelType: 'consistent'`.
174
+ const effectiveStyle = langOverride !== undefined
175
+ ? langOverride?.style
176
+ : 'style' in topVoice
177
+ ? topVoice.style
178
+ : undefined;
179
+ const effectiveAccent = langOverride !== undefined
180
+ ? langOverride?.accent
181
+ : 'accent' in topVoice
182
+ ? topVoice.accent
183
+ : undefined;
184
+ const effectivePacing = langOverride !== undefined
185
+ ? langOverride?.pacing
186
+ : 'pacing' in topVoice
187
+ ? topVoice.pacing
188
+ : undefined;
189
+ const effectiveModelType = effectiveStyle
190
+ ? 'expressive'
191
+ : (langOverride?.modelType ?? topVoice.modelType);
192
+ if (isCustomVoiceRef(effectiveVoiceName)) {
193
+ registeredCustomVoiceRefs.add(effectiveVoiceName);
194
+ }
195
+ resolvedVoices.set(lang, effectiveVoiceName);
196
+ resolvedVoiceMeta.set(lang, {
197
+ name: voiceToKeyString(effectiveVoiceName),
198
+ ...(effectiveSeed !== undefined && { seed: effectiveSeed }),
199
+ ...(effectiveRegion !== undefined && { region: effectiveRegion }),
200
+ ...(effectiveModelType !== undefined && {
201
+ modelType: effectiveModelType,
202
+ }),
203
+ ...(effectiveStyle !== undefined && { style: effectiveStyle }),
204
+ ...(effectiveAccent !== undefined && { accent: effectiveAccent }),
205
+ ...(effectivePacing !== undefined && { pacing: effectivePacing }),
206
+ });
207
+ }
208
+ const firstEntry = languages[firstLang];
209
+ if (!firstEntry)
76
210
  return {};
77
211
  const result = {};
78
- for (const key in languagesMap[firstLang].captions) {
212
+ for (const key in firstEntry.captions) {
79
213
  const keyStr = key;
80
214
  // Determine if any language uses a file-based value for this key.
81
- // If so, use videoCaptionStart with mixed translations (file or TTS per lang).
82
- // Otherwise use captionStart with text translations (existing behaviour).
83
- const hasFileEntry = langs.some((lang) => {
84
- const val = languagesMap[lang].captions[keyStr];
85
- return val !== undefined && typeof val !== 'string';
86
- });
215
+ let hasFileEntry = false;
216
+ for (const lang of langs) {
217
+ const val = languages[lang]?.captions[keyStr];
218
+ if (val !== undefined && typeof val !== 'string') {
219
+ hasFileEntry = true;
220
+ videoCaptionFileHashes.set(val.path, '');
221
+ }
222
+ }
87
223
  if (hasFileEntry) {
88
- const videoTranslations = {};
89
- for (const lang of langs) {
90
- const val = languagesMap[lang].captions[keyStr];
91
- if (val === undefined)
92
- continue;
93
- if (typeof val === 'string') {
94
- videoTranslations[lang] = {
95
- text: val,
96
- voice: languagesMap[lang].voice,
97
- };
224
+ const fileStartFn = async () => {
225
+ if (isInsideHide())
226
+ throw new Error('Cannot start a voiceOver inside hide()');
227
+ if (activeRecorder === null)
228
+ return;
229
+ captionAutoEnd();
230
+ for (const lang of langs) {
231
+ activeRecorder.registerVoiceForLang(lang, resolvedVoiceMeta.get(lang));
98
232
  }
99
- else {
100
- const fileTrans = {
101
- assetPath: val.path,
102
- ...(val.subtitle !== undefined && { subtitle: val.subtitle }),
103
- };
104
- videoTranslations[lang] = fileTrans;
233
+ const videoTranslations = {};
234
+ for (const lang of langs) {
235
+ const val = languages[lang]?.captions[keyStr];
236
+ if (val === undefined)
237
+ continue;
238
+ const voice = resolvedVoices.get(lang);
239
+ const region = languages[lang]?.region;
240
+ const meta = resolvedVoiceMeta.get(lang);
241
+ const modelType = meta?.modelType;
242
+ const style = meta?.style;
243
+ const accent = meta?.accent;
244
+ const pacing = meta?.pacing;
245
+ if (typeof val === 'string') {
246
+ videoTranslations[lang] = {
247
+ text: val,
248
+ voice: toRecordedVoice(voice),
249
+ ...(region !== undefined && { region }),
250
+ ...(modelType !== undefined && { modelType }),
251
+ ...(style !== undefined && { style }),
252
+ ...(accent !== undefined && { accent }),
253
+ ...(pacing !== undefined && { pacing }),
254
+ };
255
+ }
256
+ else {
257
+ videoTranslations[lang] = entryToVideoTranslation(val);
258
+ }
105
259
  }
106
- }
107
- result[key] = {
108
- async start() {
109
- if (activeRecorder === null)
110
- return;
111
- if (isInsideHide())
112
- throw new Error('Cannot call caption.start inside hide()');
113
- captionStarted = true;
114
- sleepFn(2 * ONE_FRAME_MS);
115
- activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, videoTranslations);
116
- },
117
- async waitUntil(progress) {
118
- captionWaitUntil(progress);
119
- },
120
- async end() {
121
- captionWaitEnd();
260
+ captionStarted = true;
261
+ sleepFn(2 * ONE_FRAME_MS);
262
+ activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, undefined, videoTranslations);
263
+ };
264
+ result[keyStr] = {
265
+ then(resolve, reject) {
266
+ return fileStartFn().then(resolve, reject);
122
267
  },
123
268
  };
124
269
  }
125
270
  else {
126
- const textTranslations = {};
127
- for (const lang of langs) {
128
- const val = languagesMap[lang].captions[keyStr];
129
- if (val !== undefined && typeof val === 'string') {
130
- textTranslations[lang] = {
131
- text: val,
132
- voice: languagesMap[lang].voice,
133
- };
271
+ const textStartFn = async () => {
272
+ if (isInsideHide())
273
+ throw new Error('Cannot start a voiceOver inside hide()');
274
+ if (activeRecorder === null)
275
+ return;
276
+ captionAutoEnd();
277
+ for (const lang of langs) {
278
+ activeRecorder.registerVoiceForLang(lang, resolvedVoiceMeta.get(lang));
134
279
  }
135
- }
136
- result[key] = {
137
- async start() {
138
- if (activeRecorder === null)
139
- return;
140
- if (isInsideHide())
141
- throw new Error('Cannot call caption.start inside hide()');
142
- captionStarted = true;
143
- sleepFn(2 * ONE_FRAME_MS);
144
- activeRecorder.addCaptionStart('', keyStr, undefined, textTranslations);
145
- },
146
- async waitUntil(progress) {
147
- captionWaitUntil(progress);
148
- },
149
- async end() {
150
- captionWaitEnd();
280
+ const textTranslations = {};
281
+ for (const lang of langs) {
282
+ const val = languages[lang]?.captions[keyStr];
283
+ if (val !== undefined && typeof val === 'string') {
284
+ const voice = resolvedVoices.get(lang);
285
+ const region = languages[lang]?.region;
286
+ const meta = resolvedVoiceMeta.get(lang);
287
+ const modelType = meta?.modelType;
288
+ const style = meta?.style;
289
+ const accent = meta?.accent;
290
+ const pacing = meta?.pacing;
291
+ textTranslations[lang] = {
292
+ text: val,
293
+ voice: toRecordedVoice(voice),
294
+ ...(region !== undefined && { region }),
295
+ ...(modelType !== undefined && { modelType }),
296
+ ...(style !== undefined && { style }),
297
+ ...(accent !== undefined && { accent }),
298
+ ...(pacing !== undefined && { pacing }),
299
+ };
300
+ }
301
+ }
302
+ captionStarted = true;
303
+ sleepFn(2 * ONE_FRAME_MS);
304
+ activeRecorder.addCaptionStart('', keyStr, undefined, textTranslations);
305
+ };
306
+ result[keyStr] = {
307
+ then(resolve, reject) {
308
+ return textStartFn().then(resolve, reject);
151
309
  },
152
310
  };
153
311
  }
154
312
  }
313
+ ;
314
+ result.waitEnd = doWaitEnd;
155
315
  return result;
156
316
  }
157
317
  function entryToVideoTranslation(entry) {
158
- if (typeof entry === 'string')
159
- return { assetPath: entry };
318
+ const path = typeof entry === 'string' ? entry : entry.path;
319
+ const subtitle = typeof entry === 'string' ? undefined : entry.subtitle;
320
+ const assetHash = videoCaptionFileHashes.get(path);
321
+ if (!assetHash)
322
+ throw new Error(`Video caption asset hash missing for path: ${path}`);
160
323
  return {
161
- assetPath: entry.path,
162
- ...(entry.subtitle !== undefined && { subtitle: entry.subtitle }),
324
+ assetHash,
325
+ assetPath: path,
326
+ ...(subtitle !== undefined && { subtitle }),
163
327
  };
164
328
  }
165
329
  export function createVideoCaptions(firstArg) {
@@ -182,31 +346,38 @@ function buildSingleLangVideoCaptions(captionsMap) {
182
346
  continue;
183
347
  const assetPath = typeof entry === 'string' ? entry : entry.path;
184
348
  const subtitle = typeof entry === 'string' ? undefined : entry.subtitle;
349
+ videoCaptionFileHashes.set(assetPath, '');
350
+ const startFn = async () => {
351
+ if (isInsideHide())
352
+ throw new Error('Cannot start a voiceOver inside hide()');
353
+ if (activeRecorder === null)
354
+ return;
355
+ captionAutoEnd();
356
+ const assetHash = videoCaptionFileHashes.get(assetPath);
357
+ if (!assetHash)
358
+ throw new Error(`Video caption asset hash missing for path: ${assetPath}`);
359
+ captionStarted = true;
360
+ sleepFn(2 * ONE_FRAME_MS);
361
+ activeRecorder.addVideoCaptionStart(key, assetPath, assetHash, subtitle);
362
+ };
185
363
  result[key] = {
186
- async start() {
187
- if (activeRecorder === null)
188
- return;
189
- if (isInsideHide())
190
- throw new Error('Cannot call videoCaption.start inside hide()');
191
- captionStarted = true;
192
- sleepFn(2 * ONE_FRAME_MS);
193
- activeRecorder.addVideoCaptionStart(key, assetPath, subtitle);
194
- },
195
- async waitUntil(progress) {
196
- captionWaitUntil(progress);
197
- },
198
- async end() {
199
- captionWaitEnd();
364
+ then(resolve, reject) {
365
+ return startFn().then(resolve, reject);
200
366
  },
201
367
  };
202
368
  }
369
+ ;
370
+ result.waitEnd = doWaitEnd;
203
371
  return result;
204
372
  }
205
373
  function buildMultiLangVideoCaptions(languagesMap) {
206
374
  const langs = Object.keys(languagesMap);
207
375
  const firstLang = langs[0];
208
- if (firstLang === undefined)
209
- return {};
376
+ if (firstLang === undefined) {
377
+ const empty = {};
378
+ empty.waitEnd = doWaitEnd;
379
+ return empty;
380
+ }
210
381
  const result = {};
211
382
  for (const key in languagesMap[firstLang].captions) {
212
383
  const keyStr = key;
@@ -214,27 +385,29 @@ function buildMultiLangVideoCaptions(languagesMap) {
214
385
  for (const lang of langs) {
215
386
  const entry = languagesMap[lang].captions[keyStr];
216
387
  if (entry !== undefined) {
388
+ const assetPath = typeof entry === 'string' ? entry : entry.path;
389
+ videoCaptionFileHashes.set(assetPath, '');
217
390
  translations[lang] = entryToVideoTranslation(entry);
218
391
  }
219
392
  }
393
+ const startFn = async () => {
394
+ if (isInsideHide())
395
+ throw new Error('Cannot start a voiceOver inside hide()');
396
+ if (activeRecorder === null)
397
+ return;
398
+ captionAutoEnd();
399
+ captionStarted = true;
400
+ sleepFn(2 * ONE_FRAME_MS);
401
+ activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, undefined, translations);
402
+ };
220
403
  result[key] = {
221
- async start() {
222
- if (activeRecorder === null)
223
- return;
224
- if (isInsideHide())
225
- throw new Error('Cannot call videoCaption.start inside hide()');
226
- captionStarted = true;
227
- sleepFn(2 * ONE_FRAME_MS);
228
- activeRecorder.addVideoCaptionStart(keyStr, undefined, undefined, translations);
229
- },
230
- async waitUntil(progress) {
231
- captionWaitUntil(progress);
232
- },
233
- async end() {
234
- captionWaitEnd();
404
+ then(resolve, reject) {
405
+ return startFn().then(resolve, reject);
235
406
  },
236
407
  };
237
408
  }
409
+ ;
410
+ result.waitEnd = doWaitEnd;
238
411
  return result;
239
412
  }
240
413
  //# sourceMappingURL=caption.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"caption.js","sourceRoot":"","sources":["../../src/caption.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"caption.js","sourceRoot":"","sources":["../../src/caption.ts"],"names":[],"mappings":"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"}