@lumencast/runtime 0.8.0 → 0.10.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 (99) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/animate/keyframes.js +8 -1
  3. package/dist/animate/keyframes.js.map +1 -1
  4. package/dist/app.d.ts +9 -1
  5. package/dist/app.d.ts.map +1 -1
  6. package/dist/app.js +4 -1
  7. package/dist/app.js.map +1 -1
  8. package/dist/{broadcast-Gcd-dmC7.js → broadcast-L5wm2I6J.js} +3 -3
  9. package/dist/{broadcast-Gcd-dmC7.js.map → broadcast-L5wm2I6J.js.map} +1 -1
  10. package/dist/{control-C5TfClga.js → control-eEUG7unp.js} +4 -4
  11. package/dist/{control-C5TfClga.js.map → control-eEUG7unp.js.map} +1 -1
  12. package/dist/index-Clrya_9l.js +1281 -0
  13. package/dist/index-Clrya_9l.js.map +1 -0
  14. package/dist/index.d.ts +3 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.html +1 -1
  17. package/dist/index.js +11 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/lumencast.js +17 -12
  20. package/dist/mount.d.ts.map +1 -1
  21. package/dist/mount.js +16 -0
  22. package/dist/mount.js.map +1 -1
  23. package/dist/overlay/runtime-context.d.ts +21 -0
  24. package/dist/overlay/runtime-context.d.ts.map +1 -1
  25. package/dist/overlay/runtime-context.js +8 -0
  26. package/dist/overlay/runtime-context.js.map +1 -1
  27. package/dist/render/bundle.d.ts +1 -1
  28. package/dist/render/bundle.d.ts.map +1 -1
  29. package/dist/render/bundle.js +4 -0
  30. package/dist/render/bundle.js.map +1 -1
  31. package/dist/render/keyframe-player.d.ts.map +1 -1
  32. package/dist/render/keyframe-player.js +15 -1
  33. package/dist/render/keyframe-player.js.map +1 -1
  34. package/dist/render/primitives/capture.d.ts +49 -0
  35. package/dist/render/primitives/capture.d.ts.map +1 -0
  36. package/dist/render/primitives/capture.js +203 -0
  37. package/dist/render/primitives/capture.js.map +1 -0
  38. package/dist/render/primitives/index.d.ts.map +1 -1
  39. package/dist/render/primitives/index.js +7 -0
  40. package/dist/render/primitives/index.js.map +1 -1
  41. package/dist/render/primitives/live-peer-video.d.ts +27 -0
  42. package/dist/render/primitives/live-peer-video.d.ts.map +1 -0
  43. package/dist/render/primitives/live-peer-video.js +64 -0
  44. package/dist/render/primitives/live-peer-video.js.map +1 -0
  45. package/dist/render/primitives/media.d.ts +37 -12
  46. package/dist/render/primitives/media.d.ts.map +1 -1
  47. package/dist/render/primitives/media.js +43 -17
  48. package/dist/render/primitives/media.js.map +1 -1
  49. package/dist/render/primitives/meet-peer.d.ts +31 -0
  50. package/dist/render/primitives/meet-peer.d.ts.map +1 -0
  51. package/dist/render/primitives/meet-peer.js +46 -0
  52. package/dist/render/primitives/meet-peer.js.map +1 -0
  53. package/dist/render/prop-allowlist.d.ts.map +1 -1
  54. package/dist/render/prop-allowlist.js +32 -1
  55. package/dist/render/prop-allowlist.js.map +1 -1
  56. package/dist/render/tree.js +42 -8
  57. package/dist/render/tree.js.map +1 -1
  58. package/dist/{status-pill-BaLQoIDl.js → status-pill-elORkMrh.js} +2 -2
  59. package/dist/{status-pill-BaLQoIDl.js.map → status-pill-elORkMrh.js.map} +1 -1
  60. package/dist/{test-CA30C2By.js → test-7q_KJkdX.js} +4 -4
  61. package/dist/{test-CA30C2By.js.map → test-7q_KJkdX.js.map} +1 -1
  62. package/dist/{tree-1coZ32nd.js → tree-BMxx5170.js} +773 -604
  63. package/dist/tree-BMxx5170.js.map +1 -0
  64. package/dist/types.d.ts +23 -0
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/webrtc/index.d.ts +76 -0
  67. package/dist/webrtc/index.d.ts.map +1 -0
  68. package/dist/webrtc/index.js +180 -0
  69. package/dist/webrtc/index.js.map +1 -0
  70. package/dist/webrtc/meet-viewer.d.ts +139 -0
  71. package/dist/webrtc/meet-viewer.d.ts.map +1 -0
  72. package/dist/webrtc/meet-viewer.js +379 -0
  73. package/dist/webrtc/meet-viewer.js.map +1 -0
  74. package/dist/webrtc/peer-stream-registry.d.ts +21 -0
  75. package/dist/webrtc/peer-stream-registry.d.ts.map +1 -0
  76. package/dist/webrtc/peer-stream-registry.js +77 -0
  77. package/dist/webrtc/peer-stream-registry.js.map +1 -0
  78. package/package.json +4 -4
  79. package/src/animate/keyframes.ts +8 -1
  80. package/src/app.tsx +14 -0
  81. package/src/index.ts +40 -0
  82. package/src/mount.ts +16 -0
  83. package/src/overlay/runtime-context.tsx +24 -0
  84. package/src/render/bundle.ts +19 -1
  85. package/src/render/keyframe-player.tsx +14 -1
  86. package/src/render/primitives/capture.tsx +255 -0
  87. package/src/render/primitives/index.ts +7 -0
  88. package/src/render/primitives/live-peer-video.tsx +90 -0
  89. package/src/render/primitives/media.tsx +66 -17
  90. package/src/render/primitives/meet-peer.tsx +57 -0
  91. package/src/render/prop-allowlist.ts +32 -1
  92. package/src/render/tree.tsx +44 -8
  93. package/src/types.ts +23 -0
  94. package/src/webrtc/index.ts +252 -0
  95. package/src/webrtc/meet-viewer.ts +497 -0
  96. package/src/webrtc/peer-stream-registry.ts +93 -0
  97. package/dist/index-N-VqrIxN.js +0 -885
  98. package/dist/index-N-VqrIxN.js.map +0 -1
  99. package/dist/tree-1coZ32nd.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/overlay/runtime-context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;CACvC;AAID,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAEA;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAQtD"}
