@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/animate/keyframes.js +8 -1
- package/dist/animate/keyframes.js.map +1 -1
- package/dist/app.d.ts +9 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +4 -1
- package/dist/app.js.map +1 -1
- package/dist/{broadcast-Gcd-dmC7.js → broadcast-L5wm2I6J.js} +3 -3
- package/dist/{broadcast-Gcd-dmC7.js.map → broadcast-L5wm2I6J.js.map} +1 -1
- package/dist/{control-C5TfClga.js → control-eEUG7unp.js} +4 -4
- package/dist/{control-C5TfClga.js.map → control-eEUG7unp.js.map} +1 -1
- package/dist/index-Clrya_9l.js +1281 -0
- package/dist/index-Clrya_9l.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.html +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/lumencast.js +17 -12
- package/dist/mount.d.ts.map +1 -1
- package/dist/mount.js +16 -0
- package/dist/mount.js.map +1 -1
- package/dist/overlay/runtime-context.d.ts +21 -0
- package/dist/overlay/runtime-context.d.ts.map +1 -1
- package/dist/overlay/runtime-context.js +8 -0
- package/dist/overlay/runtime-context.js.map +1 -1
- package/dist/render/bundle.d.ts +1 -1
- package/dist/render/bundle.d.ts.map +1 -1
- package/dist/render/bundle.js +4 -0
- package/dist/render/bundle.js.map +1 -1
- package/dist/render/keyframe-player.d.ts.map +1 -1
- package/dist/render/keyframe-player.js +15 -1
- package/dist/render/keyframe-player.js.map +1 -1
- package/dist/render/primitives/capture.d.ts +49 -0
- package/dist/render/primitives/capture.d.ts.map +1 -0
- package/dist/render/primitives/capture.js +203 -0
- package/dist/render/primitives/capture.js.map +1 -0
- package/dist/render/primitives/index.d.ts.map +1 -1
- package/dist/render/primitives/index.js +7 -0
- package/dist/render/primitives/index.js.map +1 -1
- package/dist/render/primitives/live-peer-video.d.ts +27 -0
- package/dist/render/primitives/live-peer-video.d.ts.map +1 -0
- package/dist/render/primitives/live-peer-video.js +64 -0
- package/dist/render/primitives/live-peer-video.js.map +1 -0
- package/dist/render/primitives/media.d.ts +37 -12
- package/dist/render/primitives/media.d.ts.map +1 -1
- package/dist/render/primitives/media.js +43 -17
- package/dist/render/primitives/media.js.map +1 -1
- package/dist/render/primitives/meet-peer.d.ts +31 -0
- package/dist/render/primitives/meet-peer.d.ts.map +1 -0
- package/dist/render/primitives/meet-peer.js +46 -0
- package/dist/render/primitives/meet-peer.js.map +1 -0
- package/dist/render/prop-allowlist.d.ts.map +1 -1
- package/dist/render/prop-allowlist.js +32 -1
- package/dist/render/prop-allowlist.js.map +1 -1
- package/dist/render/tree.js +42 -8
- package/dist/render/tree.js.map +1 -1
- package/dist/{status-pill-BaLQoIDl.js → status-pill-elORkMrh.js} +2 -2
- package/dist/{status-pill-BaLQoIDl.js.map → status-pill-elORkMrh.js.map} +1 -1
- package/dist/{test-CA30C2By.js → test-7q_KJkdX.js} +4 -4
- package/dist/{test-CA30C2By.js.map → test-7q_KJkdX.js.map} +1 -1
- package/dist/{tree-1coZ32nd.js → tree-BMxx5170.js} +773 -604
- package/dist/tree-BMxx5170.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/webrtc/index.d.ts +76 -0
- package/dist/webrtc/index.d.ts.map +1 -0
- package/dist/webrtc/index.js +180 -0
- package/dist/webrtc/index.js.map +1 -0
- package/dist/webrtc/meet-viewer.d.ts +139 -0
- package/dist/webrtc/meet-viewer.d.ts.map +1 -0
- package/dist/webrtc/meet-viewer.js +379 -0
- package/dist/webrtc/meet-viewer.js.map +1 -0
- package/dist/webrtc/peer-stream-registry.d.ts +21 -0
- package/dist/webrtc/peer-stream-registry.d.ts.map +1 -0
- package/dist/webrtc/peer-stream-registry.js +77 -0
- package/dist/webrtc/peer-stream-registry.js.map +1 -0
- package/package.json +4 -4
- package/src/animate/keyframes.ts +8 -1
- package/src/app.tsx +14 -0
- package/src/index.ts +40 -0
- package/src/mount.ts +16 -0
- package/src/overlay/runtime-context.tsx +24 -0
- package/src/render/bundle.ts +19 -1
- package/src/render/keyframe-player.tsx +14 -1
- package/src/render/primitives/capture.tsx +255 -0
- package/src/render/primitives/index.ts +7 -0
- package/src/render/primitives/live-peer-video.tsx +90 -0
- package/src/render/primitives/media.tsx +66 -17
- package/src/render/primitives/meet-peer.tsx +57 -0
- package/src/render/prop-allowlist.ts +32 -1
- package/src/render/tree.tsx +44 -8
- package/src/types.ts +23 -0
- package/src/webrtc/index.ts +252 -0
- package/src/webrtc/meet-viewer.ts +497 -0
- package/src/webrtc/peer-stream-registry.ts +93 -0
- package/dist/index-N-VqrIxN.js +0 -885
- package/dist/index-N-VqrIxN.js.map +0 -1
- 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;
|
|
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;
|
|
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"}
|
package/dist/render/bundle.d.ts
CHANGED
|
@@ -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":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,OAAO,GACP,MAAM,GACN,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/render/bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/render/bundle.js
CHANGED
|
@@ -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":"AAAA,8EAA8E;AAC9E,EAAE;AACF,oEAAoE;AACpE,0EAA0E;AAC1E,8EAA8E;AAC9E,EAAE;AACF,6EAA6E;AAC7E,iFAAiF;AACjF,8EAA8E;AAC9E,0EAA0E;AAC1E,yEAAyE;AACzE,mDAAmD;
|
|
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,
|
|
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, {
|
|
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,
|
|
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;
|
|
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;
|
|
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
|
-
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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;
|
|
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"}
|