frameyard 0.2.0 → 0.3.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/GLOSSARY.md +16 -0
  3. package/README.md +41 -12
  4. package/dist/cli.js +12 -4
  5. package/dist/cli.js.map +1 -1
  6. package/dist/errors.d.ts +1 -1
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js.map +1 -1
  9. package/dist/preview/main.d.ts +2 -0
  10. package/dist/preview/main.d.ts.map +1 -1
  11. package/dist/preview/main.js +28 -3
  12. package/dist/preview/main.js.map +1 -1
  13. package/dist/renderer/audio.d.ts +5 -1
  14. package/dist/renderer/audio.d.ts.map +1 -1
  15. package/dist/renderer/audio.js +4 -0
  16. package/dist/renderer/audio.js.map +1 -1
  17. package/dist/renderer/browser.d.ts +1 -0
  18. package/dist/renderer/browser.d.ts.map +1 -1
  19. package/dist/renderer/browser.js +7 -1
  20. package/dist/renderer/browser.js.map +1 -1
  21. package/dist/renderer/index.d.ts +5 -0
  22. package/dist/renderer/index.d.ts.map +1 -1
  23. package/dist/renderer/index.js +141 -18
  24. package/dist/renderer/index.js.map +1 -1
  25. package/dist/runtime/index.d.ts +3 -0
  26. package/dist/runtime/index.d.ts.map +1 -1
  27. package/dist/runtime/index.js +82 -8
  28. package/dist/runtime/index.js.map +1 -1
  29. package/dist/runtime/media.d.ts +16 -0
  30. package/dist/runtime/media.d.ts.map +1 -0
  31. package/dist/runtime/media.js +307 -0
  32. package/dist/runtime/media.js.map +1 -0
  33. package/dist/scaffold.d.ts.map +1 -1
  34. package/dist/scaffold.js +6 -3
  35. package/dist/scaffold.js.map +1 -1
  36. package/dist/version.d.ts +1 -1
  37. package/dist/version.js +1 -1
  38. package/docs/adr/0003-render-browser-frames-offline.md +2 -0
  39. package/docs/adr/0005-keep-parallel-rendering-opt-in-and-frame-ordered.md +3 -0
  40. package/docs/adr/0006-seek-embedded-media-from-the-frame-clock.md +9 -0
  41. package/docs/v0.1-design.md +14 -10
  42. package/package.json +7 -3
  43. package/skills/frameyard/SKILL.md +6 -3
  44. package/skills/frameyard/references/deterministic-authoring.md +30 -2
  45. package/skills/frameyard/references/failure-recovery.md +3 -0
  46. package/skills/frameyard/references/json-results.md +2 -1
@@ -1,6 +1,7 @@
1
1
  import { normalizeComposition, resolveAudioClips, resolveProps, resolveTranscriptClips, } from "../contracts.js";
2
2
  import { FrameyardError, isFrameyardError } from "../errors.js";
3
3
  import { frameToMilliseconds } from "./clock.js";
4
+ import { describeMediaAudio, prepareMedia, releaseMedia, settleMedia } from "./media.js";
4
5
  export { frameToMilliseconds, frameToSeconds } from "./clock.js";
5
6
  export { random } from "./random.js";
6
7
  function isThenable(value) {
@@ -154,6 +155,14 @@ async function disposeAfterFailure(composition) {
154
155
  // Cleanup after a failed mount or first update must not mask the failure.
155
156
  }
156
157
  }
