@conference-kit/react 0.0.8 → 0.0.10

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.
@@ -1,5 +1,5 @@
1
1
  export type VideoPlayerProps = React.VideoHTMLAttributes<HTMLVideoElement> & {
2
2
  stream?: MediaStream | null;
3
3
  };
4
- export declare function VideoPlayer({ stream, autoPlay, playsInline, muted, ...props }: VideoPlayerProps): import("react/jsx-runtime").JSX.Element;
4
+ export declare const VideoPlayer: import("react").NamedExoticComponent<VideoPlayerProps>;
5
5
  //# sourceMappingURL=VideoPlayer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"VideoPlayer.d.ts","sourceRoot":"","sources":["../../src/components/VideoPlayer.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;IAC3E,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,QAAe,EACf,WAAkB,EAClB,KAAK,EACL,GAAG,KAAK,EACT,EAAE,gBAAgB,2CAsClB"}
1
+ {"version":3,"file":"VideoPlayer.d.ts","sourceRoot":"","sources":["../../src/components/VideoPlayer.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG;IAC3E,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,WAAW,wDAiDtB,CAAC"}
@@ -1,30 +1,35 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useEffect, useRef } from "react";
3
- export function VideoPlayer({ stream, autoPlay = true, playsInline = true, muted, ...props }) {
2
+ import { useEffect, useRef, memo } from "react";
3
+ export const VideoPlayer = memo(function VideoPlayer({ stream, autoPlay = true, playsInline = true, muted, ...props }) {
4
4
  const ref = useRef(null);
5
- const prevStream = useRef(null);
5
+ const attachedStream = useRef(null);
6
6
  useEffect(() => {
7
7
  const el = ref.current;
8
8
  if (!el)
9
9
  return;
10
- // Avoid resetting srcObject if the exact same MediaStream instance is already attached.
11
- if (stream && prevStream.current !== stream) {
12
- el.srcObject = stream;
13
- prevStream.current = stream;
14
- }
15
- // Kick playback on mobile where autoplay can be flaky even when muted.
16
- if (stream) {
17
- el.play().catch(() => {
18
- /* ignore autoplay rejection; user gesture will resume */
19
- });
10
+ // Only update srcObject when stream actually changes (by reference).
11
+ // Avoid clearing on unmount to prevent flicker during parent re-renders.
12
+ if (stream !== attachedStream.current) {
13
+ el.srcObject = stream ?? null;
14
+ attachedStream.current = stream ?? null;
15
+ // Kick playback on mobile where autoplay can be flaky even when muted.
16
+ if (stream) {
17
+ el.play().catch(() => {
18
+ /* ignore autoplay rejection; user gesture will resume */
19
+ });
20
+ }
20
21
  }
22
+ }, [stream]);
23
+ // Only clear srcObject when component is truly unmounting, not on re-renders.
24
+ useEffect(() => {
25
+ const el = ref.current;
21
26
  return () => {
22
27
  if (el) {
23
28
  el.srcObject = null;
24
- prevStream.current = null;
29
+ attachedStream.current = null;
25
30
  }
26
31
  };
27
- }, [stream]);
32
+ }, []);
28
33
  return (_jsx("video", { ref: ref, autoPlay: autoPlay, playsInline: playsInline, muted: muted ?? stream == null, ...props }));
29
- }
34
+ });
30
35
  //# sourceMappingURL=VideoPlayer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../src/components/VideoPlayer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAM1C,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,GAAG,IAAI,EACf,WAAW,GAAG,IAAI,EAClB,KAAK,EACL,GAAG,KAAK,EACS;IACjB,MAAM,GAAG,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,wFAAwF;QACxF,IAAI,MAAM,IAAI,UAAU,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YAC5C,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC;YACtB,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC;QAC9B,CAAC;QAED,uEAAuE;QACvE,IAAI,MAAM,EAAE,CAAC;YACX,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACnB,yDAAyD;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,GAAG,EAAE;YACV,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;gBACpB,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,gBACE,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,IAAI,MAAM,IAAI,IAAI,KAC1B,KAAK,GACT,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../src/components/VideoPlayer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAMhD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,WAAW,CAAC,EACnD,MAAM,EACN,QAAQ,GAAG,IAAI,EACf,WAAW,GAAG,IAAI,EAClB,KAAK,EACL,GAAG,KAAK,EACS;IACjB,MAAM,GAAG,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,qEAAqE;QACrE,yEAAyE;QACzE,IAAI,MAAM,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;YACtC,EAAE,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,CAAC;YAC9B,cAAc,CAAC,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC;YAExC,uEAAuE;YACvE,IAAI,MAAM,EAAE,CAAC;gBACX,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;oBACnB,yDAAyD;gBAC3D,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,8EAA8E;IAC9E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,OAAO,GAAG,EAAE;YACV,IAAI,EAAE,EAAE,CAAC;gBACP,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC;gBACpB,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,gBACE,GAAG,EAAE,GAAG,EACR,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,IAAI,MAAM,IAAI,IAAI,KAC1B,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -19,24 +19,24 @@ export type UseMeshRoomOptions = {