1
+ {"version":3,"file":"runtime-context.d.ts","sourceRoot":"","sources":["../../src/overlay/runtime-context.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEzF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IACtC;;iFAE6E;IAC7E,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C;;;uEAGmE;IACnE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;gFAE4E;IAC5E,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAID,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAEA;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAQtD;AAED;;;;sCAIsC;AACtC,wBAAgB,2BAA2B,IAAI,gBAAgB,GAAG,IAAI,CAErE"}
@@ -11,4 +11,12 @@ export function useLumencastRuntime() {
11
11
  }
12
12
  return v;
13
13
  }
14
+ /** Read the runtime context WITHOUT throwing when no provider is mounted.
15
+ * Render primitives (e.g. `x-zab.capture`) may render via `<Tree>` directly —
16
+ * embedded hosts, tooling, tests — outside `mount()`'s provider. They use this
17
+ * to pick up mount-level host config (the capture resolver) when present and
18
+ * fall back to defaults when not. */
19
+ export function useOptionalLumencastRuntime() {
20
+ return useContext(Ctx);
21
+ }
14
22
  //# sourceMappingURL=runtime-context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/overlay/runtime-context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AAgBlE,MAAM,GAAG,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAEzD,MAAM,UAAU,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,KAAC,GAAG,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAgB,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"runtime-context.js","sourceRoot":"","sources":["../../src/overlay/runtime-context.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAkB,MAAM,OAAO,CAAC;AA+BlE,MAAM,GAAG,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAEzD,MAAM,UAAU,wBAAwB,CAAC,EACvC,KAAK,EACL,QAAQ,GAIT;IACC,OAAO,KAAC,GAAG,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAgB,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;sCAIsC;AACtC,MAAM,UAAU,2BAA2B;IACzC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { Transition } from "../animate/transitions.js";
2
2
  import type { Keyframes } from "../animate/keyframes.js";