158
+ function clearContainer(container) {
159
+ releaseMedia(container);
160
+ container.replaceChildren();
161
+ }
162
+ async function discardRuntime(composition, container) {
163
+ await disposeAfterFailure(composition);
164
+ clearContainer(container);
165
+ }
157
166
  async function waitForMountedAssets(container) {
158
167
  await document.fonts.ready;
159
168
  const images = Array.from(container.querySelectorAll("img"));
@@ -198,6 +207,7 @@ export async function createCompositionRuntime(options) {
198
207
  const { container } = options;
199
208
  const diagnostics = options.diagnostics;
200
209
  let warnedTransition = false;
210
+ let embeddedAudioClips = Object.freeze([]);
201
211
  const warnTransition = () => {
202
212
  if (!diagnostics || warnedTransition) {
203
213
  return;
@@ -215,20 +225,23 @@ export async function createCompositionRuntime(options) {
215
225
  await withDiagnosticsAsync("Composition mount()", diagnostics, () => composition.mount({ container, props }));
216
226
  }
217
227
  catch (error) {
218
- await disposeAfterFailure(composition);
219
- container.replaceChildren();
228
+ await discardRuntime(composition, container);
220
229
  throw wrapCompositionError("mount", null, error);
221
230
  }
222
231
  try {
223
232
  await waitForMountedAssets(container);
233
+ await prepareMedia(container);
224
234
  }
225
235
  catch (error) {
226
- await disposeAfterFailure(composition);
227
- container.replaceChildren();
236
+ await discardRuntime(composition, container);
228
237
  throw error;
229
238
  }
239
+ embeddedAudioClips = describeMediaAudio(container);
230
240
  let frame = 0;
231
241
  let disposed = false;
242
+ let settleLoop = null;
243
+ let settleWaiters = [];
244
+ let settleFrame = null;
232
245
  function seek(targetFrame) {
233
246
  if (disposed) {
234
247
  throw new FrameyardError("COMPOSITION_ERROR", "Cannot seek a disposed composition runtime.");
@@ -248,28 +261,89 @@ export async function createCompositionRuntime(options) {
248
261
  }
249
262
  frame = targetFrame;
250
263
  }
264
+ function settle() {
265
+ if (disposed) {
266
+ return Promise.reject(new FrameyardError("COMPOSITION_ERROR", "Cannot settle a disposed composition runtime."));
267
+ }
268
+ const targetFrame = frame;
269
+ const promise = new Promise((resolve, reject) => {
270
+ settleWaiters.push({ resolve, reject });
271
+ });
272
+ settleFrame = targetFrame;
273
+ settleLoop ??= runSettleLoop();
274
+ return promise;
275
+ }
276
+ async function runSettleLoop() {
277
+ try {
278
+ while (settleWaiters.length > 0) {
279
+ const waiters = settleWaiters;
280
+ settleWaiters = [];
281
+ const targetFrame = settleFrame ?? frame;
282
+ settleFrame = null;
283
+ if (disposed) {
284
+ const error = new FrameyardError("COMPOSITION_ERROR", "Cannot settle a disposed composition runtime.");
285
+ for (const waiter of waiters) {
286
+ waiter.reject(error);
287
+ }
288
+ continue;
289
+ }
290
+ try {
291
+ await settleMedia(container, targetFrame, composition.fps);
292
+ if (disposed) {
293
+ const error = new FrameyardError("COMPOSITION_ERROR", "Cannot settle a disposed composition runtime.");
294
+ for (const waiter of waiters) {
295
+ waiter.reject(error);
296
+ }
297
+ }
298
+ else {
299
+ for (const waiter of waiters) {
300
+ waiter.resolve();
301
+ }
302
+ }
303
+ }
304
+ catch (error) {
305
+ for (const waiter of waiters) {
306
+ waiter.reject(error);
307
+ }
308
+ }
309
+ }
310
+ }
311
+ finally {
312
+ settleLoop = null;
313
+ if (settleWaiters.length > 0) {
314
+ settleLoop = runSettleLoop();
315
+ }
316
+ }
317
+ }
251
318
  try {
252
319
  seek(0);
320
+ await settleMedia(container, 0, composition.fps);
253
321
  }
254
322
  catch (error) {
255
- await disposeAfterFailure(composition);
256
- container.replaceChildren();
323
+ await discardRuntime(composition, container);
257
324
  throw error;
258
325
  }
259
326
  return Object.freeze({
260
327
  composition,
261
328
  props,
262
329
  audioClips,
330
+ embeddedAudioClips,
263
331
  transcriptClips,
264
332
  get frame() {
265
333
  return frame;
266
334
  },
267
335
  seek,
336
+ settle,
268
337
  async dispose() {
269
338
  if (disposed) {
270
339
  return;
271
340
  }
272
341
  disposed = true;
342
+ const stopped = new FrameyardError("COMPOSITION_ERROR", "Cannot settle a disposed composition runtime.");
343
+ for (const waiter of settleWaiters) {
344
+ waiter.reject(stopped);
345
+ }
346
+ settleWaiters = [];
273
347
  try {
274
348
  if (composition.dispose) {
275
349
  const result = composition.dispose();
@@ -279,10 +353,10 @@ export async function createCompositionRuntime(options) {
279
353
  }
280
354
  }
281
355
  catch (error) {
282
- container.replaceChildren();
356
+ clearContainer(container);
283
357
  throw wrapCompositionError("dispose", null, error);
284
358
  }
285
- container.replaceChildren();
359
+ clearContainer(container);
286
360
  },
287
361
  });
288
362
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,sBAAsB,GAKvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAwBrC,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;QAC1D,KAAK,KAAK,IAAI;QACd,OAAQ,KAA4B,CAAC,IAAI,KAAK,UAAU,CACzD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAoB,EAAE,KAAc;IAC/E,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC;IAC5D,OAAO,IAAI,cAAc,CACvB,mBAAmB,EACnB,eAAe,KAAK,YAAY,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrG,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,SAAsB,EACtB,KAAa,EACb,GAAW,EACX,YAAsC;IAEtC,IAAI,OAAO,SAAS,CAAC,aAAa,KAAK,UAAU,EAAE,CAAC;QAClD,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,SAAS,YAAY,aAAa,EAAE,CAAC;YAC/E,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,IAAI,CAAC;YACH,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,cAAc,CACtB,mBAAmB,EACnB,uDAAuD,KAAK,KAC1D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACvD,EAAE,EACF,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,YAAY,EAAE,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAOD,SAAS,uBAAuB;IAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC;IAC7C,MAAM,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,qBAAqB,CAAC;IACjD,MAAM,IAAI,GAAG,WAA+C,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC;IACjC,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE;QACjB,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9B,OAAO,cAAc,EAAE,CAAC;IAC1B,CAAC,CAAC;IACF,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE;QACd,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC,CAAC;IACF,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,OAAqB,EAAE,OAAgB,EAAE,GAAG,IAAe,EAAE,EAAE;QACnF,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC,CAA6B,CAAC;IAC/B,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,OAAqB,EAAE,OAAgB,EAAE,GAAG,IAAe,EAAE,EAAE;QACpF,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9B,OAAO,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC,CAA8B,CAAC;IAChC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAC,QAA8B,EAAE,EAAE;QACjE,QAAQ,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACxC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAwC,CAAC;IAC1C,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,GAAG,EAAE;YACd,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAClC,OAAO,eAAe,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,oEAAoE;IACtE,CAAC;IAED,OAAO;QACL,QAAQ;QACR,OAAO;YACL,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YAC3B,MAAM,CAAC,UAAU,GAAG,kBAAkB,CAAC;YACvC,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAC;YACzC,MAAM,CAAC,qBAAqB,GAAG,WAAW,CAAC;YAC3C,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YAC7B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,KAAoB,EAAE,OAAe;IAC9E,MAAM,QAAQ,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,EAAE,CAAC;IAC5D,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,eAAe;YAClB,OAAO,GAAG,KAAK,GAAG,QAAQ,yEAAyE,CAAC;QACtG,KAAK,YAAY,CAAC;QAClB,KAAK,mBAAmB;YACtB,OAAO,GAAG,KAAK,GAAG,QAAQ,SAAS,OAAO,8CAA8C,CAAC;QAC3F;YACE,OAAO,GAAG,KAAK,GAAG,QAAQ,SAAS,OAAO,2CAA2C,CAAC;IAC1F,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAAa,EACb,KAAoB,EACpB,WAAgD,EAChD,QAAiB;IAEjB,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IACD,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,WAAW,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,KAAa,EACb,WAAgD,EAChD,QAA8B;IAE9B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IACD,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,EAAE,CAAC;IAC1B,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,WAAW,CAAC,kBAAkB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,uDAAuD;YACzD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAkB,WAA2B;IAC7E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,CAAC;QACf,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,SAAsB;IAC5C,YAAY,CAAC,SAAS,CAAC,CAAC;IACxB,SAAS,CAAC,eAAe,EAAE,CAAC;AAC9B,CAAC;AAED,KAAK,UAAU,cAAc,CAAkB,WAA2B,EAAE,SAAsB;IAChG,MAAM,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACvC,cAAc,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,SAAsB;IACxD,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;IAE3B,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,cAAc,CAAC,iBAAiB,EAAE,+BAA+B,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE;gBAC5G,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,IAAI,MAA6B,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAA0B,CAAC;IAC3E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,cAAc,CACtB,qBAAqB,EACrB,qCAAqC,GAAG,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrG,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,cAAc,CAAC,qBAAqB,EAAE,sBAAsB,GAAG,yBAAyB,CAAC,CAAC;IACtG,CAAC;IAED,OAAO,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAgC;IAEhC,MAAM,WAAW,GAAG,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAmB,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACnE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,kBAAkB,GAAiC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEzE,MAAM,cAAc,GAAG,GAAS,EAAE;QAChC,IAAI,CAAC,WAAW,IAAI,gBAAgB,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,gBAAgB,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,CAAC,kGAAkG,CAAC,CAAC;QAClH,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,eAAe,EAAE,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,qBAAqB,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAChH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,oBAAoB,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC;IACd,CAAC;IAED,kBAAkB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,UAAU,GAAyB,IAAI,CAAC;IAC5C,IAAI,aAAa,GAAqE,EAAE,CAAC;IACzF,IAAI,WAAW,GAAkB,IAAI,CAAC;IAEtC,SAAS,IAAI,CAAC,WAAmB;QAC/B,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,cAAc,CAAC,mBAAmB,EAAE,6CAA6C,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACrG,MAAM,IAAI,cAAc,CACtB,oBAAoB,EACpB,SAAS,WAAW,kCAAkC,WAAW,CAAC,gBAAgB,GAAG,CAAC,GAAG,CAC1F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,sBAAsB,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,CACxF,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CACvC,CAAC;YACb,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,cAAc,CACtB,0BAA0B,EAC1B,gFAAgF,WAAW,GAAG,CAC/F,CAAC;YACJ,CAAC;YACD,cAAc,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;QAED,KAAK,GAAG,WAAW,CAAC;IACtB,CAAC;IAED,SAAS,MAAM;QACb,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,cAAc,CAAC,mBAAmB,EAAE,+CAA+C,CAAC,CAAC,CAAC;QAClH,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpD,aAAa,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,WAAW,GAAG,WAAW,CAAC;QAC1B,UAAU,KAAK,aAAa,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,UAAU,aAAa;QAC1B,IAAI,CAAC;YACH,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,aAAa,CAAC;gBAC9B,aAAa,GAAG,EAAE,CAAC;gBACnB,MAAM,WAAW,GAAG,WAAW,IAAI,KAAK,CAAC;gBACzC,WAAW,GAAG,IAAI,CAAC;gBAEnB,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,mBAAmB,EAAE,+CAA+C,CAAC,CAAC;oBACvG,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvB,CAAC;oBACD,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC3D,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,mBAAmB,EAAE,+CAA+C,CAAC,CAAC;wBACvG,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;4BAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;4BAC7B,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,UAAU,GAAG,IAAI,CAAC;YAClB,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,UAAU,GAAG,aAAa,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,CAAC;QACR,MAAM,WAAW,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW;QACX,KAAK;QACL,UAAU;QACV,kBAAkB;QAClB,eAAe;QACf,IAAI,KAAK;YACP,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI;QACJ,MAAM;QACN,KAAK,CAAC,OAAO;YACX,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,mBAAmB,EAAE,+CAA+C,CAAC,CAAC;YACzG,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;gBACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YACD,aAAa,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;oBACxB,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;oBACrC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;wBACvB,MAAM,MAAM,CAAC;oBACf,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC1B,MAAM,oBAAoB,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC;YACD,cAAc,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ResolvedAudioClip } from "../contracts.js";
2
+ /** Converts a composition-relative media reference to a normalized project path. */
3
+ export declare function normalizeMediaSource(raw: string): string;
4
+ /** Loads every embedded video into memory before frame production begins. */
5
+ export declare function prepareMedia(container: HTMLElement): Promise<void>;
6
+ /**
7
+ * Seeks every embedded video to the requested composition frame and waits for
8
+ * the browser to present the result. This is the asynchronous half of a seek;
9
+ * composition update() stays synchronous.
10
+ */
11
+ export declare function settleMedia(container: HTMLElement, frame: number, fps: number): Promise<void>;
12
+ /** Describes the audio contributed by unmuted embedded videos for preview and FFmpeg. */
13
+ export declare function describeMediaAudio(container: HTMLElement): readonly ResolvedAudioClip[];
14
+ /** Releases object URLs and media resources owned by the runtime. */
15
+ export declare function releaseMedia(container: HTMLElement): void;
16
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/runtime/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkDzD,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA8BxD;AA8HD,6EAA6E;AAC7E,wBAAsB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGxE;AAsHD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnG;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,WAAW,GAAG,SAAS,iBAAiB,EAAE,CAwBvF;AAED,qEAAqE;AACrE,wBAAgB,YAAY,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAYzD"}
@@ -0,0 +1,307 @@
1
+ import { FrameyardError } from "../errors.js";
2
+ import { frameToSeconds } from "./clock.js";
3
+ const MEDIA_TIMEOUT_MS = 30_000;
4
+ const TIME_EPSILON = 0.0005;
5
+ const preparedMedia = new WeakMap();
6
+ const preparedStates = new Set();
7
+ const pendingPreparation = new WeakMap();
8
+ const VIDEO_MIME_TYPES = {
9
+ ".mov": "video/quicktime",
10
+ ".mp4": "video/mp4",
11
+ ".m4v": "video/mp4",
12
+ ".ogv": "video/ogg",
13
+ ".webm": "video/webm",
14
+ };
15
+ function mediaSource(video) {
16
+ const direct = video.getAttribute("src");
17
+ if (direct !== null && direct.trim().length > 0) {
18
+ return direct.trim();
19
+ }
20
+ const source = video.querySelector("source[src]");
21
+ const nested = source?.getAttribute("src");
22
+ if (nested !== null && nested !== undefined && nested.trim().length > 0) {
23
+ return nested.trim();
24
+ }
25
+ return "";
26
+ }
27
+ /** Converts a composition-relative media reference to a normalized project path. */
28
+ export function normalizeMediaSource(raw) {
29
+ if (raw.length === 0) {
30
+ throw new FrameyardError("MEDIA_INVALID", "An embedded video must have a non-empty src attribute.");
31
+ }
32
+ if (/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(raw) || raw.startsWith("//") || raw.startsWith("\\")) {
33
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video source must be a local project-relative file, not "${raw}".`);
34
+ }
35
+ let pathValue = raw.split(/[?#]/, 1)[0] ?? "";
36
+ pathValue = pathValue.replace(/\\/g, "/").replace(/^\/+/, "");
37
+ if (pathValue.startsWith("./")) {
38
+ pathValue = pathValue.slice(2);
39
+ }
40
+ if (pathValue.length === 0 || pathValue.split("/").includes("..") || pathValue.includes("\0")) {
41
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video source must stay inside the project, not "${raw}".`);
42
+ }
43
+ let decoded;
44
+ try {
45
+ decoded = decodeURIComponent(pathValue);
46
+ }
47
+ catch {
48
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video source is not a valid URL path: "${raw}".`);
49
+ }
50
+ if (decoded.length === 0 || decoded.split("/").includes("..") || decoded.includes("\0")) {
51
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video source must stay inside the project, not "${raw}".`);
52
+ }
53
+ return decoded;
54
+ }
55
+ function videoUrl(pathValue) {
56
+ return new URL(`/${pathValue}`, window.location.origin);
57
+ }
58
+ function waitForEvent(video, event, message, code = "MEDIA_INVALID") {
59
+ return new Promise((resolve, reject) => {
60
+ let timer;
61
+ function finish() {
62
+ video.removeEventListener(event, onEvent);
63
+ video.removeEventListener("error", onError);
64
+ clearTimeout(timer);
65
+ }
66
+ function onEvent() {
67
+ finish();
68
+ resolve();
69
+ }
70
+ function onError() {
71
+ finish();
72
+ reject(new FrameyardError(code, `${message}${video.error?.message ? `: ${video.error.message}` : ""}`));
73
+ }
74
+ timer = setTimeout(() => {
75
+ finish();
76
+ reject(new FrameyardError(code, `${message} Timed out after ${MEDIA_TIMEOUT_MS / 1000}s.`));
77
+ }, MEDIA_TIMEOUT_MS);
78
+ video.addEventListener(event, onEvent, { once: true });
79
+ video.addEventListener("error", onError, { once: true });
80
+ });
81
+ }
82
+ async function prepareVideo(video, owner) {
83
+ const raw = mediaSource(video);
84
+ const source = normalizeMediaSource(raw);
85
+ const spec = mediaSpec(video);
86
+ const existing = preparedMedia.get(video);
87
+ if (existing && existing.owner === owner && existing.source === source) {
88
+ return existing;
89
+ }
90
+ if (existing) {
91
+ preparedMedia.delete(video);
92
+ preparedStates.delete(existing);
93
+ URL.revokeObjectURL(existing.objectUrl);
94
+ }
95
+ let response;
96
+ try {
97
+ response = await fetch(videoUrl(source), { cache: "no-store" });
98
+ }
99
+ catch (error) {
100
+ throw new FrameyardError("ASSET_NOT_FOUND", `Could not load embedded video asset "${source}".`, {
101
+ cause: error,
102
+ });
103
+ }
104
+ if (!response.ok) {
105
+ throw new FrameyardError("ASSET_NOT_FOUND", `Could not load embedded video asset "${source}" (HTTP ${response.status}).`);
106
+ }
107
+ const blob = await response.blob();
108
+ if (blob.size === 0) {
109
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video asset "${source}" is empty.`);
110
+ }
111
+ const extension = source.slice(source.lastIndexOf(".")).toLowerCase();
112
+ const type = blob.type || VIDEO_MIME_TYPES[extension] || "video/webm";
113
+ const videoBlob = blob.type === type ? blob : blob.slice(0, blob.size, type);
114
+ const objectUrl = URL.createObjectURL(videoBlob);
115
+ const authorMuted = video.muted;
116
+ for (const nested of Array.from(video.querySelectorAll("source"))) {
117
+ nested.remove();
118
+ }
119
+ const loaded = waitForEvent(video, "loadeddata", `Embedded video asset "${source}" could not be decoded.`);
120
+ video.preload = "auto";
121
+ video.playsInline = true;
122
+ video.pause();
123
+ video.muted = true;
124
+ video.src = objectUrl;
125
+ video.load();
126
+ try {
127
+ await loaded;
128
+ if (!Number.isFinite(video.duration) || video.duration <= 0 || video.seekable.length === 0) {
129
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video asset "${source}" is not seekable.`);
130
+ }
131
+ }
132
+ catch (error) {
133
+ URL.revokeObjectURL(objectUrl);
134
+ throw error;
135
+ }
136
+ const state = { element: video, owner, source, objectUrl, spec, authorMuted };
137
+ preparedMedia.set(video, state);
138
+ preparedStates.add(state);
139
+ return state;
140
+ }
141
+ async function prepareOrGet(video, owner) {
142
+ const ready = preparedMedia.get(video);
143
+ if (ready && ready.owner === owner) {
144
+ return ready;
145
+ }
146
+ const pending = pendingPreparation.get(video);
147
+ if (pending) {
148
+ return pending;
149
+ }
150
+ const preparation = prepareVideo(video, owner);
151
+ pendingPreparation.set(video, preparation);
152
+ try {
153
+ return await preparation;
154
+ }
155
+ finally {
156
+ pendingPreparation.delete(video);
157
+ }
158
+ }
159
+ /** Loads every embedded video into memory before frame production begins. */
160
+ export async function prepareMedia(container) {
161
+ const videos = Array.from(container.querySelectorAll("video"));
162
+ await Promise.all(videos.map((video) => prepareOrGet(video, container)));
163
+ }
164
+ function integerAttribute(element, name, fallback) {
165
+ const raw = element.getAttribute(name);
166
+ if (raw === null || raw.trim().length === 0) {
167
+ return fallback;
168
+ }
169
+ const value = Number(raw);
170
+ if (!Number.isInteger(value) || value < 0) {
171
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video ${name} must be a non-negative integer.`);
172
+ }
173
+ return value;
174
+ }
175
+ function secondsAttribute(element, name, fallback, allowZero) {
176
+ const raw = element.getAttribute(name);
177
+ if (raw === null || raw.trim().length === 0) {
178
+ return fallback;
179
+ }
180
+ const value = Number(raw);
181
+ if (!Number.isFinite(value) || value < 0 || (!allowZero && value === 0)) {
182
+ throw new FrameyardError("MEDIA_INVALID", `Embedded video ${name} must be ${allowZero ? "a non-negative" : "a positive"} number of seconds.`);
183
+ }
184
+ return value;
185
+ }
186
+ function volumeAttribute(element) {
187
+ const raw = element.getAttribute("data-frameyard-volume");
188
+ if (raw === null || raw.trim().length === 0) {
189
+ return Math.max(0, Math.min(1, element.volume));
190
+ }
191
+ const value = Number(raw);
192
+ if (!Number.isFinite(value) || value < 0 || value > 1) {
193
+ throw new FrameyardError("MEDIA_INVALID", "Embedded video data-frameyard-volume must be between 0 and 1.");
194
+ }
195
+ return value;
196
+ }
197
+ function mediaSpec(element) {
198
+ const startFrame = integerAttribute(element, "data-frameyard-start", 0);
199
+ const trimStart = secondsAttribute(element, "data-frameyard-trim", 0, true);
200
+ const durationRaw = element.getAttribute("data-frameyard-duration");
201
+ const trimDuration = durationRaw === null || durationRaw.trim().length === 0
202
+ ? undefined
203
+ : secondsAttribute(element, "data-frameyard-duration", 0, false);
204
+ const spec = {
205
+ startFrame,
206
+ trimStart,
207
+ volume: volumeAttribute(element),
208
+ };
209
+ if (trimDuration !== undefined) {
210
+ spec.trimDuration = trimDuration;
211
+ }
212
+ return spec;
213
+ }
214
+ function seekTarget(video, spec, frame, fps) {
215
+ const localSeconds = frameToSeconds(frame, fps) - spec.startFrame / fps;
216
+ const usedSeconds = spec.trimDuration === undefined
217
+ ? Math.max(0, localSeconds)
218
+ : Math.min(spec.trimDuration, Math.max(0, localSeconds));
219
+ const target = spec.trimStart + usedSeconds;
220
+ const duration = Number.isFinite(video.duration) ? Math.max(0, video.duration) : target;
221
+ return Math.min(target, Math.max(0, duration - TIME_EPSILON));
222
+ }
223
+ async function seekVideo(video, frame, fps) {
224
+ const state = preparedMedia.get(video);
225
+ if (!state) {
226
+ throw new FrameyardError("MEDIA_INVALID", "Embedded video elements must be created in mount(); videos added during update() cannot be prepared without network access.");
227
+ }
228
+ if (!video.paused) {
229
+ video.pause();
230
+ }
231
+ if (video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {
232
+ await waitForEvent(video, "loadeddata", "Embedded video is not ready for frame production.");
233
+ }
234
+ const target = seekTarget(video, state.spec, frame, fps);
235
+ if (video.seeking) {
236
+ await waitForEvent(video, "seeked", "Embedded video could not finish an earlier seek.", "MEDIA_SEEK_FAILED");
237
+ }
238
+ if (!video.seeking && Math.abs(video.currentTime - target) < TIME_EPSILON) {
239
+ return;
240
+ }
241
+ const seeked = waitForEvent(video, "seeked", "Embedded video could not seek to the requested frame.", "MEDIA_SEEK_FAILED");
242
+ try {
243
+ video.currentTime = target;
244
+ }
245
+ catch (error) {
246
+ throw new FrameyardError("MEDIA_SEEK_FAILED", `Embedded video could not seek to ${target.toFixed(3)}s: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
247
+ }
248
+ await seeked;
249
+ }
250
+ async function nextPaint() {
251
+ await new Promise((resolve) => {
252
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
253
+ });
254
+ }
255
+ /**
256
+ * Seeks every embedded video to the requested composition frame and waits for
257
+ * the browser to present the result. This is the asynchronous half of a seek;
258
+ * composition update() stays synchronous.
259
+ */
260
+ export async function settleMedia(container, frame, fps) {
261
+ const videos = Array.from(container.querySelectorAll("video"));
262
+ if (videos.length === 0) {
263
+ return;
264
+ }
265
+ await Promise.all(videos.map((video) => seekVideo(video, frame, fps)));
266
+ await nextPaint();
267
+ }
268
+ /** Describes the audio contributed by unmuted embedded videos for preview and FFmpeg. */
269
+ export function describeMediaAudio(container) {
270
+ const clips = [];
271
+ for (const video of Array.from(container.querySelectorAll("video"))) {
272
+ const state = preparedMedia.get(video);
273
+ if (!state || state.authorMuted || video.getAttribute("data-frameyard-audio") === "off") {
274
+ continue;
275
+ }
276
+ const spec = state.spec;
277
+ if (spec.volume === 0) {
278
+ continue;
279
+ }
280
+ const clip = {
281
+ src: state.source,
282
+ startFrame: spec.startFrame,
283
+ trimStart: spec.trimStart,
284
+ volume: spec.volume,
285
+ };
286
+ if (spec.trimDuration !== undefined) {
287
+ clip.trimDuration = spec.trimDuration;
288
+ }
289
+ clips.push(Object.freeze(clip));
290
+ }
291
+ return Object.freeze(clips);
292
+ }
293
+ /** Releases object URLs and media resources owned by the runtime. */
294
+ export function releaseMedia(container) {
295
+ for (const state of Array.from(preparedStates)) {
296
+ if (state.owner !== container) {
297
+ continue;
298
+ }
299
+ preparedStates.delete(state);
300
+ preparedMedia.delete(state.element);
301
+ state.element.pause();
302
+ URL.revokeObjectURL(state.objectUrl);
303
+ state.element.removeAttribute("src");
304
+ state.element.load();
305
+ }
306
+ }
307
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/runtime/media.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AA8JA,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBzE;AAED,eAAO,MAAM,aAAa,UAKzB,CAAC"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAiKA,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmBzE;AAED,eAAO,MAAM,aAAa,UAKzB,CAAC"}
package/dist/scaffold.js CHANGED
@@ -16,10 +16,10 @@ This project produces deterministic, parameterized video with Frameyard. Follow
16
16
  ## Agent workflow