19
19
  features?: FeatureConfig;
20
20
  };
21
21
  export declare function useMeshRoom(options: UseMeshRoomOptions): {
22
- readonly localStream: MediaStream | null;
23
- readonly ready: boolean;
24
- readonly requesting: boolean;
25
- readonly mediaError: Error | null;
26
- readonly participants: MeshParticipant[];
27
- readonly roster: string[];
28
- readonly waitingList: string[];
29
- readonly inWaitingRoom: boolean;
30
- readonly activeSpeakerId: string | null;
31
- readonly raisedHands: Set<string>;
32
- readonly signalingStatus: "closed" | "connecting" | "open" | "idle";
33
- readonly admitPeer: (id: string) => void;
34
- readonly rejectPeer: (id: string) => void;
35
- readonly raiseHand: () => void;
36
- readonly lowerHand: () => void;
37
- readonly requestStream: () => Promise<MediaStream | null>;
38
- readonly stopStream: () => void;
39
- readonly leave: () => void;
40
- readonly error: Error | null;
22
+ localStream: MediaStream | null;
23
+ ready: boolean;
24
+ requesting: boolean;
25
+ mediaError: Error | null;
26
+ participants: MeshParticipant[];
27
+ roster: string[];
28
+ waitingList: string[];
29
+ inWaitingRoom: boolean;
30
+ activeSpeakerId: string | null;
31
+ raisedHands: Set<string>;
32
+ signalingStatus: "closed" | "connecting" | "open" | "idle";
33
+ admitPeer: (id: string) => void;
34
+ rejectPeer: (id: string) => void;
35
+ raiseHand: () => void;
36
+ lowerHand: () => void;
37
+ requestStream: () => Promise<MediaStream | null>;
38
+ stopStream: () => void;
39
+ leave: () => void;
40
+ error: Error | null;
41
41
  };
42
42
  //# sourceMappingURL=useMeshRoom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMeshRoom.d.ts","sourceRoot":"","sources":["../../src/hooks/useMeshRoom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAkC,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIvE,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,sBAAsB,CAAC;IACxC,QAAQ,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB;;;;;;;;;;;;6BAwQ9C,MAAM;8BAQN,MAAM;;;;;;;EAuId"}
1
+ {"version":3,"file":"useMeshRoom.d.ts","sourceRoot":"","sources":["../../src/hooks/useMeshRoom.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAkC,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIvE,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,sBAAsB,CAAC;IACxC,QAAQ,EAAE,qBAAqB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB;;;;;;;;;;;;oBA0S9C,MAAM;qBAQN,MAAM;;;;;;;EA6Ld"}
@@ -58,13 +58,20 @@ export function useMeshRoom(options) {
58
58
  },
59
59
  ];
60
60
  }
