@fishjam-cloud/react-client 0.25.3 → 0.26.0-rc.1

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.
@@ -26,11 +26,11 @@ export interface FishjamProviderProps extends PropsWithChildren {
26
26
  */
27
27
  bandwidthLimits?: Partial<BandwidthLimits>;
28
28
  /**
29
- * Configure whether to use video simulcast and which layers to send if so.
29
+ * Configure whether to use video simulcast and which quality layers to send if so.
30
30
  */
31
31
  videoConfig?: StreamConfig;
32
32
  /**
33
- * Configure whether to use audio simulcast and which layers to send if so.
33
+ * Configure whether to use audio simulcast and which quality layers to send if so.
34
34
  */
35
35
  audioConfig?: StreamConfig;
36
36
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/devices/useDeviceManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMtF,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,gBAAgB,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpD,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC9C,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnG,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IACxG,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnF,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAsCF,eAAO,MAAM,gBAAgB,GAAI,qKAY9B,kBAAkB,KAAG,aAiIvB,CAAC"}
1
+ {"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/devices/useDeviceManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMtF,KAAK,kBAAkB,GAAG;IACxB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACrE,gBAAgB,EAAE,MAAM,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpD,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;IAC9B,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAC9C,iBAAiB,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACnG,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC;IACxG,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,iBAAiB,EAAE,eAAe,CAAC;IACnC,eAAe,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACnF,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,cAAc,EAAE,eAAe,GAAG,IAAI,CAAC;CACxC,CAAC;AAiBF,eAAO,MAAM,gBAAgB,GAAI,qKAY9B,kBAAkB,KAAG,aA0IvB,CAAC"}
@@ -1,24 +1,8 @@
1
- import { useCallback, useMemo, useState } from "react";
1
+ import { useCallback, useMemo, useRef, useState } from "react";
2
2
  import { parseUserMediaError } from "../../../utils/errors";
3
3
  import { getTrackFromStream, stopStream } from "../../../utils/track";
4
4
  import { useTrackMiddleware } from "../useTrackMiddleware";
5
5
  import { useHandleTrackEnd } from "./useHandleTrackEnd";
6
- function getReplaceStreamAction(newStream, deviceType) {
7
- return (oldStream) => {
8
- if (oldStream) {
9
- stopStream(oldStream, deviceType);
10
- }
11
- return newStream;
12
- };
13
- }
14
- function getStopStreamAction(deviceType) {
15
- return (oldStream) => {
16
- if (oldStream) {
17
- stopStream(oldStream, deviceType);
18
- }
19
- return null;
20
- };
21
- }
22
6
  async function getDeviceStream(type, constraints, deviceId) {
23
7
  constraints = typeof constraints === "object" ? constraints : {};
24
8
  if (deviceId) {
@@ -30,6 +14,8 @@ async function getDeviceStream(type, constraints, deviceId) {
30
14
  return stream;
31
15
  }
32
16
  export const useDeviceManager = ({ mediaStream, setMediaStream, getInitialStream, deviceType, constraints, allDevicesList, setSelectedDevice, deviceError, setDeviceError, selectedDevice, logger, }) => {
17
+ const mediaStreamRef = useRef(mediaStream);
18
+ mediaStreamRef.current = mediaStream;
33
19
  const rawTrack = useMemo(() => mediaStream && getTrackFromStream(mediaStream, deviceType), [mediaStream, deviceType]);
34
20
  const clearStream = useCallback(() => {
35
21
  setMediaStream(null);
@@ -61,7 +47,10 @@ export const useDeviceManager = ({ mediaStream, setMediaStream, getInitialStream
61
47
  }
62
48
  try {
63
49
  const stream = await getDeviceStream(deviceType, constraints, deviceId ?? null);
64
- setMediaStream(getReplaceStreamAction(stream, deviceType));
50
+ if (mediaStreamRef.current) {
51
+ stopStream(mediaStreamRef.current, deviceType);
52
+ }
53
+ setMediaStream(stream);
65
54
  const retrievedTrack = stream && getTrackFromStream(stream, deviceType);
66
55
  const retrievedTrackDeviceId = retrievedTrack.getSettings().deviceId;
67
56
  if (retrievedTrackDeviceId) {
@@ -97,7 +86,10 @@ export const useDeviceManager = ({ mediaStream, setMediaStream, getInitialStream
97
86
  }
98
87
  }, [currentTrack, setSelectedDeviceId, startDevice]);
99
88
  const stopDevice = useCallback(() => {
100
- setMediaStream(getStopStreamAction(deviceType));
89
+ if (mediaStreamRef.current) {
90
+ stopStream(mediaStreamRef.current, deviceType);
91
+ }
92
+ setMediaStream(null);
101
93
  }, [setMediaStream, deviceType]);
102
94
  const enableDevice = useCallback(() => {
103
95
  if (!currentTrack)
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaDevices.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/devices/useMediaDevices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAKvD,OAAO,KAAK,EAAe,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAG7G,UAAU,eAAe;IACvB,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACnD,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACnD,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,yBAAyB,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzF,eAAO,MAAM,eAAe,GAAI,iEAAiE,eAAe;mCAmC1F,yBAAyB,KAAG,OAAO,CAAC,uBAAuB,CAAC;;;CA2GjF,CAAC"}
1
+ {"version":3,"file":"useMediaDevices.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/devices/useMediaDevices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAKvD,OAAO,KAAK,EAAe,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAG7G,UAAU,eAAe;IACvB,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACnD,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC;IACnD,eAAe,CAAC,EAAE,yBAAyB,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,yBAAyB,GAAG;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzF,eAAO,MAAM,eAAe,GAAI,iEAAiE,eAAe;mCAoC1F,yBAAyB,KAAG,OAAO,CAAC,uBAAuB,CAAC;;;CAwHjF,CAAC"}
@@ -10,6 +10,7 @@ export const useMediaDevices = ({ videoConstraints, audioConstraints, persistHan
10
10
  const [audioError, setAudioError] = useState(null);
11
11
  const [selectedCamera, setSelectedCamera] = useState(persistHandlers?.getLastDevice("video") ?? null);
12
12
  const [selectedMic, setSelectedMic] = useState(persistHandlers?.getLastDevice("audio") ?? null);
13
+ const isInitializedRef = useRef(false);
13
14
  const initializationRef = useRef(null);
14
15
  const selectCamera = useCallback((deviceInfo) => {
15
16
  setSelectedCamera(deviceInfo);
@@ -20,12 +21,15 @@ export const useMediaDevices = ({ videoConstraints, audioConstraints, persistHan
20
21
  persistHandlers?.saveLastDevice(deviceInfo, "audio");
21
22
  }, [persistHandlers]);
22
23
  const initializeDevices = useCallback(async (settings) => {
23
- if (deviceList.length) {
24
+ if (isInitializedRef.current) {
24
25
  return { stream: null, errors: null, status: "already_initialized" };
25
26
  }
27
+ if (initializationRef.current) {
28
+ return initializationRef.current;
29
+ }
26
30
  const lastUsed = {
27
- audio: selectedMic,
28
- video: selectedCamera,
31
+ audio: persistHandlers?.getLastDevice("audio") ?? null,
32
+ video: persistHandlers?.getLastDevice("video") ?? null,
29
33
  };
30
34
  const constraints = {
31
35
  video: settings?.enableVideo !== false && prepareConstraints(lastUsed.video?.deviceId, videoConstraints),
@@ -63,10 +67,16 @@ export const useMediaDevices = ({ videoConstraints, audioConstraints, persistHan
63
67
  return { status: "initialized", errors: null, stream };
64
68
  }
65
69
  };
66
- const initializePromise = intitialize();
70
+ const initializePromise = intitialize().then((result) => {
71
+ isInitializedRef.current = true;
72
+ return result;
73
+ }, (error) => {
74
+ initializationRef.current = null;
75
+ throw error;
76
+ });
67
77
  initializationRef.current = initializePromise;
68
78
  return await initializePromise;
69
- }, [deviceList, selectedMic, selectedCamera, videoConstraints, audioConstraints, selectCamera, selectMic]);
79
+ }, [videoConstraints, audioConstraints, selectCamera, selectMic, persistHandlers]);
70
80
  useEffect(() => {
71
81
  const isInitialStreamIrrelevant = videoStream !== audioStream;
72
82
  if (isInitialStreamIrrelevant) {
@@ -1 +1 @@
1
- {"version":3,"file":"useFishjamClientState.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamClientState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,0BAA0B,CAAC;AAGzG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA0CjD,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,eAAe,EAAE,CAAC,GAAG,eAAe;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAMD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAwCxG"}
1
+ {"version":3,"file":"useFishjamClientState.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamClientState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAiB,MAAM,0BAA0B,CAAC;AAGzG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AA2CjD,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,eAAe,EAAE,CAAC,GAAG,eAAe;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAMD,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAwCxG"}
@@ -15,6 +15,7 @@ const eventNames = [
15
15
  "trackAdded",
16
16
  "trackRemoved",
17
17
  "trackUpdated",
18
+ "encodingChanged",
18
19
  "peerJoined",
19
20
  "peerLeft",
20
21
  "peerUpdated",
@@ -1 +1 @@
1
- {"version":3,"file":"useReconnection.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useReconnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,kBA+BlC,CAAC"}
1
+ {"version":3,"file":"useReconnection.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useReconnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,kBAsClC,CAAC"}
@@ -20,13 +20,20 @@ export const useReconnection = () => {
20
20
  const setError = () => {
21
21
  setReconnectionStatus("error");
22
22
  };
23
+ const setErrorIfReconnecting = () => {
24
+ setReconnectionStatus((prev) => (prev === "reconnecting" ? "error" : prev));
25
+ };
23
26
  client.on("reconnectionStarted", setReconnecting);
24
27
  client.on("reconnected", setIdle);
25
28
  client.on("reconnectionRetriesLimitReached", setError);
29
+ client.on("authError", setErrorIfReconnecting);
30
+ client.on("joinError", setErrorIfReconnecting);
26
31
  return () => {
27
32
  client.off("reconnectionStarted", setReconnecting);
28
33
  client.off("reconnected", setIdle);
29
34
  client.off("reconnectionRetriesLimitReached", setError);
35
+ client.off("authError", setErrorIfReconnecting);
36
+ client.off("joinError", setErrorIfReconnecting);
30
37
  };
31
38
  }, [fishjamClientRef]);
32
39
  return reconnectionStatus;
@@ -30,7 +30,7 @@ export const useTrackManager = ({ deviceManager, tsClient, peerStatus, bandwidth
30
30
  return;
31
31
  await tsClient.replaceTrack(currentTrackId, processedTrack);
32
32
  }, [applyMiddleware, getCurrentTrackId, tsClient]);
33
- const startStreaming = useCallback(async (track, props = { simulcast: [Variant.VARIANT_LOW, Variant.VARIANT_MEDIUM, Variant.VARIANT_HIGH] }) => {
33
+ const startStreaming = useCallback(async (track, props = { sentQualities: [Variant.VARIANT_LOW, Variant.VARIANT_MEDIUM, Variant.VARIANT_HIGH] }) => {
34
34
  // temporarily setting the local trackId until we have the remoteTrackId
35
35
  currentTrackIdRef.current = track.id;
36
36
  const trackMetadata = { type, paused: false };
@@ -38,7 +38,7 @@ export const useTrackManager = ({ deviceManager, tsClient, peerStatus, bandwidth
38
38
  if (typeof displayName === "string") {
39
39
  trackMetadata.displayName = displayName;
40
40
  }
41
- const [maxBandwidth, simulcastConfig] = getConfigAndBandwidthFromProps(props.simulcast, bandwidthLimits);
41
+ const [maxBandwidth, simulcastConfig] = getConfigAndBandwidthFromProps(props.sentQualities, bandwidthLimits);
42
42
  try {
43
43
  const remoteTrackId = await tsClient.addTrack(track, trackMetadata, simulcastConfig, maxBandwidth);
44
44
  currentTrackIdRef.current = remoteTrackId;
@@ -67,8 +67,8 @@ export const useTrackManager = ({ deviceManager, tsClient, peerStatus, bandwidth
67
67
  * @see {@link TrackManager#toggleMute} for more details.
68
68
  */
69
69
  const toggleMute = useCallback(async () => {
70
- const isTrackCurrentlyEnabled = Boolean(deviceTrack?.enabled);
71
70
  const currentTrackId = getCurrentTrackId();
71
+ const isTrackCurrentlyEnabled = Boolean(deviceTrack?.enabled);
72
72
  if (!currentTrackId) {
73
73
  logger.warn("Toggling mute is only possible while connected to a room.");
74
74
  return;
@@ -0,0 +1,20 @@
1
+ import type { PeerId } from "../types/public";
2
+ /**
3
+ * Client-side voice activity detection for the local peer.
4
+ *
5
+ * Polls the local microphone's audio level every 100ms and derives a speech/silence
6
+ * state from it. A level above ~0.025 (approximately −32 dBov, scaled to [0, 1])
7
+ * is treated as speech. Silence is debounced over 2 consecutive ticks (~200ms)
8
+ * to prevent rapid flapping.
9
+ *
10
+ * This is purely client-side — it does not signal other peers. Remote participants
11
+ * receive the local peer's VAD status via backend `vadNotification` messages.
12
+ *
13
+ * @internal Used by `useVAD` when the local peer's id is included in `peerIds`.
14
+ * @returns A record mapping the local peer's id to its current speaking state,
15
+ * or an empty object if `options.disabled` is true, the local peer is not available, or no microphone track is found.
16
+ */
17
+ export declare const useLocalVAD: (options: {
18
+ disabled: boolean;
19
+ }) => Record<PeerId, boolean>;
20
+ //# sourceMappingURL=useLocalVAD.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLocalVAD.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalVAD.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAW9C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GAAI,SAAS;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAsClF,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { useContext, useEffect, useState } from "react";
2
+ import { FishjamClientContext } from "../contexts/fishjamClient";
3
+ import { usePeers } from "./usePeers";
4
+ // This is a dBov-to-linear conversion. -32 dBov number is taken from backend VAD threshold
5
+ // formula for dBov to linear conversion: linear = 10 ^ (dBov / 20)
6
+ // So -32 dBov = 10^(-32/20) ≈ 0.025. This is the minimum audio level considered "speech".
7
+ const THRESHOLD = 10 ** (-32 / 20);
8
+ // Number of consecutive "silence" ticks before we consider speech to have stopped. Helps with smoothing out brief pauses in speech.
9
+ const SILENCE_DEBOUNCE_TICKS = 2;
10
+ /**
11
+ * Client-side voice activity detection for the local peer.
12
+ *
13
+ * Polls the local microphone's audio level every 100ms and derives a speech/silence
14
+ * state from it. A level above ~0.025 (approximately −32 dBov, scaled to [0, 1])
15
+ * is treated as speech. Silence is debounced over 2 consecutive ticks (~200ms)
16
+ * to prevent rapid flapping.
17
+ *
18
+ * This is purely client-side — it does not signal other peers. Remote participants
19
+ * receive the local peer's VAD status via backend `vadNotification` messages.
20
+ *
21
+ * @internal Used by `useVAD` when the local peer's id is included in `peerIds`.
22
+ * @returns A record mapping the local peer's id to its current speaking state,
23
+ * or an empty object if `options.disabled` is true, the local peer is not available, or no microphone track is found.
24
+ */
25
+ export const useLocalVAD = (options) => {
26
+ const fishjamClient = useContext(FishjamClientContext);
27
+ const [isSpeaking, setIsSpeaking] = useState(false);
28
+ const { localPeer } = usePeers();
29
+ const localPeerId = localPeer?.id;
30
+ const microphoneTrackId = localPeer?.microphoneTrack?.trackId;
31
+ useEffect(() => {
32
+ if (options.disabled || !localPeerId || !microphoneTrackId)
33
+ return;
34
+ let silenceTicks = 0;
35
+ let timeoutId;
36
+ const poll = async () => {
37
+ const trackAudio = await fishjamClient?.current?.getLocalTrackAudioLevel(microphoneTrackId);
38
+ if (trackAudio != null && trackAudio.level > THRESHOLD) {
39
+ silenceTicks = 0;
40
+ setIsSpeaking(true);
41
+ }
42
+ else {
43
+ silenceTicks += 1;
44
+ if (silenceTicks >= SILENCE_DEBOUNCE_TICKS) {
45
+ setIsSpeaking(false);
46
+ }
47
+ }
48
+ timeoutId = setTimeout(poll, 100);
49
+ };
50
+ timeoutId = setTimeout(poll, 0);
51
+ return () => {
52
+ clearTimeout(timeoutId);
53
+ setIsSpeaking(false);
54
+ };
55
+ }, [options.disabled, fishjamClient, localPeerId, microphoneTrackId]);
56
+ if (!localPeerId || options.disabled || !microphoneTrackId)
57
+ return {};
58
+ return { [localPeerId]: isSpeaking };
59
+ };
@@ -1,20 +1,20 @@
1
1
  import type { Metadata } from "@fishjam-cloud/ts-client";
2
- import type { PeerId, Track } from "../types/public";
2
+ import type { PeerId, RemoteTrack, Track } from "../types/public";
3
3
  /**
4
4
  *
5
5
  * @typeParam PeerMetadata Type of metadata set by peer while connecting to a room.
6
6
  * @typeParam ServerMetadata Type of metadata set by the server while creating a peer.
7
7
  */
8
- export type PeerWithTracks<PeerMetadata, ServerMetadata> = {
8
+ export type PeerWithTracks<PeerMetadata, ServerMetadata, T extends Track = Track> = {
9
9
  id: PeerId;
10
10
  metadata?: Metadata<PeerMetadata, ServerMetadata>;
11
- tracks: Track[];
12
- cameraTrack?: Track;
13
- microphoneTrack?: Track;
14
- screenShareVideoTrack?: Track;
15
- screenShareAudioTrack?: Track;
16
- customVideoTracks: Track[];
17
- customAudioTracks: Track[];
11
+ tracks: T[];
12
+ cameraTrack?: T;
13
+ microphoneTrack?: T;
14
+ screenShareVideoTrack?: T;
15
+ screenShareAudioTrack?: T;
16
+ customVideoTracks: T[];
17
+ customAudioTracks: T[];
18
18
  };
19
19
  /**
20
20
  * Hook allows to access id, tracks and metadata of the local and remote peers.
@@ -28,15 +28,15 @@ export declare function usePeers<PeerMetadata = Record<string, unknown>, ServerM
28
28
  /**
29
29
  * The local peer with distinguished tracks (camera, microphone, screen share).
30
30
  * Will be null if the local peer is not found.
31
- */ localPeer: PeerWithTracks<PeerMetadata, ServerMetadata> | null;
31
+ */ localPeer: PeerWithTracks<PeerMetadata, ServerMetadata, Track> | null;
32
32
  /**
33
33
  * Array of remote peers with distinguished tracks (camera, microphone, screen share).
34
- */ remotePeers: PeerWithTracks<PeerMetadata, ServerMetadata>[];
34
+ */ remotePeers: PeerWithTracks<PeerMetadata, ServerMetadata, RemoteTrack>[];
35
35
  /**
36
36
  * @deprecated Use remotePeers instead
37
37
  * Legacy array containing remote peers.
38
38
  * This property will be removed in future versions.
39
39
  */
40
- peers: PeerWithTracks<PeerMetadata, ServerMetadata>[];
40
+ peers: PeerWithTracks<PeerMetadata, ServerMetadata, RemoteTrack>[];
41
41
  };
42
42
  //# sourceMappingURL=usePeers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,QAAQ,EAAqC,MAAM,0BAA0B,CAAC;AAKjH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,IAAI;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,iBAAiB,EAAE,KAAK,EAAE,CAAC;IAC3B,iBAAiB,EAAE,KAAK,EAAE,CAAC;CAC5B,CAAC;AAoCF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAerG;;;OAGG;IACH;;OAEG;IACH;;;;OAIG;;EAGN"}
1
+ {"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AAMvH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAE3E;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI;IAClF,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,WAAW,CAAC,EAAE,CAAC,CAAC;IAChB,eAAe,CAAC,EAAE,CAAC,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1B,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAC1B,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvB,iBAAiB,EAAE,CAAC,EAAE,CAAC;CACxB,CAAC;AAuEF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAoBrG;;;OAGG;IACH;;OAEG;IACH;;;;OAIG;;EAGN"}
@@ -1,4 +1,5 @@
1
1
  import { useContext } from "react";
2
+ import { FishjamClientContext } from "../contexts/fishjamClient";
2
3
  import { FishjamClientStateContext } from "../contexts/fishjamState";
3
4
  function trackContextToTrack(track) {
4
5
  return {
@@ -6,28 +7,43 @@ function trackContextToTrack(track) {
6
7
  trackId: track.trackId,
7
8
  stream: track.stream,
8
9
  simulcastConfig: track.simulcastConfig ?? null,
9
- encoding: track.encoding ?? null,
10
10
  track: track.track,
11
11
  };
12
12
  }
13
- function getPeerWithDistinguishedTracks(peer) {
13
+ function trackContextToRemoteTrack(track, fishjamClient) {
14
+ return {
15
+ ...trackContextToTrack(track),
16
+ setReceivedQuality: (encoding) => {
17
+ fishjamClient.setTargetTrackEncoding(track.trackId, encoding);
18
+ },
19
+ };
20
+ }
21
+ function getLocalPeerWithTracks(peer) {
14
22
  const tracks = [...peer.tracks.values()].map(trackContextToTrack);
15
- const cameraTrack = tracks.find(({ metadata }) => metadata?.type === "camera");
16
- const microphoneTrack = tracks.find(({ metadata }) => metadata?.type === "microphone");
17
- const screenShareVideoTrack = tracks.find(({ metadata }) => metadata?.type === "screenShareVideo");
18
- const screenShareAudioTrack = tracks.find(({ metadata }) => metadata?.type === "screenShareAudio");
19
- const customVideoTracks = tracks.filter(({ metadata }) => metadata?.type === "customVideo");
20
- const customAudioTracks = tracks.filter(({ metadata }) => metadata?.type === "customAudio");
21
23
  return {
22
24
  id: peer.id,
23
25
  metadata: peer.metadata,
24
26
  tracks,
25
- cameraTrack,
26
- microphoneTrack,
27
- screenShareVideoTrack,
28
- screenShareAudioTrack,
29
- customVideoTracks,
30
- customAudioTracks,
27
+ cameraTrack: tracks.find(({ metadata }) => metadata?.type === "camera"),
28
+ microphoneTrack: tracks.find(({ metadata }) => metadata?.type === "microphone"),
29
+ screenShareVideoTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareVideo"),
30
+ screenShareAudioTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareAudio"),
31
+ customVideoTracks: tracks.filter(({ metadata }) => metadata?.type === "customVideo"),
32
+ customAudioTracks: tracks.filter(({ metadata }) => metadata?.type === "customAudio"),
33
+ };
34
+ }
35
+ function getRemotePeerWithTracks(peer, fishjamClient) {
36
+ const tracks = [...peer.tracks.values()].map((track) => trackContextToRemoteTrack(track, fishjamClient));
37
+ return {
38
+ id: peer.id,
39
+ metadata: peer.metadata,
40
+ tracks,
41
+ cameraTrack: tracks.find(({ metadata }) => metadata?.type === "camera"),
42
+ microphoneTrack: tracks.find(({ metadata }) => metadata?.type === "microphone"),
43
+ screenShareVideoTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareVideo"),
44
+ screenShareAudioTrack: tracks.find(({ metadata }) => metadata?.type === "screenShareAudio"),
45
+ customVideoTracks: tracks.filter(({ metadata }) => metadata?.type === "customVideo"),
46
+ customAudioTracks: tracks.filter(({ metadata }) => metadata?.type === "customAudio"),
31
47
  };
32
48
  }
33
49
  /**
@@ -40,12 +56,13 @@ function getPeerWithDistinguishedTracks(peer) {
40
56
  */
41
57
  export function usePeers() {
42
58
  const clientState = useContext(FishjamClientStateContext);
43
- if (!clientState)
59
+ const fishjamClient = useContext(FishjamClientContext);
60
+ if (!clientState || !fishjamClient)
44
61
  throw Error("usePeers must be used within FishjamProvider");
45
62
  const localPeer = clientState.localPeer
46
- ? getPeerWithDistinguishedTracks(clientState.localPeer)
63
+ ? getLocalPeerWithTracks(clientState.localPeer)
47
64
  : null;
48
- const remotePeers = Object.values(clientState.peers).map((peer) => getPeerWithDistinguishedTracks(peer));
65
+ const remotePeers = Object.values(clientState.peers).map((peer) => getRemotePeerWithTracks(peer, fishjamClient.current));
49
66
  return {
50
67
  /**
51
68
  * The local peer with distinguished tracks (camera, microphone, screen share).
@@ -1,14 +1,21 @@
1
1
  import type { PeerId } from "../types/public";
2
2
  /**
3
- * Voice activity detection. Use this hook to check if voice is detected in audio track for given peer(s).
3
+ * Voice activity detection. Use this hook to check if voice is detected in the audio track for given peer(s).
4
4
  *
5
- * @param options - Options object containing `peerIds` - a list of ids of peers to subscribe to for voice activity detection notifications.
5
+ * Remote peer VAD is driven by `vadNotification` messages from the backend.
6
+ * If the local peer's id is included in `peerIds`, local VAD is determined client-side
7
+ * by polling the microphone's audio level (see `useLocalVAD`).
8
+ *
9
+ * @param options - Options object.
10
+ * @param options.peerIds - List of peer ids to subscribe to for VAD notifications.
11
+ * Include the local peer's id to also track whether the local user is speaking.
6
12
  *
7
13
  * Example usage:
8
14
  * ```tsx
9
15
  * import { useVAD, type PeerId } from "@fishjam-cloud/react-client";
16
+ *
10
17
  * function WhoIsTalkingComponent({ peerIds }: { peerIds: PeerId[] }) {
11
- * const peersInfo = useVAD({peerIds});
18
+ * const peersInfo = useVAD({ peerIds });
12
19
  * const activePeers = (Object.keys(peersInfo) as PeerId[]).filter((peerId) => peersInfo[peerId]);
13
20
  *
14
21
  * return "Now talking: " + activePeers.join(", ");
@@ -16,7 +23,8 @@ import type { PeerId } from "../types/public";
16
23
  * ```
17
24
  * @category Connection
18
25
  * @group Hooks
19
- * @returns Each key is a peerId and the boolean value indicates if voice activity is currently detected for that peer.
26
+ * @returns A record where each key is a peer id and the boolean value indicates
27
+ * whether voice activity is currently detected for that peer.
20
28
  */
21
29
  export declare const useVAD: (options: {
22
30
  peerIds: ReadonlyArray<PeerId>;
@@ -1 +1 @@
1
- {"version":3,"file":"useVAD.d.ts","sourceRoot":"","sources":["../../src/hooks/useVAD.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS;IAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAiE1F,CAAC"}
1
+ {"version":3,"file":"useVAD.d.ts","sourceRoot":"","sources":["../../src/hooks/useVAD.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,iBAAiB,CAAC;AAGvD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,MAAM,GAAI,SAAS;IAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAuE1F,CAAC"}
@@ -1,15 +1,23 @@
1
1
  import { useContext, useEffect, useMemo, useState } from "react";
2
2
  import { FishjamClientStateContext } from "../contexts/fishjamState";
3
+ import { useLocalVAD } from "./useLocalVAD";
3
4
  /**
4
- * Voice activity detection. Use this hook to check if voice is detected in audio track for given peer(s).
5
+ * Voice activity detection. Use this hook to check if voice is detected in the audio track for given peer(s).
5
6
  *
6
- * @param options - Options object containing `peerIds` - a list of ids of peers to subscribe to for voice activity detection notifications.
7
+ * Remote peer VAD is driven by `vadNotification` messages from the backend.
8
+ * If the local peer's id is included in `peerIds`, local VAD is determined client-side
9
+ * by polling the microphone's audio level (see `useLocalVAD`).
10
+ *
11
+ * @param options - Options object.
12
+ * @param options.peerIds - List of peer ids to subscribe to for VAD notifications.
13
+ * Include the local peer's id to also track whether the local user is speaking.
7
14
  *
8
15
  * Example usage:
9
16
  * ```tsx
10
17
  * import { useVAD, type PeerId } from "@fishjam-cloud/react-client";
18
+ *
11
19
  * function WhoIsTalkingComponent({ peerIds }: { peerIds: PeerId[] }) {
12
- * const peersInfo = useVAD({peerIds});
20
+ * const peersInfo = useVAD({ peerIds });
13
21
  * const activePeers = (Object.keys(peersInfo) as PeerId[]).filter((peerId) => peersInfo[peerId]);
14
22
  *
15
23
  * return "Now talking: " + activePeers.join(", ");
@@ -17,46 +25,52 @@ import { FishjamClientStateContext } from "../contexts/fishjamState";
17
25
  * ```
18
26
  * @category Connection
19
27
  * @group Hooks
20
- * @returns Each key is a peerId and the boolean value indicates if voice activity is currently detected for that peer.
28
+ * @returns A record where each key is a peer id and the boolean value indicates
29
+ * whether voice activity is currently detected for that peer.
21
30
  */
22
31
  export const useVAD = (options) => {
23
32
  const { peerIds } = options;
24
33
  const clientState = useContext(FishjamClientStateContext);
25
34
  if (!clientState)
26
35
  throw Error("useVAD must be used within FishjamProvider");
36
+ const showLocalPeerVAD = useMemo(() => (clientState.localPeer?.id ? peerIds.includes(clientState.localPeer?.id) : false), [clientState.localPeer?.id, peerIds]);
27
37
  const micTracksWithSelectedPeerIds = useMemo(() => Object.values(clientState.peers)
28
38
  .filter((peer) => peerIds.includes(peer.id))
29
39
  .map((peer) => ({
30
40
  peerId: peer.id,
31
- microphoneTracks: Array.from(peer.tracks.values()).filter(({ metadata }) => metadata?.type === "microphone"),
41
+ microphoneTrack: Array.from(peer.tracks.values()).find(({ metadata }) => metadata?.type === "microphone"),
32
42
  })), [clientState.peers, peerIds]);
33
- const getDefaultVadStatuses = () => micTracksWithSelectedPeerIds.reduce((mappedTracks, peer) => ({
43
+ const getDefaultVadStatuses = () => micTracksWithSelectedPeerIds.reduce((mappedTracks, { peerId, microphoneTrack }) => ({
34
44
  ...mappedTracks,
35
- [peer.peerId]: peer.microphoneTracks.reduce((vadStatuses, track) => ({ ...vadStatuses, [track.trackId]: track.vadStatus }), {}),
45
+ [peerId]: microphoneTrack ? { [microphoneTrack.trackId]: microphoneTrack.vadStatus } : {},
36
46
  }), {});
37
47
  const [_vadStatuses, setVadStatuses] = useState(getDefaultVadStatuses);
38
48
  useEffect(() => {
39
- const unsubs = micTracksWithSelectedPeerIds.map(({ peerId, microphoneTracks }) => {
49
+ const unsubs = micTracksWithSelectedPeerIds.map(({ peerId, microphoneTrack }) => {
40
50
  const updateVadStatus = (track) => {
41
51
  setVadStatuses((prev) => ({
42
52
  ...prev,
43
53
  [peerId]: { ...prev[peerId], [track.trackId]: track.vadStatus },
44
54
  }));
45
55
  };
46
- microphoneTracks.forEach((track) => {
47
- track.on("voiceActivityChanged", updateVadStatus);
48
- });
56
+ if (microphoneTrack) {
57
+ microphoneTrack.on("voiceActivityChanged", updateVadStatus);
58
+ }
49
59
  return () => {
50
- microphoneTracks.forEach((track) => {
51
- track.off("voiceActivityChanged", updateVadStatus);
52
- });
60
+ if (microphoneTrack) {
61
+ microphoneTrack.off("voiceActivityChanged", updateVadStatus);
62
+ }
53
63
  };
54
64
  });
55
65
  return () => unsubs.forEach((unsub) => unsub());
56
66
  }, [micTracksWithSelectedPeerIds]);
57
- const vadStatuses = useMemo(() => Object.fromEntries(Object.entries(_vadStatuses).map(([peerId, tracks]) => [
58
- peerId,
59
- Object.values(tracks).some((vad) => vad === "speech"),
60
- ])), [_vadStatuses]);
67
+ const localVAD = useLocalVAD({ disabled: !showLocalPeerVAD });
68
+ const vadStatuses = useMemo(() => ({
69
+ ...Object.fromEntries(Object.entries(_vadStatuses).map(([peerId, tracks]) => [
70
+ peerId,
71
+ Object.values(tracks).some((vad) => vad === "speech"),
72
+ ])),
73
+ ...localVAD,
74
+ }), [_vadStatuses, localVAD]);
61
75
  return vadStatuses;
62
76
  };
package/dist/index.d.ts CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * React client SDK for building web video and audio apps with Fishjam.
3
+ *
4
+ * @packageDocumentation
5
+ */
1
6
  export { FishjamProvider, type FishjamProviderProps } from "./FishjamProvider";
2
7
  export { useCamera } from "./hooks/devices/useCamera";
3
8
  export { useInitializeDevices, UseInitializeDevicesParams } from "./hooks/devices/useInitializeDevices";
@@ -13,7 +18,7 @@ export { type RoomType, useSandbox, type UseSandboxProps } from "./hooks/useSand
13
18
  export { useScreenShare } from "./hooks/useScreenShare";
14
19
  export { useUpdatePeerMetadata } from "./hooks/useUpdatePeerMetadata";
15
20
  export { useVAD } from "./hooks/useVAD";
16
- export type { BandwidthLimits, Brand, CustomSource, DeviceError, DeviceItem, InitializeDevicesResult, InitializeDevicesStatus, MiddlewareResult, PeerId, PeerStatus, PersistLastDeviceHandlers, SimulcastBandwidthLimits, StreamConfig, Track, TrackId, TrackMiddleware, TracksMiddleware, TracksMiddlewareResult, UseDataChannelResult, } from "./types/public";
21
+ export type { BandwidthLimits, Brand, CustomSource, DeviceError, DeviceItem, InitializeDevicesResult, InitializeDevicesStatus, MiddlewareResult, PeerId, PeerStatus, PersistLastDeviceHandlers, RemoteTrack, SimulcastBandwidthLimits, StreamConfig, Track, TrackId, TrackMiddleware, TracksMiddleware, TracksMiddlewareResult, UseDataChannelResult, } from "./types/public";
17
22
  export type { AuthErrorReason, DataCallback, DataChannelOptions, JoinErrorReason, Metadata, ReconnectConfig, ReconnectionStatus, SimulcastBandwidthLimit, SimulcastConfig, TrackBandwidthLimit, } from "@fishjam-cloud/ts-client";
18
23
  export { Variant } from "@fishjam-cloud/ts-client";
19
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,qBAAqB,EACrB,KAAK,2BAA2B,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,yBAAyB,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,KAAK,QAAQ,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,YAAY,EACV,eAAe,EACf,KAAK,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,cAAc,EACnB,qBAAqB,EACrB,KAAK,2BAA2B,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,mBAAmB,EACxB,mBAAmB,EACnB,KAAK,yBAAyB,GAC/B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,KAAK,QAAQ,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,YAAY,EACV,eAAe,EACf,KAAK,EACL,YAAY,EACZ,WAAW,EACX,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,MAAM,EACN,UAAU,EACV,yBAAyB,EACzB,WAAW,EACX,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,8 @@
1
+ /**
2
+ * React client SDK for building web video and audio apps with Fishjam.
3
+ *
4
+ * @packageDocumentation
5
+ */
1
6
  export { FishjamProvider } from "./FishjamProvider";
2
7
  export { useCamera } from "./hooks/devices/useCamera";
3
8
  export { useInitializeDevices } from "./hooks/devices/useInitializeDevices";
@@ -12,12 +12,14 @@ export type TrackId = Brand<string, "TrackId">;
12
12
  export type PeerId = Brand<string, "PeerId">;
13
13
  export type Track = {
14
14
  stream: MediaStream | null;
15
- encoding: Variant | null;
16
15
  trackId: TrackId;
17
16
  metadata?: TrackMetadata;
18
17
  simulcastConfig: SimulcastConfig | null;
19
18
  track: MediaStreamTrack | null;
20
19
  };
20
+ export type RemoteTrack = Track & {
21
+ setReceivedQuality: (quality: Variant) => void;
22
+ };
21
23
  export type MiddlewareResult = {
22
24
  track: MediaStreamTrack;
23
25
  onClear?: () => void;
@@ -52,7 +54,7 @@ export type SimulcastBandwidthLimits = {
52
54
  [Variant.VARIANT_HIGH]: number;
53
55
  };
54
56
  export type StreamConfig = {
55
- simulcast?: Variant[] | false;
57
+ sentQualities?: Variant[] | false;
56
58
  };
57
59
  export type BandwidthLimits = {
58
60
  singleStream: number;
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAiCvE,eAAO,MAAM,qBAAqB,GAAI,UAAU,aAAa,EAAE,sBAAsB,MAAM,iBAI1F,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B;AAOD,eAAO,MAAM,8BAA8B,GACzC,WAAW,OAAO,EAAE,GAAG,KAAK,GAAG,SAAS,EACxC,iBAAiB,eAAe,oFAgBjC,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,oBAE9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,QAKtE"}
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAgCvE,eAAO,MAAM,qBAAqB,GAAI,UAAU,aAAa,EAAE,sBAAsB,MAAM,iBAI1F,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B;AAOD,eAAO,MAAM,8BAA8B,GACzC,WAAW,OAAO,EAAE,GAAG,KAAK,GAAG,SAAS,EACxC,iBAAiB,eAAe,oFAgBjC,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,oBAE9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,QAKtE"}
@@ -22,7 +22,6 @@ const getTrackFromContext = (context) => ({
22
22
  trackId: context.trackId,
23
23
  stream: context.stream,
24
24
  simulcastConfig: context.simulcastConfig || null,
25
- encoding: context.encoding || null,
26
25
  track: context.track,
27
26
  });
28
27
  export const getRemoteOrLocalTrack = (tsClient, remoteOrLocalTrackId) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishjam-cloud/react-client",
3
- "version": "0.25.3",
3
+ "version": "0.26.0-rc.1",
4
4
  "description": "React client library for Fishjam",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Fishjam Team",
@@ -62,7 +62,7 @@
62
62
  "vitest": "^3.1.1"
63
63
  },
64
64
  "dependencies": {
65
- "@fishjam-cloud/ts-client": "0.25.3",
65
+ "@fishjam-cloud/ts-client": "0.26.0-rc.1",
66
66
  "events": "3.3.0",
67
67
  "lodash.isequal": "4.5.0"
68
68
  },