17
17
 
18
18
  1. Read \`video.config.js\`, the composition source, and the props file before changing behavior.
19
- 2. Author the composition or props with native HTML, CSS, SVG, Canvas 2D, and JavaScript. Do not add a bundling step.
19
+ 2. Author the composition or props with native HTML, CSS, SVG, Canvas 2D, WebGL, embedded video, and JavaScript. Do not add a bundling step.
20
20
  3. Validate every frame: \`npx frameyard check <id> --json\`. Use \`--props <file>\` to validate a specific props file.
21
21
  4. Inspect a representative frame: \`npx frameyard still <id> --frame <n> --out <file.png> --json\`, then view the PNG when the host supports images. State explicitly when visual inspection is not possible.
22
- 5. Render: \`npx frameyard render <id> --props <file> --out <file.mp4> --json\`.
22
+ 5. Render: \`npx frameyard render <id> --props <file> --out <file.mp4> [--concurrency <n>] --json\`.
23
23
  6. Report the composition, props, validation result, still path and inspection status, video path, and any failure. Never claim success when \`check\` fails, a still is missing, or a render exits nonzero.
24
24
 
25
25
  ## Commands
@@ -34,6 +34,7 @@ npx frameyard render hello --props props/hello.json --out hello.mp4 --json
34
34
 
35
35
  - Use \`--json\` for non-interactive commands. Parse stdout as the structured result; treat stderr as progress and diagnostics.
36
36
  - Use \`--project <dir>\` when running outside the project root.
37
+ - Use \`--concurrency <n>\` for faster local rendering when useful; the default is \`1\` and the maximum is \`16\`. It changes capture scheduling only, not composition behavior or output frame order.
37
38
  - \`still\` and \`render\` replace existing outputs only with \`--overwrite\`. Generated assets are replaced only with \`--force\`, and only with user approval.
38
39
 
39
40
  ## Determinism rules
@@ -45,11 +46,13 @@ npx frameyard render hello --props props/hello.json --out hello.mp4 --json
45
46
  - Never use \`Math.random()\`, \`Date.now()\`, \`performance.now()\`, timers, independent \`requestAnimationFrame()\` loops, CSS transitions, or state left from a previously visited frame as animation inputs.
46
47
  - CSS \`@keyframes\` and the Web Animations API are valid; the runtime seeks them.
47
48
  - Load remote data, fonts, and images during \`mount()\` or before the first frame. Network requests are blocked during capture; a \`fetch()\` from \`update()\` is a bug.
48
- - Redraw Canvas 2D from the current frame.
49
+ - Redraw Canvas 2D and WebGL from the current frame. Production pins software WebGL for reproducible pixels.
50
+ - Embedded video must use a local project file in the composition container's light DOM and be created, with its \`data-frameyard-*\` attributes, in \`mount()\`. Let the runtime seek it; do not call \`play()\`, \`pause()\`, or set \`currentTime\` in \`update()\`. Use \`data-frameyard-start\` (frames), \`data-frameyard-trim\` (seconds), optional \`data-frameyard-duration\` (seconds), and optional \`data-frameyard-volume\` (0-1).
49
51
 
50
52
  ## Audio and transcripts
51
53
 
52
54
  - Audio clips are placed by composition frames and trimmed by seconds. Frameyard does not time-stretch audio or change composition duration to fit it.
55
+ - An unmuted embedded video contributes its audio track to the same mix; use \`muted\` or \`data-frameyard-audio="off"\` for a visual-only video.
53
56
  - Produce speech with \`npx frameyard tts\` and transcripts with \`npx frameyard transcribe\`; never call \`qwen-tts\` or \`whisper-cli\` directly, and never run inference inside \`mount()\` or \`update()\`.
54
57
  - Do not overwrite or regenerate generated assets without explicit approval.
55
58
  - \`words: true\` requires measured word timings; never interpolate segment timings.
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CA0DwB,OAAO,kFAAkF,OAAO;CAC5I,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BtB,CAAC;AAEF,MAAM,kBAAkB,GAA2B;IACjD,iBAAiB,EAAE,wFAAwF;IAC3G,kBAAkB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;IACpG,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,cAAc;IAC3B,uBAAuB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgD1B;CACA,CAAC;AAEF,0DAA0D;AAC1D,SAAS,WAAW,CAAC,WAAmB;IACtC,MAAM,UAAU,GAAG,WAAW;SAC3B,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO;QACL,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAC/B;YACE,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;YAC9B,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,uBAAuB,OAAO,MAAM;gBACzC,KAAK,EAAE,uBAAuB,OAAO,QAAQ;gBAC7C,MAAM,EAAE,uBAAuB,OAAO,SAAS;gBAC/C,KAAK,EAAE,uBAAuB,OAAO,QAAQ;aAC9C;SACF,EACD,IAAI,EACJ,CAAC,CACF,IAAI;QACL,GAAG,kBAAkB;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,sBAAsB;IACtB,mBAAmB;IACnB,2BAA2B;IAC3B,4CAA4C;CAC7C,CAAC"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6CA6DwB,OAAO,kFAAkF,OAAO;CAC5I,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BtB,CAAC;AAEF,MAAM,kBAAkB,GAA2B;IACjD,iBAAiB,EAAE,wFAAwF;IAC3G,kBAAkB,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;IACpG,WAAW,EAAE,YAAY;IACzB,WAAW,EAAE,cAAc;IAC3B,uBAAuB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgD1B;CACA,CAAC;AAEF,0DAA0D;AAC1D,SAAS,WAAW,CAAC,WAAmB;IACtC,MAAM,UAAU,GAAG,WAAW;SAC3B,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO;QACL,cAAc,EAAE,GAAG,IAAI,CAAC,SAAS,CAC/B;YACE,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;YAC9B,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,uBAAuB,OAAO,MAAM;gBACzC,KAAK,EAAE,uBAAuB,OAAO,QAAQ;gBAC7C,MAAM,EAAE,uBAAuB,OAAO,SAAS;gBAC/C,KAAK,EAAE,uBAAuB,OAAO,QAAQ;aAC9C;SACF,EACD,IAAI,EACJ,CAAC,CACF,IAAI;QACL,GAAG,kBAAkB;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,sBAAsB;IACtB,mBAAmB;IACnB,2BAA2B;IAC3B,4CAA4C;CAC7C,CAAC"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.2.0";
1
+ export declare const VERSION = "0.3.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.2.0";
1
+ export const VERSION = "0.3.0";
2
2
  //# sourceMappingURL=version.js.map
@@ -1,3 +1,5 @@
1
1
  # Render browser frames offline
2
2
 
3
3
  Production rendering will drive pinned Chromium through explicit frame seeks, capture each frame, and encode frames and timeline audio with FFmpeg instead of recording real-time browser playback. This accepts slower sequential rendering in exchange for frame accuracy under load, reproducible visual state, and parity between preview and production composition behavior.
4
+
5
+ ADR 0005 makes this offline capture loop optionally parallel while preserving ordered, frame-accurate encoding; sequential rendering remains the default.
@@ -0,0 +1,3 @@
1
+ # Keep parallel rendering opt-in and frame-ordered
2
+
3
+ Frameyard will offer parallel frame capture as an explicit `render --concurrency <n>` option, defaulting to one browser session and limiting `n` to 16 to bound browser processes and buffered PNG memory. Each worker loads the same composition, props, and preview server in an independent session; workers seek and capture assigned frames while one ordered writer feeds a single FFmpeg encoder. Bounded lookahead limits buffered PNGs, failures stop further frame work and abort publication, and no partial output is published. This keeps sequential rendering as the predictable default and preserves the determinism contract at the capture boundary: concurrency changes scheduling only, never frame order or visual state. The cost is additional CPU and memory proportional to the requested session count.