61
+ // Check if anything actually changed to avoid unnecessary re-renders
62
+ const changed = Object.keys(patch).some((key) => patch[key] !==
63
+ existing[key]);
64
+ if (!changed)
65
+ return prev;
61
66
  return prev.map((p) => (p.id === id ? { ...p, ...patch } : p));
62
67
  });
63
68
  }, []);
69
+ const inWaitingRoomRef = useRef(inWaitingRoom);
70
+ inWaitingRoomRef.current = inWaitingRoom;
64
71
  const ensurePeer = useCallback((id, side) => {
65
72
  if (id === peerId)
66
73
  return null;
67
- if (features.enableWaitingRoom && inWaitingRoom)
74
+ if (features.enableWaitingRoom && inWaitingRoomRef.current)
68
75
  return null;
69
76
  const existing = peers.current.get(id);
70
77
  if (existing)
@@ -102,6 +109,8 @@ export function useMeshRoom(options) {
102
109
  return peer;
103
110
  }, [
104
111
  destroyPeer,
112
+ features.enableDataChannel,
113
+ features.enableWaitingRoom,
105
114
  localStream,
106
115
  peerId,
107
116
  rtcConfig,
@@ -131,10 +140,20 @@ export function useMeshRoom(options) {
131
140
  useEffect(() => {
132
141
  const onPresence = (payload) => {
133
142
  const ids = payload.peers;
134
- setRoster(ids);
143
+ // Only update roster if changed
144
+ setRoster((prev) => {
145
+ if (prev.length === ids.length &&
146
+ prev.every((id, i) => id === ids[i])) {
147
+ return prev;
148
+ }
149
+ return ids;
150
+ });
135
151
  ids.filter((id) => id !== peerId).forEach((id) => ensurePeer(id));
136
152
  // Remove peers no longer present
137
- setParticipants((prev) => prev.filter((p) => ids.includes(p.id)));
153
+ setParticipants((prev) => {
154
+ const filtered = prev.filter((p) => ids.includes(p.id));
155
+ return filtered.length === prev.length ? prev : filtered;
156
+ });
138
157
  Array.from(peers.current.keys()).forEach((id) => {
139
158
  if (!ids.includes(id))
140
159
  destroyPeer(id);
@@ -147,7 +166,13 @@ export function useMeshRoom(options) {
147
166
  const onControl = ({ action, data }) => {
148
167
  if (action === "waiting-list") {
149
168
  const waiting = data?.waiting ?? [];
150
- setWaitingList(waiting);
169
+ setWaitingList((prev) => {
170
+ if (prev.length === waiting.length &&
171
+ prev.every((id, i) => id === waiting[i])) {
172
+ return prev;
173
+ }
174
+ return waiting;
175
+ });
151
176
  return;
152
177
  }
153
178
  if (action === "waiting") {
@@ -168,6 +193,8 @@ export function useMeshRoom(options) {
168
193
  if (!peer)
169
194
  return;
170
195
  setRaisedHands((prev) => {
196
+ if (prev.has(peer))
197
+ return prev;
171
198
  const next = new Set(prev);
172
199
  next.add(peer);
173
200
  return next;
@@ -179,6 +206,8 @@ export function useMeshRoom(options) {
179
206
  if (!peer)
180
207
  return;
181
208
  setRaisedHands((prev) => {
209
+ if (!prev.has(peer))
210
+ return prev;
182
211
  const next = new Set(prev);
183
212
  next.delete(peer);
184
213
  return next;
@@ -243,8 +272,11 @@ export function useMeshRoom(options) {
243
272
  const analyzers = useRef(new Map());
244
273
  const activeCandidate = useRef(null);
245
274
  const activeSince = useRef(0);
275
+ const silenceSince = useRef(0);
276
+ // Separate effect to manage analyzers based on participants
277
+ // This runs when participants change but doesn't recreate the interval
246
278
  useEffect(() => {
247
- if (!features.enableActiveSpeaker)
279
+ if (!features.enableActiveSpeaker || signalingStatus !== "open")
248
280
  return;
249
281
  const ensureAnalyzer = (id, stream) => {
250
282
  if (analyzers.current.has(id))
@@ -260,7 +292,7 @@ export function useMeshRoom(options) {
260
292
  if (p.remoteStream)
261
293
  ensureAnalyzer(p.id, p.remoteStream);
262
294
  });
263
- const removedIds = [];
295
+ // Cleanup analyzers for participants no longer present
264
296
  analyzers.current.forEach((_value, id) => {
265
297
  const stillPresent = participants.find((p) => p.id === id && p.remoteStream);
266
298
  if (!stillPresent) {
@@ -269,11 +301,27 @@ export function useMeshRoom(options) {
269
301
  entry?.analyser.disconnect();
270
302
  entry?.ctx.close();
271
303
  analyzers.current.delete(id);
272
- removedIds.push(id);
273
304
  }
274
305
  });
306
+ }, [features.enableActiveSpeaker, participants, signalingStatus]);
307
+ // Separate effect for the interval - only depends on feature flag and signaling status
308
+ useEffect(() => {
309
+ if (!features.enableActiveSpeaker || signalingStatus !== "open") {
310
+ setActiveSpeakerId((prev) => (prev === null ? prev : null));
311
+ analyzers.current.forEach((entry) => {
312
+ entry.source.disconnect();
313
+ entry.analyser.disconnect();
314
+ entry.ctx.close();
315
+ });
316
+ analyzers.current.clear();
317
+ activeCandidate.current = null;
318
+ activeSince.current = 0;
319
+ silenceSince.current = 0;
320
+ return;
321
+ }
275
322
  const minHoldMs = 700;
276
323
  const minLevel = 18;
324
+ const silenceHoldMs = 1200;
277
325
  const interval = window.setInterval(() => {
278
326
  let loudestId = null;
279
327
  let loudest = 0;
@@ -295,6 +343,17 @@ export function useMeshRoom(options) {
295
343
  if (heldLongEnough) {
296
344
  setActiveSpeakerId((prev) => prev === activeCandidate.current ? prev : activeCandidate.current);
297
345
  }
346
+ if (!loudestId) {
347
+ if (!silenceSince.current)
348
+ silenceSince.current = now;
349
+ const silentLongEnough = now - silenceSince.current >= silenceHoldMs;
350
+ if (silentLongEnough) {
351
+ setActiveSpeakerId((prev) => (prev === null ? prev : null));
352
+ }
353
+ }
354
+ else {
355
+ silenceSince.current = 0;
356
+ }
298
357
  }, 400);
299
358
  return () => {
300
359
  window.clearInterval(interval);
@@ -306,9 +365,30 @@ export function useMeshRoom(options) {
306
365
  analyzers.current.clear();
307
366
  activeCandidate.current = null;
308
367
  activeSince.current = 0;
368
+ silenceSince.current = 0;
309
369
  };
310
- }, [features.enableActiveSpeaker, participants]);
311
- return {
370
+ }, [features.enableActiveSpeaker, signalingStatus]);
371
+ return useMemo(() => ({
372
+ localStream,
373
+ ready,
374
+ requesting,
375
+ mediaError,
376
+ participants,
377
+ roster,
378
+ waitingList,
379
+ inWaitingRoom,
380
+ activeSpeakerId,
381
+ raisedHands,
382
+ signalingStatus,
383
+ admitPeer,
384
+ rejectPeer,
385
+ raiseHand,
386
+ lowerHand,
387
+ requestStream,
388
+ stopStream,
389
+ leave,
390
+ error,
391
+ }), [
312
392
  localStream,
313
393
  ready,
314
394
  requesting,
@@ -328,6 +408,6 @@ export function useMeshRoom(options) {
328
408
  stopStream,
329
409
  leave,
330
410
  error,
331
- };
411
+ ]);
332
412
  }
333
413
  //# sourceMappingURL=useMeshRoom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMeshRoom.js","sourceRoot":"","sources":["../../src/hooks/useMeshRoom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useMeshRoom.js","sourceRoot":"","sources":["../../src/hooks/useMeshRoom.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conference-kit/react",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1,10 +1,10 @@
1
- import { useEffect, useRef } from "react";
1
+ import { useEffect, useRef, memo } from "react";
2
2
 
3
3
  export type VideoPlayerProps = React.VideoHTMLAttributes<HTMLVideoElement> & {
4
4
  stream?: MediaStream | null;
5
5
  };
6
6
 
7
- export function VideoPlayer({
7
+ export const VideoPlayer = memo(function VideoPlayer({
8
8
  stream,
9
9
  autoPlay = true,
10
10
  playsInline = true,
@@ -12,32 +12,37 @@ export function VideoPlayer({
12
12
  ...props
13
13
  }: VideoPlayerProps) {
14
14
  const ref = useRef<HTMLVideoElement | null>(null);
15
- const prevStream = useRef<MediaStream | null>(null);
15
+ const attachedStream = useRef<MediaStream | null>(null);
16
16
 
17
17
  useEffect(() => {
18
18
  const el = ref.current;
19
19
  if (!el) return;
20
20
 
21
- // Avoid resetting srcObject if the exact same MediaStream instance is already attached.
22
- if (stream && prevStream.current !== stream) {
23
- el.srcObject = stream;
24
- prevStream.current = stream;
25
- }
21
+ // Only update srcObject when stream actually changes (by reference).
22
+ // Avoid clearing on unmount to prevent flicker during parent re-renders.
23
+ if (stream !== attachedStream.current) {
24
+ el.srcObject = stream ?? null;
25
+ attachedStream.current = stream ?? null;
26
26
 
27
- // Kick playback on mobile where autoplay can be flaky even when muted.
28
- if (stream) {
29
- el.play().catch(() => {
30
- /* ignore autoplay rejection; user gesture will resume */
31
- });
27
+ // Kick playback on mobile where autoplay can be flaky even when muted.
28
+ if (stream) {
29
+ el.play().catch(() => {
30
+ /* ignore autoplay rejection; user gesture will resume */
31
+ });
32
+ }
32
33
  }
34
+ }, [stream]);
33
35
 
36
+ // Only clear srcObject when component is truly unmounting, not on re-renders.
37
+ useEffect(() => {
38
+ const el = ref.current;
34
39
  return () => {
35
40
  if (el) {
36
41
  el.srcObject = null;
37
- prevStream.current = null;
42
+ attachedStream.current = null;
38
43
  }
39
44
  };
40
- }, [stream]);
45
+ }, []);
41
46
 
42
47
  return (
43
48
  <video
@@ -48,4 +53,4 @@ export function VideoPlayer({
48
53
  {...props}
49
54
  />
50
55
  );
51
- }
56
+ });
@@ -117,16 +117,26 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
117
117
  },
118
118
  ];
119
119
  }
120
+ // Check if anything actually changed to avoid unnecessary re-renders
121
+ const changed = Object.keys(patch).some(
122
+ (key) =>
123
+ patch[key as keyof MeshParticipant] !==
124
+ existing[key as keyof MeshParticipant]
125
+ );
126
+ if (!changed) return prev;
120
127
  return prev.map((p) => (p.id === id ? { ...p, ...patch } : p));
121
128
  });
122
129
  },
123
130
  []
124
131
  );
125
132
 
133
+ const inWaitingRoomRef = useRef(inWaitingRoom);
134
+ inWaitingRoomRef.current = inWaitingRoom;
135
+
126
136
  const ensurePeer = useCallback(
127
137
  (id: string, side?: PeerSide) => {
128
138
  if (id === peerId) return null;
129
- if (features.enableWaitingRoom && inWaitingRoom) return null;
139
+ if (features.enableWaitingRoom && inWaitingRoomRef.current) return null;
130
140
  const existing = peers.current.get(id);
131
141
  if (existing) return existing;
132
142
  // enableDataChannel is supported in the runtime PeerConfig but may lag in published typings; cast to satisfy TS.
@@ -169,6 +179,8 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
169
179
  },
170
180
  [
171
181
  destroyPeer,
182
+ features.enableDataChannel,
183
+ features.enableWaitingRoom,
172
184
  localStream,
173
185
  peerId,
174
186
  rtcConfig,
@@ -209,10 +221,22 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
209
221
  action: "join" | "leave";
210
222
  }) => {
211
223
  const ids = payload.peers;
212
- setRoster(ids);
224
+ // Only update roster if changed
225
+ setRoster((prev) => {
226
+ if (
227
+ prev.length === ids.length &&
228
+ prev.every((id, i) => id === ids[i])
229
+ ) {
230
+ return prev;
231
+ }
232
+ return ids;
233
+ });
213
234
  ids.filter((id) => id !== peerId).forEach((id) => ensurePeer(id));
214
235
  // Remove peers no longer present
215
- setParticipants((prev) => prev.filter((p) => ids.includes(p.id)));
236
+ setParticipants((prev) => {
237
+ const filtered = prev.filter((p) => ids.includes(p.id));
238
+ return filtered.length === prev.length ? prev : filtered;
239
+ });
216
240
  Array.from(peers.current.keys()).forEach((id) => {
217
241
  if (!ids.includes(id)) destroyPeer(id);
218
242
  });
@@ -225,7 +249,15 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
225
249
  const onControl = ({ action, data }: { action: string; data?: any }) => {
226
250
  if (action === "waiting-list") {
227
251
  const waiting = (data?.waiting as string[]) ?? [];
228
- setWaitingList(waiting);
252
+ setWaitingList((prev) => {
253
+ if (
254
+ prev.length === waiting.length &&
255
+ prev.every((id, i) => id === waiting[i])
256
+ ) {
257
+ return prev;
258
+ }
259
+ return waiting;
260
+ });
229
261
  return;
230
262
  }
231
263
  if (action === "waiting") {
@@ -245,6 +277,7 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
245
277
  const peer = (data?.peerId as string) ?? null;
246
278
  if (!peer) return;
247
279
  setRaisedHands((prev) => {
280
+ if (prev.has(peer)) return prev;
248
281
  const next = new Set(prev);
249
282
  next.add(peer);
250
283
  return next;
@@ -255,6 +288,7 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
255
288
  const peer = (data?.peerId as string) ?? null;
256
289
  if (!peer) return;
257
290
  setRaisedHands((prev) => {
291
+ if (!prev.has(peer)) return prev;
258
292
  const next = new Set(prev);
259
293
  next.delete(peer);
260
294
  return next;
@@ -335,9 +369,12 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
335
369
  >(new Map());
336
370
  const activeCandidate = useRef<string | null>(null);
337
371
  const activeSince = useRef<number>(0);
372
+ const silenceSince = useRef<number>(0);
338
373
 
374
+ // Separate effect to manage analyzers based on participants
375
+ // This runs when participants change but doesn't recreate the interval
339
376
  useEffect(() => {
340
- if (!features.enableActiveSpeaker) return;
377
+ if (!features.enableActiveSpeaker || signalingStatus !== "open") return;
341
378
 
342
379
  const ensureAnalyzer = (id: string, stream: MediaStream) => {
343
380
  if (analyzers.current.has(id)) return;
@@ -353,7 +390,7 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
353
390
  if (p.remoteStream) ensureAnalyzer(p.id, p.remoteStream);
354
391
  });
355
392
 
356
- const removedIds: string[] = [];
393
+ // Cleanup analyzers for participants no longer present
357
394
  analyzers.current.forEach((_value, id) => {
358
395
  const stillPresent = participants.find(
359
396
  (p) => p.id === id && p.remoteStream
@@ -364,12 +401,29 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
364
401
  entry?.analyser.disconnect();
365
402
  entry?.ctx.close();
366
403
  analyzers.current.delete(id);
367
- removedIds.push(id);
368
404
  }
369
405
  });
406
+ }, [features.enableActiveSpeaker, participants, signalingStatus]);
407
+
408
+ // Separate effect for the interval - only depends on feature flag and signaling status
409
+ useEffect(() => {
410
+ if (!features.enableActiveSpeaker || signalingStatus !== "open") {
411
+ setActiveSpeakerId((prev) => (prev === null ? prev : null));
412
+ analyzers.current.forEach((entry) => {
413
+ entry.source.disconnect();
414
+ entry.analyser.disconnect();
415
+ entry.ctx.close();
416
+ });
417
+ analyzers.current.clear();
418
+ activeCandidate.current = null;
419
+ activeSince.current = 0;
420
+ silenceSince.current = 0;
421
+ return;
422
+ }
370
423
 
371
424
  const minHoldMs = 700;
372
425
  const minLevel = 18;
426
+ const silenceHoldMs = 1200;
373
427
  const interval = window.setInterval(() => {
374
428
  let loudestId: string | null = null;
375
429
  let loudest = 0;
@@ -395,6 +449,16 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
395
449
  prev === activeCandidate.current ? prev : activeCandidate.current
396
450
  );
397
451
  }
452
+
453
+ if (!loudestId) {
454
+ if (!silenceSince.current) silenceSince.current = now;
455
+ const silentLongEnough = now - silenceSince.current >= silenceHoldMs;
456
+ if (silentLongEnough) {
457
+ setActiveSpeakerId((prev) => (prev === null ? prev : null));
458
+ }
459
+ } else {
460
+ silenceSince.current = 0;
461
+ }
398
462
  }, 400);
399
463
 
400
464
  return () => {
@@ -407,28 +471,52 @@ export function useMeshRoom(options: UseMeshRoomOptions) {
407
471
  analyzers.current.clear();
408
472
  activeCandidate.current = null;
409
473
  activeSince.current = 0;
474
+ silenceSince.current = 0;
410
475
  };
411
- }, [features.enableActiveSpeaker, participants]);
476
+ }, [features.enableActiveSpeaker, signalingStatus]);
412
477
 
413
- return {
414
- localStream,
415
- ready,
416
- requesting,
417
- mediaError,
418
- participants,
419
- roster,
420
- waitingList,
421
- inWaitingRoom,
422
- activeSpeakerId,
423
- raisedHands,
424
- signalingStatus,
425
- admitPeer,
426
- rejectPeer,
427
- raiseHand,
428
- lowerHand,
429
- requestStream,
430
- stopStream,
431
- leave,
432
- error,
433
- } as const;
478
+ return useMemo(
479
+ () => ({
480
+ localStream,
481
+ ready,
482
+ requesting,
483
+ mediaError,
484
+ participants,
485
+ roster,
486
+ waitingList,
487
+ inWaitingRoom,
488
+ activeSpeakerId,
489
+ raisedHands,
490
+ signalingStatus,
491
+ admitPeer,
492
+ rejectPeer,
493
+ raiseHand,
494
+ lowerHand,
495
+ requestStream,
496
+ stopStream,
497
+ leave,
498
+ error,
499
+ }),
500
+ [
501
+ localStream,
502
+ ready,
503
+ requesting,
504
+ mediaError,
505
+ participants,
506
+ roster,
507
+ waitingList,
508
+ inWaitingRoom,
509
+ activeSpeakerId,
510
+ raisedHands,
511
+ signalingStatus,
512
+ admitPeer,
513
+ rejectPeer,
514
+ raiseHand,
515
+ lowerHand,
516
+ requestStream,
517
+ stopStream,
518
+ leave,
519
+ error,
520
+ ]
521
+ );
434
522
  }