@lumencast/runtime 0.10.0 → 0.12.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 (59) hide show
  1. package/README.md +39 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/{broadcast-L5wm2I6J.js → broadcast-ydSpPUje.js} +3 -3
  4. package/dist/{broadcast-L5wm2I6J.js.map → broadcast-ydSpPUje.js.map} +1 -1
  5. package/dist/{control-eEUG7unp.js → control-zTsF-bHP.js} +4 -4
  6. package/dist/{control-eEUG7unp.js.map → control-zTsF-bHP.js.map} +1 -1
  7. package/dist/{index-Clrya_9l.js → index-ClWi5UzJ.js} +422 -341
  8. package/dist/index-ClWi5UzJ.js.map +1 -0
  9. package/dist/index.d.ts +2 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.html +1 -1
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/lumencast.js +22 -18
  15. package/dist/mount.d.ts.map +1 -1
  16. package/dist/mount.js +63 -0
  17. package/dist/mount.js.map +1 -1
  18. package/dist/render/primitives/index.d.ts.map +1 -1
  19. package/dist/render/primitives/index.js +6 -0
  20. package/dist/render/primitives/index.js.map +1 -1
  21. package/dist/render/primitives/meet-peer-slot.d.ts +29 -0
  22. package/dist/render/primitives/meet-peer-slot.d.ts.map +1 -0
  23. package/dist/render/primitives/meet-peer-slot.js +46 -0
  24. package/dist/render/primitives/meet-peer-slot.js.map +1 -0
  25. package/dist/state/reserved-leaves.d.ts +37 -0
  26. package/dist/state/reserved-leaves.d.ts.map +1 -0
  27. package/dist/state/reserved-leaves.js +96 -0
  28. package/dist/state/reserved-leaves.js.map +1 -0
  29. package/dist/{status-pill-elORkMrh.js → status-pill-DkHIOL5V.js} +2 -2
  30. package/dist/{status-pill-elORkMrh.js.map → status-pill-DkHIOL5V.js.map} +1 -1
  31. package/dist/{test-7q_KJkdX.js → test-COpMkyms.js} +4 -4
  32. package/dist/{test-7q_KJkdX.js.map → test-COpMkyms.js.map} +1 -1
  33. package/dist/transport/ws.d.ts +4 -1
  34. package/dist/transport/ws.d.ts.map +1 -1
  35. package/dist/transport/ws.js +7 -0
  36. package/dist/transport/ws.js.map +1 -1
  37. package/dist/{tree-BMxx5170.js → tree-Cubmxeqo.js} +213 -197
  38. package/dist/tree-Cubmxeqo.js.map +1 -0
  39. package/dist/types.d.ts +30 -2
  40. package/dist/types.d.ts.map +1 -1
  41. package/dist/webrtc/index.d.ts +1 -1
  42. package/dist/webrtc/index.d.ts.map +1 -1
  43. package/dist/webrtc/index.js.map +1 -1
  44. package/dist/webrtc/peer-stream-registry.d.ts +17 -0
  45. package/dist/webrtc/peer-stream-registry.d.ts.map +1 -1
  46. package/dist/webrtc/peer-stream-registry.js +22 -0
  47. package/dist/webrtc/peer-stream-registry.js.map +1 -1
  48. package/package.json +4 -4
  49. package/src/index.ts +13 -0
  50. package/src/mount.ts +66 -0
  51. package/src/render/primitives/index.ts +6 -0
  52. package/src/render/primitives/meet-peer-slot.tsx +55 -0
  53. package/src/state/reserved-leaves.ts +121 -0
  54. package/src/transport/ws.ts +11 -0
  55. package/src/types.ts +30 -2
  56. package/src/webrtc/index.ts +1 -0
  57. package/src/webrtc/peer-stream-registry.ts +38 -0
  58. package/dist/index-Clrya_9l.js.map +0 -1
  59. package/dist/tree-BMxx5170.js.map +0 -1