3
- export type RenderKind = "stack" | "grid" | "frame" | "text" | "image" | "shape" | "media" | "repeat" | "instance";
3
+ export type RenderKind = "stack" | "grid" | "frame" | "text" | "image" | "shape" | "media" | "repeat" | "instance" | "meet.peer" | "x-zab.capture" | "x-zab.meet-peer";
4
4
  export interface RenderNode {
5
5
  kind: RenderKind;
6
6
  /** Stable identifier for keyed reconciliation. */
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,10 @@
23
23
  */
24
24
  export const SUPPORTED_PROFILES = new Set([
25
25
  "x-lumencast.color-srgb-1.0",
26
+ // RFC-0001 / ADR 004 — this runtime ships the Zab capture plugin, so a
27
+ // bundle declaring `x-zab.capture/1` in `profiles[]` is compatible (it is
28
+ // NOT rejected as BUNDLE_INCOMPATIBLE, §17.3.1).
29
+ "x-zab.capture/1",
26
30
  ]);
27
31
  // LSML 1.1 §17.5.1 + ADR 001 RC#14 — authoring-profile detection.
28
32
  //
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"keyframe-player.d.ts","sourceRoot":"","sources":["../../src/render/keyframe-player.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIxE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb;iDAC6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,GAAG,SAAS,CAwCjC"}
1
+ {"version":3,"file":"keyframe-player.d.ts","sourceRoot":"","sources":["../../src/render/keyframe-player.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIxE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;IACb;iDAC6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,cAAc,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,GAAG,SAAS,CAqDjC"}
@@ -40,7 +40,21 @@ export function KeyframePlayer({ keyframes, store, nodeId, children, }) {
40
40
  const transition = staggerDelayMs > 0
41
41
  ? { ...compiled.transition, delay: staggerDelayMs / 1000 }
42
42
  : compiled.transition;
43
- return (_jsxs(motion.div, { style: { display: "contents" }, initial: firstFrame(compiled.animate), animate: compiled.animate, transition: transition, children: [_jsx(ReplayOnMount, {}), children] }, replayTokenRef.current));
43
+ return (_jsxs(motion.div, {
44
+ // A `display:contents` element generates NO box, so the browser
45
+ // never composites the animated `transform`/`opacity`/`filter` this
46
+ // player writes — they are silently dropped and the subtree renders
47
+ // dead at its child's default origin (ADR 011 I7 live bug). The
48
+ // player must be a REAL compositing box. `position:absolute; inset:0`
49
+ // overlays the parent without disturbing sibling layout, and — being
50
+ // positioned — becomes the containing block for the absolutely-
51
+ // positioned primitive nested beneath it (Frame is `position:absolute;
52
+ // left:0; top:0`), so the child's authored `x`/`y` resolve against the
53
+ // player's (0,0) exactly as they did against the grandparent under
54
+ // `display:contents`. The animated channels now composite onto a live
55
+ // box and the whole subtree (the nested target's geometry + fill)
56
+ // moves and fades with the keyframes.
57
+ style: { position: "absolute", inset: 0 }, initial: firstFrame(compiled.animate), animate: compiled.animate, transition: transition, children: [_jsx(ReplayOnMount, {}), children] }, replayTokenRef.current));
44
58
  }
45
59
  /** No-op effect placeholder — kept for symmetry / future hooks like
46
60
  * reporting playback completion to the renderer. */
@@ -1 +1 @@
1
- {"version":3,"file":"keyframe-player.js","sourceRoot":"","sources":["../../src/render/keyframe-player.tsx"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,EAAE;AACF,uEAAuE;AACvE,sEAAsE;AACtE,qEAAqE;AACrE,uEAAuE;AACvE,sEAAsE;AACtE,EAAE;AACF,uEAAuE;AACvE,wEAAwE;AACxE,0EAA0E;AAC1E,0BAA0B;AAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAkB,MAAM,OAAO,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAkB,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWnD,MAAM,UAAU,cAAc,CAAC,EAC7B,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,GACY;IACpB,UAAU,EAAE,CAAC;IACb,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAElD,+DAA+D;IAC/D,kEAAkE;IAClE,iEAAiE;IACjE,MAAM,YAAY,GAAG,MAAM,CAAU,SAAS,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,IAAI,YAAY,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC/B,YAAY,CAAC,OAAO,GAAG,CAAC,CAAC;YACzB,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,4BAAG,QAAQ,GAAI,CAAC;IACzB,CAAC;IAED,MAAM,UAAU,GACd,cAAc,GAAG,CAAC;QAChB,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,EAAE;QAC1D,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;IAE1B,OAAO,CACL,MAAC,MAAM,CAAC,GAAG,IAET,KAAK,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,EAC9B,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EACrC,OAAO,EAAE,QAAQ,CAAC,OAAO,EACzB,UAAU,EAAE,UAAU,aAEtB,KAAC,aAAa,KAAG,EAChB,QAAQ,KAPJ,cAAc,CAAC,OAAO,CAQhB,CACd,CAAC;AACJ,CAAC;AAED;qDACqD;AACrD,SAAS,aAAa;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,oBAAoB;IACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;uCAGuC;AACvC,SAAS,UAAU,CAAC,OAA4C;IAC9D,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"keyframe-player.js","sourceRoot":"","sources":["../../src/render/keyframe-player.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { PrimitiveProps } from "./index";
2
+ /** `x-zab.capture` — context-aware capture primitive (Zab vendor primitive,
3
+ * RFC-0001 / ADR 004 §Amendment 1).
4
+ *
5
+ * The primitive reserves a box of the declared geometry so downstream layout
6
+ * (siblings, masks, stacks, grids) is unaffected — exactly as an `image` of
7
+ * the same geometry, in BOTH modes below. It picks a mode by **capability
8
+ * detection at mount** (feature detection, not an env flag) :
9
+ *
10
+ * - **ACQUIRE** (capable host, e.g. the Electron preview webview with
11
+ * auto-granted media permissions) : it acquires a live stream itself via
12
+ * `getUserMedia` (webcam/mic) or `getDisplayMedia` (screen/window) per
13
+ * `x-zab.sourceKind`, and renders it in a `<video>` for visual kinds
14
+ * (audio kinds stay visually empty). The physical device is resolved from
15
+ * the LOGICAL `x-zab.deviceRef` through a host-provided resolver
16
+ * (`resolveCaptureDevice`, §A1.3) — never a bundle-baked id. Any failure
17
+ * (no resolver, no device, permission denied, acquisition error) falls
18
+ * back to PLACEHOLDER WITHOUT throwing or blanking the surrounding tree.
19
+ *
20
+ * - **PLACEHOLDER** (non-capable host, e.g. CEF/Pulsar on-air) : the box is
21
+ * fully transparent, acquires nothing, reaches no device — the original
22
+ * §3.2 behaviour. The consuming app composites a native source behind it
23
+ * (ON-AIR PATH UNCHANGED).
24
+ *
25
+ * A stream-less box is a valid mode, not an error : NO diagnostic is emitted
26
+ * for PLACEHOLDER mode or for an ACQUIRE→PLACEHOLDER fallback.
27
+ *
28
+ * Geometry is the only layout input. `width`/`height` are the
29
+ * compiler-flattened `size:{w,h}` ; universal props (visible/opacity/
30
+ * position) are applied by the Tree's UniversalWrapper. An audio-only
31
+ * capture (`media.mic` / `media.app_audio`) may omit `size` → a zero-area
32
+ * box that never paints. */
33
+ export declare function Capture({ resolved }: PrimitiveProps): import("react/jsx-runtime").JSX.Element;
34
+ /** A resolved physical device for a live capture constraint, or `null` when the
35
+ * host could not bind the logical `deviceRef`. */
36
+ export type ResolvedCaptureDevice = {
37
+ deviceId?: string;
38
+ captureSourceId?: string;
39
+ } | null;
40
+ /** Resolver injected by the consuming app (ADR 004 §A1.3). Maps the LOGICAL
41
+ * `deviceRef` to a physical `deviceId`/`captureSourceId` for a live
42
+ * `getUserMedia` constraint. The result NEVER enters the bundle or the content
43
+ * hash. MAY be async: physical ids (e.g. getUserMedia `deviceId`) are salted
44
+ * per origin/partition, so the host often must re-resolve a portable key
45
+ * (label) against THIS context's devices — an inherently asynchronous step
46
+ * (`enumerateDevices`). `acquireStream` awaits it, so the device is bound
47
+ * before acquisition rather than racing a late global mutation. */
48
+ export type ResolveCaptureDevice = (deviceRef: string, sourceKind: string) => ResolvedCaptureDevice | Promise<ResolvedCaptureDevice>;
49
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/capture.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA8B6B;AAC7B,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA8FnD;AAED;mDACmD;AACnD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,IAAI,CAAC;AAET;;;;;;;oEAOoE;AACpE,MAAM,MAAM,oBAAoB,GAAG,CACjC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,KACf,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,203 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { useOptionalLumencastRuntime } from "../../overlay/runtime-context";
4
+ /** `x-zab.capture` — context-aware capture primitive (Zab vendor primitive,
5
+ * RFC-0001 / ADR 004 §Amendment 1).
6
+ *
7
+ * The primitive reserves a box of the declared geometry so downstream layout
8
+ * (siblings, masks, stacks, grids) is unaffected — exactly as an `image` of
9
+ * the same geometry, in BOTH modes below. It picks a mode by **capability
10
+ * detection at mount** (feature detection, not an env flag) :
11
+ *
12
+ * - **ACQUIRE** (capable host, e.g. the Electron preview webview with
13
+ * auto-granted media permissions) : it acquires a live stream itself via
14
+ * `getUserMedia` (webcam/mic) or `getDisplayMedia` (screen/window) per
15
+ * `x-zab.sourceKind`, and renders it in a `<video>` for visual kinds
16
+ * (audio kinds stay visually empty). The physical device is resolved from
17
+ * the LOGICAL `x-zab.deviceRef` through a host-provided resolver
18
+ * (`resolveCaptureDevice`, §A1.3) — never a bundle-baked id. Any failure
19
+ * (no resolver, no device, permission denied, acquisition error) falls
20
+ * back to PLACEHOLDER WITHOUT throwing or blanking the surrounding tree.
21
+ *
22
+ * - **PLACEHOLDER** (non-capable host, e.g. CEF/Pulsar on-air) : the box is
23
+ * fully transparent, acquires nothing, reaches no device — the original
24
+ * §3.2 behaviour. The consuming app composites a native source behind it
25
+ * (ON-AIR PATH UNCHANGED).
26
+ *
27
+ * A stream-less box is a valid mode, not an error : NO diagnostic is emitted
28
+ * for PLACEHOLDER mode or for an ACQUIRE→PLACEHOLDER fallback.
29
+ *
30
+ * Geometry is the only layout input. `width`/`height` are the
31
+ * compiler-flattened `size:{w,h}` ; universal props (visible/opacity/
32
+ * position) are applied by the Tree's UniversalWrapper. An audio-only
33
+ * capture (`media.mic` / `media.app_audio`) may omit `size` → a zero-area
34
+ * box that never paints. */
35
+ export function Capture({ resolved }) {
36
+ const width = dimOr(resolved.width, "100%");
37
+ const height = dimOr(resolved.height, "100%");
38
+ const sourceKind = typeof resolved["x-zab.sourceKind"] === "string"
39
+ ? resolved["x-zab.sourceKind"]
40
+ : "";
41
+ const deviceRef = typeof resolved["x-zab.deviceRef"] === "string" ? resolved["x-zab.deviceRef"] : "";
42
+ // §A1.3 — the host-provided resolver, injected at mount through the runtime
43
+ // context (NOT the bundle, NOT the LSDP wire). Absent when the tree renders
44
+ // outside a host (direct embedding, tooling, tests) → the default-device
45
+ // path applies.
46
+ const runtime = useOptionalLumencastRuntime();
47
+ const resolveCaptureDevice = runtime?.resolveCaptureDevice;
48
+ const videoRef = useRef(null);
49
+ // `null` → PLACEHOLDER (non-capable, or ACQUIRE→PLACEHOLDER fallback).
50
+ // A `MediaStream` → ACQUIRE succeeded and a visual stream is mounted.
51
+ const [stream, setStream] = useState(null);
52
+ useEffect(() => {
53
+ // §A1.2(2) — capability detection at mount. A non-capable host (no
54
+ // `getUserMedia`, e.g. CEF/Pulsar on-air, or jsdom without a mock) stays
55
+ // in PLACEHOLDER : acquire nothing, no diagnostic.
56
+ if (!isCaptureCapable())
57
+ return;
58
+ let cancelled = false;
59
+ let acquired = null;
60
+ void (async () => {
61
+ try {
62
+ const media = await acquireStream(sourceKind, deviceRef, resolveCaptureDevice);
63
+ if (media === null)
64
+ return; // unknown/unsupported kind → PLACEHOLDER
65
+ if (cancelled) {
66
+ // Unmounted (or scene-changed) during acquisition — stop immediately
67
+ // so we never leave a camera light on (RC11).
68
+ stopStream(media);
69
+ return;
70
+ }
71
+ acquired = media;
72
+ setStream(media);
73
+ }
74
+ catch {
75
+ // §A1.2(2)(a) — any acquisition failure (permission denied, no device,
76
+ // getUserMedia rejected) falls back to PLACEHOLDER, no throw, no
77
+ // diagnostic.
78
+ }
79
+ })();
80
+ return () => {
81
+ cancelled = true;
82
+ // RC11 — stop the tracks at unmount / scene change. Clearing state is
83
+ // unnecessary (the component is gone) but stopping the device is not.
84
+ if (acquired !== null)
85
+ stopStream(acquired);
86
+ };
87
+ // Re-acquire when the logical source identity changes (a scene switch can
88
+ // reuse the node with a new sourceKind/deviceRef).
89
+ }, [sourceKind, deviceRef, resolveCaptureDevice]);
90
+ // Attach / detach the live stream to the <video> element imperatively —
91
+ // `srcObject` is not a serialisable attribute.
92
+ useEffect(() => {
93
+ const el = videoRef.current;
94
+ if (el === null)
95
+ return;
96
+ el.srcObject = stream;
97
+ return () => {
98
+ if (el !== null)
99
+ el.srcObject = null;
100
+ };
101
+ }, [stream]);
102
+ // ACQUIRE with a visual stream → render the <video>. Audio-only kinds keep
103
+ // the transparent box (no visible element) even when acquired.
104
+ if (stream !== null && isVisualKind(sourceKind)) {
105
+ return (_jsx("video", { ref: videoRef, "data-lumencast-capture": true, autoPlay: true, muted: true, playsInline: true, style: { width, height, objectFit: "cover", pointerEvents: "none" } }));
106
+ }
107
+ // PLACEHOLDER (or audio-only ACQUIRE) — fully transparent, inert box.
108
+ return (_jsx("div", { "aria-hidden": true, "data-lumencast-capture": true, style: { width, height, opacity: 0, pointerEvents: "none" } }));
109
+ }
110
+ /** §A1.2(2) — capture-capable iff `navigator.mediaDevices.getUserMedia`
111
+ * exists and is callable in the current context. Feature detection only ;
112
+ * CEF/Pulsar on-air and jsdom (without a mock) report non-capable. */
113
+ function isCaptureCapable() {
114
+ return (typeof navigator !== "undefined" && typeof navigator.mediaDevices?.getUserMedia === "function");
115
+ }
116
+ /** Visual kinds render a `<video>` ; audio kinds stay visually empty. */
117
+ function isVisualKind(sourceKind) {
118
+ return (sourceKind === "media.webcam" || sourceKind === "media.screen" || sourceKind === "media.window");
119
+ }
120
+ /** Acquire a live stream for `sourceKind`, applying a host-resolved `deviceId`
121
+ * when available. Returns `null` for an unsupported/unknown kind (→
122
+ * PLACEHOLDER) ; throws are caught by the caller (→ PLACEHOLDER fallback). */
123
+ async function acquireStream(sourceKind, deviceRef, resolveCaptureDevice) {
124
+ const md = navigator.mediaDevices;
125
+ // §A1.3 (amended 2026-06-27) — AWAIT the resolver: physical ids are salted
126
+ // per origin/partition, so the host may need an async re-resolution by a
127
+ // portable key (label) in THIS context. Awaiting binds the device before
128
+ // acquisition instead of racing a late global update (the previous sync call
129
+ // let the node acquire with a stale/absent id first).
130
+ const resolved = (await resolveCaptureDevice?.(deviceRef, sourceKind)) ?? null;
131
+ const deviceId = resolved?.deviceId;
132
+ const declaredRef = deviceRef.length > 0;
133
+ switch (sourceKind) {
134
+ case "media.webcam":
135
+ case "media.mic":
136
+ case "media.app_audio": {
137
+ // §A1.3 (amended) — NO default-device fallback for a DECLARED deviceRef
138
+ // that did not resolve to a real device. Acquiring the host default cam
139
+ // here is the silent "automatic allocation" of the WRONG camera the
140
+ // consuming app must never get. → PLACEHOLDER (return null). The bare
141
+ // default constraint stays ONLY when no deviceRef is declared at all.
142
+ if (declaredRef && (typeof deviceId !== "string" || deviceId.length === 0)) {
143
+ return null;
144
+ }
145
+ const channel = sourceKind === "media.webcam" ? "video" : "audio";
146
+ return md.getUserMedia({ [channel]: deviceConstraint(deviceId) });
147
+ }
148
+ case "media.screen":
149
+ case "media.window": {
150
+ // DIRECT capture of the picked desktopCapturer surface (no system picker)
151
+ // via Electron's legacy `chromeMediaSource:desktop` + the resolved
152
+ // `captureSourceId`.
153
+ const captureSourceId = resolved?.captureSourceId;
154
+ if (typeof captureSourceId === "string" && captureSourceId.length > 0) {
155
+ return md.getUserMedia({
156
+ video: {
157
+ mandatory: {
158
+ chromeMediaSource: "desktop",
159
+ chromeMediaSourceId: captureSourceId,
160
+ },
161
+ },
162
+ });
163
+ }
164
+ // A declared surface ref that didn't resolve → PLACEHOLDER, never a
165
+ // default `getDisplayMedia` picker. The picker stays only when no ref is
166
+ // declared (a bare capture node on a non-Electron host).
167
+ if (declaredRef)
168
+ return null;
169
+ return md.getDisplayMedia({ video: true });
170
+ }
171
+ default:
172
+ return null;
173
+ }
174
+ }
175
+ /** A `getUserMedia` track constraint. A resolved deviceId is pinned with
176
+ * `exact`, NOT a bare (ideal) deviceId: an *ideal* constraint SILENTLY falls
177
+ * back to the host default camera when the requested device can't start (e.g.
178
+ * an INACTIVE virtual cam that's enumerated but produces no stream) — the
179
+ * "automatic allocation" of the WRONG camera. `exact` yields the requested
180
+ * device (its placeholder frame if idle), or an OverconstrainedError the
181
+ * caller catches into PLACEHOLDER — never the wrong cam. No deviceId → `true`
182
+ * (host default) applies ONLY when no deviceRef was declared. */
183
+ function deviceConstraint(deviceId) {
184
+ return typeof deviceId === "string" && deviceId.length > 0
185
+ ? { deviceId: { exact: deviceId } }
186
+ : true;
187
+ }
188
+ /** Stop every track of a stream (RC11 — release the camera/mic, kill the
189
+ * device light). */
190
+ function stopStream(stream) {
191
+ for (const track of stream.getTracks())
192
+ track.stop();
193
+ }
194
+ /** A render dimension: a finite number → px, a non-empty string → verbatim,
195
+ * anything else → the fallback (matches the `image` primitive's helper). */
196
+ function dimOr(v, fallback) {
197
+ if (typeof v === "number" && Number.isFinite(v))
198
+ return `${v}px`;
199
+ if (typeof v === "string" && v.length > 0)
200
+ return v;
201
+ return fallback;
202
+ }
203
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../src/render/primitives/capture.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAa5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;oEACgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACvD;;;;0EAIsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACjD;;;;;uEAKmE;IACnE,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,CASjF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAe5D,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC;oEACgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,SAAS,CAAC;IACvD;;;;0EAIsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;IACjD;;;;;uEAKmE;IACnE,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,CAcjF,CAAC"}
@@ -8,7 +8,9 @@ import { Text } from "./text";
8
8
  import { Image } from "./image";
9
9
  import { Shape } from "./shape";
10
10
  import { Media } from "./media";
11
+ import { MeetPeer } from "./meet-peer";
11
12
  import { Instance } from "./instance";
13
+ import { Capture } from "./capture";
12
14
  export const PRIMITIVES = {
13
15
  stack: Stack,
14
16
  grid: Grid,
@@ -17,6 +19,11 @@ export const PRIMITIVES = {
17
19
  image: Image,
18
20
  shape: Shape,
19
21
  media: Media,
22
+ // ADR 006 §3.3/§3.5 — the unified source kind : every exported source is a
23
+ // `meet.peer` node rendered in `<video srcObject>` from the WebRTC viewer.
24
+ "meet.peer": MeetPeer,
20
25
  instance: Instance,
26
+ // RFC-0001 / ADR 004 — Zab vendor capture placeholder (transparent, inert).
27
+ "x-zab.capture": Capture,
21
28
  };
22
29
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/primitives/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,uEAAuE;AACvE,0DAA0D;AAK1D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA2BtC,MAAM,CAAC,MAAM,UAAU,GAA+D;IACpF,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,QAAQ;CACnB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/render/primitives/index.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,uEAAuE;AACvE,0DAA0D;AAK1D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,MAAM,CAAC,MAAM,UAAU,GAA+D;IACpF,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,KAAK,EAAE,KAAK;IACZ,2EAA2E;IAC3E,2EAA2E;IAC3E,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE,QAAQ;IAClB,4EAA4E;IAC5E,eAAe,EAAE,OAAO;CACzB,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** Shared LIVE peer-stream rendering (ADR 006 §3.3/§3.5) — the SINGLE srcObject
2
+ * path used by BOTH the `media` primitive's live mode (#4, keyed on `peerLabel`)
3
+ * AND the generic `meet.peer` source kind (the unified source abstraction).
4
+ * There is no special renderer per source : every live source resolves
5
+ * `peerLabel → MediaStream` through the host viewer and paints it the same way.
6
+ *
7
+ * Resolution : prefer the reactive channel (`subscribePeerStream`, #3) so a node
8
+ * mounted BEFORE its peer connects re-renders on arrival ; fall back to the
9
+ * one-shot `resolvePeerStream` (#4 contract) ; no host resolver → stream-less
10
+ * box. Reading a stream is the ONLY side effect — the scene is never mutated
11
+ * (RC-ReadOnly).
12
+ *
13
+ * Geometry (RC-Geo) : the `<video>` fills `100%`/`100%` of the box the Tree's
14
+ * UniversalWrapper sized from the node's `x/y/width/height`. The geometry lives
15
+ * on the wrapper, NEVER on the video, so it is structurally impossible to force
16
+ * a full-viewport size ; `object-fit` is the scene-authored value.
17
+ *
18
+ * Ownership : the stream is owned by the viewer (#3). This component is a pure
19
+ * consumer — unmounting clears its own `srcObject` and stops NO track (a mirror
20
+ * must never tear a peer down for the on-air composite). */
21
+ export declare function LivePeerVideo({ peerLabel, objectFit, muted, }: {
22
+ peerLabel: string;
23
+ objectFit: string;
24
+ /** Audio playout hint. Always muted for now (broadcast audio is Pulsar-side). */
25
+ muted?: boolean;
26
+ }): import("react/jsx-runtime").JSX.Element;
27
+ //# sourceMappingURL=live-peer-video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-peer-video.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/live-peer-video.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;6DAmB6D;AAC7D,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,SAAS,EACT,KAAY,GACb,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,2CAyDA"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { useOptionalLumencastRuntime } from "../../overlay/runtime-context";
4
+ /** Shared LIVE peer-stream rendering (ADR 006 §3.3/§3.5) — the SINGLE srcObject
5
+ * path used by BOTH the `media` primitive's live mode (#4, keyed on `peerLabel`)
6
+ * AND the generic `meet.peer` source kind (the unified source abstraction).
7
+ * There is no special renderer per source : every live source resolves
8
+ * `peerLabel → MediaStream` through the host viewer and paints it the same way.
9
+ *
10
+ * Resolution : prefer the reactive channel (`subscribePeerStream`, #3) so a node
11
+ * mounted BEFORE its peer connects re-renders on arrival ; fall back to the
12
+ * one-shot `resolvePeerStream` (#4 contract) ; no host resolver → stream-less
13
+ * box. Reading a stream is the ONLY side effect — the scene is never mutated
14
+ * (RC-ReadOnly).
15
+ *
16
+ * Geometry (RC-Geo) : the `<video>` fills `100%`/`100%` of the box the Tree's
17
+ * UniversalWrapper sized from the node's `x/y/width/height`. The geometry lives
18
+ * on the wrapper, NEVER on the video, so it is structurally impossible to force
19
+ * a full-viewport size ; `object-fit` is the scene-authored value.
20
+ *
21
+ * Ownership : the stream is owned by the viewer (#3). This component is a pure
22
+ * consumer — unmounting clears its own `srcObject` and stops NO track (a mirror
23
+ * must never tear a peer down for the on-air composite). */
24
+ export function LivePeerVideo({ peerLabel, objectFit, muted = true, }) {
25
+ const runtime = useOptionalLumencastRuntime();
26
+ const resolvePeerStream = runtime?.resolvePeerStream;
27
+ const subscribePeerStream = runtime?.subscribePeerStream;
28
+ const videoRef = useRef(null);
29
+ const [stream, setStream] = useState(null);
30
+ useEffect(() => {
31
+ if (subscribePeerStream !== undefined) {
32
+ return subscribePeerStream(peerLabel, setStream);
33
+ }
34
+ if (resolvePeerStream !== undefined) {
35
+ setStream(resolvePeerStream(peerLabel));
36
+ return;
37
+ }
38
+ setStream(null);
39
+ }, [peerLabel, resolvePeerStream, subscribePeerStream]);
40
+ // `srcObject` is not a serialisable attribute — attach imperatively. Never
41
+ // stop the tracks here (the viewer owns them).
42
+ useEffect(() => {
43
+ const el = videoRef.current;
44
+ if (el === null)
45
+ return;
46
+ el.srcObject = stream;
47
+ return () => {
48
+ if (el !== null)
49
+ el.srcObject = null;
50
+ };
51
+ }, [stream]);
52
+ if (stream === null) {
53
+ // Stream-less box of the wrapper geometry — transparent, inert, paints
54
+ // nothing. NOT an error : the peer can connect mid-show.
55
+ return (_jsx("div", { "aria-hidden": true, "data-lumencast-media-live": true, style: { width: "100%", height: "100%", opacity: 0, pointerEvents: "none" } }));
56
+ }
57
+ return (_jsx("video", { ref: videoRef, "data-lumencast-media-live": true, autoPlay: true, muted: muted, playsInline: true, style: {
58
+ width: "100%",
59
+ height: "100%",
60
+ objectFit: objectFit,
61
+ pointerEvents: "none",
62
+ } }));
63
+ }
64
+ //# sourceMappingURL=live-peer-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-peer-video.js","sourceRoot":"","sources":["../../../src/render/primitives/live-peer-video.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;6DAmB6D;AAC7D,MAAM,UAAU,aAAa,CAAC,EAC5B,SAAS,EACT,SAAS,EACT,KAAK,GAAG,IAAI,GAMb;IACC,MAAM,OAAO,GAAG,2BAA2B,EAAE,CAAC;IAC9C,MAAM,iBAAiB,GAAG,OAAO,EAAE,iBAAiB,CAAC;IACrD,MAAM,mBAAmB,GAAG,OAAO,EAAE,mBAAmB,CAAC;IAEzD,MAAM,QAAQ,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAC;IAE/D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,mBAAmB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACpC,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAExD,2EAA2E;IAC3E,+CAA+C;IAC/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC5B,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO;QACxB,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,IAAI,EAAE,KAAK,IAAI;gBAAE,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;QACvC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,uEAAuE;QACvE,yDAAyD;QACzD,OAAO,CACL,sEAGE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,GAC3E,CACH,CAAC;IACJ,CAAC;IAED,OAAO,CACL,gBACE,GAAG,EAAE,QAAQ,qCAEb,QAAQ,QACR,KAAK,EAAE,KAAK,EACZ,WAAW,QACX,KAAK,EAAE;YACL,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAA6C;YACxD,aAAa,EAAE,MAAM;SACtB,GACD,CACH,CAAC;AACJ,CAAC"}
@@ -1,15 +1,40 @@
1
1
  import type { PrimitiveProps } from "./index";
2
- /** Embedded video. `src`, `loop`, `mute`, `autoplay`. Audio is muted
3
- * by default broadcast audio is Pulsar-side, not from the browser
4
- * source.
5
- *
6
- * Security (Bastion, ADR 003) : `src` is the media primitive's sole
7
- * network sink (no `poster` / `<source>` / `<track>` are rendered). Like
8
- * every other asset leaf (image / image-fill / mask) it MUST pass
9
- * `gateSrc` BEFORE reaching the `<video>` otherwise a `kind:"media"`
10
- * node would make the headless Chromium of `zabrender` emit an
11
- * off-allowlist request (an SSRF surface). A rejected host/scheme omits
12
- * the source entirely (no passthrough), with an R9-clean diagnostic
13
- * ({ nodeId, field, reason } never the URL). */
2
+ /** Resolver injected by the consuming app (ADR 006 §3.3, #4). Maps a LOGICAL
3
+ * `peerLabel` (the `meet.peer.peer_label` carried by the scene) to the live
4
+ * `MediaStream` of that peer — supplied by the WebRTC viewer (issue #3). The
5
+ * stream is rendered in `srcObject` ; it NEVER enters the bundle or the content
6
+ * hash. Returns `null` when the peer is not (yet) connected → the node stays a
7
+ * stream-less box, no throw, no diagnostic (a peer can join mid-show). */
8
+ export type ResolvePeerStream = (peerLabel: string) => MediaStream | null;
9
+ /** Reactive variant (ADR 006 #3) : the viewer pushes a peer's stream when it
10
+ * connects and `null` when it leaves. The LIVE primitive prefers this over the
11
+ * one-shot resolver so a node that mounted BEFORE the peer connected re-renders
12
+ * on arrival (a peer joins mid-show). The listener is invoked immediately with
13
+ * the current value, then on every change ; the return value unsubscribes.
14
+ * Like `resolvePeerStream`, it is injected at mount — never the bundle. */
15
+ export type SubscribePeerStream = (peerLabel: string, listener: (stream: MediaStream | null) => void) => () => void;
16
+ /** Embedded video. Two source modes, picked by the node's props :
17
+ *
18
+ * - **BUNDLE** (`src`, the original mode) : a `<video src>` of a bundled /
19
+ * gated URL. Audio muted by default (broadcast audio is Pulsar-side). `src`
20
+ * is the sole network sink and MUST pass `gateSrc` before reaching the
21
+ * `<video>` (Bastion, ADR 003 — an off-allowlist request is an SSRF surface
22
+ * in headless `zabrender`). A rejected host/scheme omits the source.
23
+ *
24
+ * - **LIVE** (`peerLabel`, ADR 006 #4) : the source is a `meet.peer`'s
25
+ * `peer_label`. The runtime resolves the peer's `MediaStream` through a
26
+ * host-provided resolver (`resolvePeerStream`, injected at mount — NOT the
27
+ * bundle, like `resolveCaptureDevice`) and renders it imperatively via
28
+ * `<video>.srcObject` in real time. No URL, no `gateSrc` (a `MediaStream`
29
+ * is not a network sink). An absent resolver or an unconnected peer leaves a
30
+ * stream-less box — no throw, no diagnostic (peers join mid-show).
31
+ *
32
+ * `peerLabel` takes precedence when present (a live node), else `src` (bundle).
33
+ *
34
+ * Geometry is read-only (ADR 006 A1.6) : the node's `x/y/width/height` are
35
+ * applied by the Tree's UniversalWrapper around this primitive ; the `<video>`
36
+ * fills that box (`100%`/`100%`) with the scene-authored `object-fit`. The
37
+ * primitive NEVER forces full-screen and NEVER writes any geometry back — it
38
+ * only reads `resolved`. */
14
39
  export declare function Media({ resolved, nodeId }: PrimitiveProps): import("react/jsx-runtime").JSX.Element | null;
15
40
  //# sourceMappingURL=media.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/media.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAG9C;;;;;;;;;;;mDAWmD;AACnD,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,cAAc,kDAuBzD"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/render/primitives/media.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C;;;;;2EAK2E;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW,GAAG,IAAI,CAAC;AAE1E;;;;;4EAK4E;AAC5E,MAAM,MAAM,mBAAmB,GAAG,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,KAC3C,MAAM,IAAI,CAAC;AAEhB;;;;;;;;;;;;;;;;;;;;;;6BAsB6B;AAC7B,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,cAAc,kDA8BzD"}