@@ -1,86 +1,86 @@
1
- import { batch as T, signal as v } from "@preact/signals-react";
2
- import { createRoot as q } from "react-dom/client";
3
- import { createContext as te, useContext as W, lazy as E, Suspense as se, createElement as ne, StrictMode as re } from "react";
4
- import { jsx as m } from "react/jsx-runtime";
5
- import { useSignals as ie } from "@preact/signals-react/runtime";
6
- import { AnimatePresence as oe, motion as ae } from "framer-motion";
7
- import { SequenceTracker as ce, encodeFrame as O, input as le, WS_SUBPROTOCOLS as ue, WS_SUBPROTOCOL_V1_1 as de, subscribe as he, decodeServerFrame as fe, LumencastError as L } from "@lumencast/protocol";
8
- const I = te(null);
9
- function z({
1
+ import { batch as I, signal as S } from "@preact/signals-react";
2
+ import { createRoot as X } from "react-dom/client";
3
+ import { createContext as ce, useContext as K, lazy as O, Suspense as le, createElement as ue, StrictMode as de } from "react";
4
+ import { jsx as p } from "react/jsx-runtime";
5
+ import { useSignals as fe } from "@preact/signals-react/runtime";
6
+ import { AnimatePresence as he, motion as me } from "framer-motion";
7
+ import { SequenceTracker as pe, encodeFrame as x, input as ge, WS_SUBPROTOCOLS as ve, WS_SUBPROTOCOL_V1_1 as we, subscribe as ye, decodeServerFrame as be, LumencastError as j } from "@lumencast/protocol";
8
+ const P = ce(null);
9
+ function J({
10
10
  value: t,
11
11
  children: e
12
12
  }) {
13
- return /* @__PURE__ */ m(I.Provider, { value: t, children: e });
13
+ return /* @__PURE__ */ p(P.Provider, { value: t, children: e });
14
14
  }
15
- function at() {
16
- const t = W(I);
15
+ function gt() {
16
+ const t = K(P);
17
17
  if (!t)
18
18
  throw new Error(
19
19
  "Lumencast overlay components must be rendered inside LumencastRuntimeProvider"
20
20
  );
21
21
  return t;
22
22
  }
23
- function ct() {
24
- return W(I);
23
+ function vt() {
24
+ return K(P);
25
25
  }
26
- const me = E(
27
- () => import("./broadcast-L5wm2I6J.js").then((t) => ({ default: t.BroadcastMode }))
28
- ), pe = E(
29
- () => import("./control-eEUG7unp.js").then((t) => ({ default: t.ControlMode }))
30
- ), ge = E(() => import("./test-7q_KJkdX.js").then((t) => ({ default: t.TestMode })));
31
- function ve({
26
+ const Se = O(
27
+ () => import("./broadcast-ydSpPUje.js").then((t) => ({ default: t.BroadcastMode }))
28
+ ), ke = O(
29
+ () => import("./control-zTsF-bHP.js").then((t) => ({ default: t.ControlMode }))
30
+ ), Te = O(() => import("./test-COpMkyms.js").then((t) => ({ default: t.TestMode })));
31
+ function _e({
32
32
  mode: t,
33
33
  store: e,
34
34
  bundleSignal: s,
35
35
  statusSignal: n,
36
36
  crossfadeKeySignal: r,
37
- sendInput: o,
37
+ sendInput: i,
38
38
  resolveCaptureDevice: a,
39
- resolvePeerStream: i,
40
- subscribePeerStream: l
39
+ resolvePeerStream: o,
40
+ subscribePeerStream: c
41
41
  }) {
42
- ie();
43
- const c = s.value, d = n.value, h = r.value;
44
- if (!c) return null;
45
- const w = t === "broadcast" ? me : t === "control" ? pe : ge;
46
- return /* @__PURE__ */ m(oe, { mode: "sync", children: /* @__PURE__ */ m(
47
- ae.div,
42
+ fe();
43
+ const l = s.value, d = n.value, h = r.value;
44
+ if (!l) return null;
45
+ const _ = t === "broadcast" ? Se : t === "control" ? ke : Te;
46
+ return /* @__PURE__ */ p(he, { mode: "sync", children: /* @__PURE__ */ p(
47
+ me.div,
48
48
  {
49
49
  initial: { opacity: 0 },
50
50
  animate: { opacity: 1 },
51
51
  exit: { opacity: 0 },
52
52
  transition: { duration: 0.4, ease: "easeInOut" },
53
53
  style: { position: "absolute", inset: 0 },
54
- children: /* @__PURE__ */ m(
55
- z,
54
+ children: /* @__PURE__ */ p(
55
+ J,
56
56
  {
57
57
  value: {
58
58
  mode: t,
59
59
  store: e,
60
- bundle: c,
60
+ bundle: l,
61
61
  status: d,
62
- sendInput: o,
62
+ sendInput: i,
63
63
  ...a !== void 0 ? { resolveCaptureDevice: a } : {},
64
- ...i !== void 0 ? { resolvePeerStream: i } : {},
65
- ...l !== void 0 ? { subscribePeerStream: l } : {}
64
+ ...o !== void 0 ? { resolvePeerStream: o } : {},
65
+ ...c !== void 0 ? { subscribePeerStream: c } : {}
66
66
  },
67
- children: /* @__PURE__ */ m(se, { fallback: null, children: /* @__PURE__ */ m(w, {}) })
67
+ children: /* @__PURE__ */ p(le, { fallback: null, children: /* @__PURE__ */ p(_, {}) })
68
68
  }
69
69
  )
70
70
  },
71
71
  h
72
72
  ) });
73
73
  }
74
- const we = "<anon>", b = /* @__PURE__ */ new Set();
75
- function B(t) {
76
- return b.add(t), () => {
77
- b.delete(t);
74
+ const Ee = "<anon>", T = /* @__PURE__ */ new Set();
75
+ function Y(t) {
76
+ return T.add(t), () => {
77
+ T.delete(t);
78
78
  };
79
79
  }
80
- function H(t, e, s) {
81
- const n = { nodeId: t ?? we, field: e, reason: s };
82
- if (b.size > 0) {
83
- for (const r of b)
80
+ function Z(t, e, s) {
81
+ const n = { nodeId: t ?? Ee, field: e, reason: s };
82
+ if (T.size > 0) {
83
+ for (const r of T)
84
84
  try {
85
85
  r(n);
86
86
  } catch {
@@ -88,41 +88,41 @@ function H(t, e, s) {
88
88
  return;
89
89
  }
90
90
  }
91
- const ye = 100, be = 4, ke = 64, Se = {
92
- blur: ye,
93
- brightness: be
91
+ const Re = 100, Ie = 4, Ae = 64, Oe = {
92
+ blur: Re,
93
+ brightness: Ie
94
94
  };
95
- function M(t, e) {
95
+ function D(t, e) {
96
96
  if (typeof e != "number" || !Number.isFinite(e) || e < 0 || Object.is(e, -0)) return null;
97
- const s = Se[t];
97
+ const s = Oe[t];
98
98
  return e > s ? s : e;
99
99
  }
100
- const Te = /^blur\((\d{1,7}(?:\.\d{1,4})?)px\) brightness\((\d{1,7}(?:\.\d{1,4})?)\)$/, lt = "blur(0px) brightness(1)";
101
- function Ee(t) {
102
- if (typeof t != "string" || t.length === 0 || t.length > ke) return null;
103
- const e = Te.exec(t);
100
+ const Pe = /^blur\((\d{1,7}(?:\.\d{1,4})?)px\) brightness\((\d{1,7}(?:\.\d{1,4})?)\)$/, wt = "blur(0px) brightness(1)";
101
+ function Le(t) {
102
+ if (typeof t != "string" || t.length === 0 || t.length > Ae) return null;
103
+ const e = Pe.exec(t);
104
104
  if (!e) return null;
105
- const s = M("blur", Number(e[1])), n = M("brightness", Number(e[2]));
105
+ const s = D("blur", Number(e[1])), n = D("brightness", Number(e[2]));
106
106
  return s === null || n === null ? null : `blur(${s}px) brightness(${n})`;
107
107
  }
108
- function Ie(t, e) {
109
- H(
108
+ function Me(t, e) {
109
+ Z(
110
110
  e,
111
111
  t,
112
112
  "rejected unsafe filter value : outside the R8 caps or not a finite number >= 0"
113
113
  );
114
114
  }
115
- const _e = { duration: 0 }, Re = {
115
+ const Ce = { duration: 0 }, Ne = {
116
116
  linear: "linear",
117
117
  "cubic-in": "easeIn",
118
118
  "cubic-out": "easeOut",
119
119
  "cubic-in-out": "easeInOut"
120
120
  };
121
- function ut(t) {
122
- return !t || t.kind === "none" ? _e : t.kind === "tween" ? {
121
+ function yt(t) {
122
+ return !t || t.kind === "none" ? Ce : t.kind === "tween" ? {
123
123
  type: "tween",
124
124
  duration: (t.duration_ms ?? 0) / 1e3,
125
- ease: t.ease ? Re[t.ease] ?? "easeOut" : "easeOut"
125
+ ease: t.ease ? Ne[t.ease] ?? "easeOut" : "easeOut"
126
126
  } : t.kind === "spring" ? {
127
127
  type: "spring",
128
128
  ...t.stiffness !== void 0 ? { stiffness: t.stiffness } : {},
@@ -134,7 +134,7 @@ function ut(t) {
134
134
  ease: "easeInOut"
135
135
  };
136
136
  }
137
- const Ae = {
137
+ const xe = {
138
138
  opacity: 1,
139
139
  scale: 1,
140
140
  scaleX: 1,
@@ -146,12 +146,12 @@ const Ae = {
146
146
  // framer interpolates between structurally-identical filter lists
147
147
  // (the compiler emits the same two-function form, clamped per R8).
148
148
  filter: "blur(0px) brightness(1)"
149
- }, Pe = {
149
+ }, je = {
150
150
  kind: "tween",
151
151
  duration_ms: 400,
152
152
  ease: "cubic-out"
153
153
  };
154
- function dt(t, e, s) {
154
+ function bt(t, e, s) {
155
155
  for (const n of e) {
156
156
  const r = t(n);
157
157
  if (r !== void 0) return r;
@@ -161,29 +161,29 @@ function dt(t, e, s) {
161
161
  const r = t(n);
162
162
  if (r !== void 0) return r;
163
163
  }
164
- return Pe;
164
+ return je;
165
165
  }
166
166
  }
167
- function ht(t, e, s) {
167
+ function St(t, e, s) {
168
168
  if (!e || Object.keys(e).length === 0)
169
169
  return { initial: t, animate: t };
170
170
  let n = e;
171
171
  if (e.filter !== void 0) {
172
- const o = Ee(e.filter);
173
- n = { ...e }, o === null ? (Ie("animate_initial.filter", s), delete n.filter) : n.filter = o;
172
+ const i = Le(e.filter);
173
+ n = { ...e }, i === null ? (Me("animate_initial.filter", s), delete n.filter) : n.filter = i;
174
174
  }
175
175
  const r = { ...t };
176
- for (const o of Object.keys(n))
177
- o in r || (r[o] = Ae[o] ?? 0);
176
+ for (const i of Object.keys(n))
177
+ i in r || (r[i] = xe[i] ?? 0);
178
178
  return { initial: n, animate: r };
179
179
  }
180
- function Oe(t) {
180
+ function De(t) {
181
181
  if (typeof t != "object" || t === null) return;
182
182
  const e = t, s = e.kind;
183
183
  if (s === "snap")
184
184
  return { kind: "none" };
185
185
  if (s === "tween") {
186
- const n = typeof e.duration_ms == "number" ? e.duration_ms : 0, r = Le[e.easing] ?? "cubic-out";
186
+ const n = typeof e.duration_ms == "number" ? e.duration_ms : 0, r = Ue[e.easing] ?? "cubic-out";
187
187
  return { kind: "tween", duration_ms: n, ease: r };
188
188
  }
189
189
  if (s === "spring") {
@@ -191,53 +191,95 @@ function Oe(t) {
191
191
  return typeof e.stiffness == "number" && (n.stiffness = e.stiffness), typeof e.damping == "number" && (n.damping = e.damping), typeof e.mass == "number" && (n.mass = e.mass), n;
192
192
  }
193
193
  }
194
- const Le = {
194
+ const Ue = {
195
195
  linear: "linear",
196
196
  "ease-in": "cubic-in",
197
197
  "ease-out": "cubic-out",
198
198
  "ease-in-out": "cubic-in-out"
199
199
  };
200
- function Me(t, e) {
201
- T(() => {
200
+ function $e(t, e) {
201
+ I(() => {
202
202
  for (const s of e.patches) {
203
- const n = Oe(s.transition);
203
+ const n = De(s.transition);
204
204
  n !== void 0 ? t.setWithTransition(s.path, s.value, n) : t.set(s.path, s.value);
205
205
  }
206
206
  });
207
207
  }
208
- function Ce(t, e) {
208
+ function Fe(t, e) {
209
209
  t.reset(e.state);
210
210
  }
211
- class Ne {
211
+ const kt = "__cam.", A = "__cam.slots.", Q = "__cam.viewer";
212
+ function U(t) {
213
+ return t === Q || t.startsWith(A);
214
+ }
215
+ function We(t) {
216
+ const e = {};
217
+ let s;
218
+ for (const [n, r] of t)
219
+ if (n === Q)
220
+ r != null && (s = r);
221
+ else if (n.startsWith(A)) {
222
+ const i = n.slice(A.length);
223
+ i !== "" && typeof r == "string" && r !== "" && (e[i] = r);
224
+ }
225
+ return s !== void 0 ? { viewer: s, slots: e } : { slots: e };
226
+ }
227
+ function $(t) {
228
+ const e = Object.keys(t.slots).sort().map((n) => `${n}=${t.slots[n]}`).join("&"), s = t.viewer === void 0 ? "" : JSON.stringify(t.viewer);
229
+ return `${e}|${s}`;
230
+ }
231
+ function qe(t) {
232
+ const e = /* @__PURE__ */ new Map();
233
+ let s = $({ slots: {} });
234
+ const n = () => {
235
+ const r = We(e), i = $(r);
236
+ i !== s && (s = i, t(r));
237
+ };
238
+ return {
239
+ onSnapshot(r) {
240
+ e.clear();
241
+ for (const [i, a] of Object.entries(r))
242
+ U(i) && e.set(i, a);
243
+ n();
244
+ },
245
+ onDelta(r) {
246
+ let i = !1;
247
+ for (const a of r)
248
+ U(a.path) && (e.set(a.path, a.value), i = !0);
249
+ i && n();
250
+ }
251
+ };
252
+ }
253
+ class ze {
212
254
  signals = /* @__PURE__ */ new Map();
213
255
  transitions = /* @__PURE__ */ new Map();
214
256
  signal(e) {
215
257
  let s = this.signals.get(e);
216
- return s || (s = v(void 0), this.signals.set(e, s)), s;
258
+ return s || (s = S(void 0), this.signals.set(e, s)), s;
217
259
  }
218
260
  transitionSignal(e) {
219
261
  let s = this.transitions.get(e);
220
- return s || (s = v(void 0), this.transitions.set(e, s)), s;
262
+ return s || (s = S(void 0), this.transitions.set(e, s)), s;
221
263
  }
222
264
  set(e, s) {
223
265
  const n = this.signal(e);
224
- S(n.peek(), s) || (n.value = s);
266
+ R(n.peek(), s) || (n.value = s);
225
267
  }
226
268
  setWithTransition(e, s, n) {
227
- T(() => {
269
+ I(() => {
228
270
  const r = this.transitionSignal(e);
229
271
  r.peek() !== n && (r.value = n);
230
- const o = this.signal(e);
231
- S(o.peek(), s) || (o.value = s);
272
+ const i = this.signal(e);
273
+ R(i.peek(), s) || (i.value = s);
232
274
  });
233
275
  }
234
276
  reset(e) {
235
- T(() => {
277
+ I(() => {
236
278
  const s = /* @__PURE__ */ new Set();
237
279
  for (const [n, r] of Object.entries(e)) {
238
280
  s.add(n);
239
- const o = this.signal(n);
240
- S(o.peek(), r) || (o.value = r);
281
+ const i = this.signal(n);
282
+ R(i.peek(), r) || (i.value = r);
241
283
  const a = this.transitions.get(n);
242
284
  a && a.peek() !== void 0 && (a.value = void 0);
243
285
  }
@@ -255,10 +297,10 @@ class Ne {
255
297
  return e;
256
298
  }
257
299
  }
258
- function G() {
259
- return new Ne();
300
+ function ee() {
301
+ return new ze();
260
302
  }
261
- function S(t, e) {
303
+ function R(t, e) {
262
304
  if (t === e) return !0;
263
305
  if (t === null || e === null || typeof t != typeof e || typeof t != "object" || Array.isArray(t) !== Array.isArray(e)) return !1;
264
306
  if (Array.isArray(t) && Array.isArray(e)) {
@@ -267,26 +309,26 @@ function S(t, e) {
267
309
  if (t[a] !== e[a]) return !1;
268
310
  return !0;
269
311
  }
270
- const s = t, n = e, r = Object.keys(s), o = Object.keys(n);
271
- if (r.length !== o.length) return !1;
312
+ const s = t, n = e, r = Object.keys(s), i = Object.keys(n);
313
+ if (r.length !== i.length) return !1;
272
314
  for (const a of r)
273
315
  if (s[a] !== n[a]) return !1;
274
316
  return !0;
275
317
  }
276
- const xe = /* @__PURE__ */ new Set([
318
+ const Be = /* @__PURE__ */ new Set([
277
319
  "x-lumencast.color-srgb-1.0",
278
320
  // RFC-0001 / ADR 004 — this runtime ships the Zab capture plugin, so a
279
321
  // bundle declaring `x-zab.capture/1` in `profiles[]` is compatible (it is
280
322
  // NOT rejected as BUNDLE_INCOMPATIBLE, §17.3.1).
281
323
  "x-zab.capture/1"
282
- ]), je = /^x-[a-z0-9-]+(?:\.[a-z0-9-]+)*$/, De = /^(?:0|[1-9][0-9]*)$/, C = ".authoring";
283
- function Ue(t) {
324
+ ]), He = /^x-[a-z0-9-]+(?:\.[a-z0-9-]+)*$/, Ge = /^(?:0|[1-9][0-9]*)$/, F = ".authoring";
325
+ function Ve(t) {
284
326
  const e = t.indexOf("/");
285
327
  if (e < 0) return !1;
286
328
  const s = t.slice(0, e), n = t.slice(e + 1);
287
- return !De.test(n) || !s.endsWith(C) ? !1 : je.test(s.slice(0, -C.length));
329
+ return !Ge.test(n) || !s.endsWith(F) ? !1 : He.test(s.slice(0, -F.length));
288
330
  }
289
- class N extends Error {
331
+ class W extends Error {
290
332
  code = "BUNDLE_INCOMPATIBLE";
291
333
  unsupportedProfiles;
292
334
  constructor(e) {
@@ -297,17 +339,17 @@ class N extends Error {
297
339
  ), this.name = "BundleIncompatibleError", this.unsupportedProfiles = e;
298
340
  }
299
341
  }
300
- function x(t, e = xe) {
342
+ function q(t, e = Be) {
301
343
  const s = t.profiles;
302
344
  if (!s) return;
303
345
  if (!Array.isArray(s))
304
- throw new N(["<malformed: profiles is not an array>"]);
346
+ throw new W(["<malformed: profiles is not an array>"]);
305
347
  if (s.length === 0) return;
306
- const n = s.filter((r) => typeof r != "string" || !Ue(r) && !e.has(r)).map((r) => typeof r == "string" ? r : "<malformed: non-string profile entry>");
348
+ const n = s.filter((r) => typeof r != "string" || !Ve(r) && !e.has(r)).map((r) => typeof r == "string" ? r : "<malformed: non-string profile entry>");
307
349
  if (n.length > 0)
308
- throw new N(n);
350
+ throw new W(n);
309
351
  }
310
- class $e {
352
+ class Xe {
311
353
  cache = /* @__PURE__ */ new Map();
312
354
  baseUrl;
313
355
  pathPrefix;
@@ -330,32 +372,32 @@ class $e {
330
372
  return this.resolveUrl ? this.resolveUrl(e, s) : `${this.baseUrl}${this.pathPrefix}/${encodeURIComponent(e)}/bundle?v=${encodeURIComponent(s)}`;
331
373
  }
332
374
  preload(e) {
333
- x(e), this.cache.set(e.scene_version, e);
375
+ q(e), this.cache.set(e.scene_version, e);
334
376
  }
335
377
  async get(e, s) {
336
378
  const n = this.cache.get(s);
337
379
  if (n) return n;
338
- const r = this.buildUrl(e, s), o = await this.buildInit(), a = o ? await this.fetchImpl(r, o) : await this.fetchImpl(r);
380
+ const r = this.buildUrl(e, s), i = await this.buildInit(), a = i ? await this.fetchImpl(r, i) : await this.fetchImpl(r);
339
381
  if (!a.ok)
340
382
  throw new Error(`bundle fetch failed: ${a.status} ${a.statusText}`);
341
- const i = await a.json();
342
- if (i.scene_version !== s)
383
+ const o = await a.json();
384
+ if (o.scene_version !== s)
343
385
  throw new Error(
344
- `bundle scene_version mismatch: expected ${s}, got ${i.scene_version}`
386
+ `bundle scene_version mismatch: expected ${s}, got ${o.scene_version}`
345
387
  );
346
- return x(i), this.cache.set(s, i), i;
388
+ return q(o), this.cache.set(s, o), o;
347
389
  }
348
390
  }
349
- function Fe(t) {
350
- return new $e(t);
391
+ function Ke(t) {
392
+ return new Xe(t);
351
393
  }
352
- const y = {
394
+ const k = {
353
395
  initial: 200,
354
396
  max: 5e3,
355
397
  factor: 2,
356
398
  jitter: 0.2
357
399
  };
358
- class qe {
400
+ class Je {
359
401
  constructor(e, s) {
360
402
  this.opts = e, this.random = s;
361
403
  }
@@ -379,20 +421,20 @@ class qe {
379
421
  this._attempt = 0;
380
422
  }
381
423
  }
382
- function We(t = {}) {
424
+ function Ye(t = {}) {
383
425
  const e = {
384
- initial: t.initial ?? y.initial,
385
- max: t.max ?? y.max,
386
- factor: t.factor ?? y.factor,
387
- jitter: t.jitter ?? y.jitter
426
+ initial: t.initial ?? k.initial,
427
+ max: t.max ?? k.max,
428
+ factor: t.factor ?? k.factor,
429
+ jitter: t.jitter ?? k.jitter
388
430
  };
389
431
  if (e.initial <= 0) throw new RangeError("initial must be > 0");
390
432
  if (e.max < e.initial) throw new RangeError("max must be >= initial");
391
433
  if (e.factor < 1) throw new RangeError("factor must be >= 1");
392
434
  if (e.jitter < 0 || e.jitter > 1) throw new RangeError("jitter must be within [0, 1]");
393
- return new qe(e, t.random ?? Math.random);
435
+ return new Je(e, t.random ?? Math.random);
394
436
  }
395
- class p extends Error {
437
+ class g extends Error {
396
438
  recoverable;
397
439
  code;
398
440
  cause;
@@ -400,14 +442,14 @@ class p extends Error {
400
442
  super(e), this.name = "TransportError", this.recoverable = s, this.code = n, this.cause = r;
401
443
  }
402
444
  }
403
- class ze {
445
+ class Ze {
404
446
  status = "disconnected";
405
447
  socket = null;
406
448
  token;
407
449
  url;
408
450
  WebSocketCtor;
409
451
  schedule;
410
- seq = new ce();
452
+ seq = new pe();
411
453
  opts;
412
454
  scheduler;
413
455
  reconnectTimer = null;
@@ -419,7 +461,7 @@ class ze {
419
461
  throw new TypeError(
420
462
  "Lumencast WsClient: no WebSocket implementation found in this environment"
421
463
  );
422
- this.WebSocketCtor = s, this.schedule = We(e.reconnect), this.scheduler = e.scheduler ?? {
464
+ this.WebSocketCtor = s, this.schedule = Ye(e.reconnect), this.scheduler = e.scheduler ?? {
423
465
  setTimeout: globalThis.setTimeout.bind(globalThis),
424
466
  clearTimeout: globalThis.clearTimeout.bind(globalThis)
425
467
  };
@@ -433,11 +475,11 @@ class ze {
433
475
  * authenticate the render-bundle GET with the same credential. A
434
476
  * `LumencastTokenProvider` is awaited. */
435
477
  resolveCurrentToken() {
436
- return j(this.token);
478
+ return z(this.token);
437
479
  }
438
480
  /** Send `input` patches to the server. No-op if not connected. */
439
481
  sendInput(e) {
440
- !this.socket || this.socket.readyState !== this.WebSocketCtor.OPEN || e.length !== 0 && this.socket.send(O(le(e)));
482
+ !this.socket || this.socket.readyState !== this.WebSocketCtor.OPEN || e.length !== 0 && this.socket.send(x(ge(e)));
441
483
  }
442
484
  /** Replace the auth token. Closes and reopens with the new token. */
443
485
  setToken(e) {
@@ -453,10 +495,10 @@ class ze {
453
495
  this.setStatus("connecting");
454
496
  let e;
455
497
  try {
456
- e = await j(this.token);
498
+ e = await z(this.token);
457
499
  } catch (n) {
458
500
  this.opts.onTransportError?.(
459
- new p(
501
+ new g(
460
502
  `failed to resolve token: ${n.message}`,
461
503
  !0,
462
504
  "AUTH_DENIED",
@@ -468,10 +510,10 @@ class ze {
468
510
  if (!this.active) return;
469
511
  let s;
470
512
  try {
471
- s = new this.WebSocketCtor(this.url, [...ue]);
513
+ s = new this.WebSocketCtor(this.url, [...ve]);
472
514
  } catch (n) {
473
515
  this.opts.onTransportError?.(
474
- new p(
516
+ new g(
475
517
  `failed to open WebSocket: ${n.message}`,
476
518
  !0,
477
519
  "INTERNAL",
@@ -484,25 +526,25 @@ class ze {
484
526
  }
485
527
  handleOpen(e) {
486
528
  if (!this.socket) return;
487
- const n = this.socket.protocol === de && this.seq.last > 0, r = n ? this.seq.last : void 0;
529
+ const n = this.socket.protocol === we && this.seq.last > 0, r = n ? this.seq.last : void 0;
488
530
  n || this.seq.reset();
489
- const o = he({
531
+ const i = ye({
490
532
  token: e,
491
533
  ...this.opts.scene !== void 0 ? { scene: this.opts.scene } : {},
492
534
  ...this.opts.session !== void 0 ? { session: this.opts.session } : {},
493
535
  ...r !== void 0 ? { since_sequence: r } : {}
494
536
  });
495
- this.socket.send(O(o));
537
+ this.socket.send(x(i));
496
538
  }
497
539
  handleMessage(e) {
498
540
  const s = typeof e.data == "string" ? e.data : "";
499
541
  if (!s) return;
500
542
  let n;
501
543
  try {
502
- n = fe(s);
544
+ n = be(s);
503
545
  } catch (r) {
504
- const o = (r instanceof L, r.message), a = r instanceof L ? r.code : "INTERNAL";
505
- this.opts.onTransportError?.(new p(`codec: ${o}`, !0, a, r)), this.closeSocket(), this.scheduleReconnect();
546
+ const i = (r instanceof j, r.message), a = r instanceof j ? r.code : "INTERNAL";
547
+ this.opts.onTransportError?.(new g(`codec: ${i}`, !0, a, r)), this.closeSocket(), this.scheduleReconnect();
506
548
  return;
507
549
  }
508
550
  if (n !== null)
@@ -510,7 +552,7 @@ class ze {
510
552
  case "snapshot": {
511
553
  if (n.seq < 1) {
512
554
  this.opts.onTransportError?.(
513
- new p(`snapshot seq must be >= 1, got ${n.seq}`, !0, "VERSION_GAP")
555
+ new g(`snapshot seq must be >= 1, got ${n.seq}`, !0, "VERSION_GAP")
514
556
  ), this.closeSocket(), this.scheduleReconnect();
515
557
  return;
516
558
  }
@@ -521,7 +563,7 @@ class ze {
521
563
  const r = this.seq.observe(n.seq);
522
564
  if (r.kind === "gap") {
523
565
  this.opts.onTransportError?.(
524
- new p(
566
+ new g(
525
567
  `sequence gap: expected ${this.seq.last + 1}, got ${n.seq}`,
526
568
  !0,
527
569
  "VERSION_GAP"
@@ -541,6 +583,10 @@ class ze {
541
583
  this.opts.onServerError?.(n), n.recoverable || this.close();
542
584
  return;
543
585
  }
586
+ case "scene_roster": {
587
+ this.opts.onSceneRoster?.(n);
588
+ return;
589
+ }
544
590
  case "pong":
545
591
  return;
546
592
  }
@@ -554,7 +600,7 @@ class ze {
554
600
  }
555
601
  if (e.code === 4401 || e.code === 4403 || e.code === 1008) {
556
602
  this.opts.onTransportError?.(
557
- new p(`server closed: ${e.code} ${e.reason}`, !1, "AUTH_DENIED")
603
+ new g(`server closed: ${e.code} ${e.reason}`, !1, "AUTH_DENIED")
558
604
  ), this.close();
559
605
  return;
560
606
  }
@@ -584,10 +630,10 @@ class ze {
584
630
  this.status !== e && (this.status = e, this.opts.onStatus?.(e));
585
631
  }
586
632
  }
587
- async function j(t) {
633
+ async function z(t) {
588
634
  return typeof t == "string" ? t : await t.fetch();
589
635
  }
590
- function Be(t) {
636
+ function Qe(t) {
591
637
  if (!(t.target instanceof HTMLElement))
592
638
  throw new TypeError("mount: `target` must be an HTMLElement");
593
639
  if (typeof t.serverUrl != "string" || t.serverUrl.length === 0)
@@ -599,33 +645,33 @@ function Be(t) {
599
645
  throw new TypeError("mount: `scene` is required when mode === 'test'");
600
646
  }
601
647
  }
602
- function ft(t) {
603
- Be(t), t.onStatus?.("disconnected");
604
- const e = G(), s = Ge(t.serverUrl), n = Fe({
648
+ function Tt(t) {
649
+ Qe(t), t.onStatus?.("disconnected");
650
+ const e = ee(), s = tt(t.serverUrl), n = Ke({
605
651
  baseUrl: s,
606
652
  ...t.resolveBundleUrl !== void 0 ? { resolveUrl: t.resolveBundleUrl } : {},
607
- getAuthToken: () => h.resolveCurrentToken()
608
- }), r = v(null), o = v("disconnected"), a = v("__initial__"), i = (u) => {
609
- o.value = u, t.onStatus?.(u);
610
- }, l = (u) => {
653
+ getAuthToken: () => w.resolveCurrentToken()
654
+ }), r = S(null), i = S("disconnected"), a = S("__initial__"), o = (u) => {
655
+ i.value = u, t.onStatus?.(u);
656
+ }, c = (u) => {
611
657
  t.onError?.(u);
612
658
  };
613
- let c = !0;
614
- const d = t.onDiagnostic ? B(t.onDiagnostic) : void 0, h = new ze({
659
+ let l = !0;
660
+ const d = /* @__PURE__ */ new Set(), h = t.onReservedLeaves ? qe(t.onReservedLeaves) : void 0, _ = t.onDiagnostic ? Y(t.onDiagnostic) : void 0, w = new Ze({
615
661
  url: t.serverUrl,
616
662
  token: t.token,
617
663
  ...t.scene !== void 0 ? { scene: t.scene } : {},
618
664
  ...t.testSession !== void 0 ? { session: t.testSession } : {},
619
- onStatus: i,
665
+ onStatus: o,
620
666
  onSnapshot: (u) => {
621
- c && (J(
667
+ l && (h?.onSnapshot(u.state), ie(
622
668
  n,
623
669
  r,
624
670
  a,
625
671
  u.scene_id,
626
672
  u.scene_version,
627
- () => Ce(e, u),
628
- l
673
+ () => Fe(e, u),
674
+ c
629
675
  ), t.onMetric?.({
630
676
  name: "snapshot_received",
631
677
  scene_id: u.scene_id,
@@ -633,41 +679,44 @@ function ft(t) {
633
679
  }));
634
680
  },
635
681
  onDelta: (u) => {
636
- if (!c) return;
637
- const k = performance.now();
638
- Me(e, u), t.onMetric?.({
682
+ if (!l) return;
683
+ const y = performance.now();
684
+ $e(e, u), h?.onDelta(u.patches), t.onMetric?.({
639
685
  name: "delta_applied",
640
- duration_ms: performance.now() - k
686
+ duration_ms: performance.now() - y
641
687
  }), t.onMetric?.({ name: "delta_received", count: 1, path_count: u.patches.length });
642
688
  },
643
689
  onSceneChanged: (u) => {
644
- c && t.onMetric?.({
690
+ l && t.onMetric?.({
645
691
  name: "scene_changed",
646
692
  from: r.value?.scene_version ?? null,
647
693
  to: u.scene_version
648
694
  });
649
695
  },
696
+ onSceneRoster: (u) => {
697
+ l && M(u.entries, "frame");
698
+ },
650
699
  onServerError: (u) => {
651
- l({
700
+ c({
652
701
  code: u.code,
653
702
  message: u.message,
654
703
  recoverable: u.recoverable
655
704
  });
656
705
  },
657
706
  onTransportError: (u) => {
658
- l(He(u));
707
+ c(et(u));
659
708
  }
660
709
  });
661
- h.start();
662
- const w = q(t.target);
663
- return w.render(
664
- ne(ve, {
710
+ w.start(), t.preloadRoster !== void 0 && t.preloadRoster.length > 0 && M(t.preloadRoster, "option");
711
+ const L = X(t.target);
712
+ return L.render(
713
+ ue(_e, {
665
714
  mode: t.mode,
666
715
  store: e,
667
716
  bundleSignal: r,
668
- statusSignal: o,
717
+ statusSignal: i,
669
718
  crossfadeKeySignal: a,
670
- sendInput: (u) => h.sendInput(u),
719
+ sendInput: (u) => w.sendInput(u),
671
720
  // ADR 004 §A1.3 — thread the host capture resolver to the runtime context
672
721
  // so the `x-zab.capture` primitive's ACQUIRE mode can pin a device.
673
722
  ...t.resolveCaptureDevice !== void 0 ? { resolveCaptureDevice: t.resolveCaptureDevice } : {},
@@ -681,35 +730,49 @@ function ft(t) {
681
730
  })
682
731
  ), {
683
732
  disconnect() {
684
- c && (c = !1, d?.(), h.close(), w.unmount());
733
+ l && (l = !1, _?.(), w.close(), L.unmount());
685
734
  },
686
735
  setToken(u) {
687
- c && h.setToken(u);
736
+ l && w.setToken(u);
688
737
  }
689
738
  };
690
- async function J(u, k, Z, _, R, Q, ee) {
691
- let A;
739
+ function M(u, y) {
740
+ const E = r.value?.scene_version;
741
+ for (const { scene_id: b, scene_version: m } of u)
742
+ m !== E && (d.has(m) || (d.add(m), n.get(b, m).then(() => {
743
+ l && t.onMetric?.({
744
+ name: "roster_preloaded",
745
+ scene_id: b,
746
+ scene_version: m,
747
+ source: y
748
+ });
749
+ }).catch(() => {
750
+ d.delete(m);
751
+ })));
752
+ }
753
+ async function ie(u, y, E, b, m, oe, ae) {
754
+ let C;
692
755
  try {
693
- A = await u.get(_, R);
694
- } catch (P) {
695
- ee({
756
+ C = await u.get(b, m);
757
+ } catch (N) {
758
+ ae({
696
759
  code: "BUNDLE_FETCH_FAILED",
697
- message: P instanceof Error ? P.message : "render bundle fetch failed",
760
+ message: N instanceof Error ? N.message : "render bundle fetch failed",
698
761
  recoverable: !0
699
762
  });
700
763
  return;
701
764
  }
702
- c && (Q(), k.value = A, Z.value = `${_}::${R}`);
765
+ l && (oe(), y.value = C, E.value = `${b}::${m}`);
703
766
  }
704
767
  }
705
- function He(t) {
768
+ function et(t) {
706
769
  return {
707
770
  code: t.code,
708
771
  message: t.message,
709
772
  recoverable: t.recoverable
710
773
  };
711
774
  }
712
- function Ge(t) {
775
+ function tt(t) {
713
776
  try {
714
777
  const e = new URL(t);
715
778
  return `${e.protocol === "wss:" ? "https:" : "http:"}//${e.host}`;
@@ -717,7 +780,7 @@ function Ge(t) {
717
780
  return "";
718
781
  }
719
782
  }
720
- const Ke = [
783
+ const st = [
721
784
  "visible",
722
785
  "opacity",
723
786
  "universal_opacity",
@@ -735,9 +798,9 @@ const Ke = [
735
798
  "mask"
736
799
  ];
737
800
  function f(t) {
738
- return /* @__PURE__ */ new Set([...Ke, ...t]);
801
+ return /* @__PURE__ */ new Set([...st, ...t]);
739
802
  }
740
- const Xe = {
803
+ const nt = {
741
804
  stack: f(["direction", "gap", "wrap", "crossGap", "align", "justify"]),
742
805
  grid: f(["cols", "rows", "gap"]),
743
806
  frame: f([
@@ -818,26 +881,26 @@ const Xe = {
818
881
  // binding is `items`.
819
882
  repeat: /* @__PURE__ */ new Set(["items"])
820
883
  };
821
- function Ve(t, e) {
822
- const s = Xe[t];
884
+ function rt(t, e) {
885
+ const s = nt[t];
823
886
  return !!(s === void 0 || s.has(e) || t === "instance" && (e === "params" || e.startsWith("params.")));
824
887
  }
825
- const D = /* @__PURE__ */ new WeakSet();
826
- function mt(t) {
827
- if (D.has(t)) return;
828
- D.add(t);
888
+ const B = /* @__PURE__ */ new WeakSet();
889
+ function _t(t) {
890
+ if (B.has(t)) return;
891
+ B.add(t);
829
892
  const e = /* @__PURE__ */ new Set([
830
893
  ...Object.keys(t.props ?? {}),
831
894
  ...Object.keys(t.bindings ?? {})
832
895
  ]);
833
896
  for (const s of e)
834
- Ve(t.kind, s) || H(
897
+ rt(t.kind, s) || Z(
835
898
  t.id,
836
899
  `${t.kind}.${s}`,
837
900
  "is not consumed by this primitive's renderer ; the prop is ignored (anti-silent-drop, ADR 001 §3.4)"
838
901
  );
839
902
  }
840
- class K {
903
+ class te {
841
904
  constructor(e) {
842
905
  this.options = e, this.deps = {
843
906
  WebSocket: e.deps?.WebSocket ?? globalThis.WebSocket,
@@ -870,13 +933,13 @@ class K {
870
933
  return e.searchParams.set("room", this.options.roomId), e.searchParams.set("token", this.options.token), new Promise((s, n) => {
871
934
  const r = new this.deps.WebSocket(e.toString());
872
935
  this.ws = r;
873
- const o = () => {
936
+ const i = () => {
874
937
  r.removeEventListener("error", a), this.send({ type: "join", name: this.options.name, role: "viewer" }), s();
875
- }, a = (i) => {
876
- r.removeEventListener("open", o), n(i);
938
+ }, a = (o) => {
939
+ r.removeEventListener("open", i), n(o);
877
940
  };
878
- r.addEventListener("open", o, { once: !0 }), r.addEventListener("error", a, { once: !0 }), r.addEventListener("message", (i) => void this.onMessage(i.data)), r.addEventListener("close", (i) => {
879
- this.tearDown(), this.emit("close", { code: i.code, reason: i.reason });
941
+ r.addEventListener("open", i, { once: !0 }), r.addEventListener("error", a, { once: !0 }), r.addEventListener("message", (o) => void this.onMessage(o.data)), r.addEventListener("close", (o) => {
942
+ this.tearDown(), this.emit("close", { code: o.code, reason: o.reason });
880
943
  });
881
944
  });
882
945
  }
@@ -929,15 +992,15 @@ class K {
929
992
  n || (n = this.ensureRemote({ id: e, name: e.slice(0, 8), role: "publisher" }));
930
993
  const { pc: r } = n;
931
994
  if (s.kind === "sdp") {
932
- const o = s.description, a = o.type === "offer" && (n.makingOffer || r.signalingState !== "stable");
995
+ const i = s.description, a = i.type === "offer" && (n.makingOffer || r.signalingState !== "stable");
933
996
  if (n.ignoreOffer = !this.isPolite(e) && a, n.ignoreOffer) return;
934
- await r.setRemoteDescription(o);
935
- for (const i of n.pendingCandidates)
997
+ await r.setRemoteDescription(i);
998
+ for (const o of n.pendingCandidates)
936
999
  try {
937
- await r.addIceCandidate(i);
1000
+ await r.addIceCandidate(o);
938
1001
  } catch {
939
1002
  }
940
- n.pendingCandidates = [], o.type === "offer" && (await r.setLocalDescription(), r.localDescription && this.sendSignal(e, {
1003
+ n.pendingCandidates = [], i.type === "offer" && (await r.setLocalDescription(), r.localDescription && this.sendSignal(e, {
941
1004
  kind: "sdp",
942
1005
  description: {
943
1006
  type: r.localDescription.type,
@@ -947,15 +1010,15 @@ class K {
947
1010
  return;
948
1011
  }
949
1012
  if (s.kind === "ice") {
950
- const o = s.candidate;
1013
+ const i = s.candidate;
951
1014
  if (r.remoteDescription)
952
1015
  try {
953
- await r.addIceCandidate(o);
1016
+ await r.addIceCandidate(i);
954
1017
  } catch (a) {
955
1018
  if (!n.ignoreOffer) throw a;
956
1019
  }
957
1020
  else
958
- n.pendingCandidates.push(o);
1021
+ n.pendingCandidates.push(i);
959
1022
  return;
960
1023
  }
961
1024
  }
@@ -966,9 +1029,9 @@ class K {
966
1029
  const n = new this.deps.RTCPeerConnection({
967
1030
  iceServers: this.iceServers,
968
1031
  iceTransportPolicy: "relay"
969
- }), r = new this.deps.MediaStream(), o = n.addTransceiver("audio", { direction: "recvonly" }), a = n.addTransceiver("video", { direction: "recvonly" });
970
- Ye(o, a);
971
- const i = {
1032
+ }), r = new this.deps.MediaStream(), i = n.addTransceiver("audio", { direction: "recvonly" }), a = n.addTransceiver("video", { direction: "recvonly" });
1033
+ it(i, a);
1034
+ const o = {
972
1035
  info: e,
973
1036
  pc: n,
974
1037
  stream: r,
@@ -979,7 +1042,7 @@ class K {
979
1042
  return n.addEventListener("negotiationneeded", () => {
980
1043
  (async () => {
981
1044
  try {
982
- i.makingOffer = !0, await n.setLocalDescription(), n.localDescription && this.sendSignal(e.id, {
1045
+ o.makingOffer = !0, await n.setLocalDescription(), n.localDescription && this.sendSignal(e.id, {
983
1046
  kind: "sdp",
984
1047
  description: {
985
1048
  type: n.localDescription.type,
@@ -988,32 +1051,32 @@ class K {
988
1051
  });
989
1052
  } catch {
990
1053
  } finally {
991
- i.makingOffer = !1;
1054
+ o.makingOffer = !1;
992
1055
  }
993
1056
  })();
994
- }), n.addEventListener("icecandidate", (l) => {
995
- const c = l.candidate;
996
- c && this.sendSignal(e.id, {
1057
+ }), n.addEventListener("icecandidate", (c) => {
1058
+ const l = c.candidate;
1059
+ l && this.sendSignal(e.id, {
997
1060
  kind: "ice",
998
1061
  candidate: {
999
- candidate: c.candidate,
1000
- sdpMid: c.sdpMid,
1001
- sdpMLineIndex: c.sdpMLineIndex,
1002
- usernameFragment: c.usernameFragment
1062
+ candidate: l.candidate,
1063
+ sdpMid: l.sdpMid,
1064
+ sdpMLineIndex: l.sdpMLineIndex,
1065
+ usernameFragment: l.usernameFragment
1003
1066
  }
1004
1067
  });
1005
- }), n.addEventListener("track", (l) => {
1006
- const c = l.track;
1007
- i.stream.getTracks().includes(c) || i.stream.addTrack(c), c.addEventListener("ended", () => {
1008
- i.stream.removeTrack(c);
1068
+ }), n.addEventListener("track", (c) => {
1069
+ const l = c.track;
1070
+ o.stream.getTracks().includes(l) || o.stream.addTrack(l), l.addEventListener("ended", () => {
1071
+ o.stream.removeTrack(l);
1009
1072
  }), this.emit("remote-track", {
1010
1073
  peerId: e.id,
1011
1074
  peerName: e.name,
1012
- stream: i.stream
1075
+ stream: o.stream
1013
1076
  });
1014
1077
  }), n.addEventListener("connectionstatechange", () => {
1015
1078
  this.emit("connection-state", { peerId: e.id, state: n.connectionState }), (n.connectionState === "failed" || n.connectionState === "closed") && (this.remotes.delete(e.id), this.emit("peer-left", { peerId: e.id, peerName: e.name }));
1016
- }), this.remotes.set(e.id, i), i;
1079
+ }), this.remotes.set(e.id, o), o;
1017
1080
  }
1018
1081
  /* ---- Helpers ------------------------------------------------------ */
1019
1082
  isPolite(e) {
@@ -1028,213 +1091,227 @@ class K {
1028
1091
  for (const r of n) r(s);
1029
1092
  }
1030
1093
  }
1031
- function Ye(t, e) {
1094
+ function it(t, e) {
1032
1095
  const s = globalThis.RTCRtpReceiver?.getCapabilities;
1033
- typeof s == "function" && (U(e, s("video"), (n) => {
1096
+ typeof s == "function" && (H(e, s("video"), (n) => {
1034
1097
  const r = n.toLowerCase();
1035
1098
  return r === "video/h264" || r === "video/rtx";
1036
- }), U(t, s("audio"), (n) => {
1099
+ }), H(t, s("audio"), (n) => {
1037
1100
  const r = n.toLowerCase();
1038
1101
  return r === "audio/opus" || r === "audio/telephone-event";
1039
1102
  }));
1040
1103
  }
1041
- function U(t, e, s) {
1104
+ function H(t, e, s) {
1042
1105
  const n = t?.setCodecPreferences;
1043
1106
  if (typeof n != "function" || !e) return;
1044
- const r = e.codecs.filter((o) => s(o.mimeType));
1107
+ const r = e.codecs.filter((i) => s(i.mimeType));
1045
1108
  if (r.length !== 0)
1046
1109
  try {
1047
1110
  n.call(t, r);
1048
1111
  } catch {
1049
1112
  }
1050
1113
  }
1051
- function X() {
1052
- const t = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map();
1053
- function s(n) {
1054
- const r = e.get(n);
1055
- if (r === void 0) return;
1056
- const o = t.get(n) ?? null;
1057
- for (const a of r) a(o);
1114
+ function se() {
1115
+ const t = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Set();
1116
+ function n(i) {
1117
+ const a = e.get(i);
1118
+ if (a === void 0) return;
1119
+ const o = t.get(i) ?? null;
1120
+ for (const c of a) c(o);
1121
+ }
1122
+ function r() {
1123
+ for (const i of [...s]) i();
1058
1124
  }
1059
1125
  return {
1060
- resolve(n) {
1061
- return t.get(n) ?? null;
1126
+ resolve(i) {
1127
+ return t.get(i) ?? null;
1128
+ },
1129
+ orderedLabels() {
1130
+ return [...t.keys()];
1062
1131
  },
1063
- subscribe(n, r) {
1064
- let o = e.get(n);
1065
- return o === void 0 && (o = /* @__PURE__ */ new Set(), e.set(n, o)), o.add(r), r(t.get(n) ?? null), () => {
1066
- const a = e.get(n);
1067
- a !== void 0 && (a.delete(r), a.size === 0 && e.delete(n));
1132
+ subscribeRoster(i) {
1133
+ return s.add(i), () => {
1134
+ s.delete(i);
1068
1135
  };
1069
1136
  },
1070
- set(n, r) {
1071
- t.get(n) !== r && (t.set(n, r), s(n));
1137
+ subscribe(i, a) {
1138
+ let o = e.get(i);
1139
+ return o === void 0 && (o = /* @__PURE__ */ new Set(), e.set(i, o)), o.add(a), a(t.get(i) ?? null), () => {
1140
+ const c = e.get(i);
1141
+ c !== void 0 && (c.delete(a), c.size === 0 && e.delete(i));
1142
+ };
1143
+ },
1144
+ set(i, a) {
1145
+ if (t.get(i) === a) return;
1146
+ const o = !t.has(i);
1147
+ t.set(i, a), n(i), o && r();
1072
1148
  },
1073
- remove(n) {
1074
- t.has(n) && (t.delete(n), s(n));
1149
+ remove(i) {
1150
+ t.has(i) && (t.delete(i), n(i), r());
1075
1151
  },
1076
1152
  clear() {
1077
- const n = [...t.keys()];
1153
+ const i = [...t.keys()];
1078
1154
  t.clear();
1079
- for (const r of n) s(r);
1155
+ for (const a of i) n(a);
1156
+ i.length > 0 && r();
1080
1157
  }
1081
1158
  };
1082
1159
  }
1083
- function g(t) {
1160
+ function v(t) {
1084
1161
  return t.toLowerCase().replace(/[^a-z0-9_-]+/g, "_").replace(/^[_-]+|[_-]+$/g, "");
1085
1162
  }
1086
- function V(t, e, s) {
1163
+ function ne(t, e, s) {
1087
1164
  t.on("remote-track", (n) => {
1088
- const r = g(n.peerName);
1165
+ const r = v(n.peerName);
1089
1166
  s.acquire(r, t) && e.set(r, n.stream);
1090
1167
  }), t.on("peer-left", (n) => {
1091
- const r = g(n.peerName);
1168
+ const r = v(n.peerName);
1092
1169
  s.acquire(r, t) && (e.remove(r), s.release(r, t));
1093
1170
  });
1094
1171
  }
1095
- const Je = {
1172
+ const ot = {
1096
1173
  acquire: () => !0,
1097
1174
  release: () => {
1098
1175
  }
1099
1176
  };
1100
- function pt(t) {
1101
- const e = X(), s = new K(t);
1102
- return V(s, e, Je), {
1177
+ function Et(t) {
1178
+ const e = se(), s = new te(t);
1179
+ return ne(s, e, ot), {
1103
1180
  join: () => s.join(),
1104
1181
  leave: () => {
1105
1182
  s.leave(), e.clear();
1106
1183
  },
1107
- resolvePeerStream: (n) => e.resolve(g(n)),
1108
- subscribePeerStream: (n, r) => e.subscribe(g(n), r),
1184
+ resolvePeerStream: (n) => e.resolve(v(n)),
1185
+ subscribePeerStream: (n, r) => e.subscribe(v(n), r),
1109
1186
  registry: e,
1110
1187
  viewer: s
1111
1188
  };
1112
1189
  }
1113
- function $(t) {
1114
- const e = X(), s = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), r = {
1115
- acquire: (i, l) => {
1116
- const c = n.get(i);
1117
- return c === void 0 ? (n.set(i, l), !0) : c === l;
1190
+ function G(t) {
1191
+ const e = se(), s = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), r = {
1192
+ acquire: (o, c) => {
1193
+ const l = n.get(o);
1194
+ return l === void 0 ? (n.set(o, c), !0) : l === c;
1118
1195
  },
1119
- release: (i, l) => {
1120
- n.get(i) === l && n.delete(i);
1196
+ release: (o, c) => {
1197
+ n.get(o) === c && n.delete(o);
1121
1198
  }
1122
1199
  };
1123
- function o(i) {
1124
- if (s.has(i.roomId)) return;
1125
- const l = new K({
1126
- name: i.name ?? "solar-viewer",
1127
- ...i,
1128
- ...t.deps !== void 0 && i.deps === void 0 ? { deps: t.deps } : {}
1200
+ function i(o) {
1201
+ if (s.has(o.roomId)) return;
1202
+ const c = new te({
1203
+ name: o.name ?? "solar-viewer",
1204
+ ...o,
1205
+ ...t.deps !== void 0 && o.deps === void 0 ? { deps: t.deps } : {}
1129
1206
  });
1130
- V(l, e, r), s.set(i.roomId, { viewer: l });
1207
+ ne(c, e, r), s.set(o.roomId, { viewer: c });
1131
1208
  }
1132
- function a(i) {
1133
- const l = s.get(i);
1134
- if (l !== void 0) {
1135
- for (const [c, d] of [...n.entries()])
1136
- d === l.viewer && (e.remove(c), n.delete(c));
1137
- l.viewer.leave(), s.delete(i);
1209
+ function a(o) {
1210
+ const c = s.get(o);
1211
+ if (c !== void 0) {
1212
+ for (const [l, d] of [...n.entries()])
1213
+ d === c.viewer && (e.remove(l), n.delete(l));
1214
+ c.viewer.leave(), s.delete(o);
1138
1215
  }
1139
1216
  }
1140
- for (const i of t.rooms) o(i);
1217
+ for (const o of t.rooms) i(o);
1141
1218
  return {
1142
1219
  join: async () => {
1143
- await Promise.all([...s.values()].map((i) => i.viewer.join()));
1220
+ await Promise.all([...s.values()].map((o) => o.viewer.join()));
1144
1221
  },
1145
1222
  leave: () => {
1146
- for (const i of [...s.keys()]) a(i);
1223
+ for (const o of [...s.keys()]) a(o);
1147
1224
  e.clear();
1148
1225
  },
1149
- setRooms: async (i) => {
1150
- const l = new Set(i.map((d) => d.roomId));
1226
+ setRooms: async (o) => {
1227
+ const c = new Set(o.map((d) => d.roomId));
1151
1228
  for (const d of [...s.keys()])
1152
- l.has(d) || a(d);
1153
- const c = [];
1154
- for (const d of i)
1229
+ c.has(d) || a(d);
1230
+ const l = [];
1231
+ for (const d of o)
1155
1232
  if (!s.has(d.roomId)) {
1156
- o(d);
1233
+ i(d);
1157
1234
  const h = s.get(d.roomId);
1158
- h && c.push(h.viewer);
1235
+ h && l.push(h.viewer);
1159
1236
  }
1160
- await Promise.all(c.map((d) => d.join()));
1237
+ await Promise.all(l.map((d) => d.join()));
1161
1238
  },
1162
- resolvePeerStream: (i) => e.resolve(g(i)),
1163
- subscribePeerStream: (i, l) => e.subscribe(g(i), l),
1239
+ resolvePeerStream: (o) => e.resolve(v(o)),
1240
+ subscribePeerStream: (o, c) => e.subscribe(v(o), c),
1164
1241
  registry: e
1165
1242
  };
1166
1243
  }
1167
- function gt(t) {
1244
+ function Rt(t) {
1168
1245
  if ("rooms" in t && Array.isArray(t.rooms))
1169
- return $(t);
1246
+ return G(t);
1170
1247
  const { name: e, deps: s, ...n } = t;
1171
- return $({
1248
+ return G({
1172
1249
  rooms: [{ ...n, ...e !== void 0 ? { name: e } : {} }],
1173
1250
  ...s !== void 0 ? { deps: s } : {}
1174
1251
  });
1175
1252
  }
1176
- const Ze = { width: 1920, height: 1080 }, Qe = () => {
1253
+ const at = { width: 1920, height: 1080 }, ct = () => {
1177
1254
  };
1178
- function vt(t) {
1179
- const e = t.stage ?? Ze, s = t.target;
1255
+ function It(t) {
1256
+ const e = t.stage ?? at, s = t.target;
1180
1257
  s.style.position ||= "relative", s.style.width = `${e.width}px`, s.style.height = `${e.height}px`, s.style.overflow = "hidden";
1181
- const n = t.onDiagnostic ? B(t.onDiagnostic) : void 0, r = G();
1258
+ const n = t.onDiagnostic ? Y(t.onDiagnostic) : void 0, r = ee();
1182
1259
  r.reset(t.defaults ?? {});
1183
- const o = q(s);
1260
+ const i = X(s);
1184
1261
  return {
1185
- ready: new Promise((i) => {
1186
- import("./broadcast-L5wm2I6J.js").then(({ BroadcastMode: l }) => {
1187
- o.render(
1188
- /* @__PURE__ */ m(re, { children: /* @__PURE__ */ m(
1189
- z,
1262
+ ready: new Promise((o) => {
1263
+ import("./broadcast-ydSpPUje.js").then(({ BroadcastMode: c }) => {
1264
+ i.render(
1265
+ /* @__PURE__ */ p(de, { children: /* @__PURE__ */ p(
1266
+ J,
1190
1267
  {
1191
1268
  value: {
1192
1269
  mode: "broadcast",
1193
1270
  store: r,
1194
1271
  bundle: t.bundle,
1195
1272
  status: "live",
1196
- sendInput: Qe
1273
+ sendInput: ct
1197
1274
  },
1198
- children: /* @__PURE__ */ m(l, {})
1275
+ children: /* @__PURE__ */ p(c, {})
1199
1276
  }
1200
1277
  ) })
1201
1278
  );
1202
- const c = new Promise((h) => {
1279
+ const l = new Promise((h) => {
1203
1280
  requestAnimationFrame(() => requestAnimationFrame(() => h()));
1204
1281
  }), d = typeof document < "u" && document.fonts ? document.fonts.ready.then(() => {
1205
1282
  }) : Promise.resolve();
1206
- Promise.all([c, d]).then(() => i());
1283
+ Promise.all([l, d]).then(() => o());
1207
1284
  });
1208
1285
  }),
1209
1286
  unmount() {
1210
- n?.(), o.unmount();
1287
+ n?.(), i.unmount();
1211
1288
  }
1212
1289
  };
1213
1290
  }
1214
- function Y(t, e) {
1291
+ function re(t, e) {
1215
1292
  if (typeof t != "string") return t;
1216
1293
  if (e[t]) return e[t];
1217
1294
  const s = /^assets\/([A-Za-z0-9]+)\.[A-Za-z0-9]+$/.exec(t);
1218
1295
  return s && s[1] !== void 0 && e[s[1]] ? e[s[1]] : t;
1219
1296
  }
1220
- function F(t, e) {
1297
+ function V(t, e) {
1221
1298
  if (t === null || typeof t != "object") return;
1222
1299
  if (Array.isArray(t)) {
1223
- for (const n of t) F(n, e);
1300
+ for (const n of t) V(n, e);
1224
1301
  return;
1225
1302
  }
1226
1303
  const s = t;
1227
- "src" in s && (s.src = Y(s.src, e));
1304
+ "src" in s && (s.src = re(s.src, e));
1228
1305
  for (const n of Object.values(s))
1229
- n && typeof n == "object" && F(n, e);
1306
+ n && typeof n == "object" && V(n, e);
1230
1307
  }
1231
- function wt(t, e) {
1308
+ function At(t, e) {
1232
1309
  const s = { ...t };
1233
1310
  for (const [n, r] of Object.entries(s))
1234
- n.startsWith("__lit.image.") && (s[n] = Y(r, e));
1311
+ n.startsWith("__lit.image.") && (s[n] = re(r, e));
1235
1312
  return s;
1236
1313
  }
1237
- async function yt(t) {
1314
+ async function Ot(t) {
1238
1315
  const e = [];
1239
1316
  for (const s of t)
1240
1317
  try {
@@ -1248,34 +1325,38 @@ async function yt(t) {
1248
1325
  return e;
1249
1326
  }
1250
1327
  export {
1251
- we as A,
1252
- N as B,
1253
- lt as F,
1254
- K as M,
1255
- Xe as P,
1256
- xe as S,
1257
- ct as a,
1258
- mt as b,
1259
- M as c,
1260
- B as d,
1261
- H as e,
1262
- $ as f,
1263
- X as g,
1264
- pt as h,
1265
- gt as i,
1266
- yt as j,
1267
- Ue as k,
1268
- ft as l,
1269
- ht as m,
1270
- vt as n,
1271
- Y as o,
1272
- wt as p,
1273
- F as q,
1274
- dt as r,
1275
- Ee as s,
1276
- ut as t,
1277
- at as u,
1278
- x as v,
1279
- Ie as w
1328
+ Ee as A,
1329
+ W as B,
1330
+ kt as C,
1331
+ wt as F,
1332
+ te as M,
1333
+ nt as P,
1334
+ Be as S,
1335
+ vt as a,
1336
+ _t as b,
1337
+ D as c,
1338
+ A as d,
1339
+ Z as e,
1340
+ Q as f,
1341
+ Y as g,
1342
+ G as h,
1343
+ se as i,
1344
+ Et as j,
1345
+ Rt as k,
1346
+ Ot as l,
1347
+ St as m,
1348
+ Ve as n,
1349
+ U as o,
1350
+ Tt as p,
1351
+ It as q,
1352
+ bt as r,
1353
+ Le as s,
1354
+ yt as t,
1355
+ gt as u,
1356
+ re as v,
1357
+ Me as w,
1358
+ At as x,
1359
+ V as y,
1360
+ q as z
1280
1361
  };
1281
- //# sourceMappingURL=index-Clrya_9l.js.map
1362
+ //# sourceMappingURL=index-ClWi5UzJ.js.map