@fishjam-cloud/react-client 0.7.2 → 0.8.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 (41) hide show
  1. package/dist/DeviceManager.d.ts.map +1 -1
  2. package/dist/DeviceManager.js +6 -0
  3. package/dist/fishjamProvider.d.ts +5 -2
  4. package/dist/fishjamProvider.d.ts.map +1 -1
  5. package/dist/fishjamProvider.js +9 -2
  6. package/dist/hooks/devices/useCamera.d.ts +7 -0
  7. package/dist/hooks/devices/useCamera.d.ts.map +1 -0
  8. package/dist/hooks/devices/useCamera.js +35 -0
  9. package/dist/hooks/devices/useInitializeDevices.d.ts +8 -0
  10. package/dist/hooks/devices/useInitializeDevices.d.ts.map +1 -0
  11. package/dist/hooks/devices/useInitializeDevices.js +41 -0
  12. package/dist/hooks/devices/useMicrophone.d.ts +7 -0
  13. package/dist/hooks/devices/useMicrophone.d.ts.map +1 -0
  14. package/dist/hooks/devices/useMicrophone.js +37 -0
  15. package/dist/hooks/public.d.ts +3 -1
  16. package/dist/hooks/public.d.ts.map +1 -1
  17. package/dist/hooks/public.js +3 -1
  18. package/dist/hooks/useFishjamContext.d.ts +2 -1
  19. package/dist/hooks/useFishjamContext.d.ts.map +1 -1
  20. package/dist/hooks/useScreenShare.d.ts +3 -2
  21. package/dist/hooks/useScreenShare.d.ts.map +1 -1
  22. package/dist/hooks/useScreenShare.js +8 -6
  23. package/dist/hooks/useTrackManager.d.ts +4 -2
  24. package/dist/hooks/useTrackManager.d.ts.map +1 -1
  25. package/dist/hooks/useTrackManager.js +35 -36
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/types/internal.d.ts +2 -3
  29. package/dist/types/internal.d.ts.map +1 -1
  30. package/dist/types/public.d.ts +12 -1
  31. package/dist/types/public.d.ts.map +1 -1
  32. package/dist/utils/bandwidth.d.ts +3 -0
  33. package/dist/utils/bandwidth.d.ts.map +1 -0
  34. package/dist/utils/bandwidth.js +4 -0
  35. package/dist/utils/track.d.ts +7 -2
  36. package/dist/utils/track.d.ts.map +1 -1
  37. package/dist/utils/track.js +15 -0
  38. package/package.json +2 -2
  39. package/dist/hooks/devices.d.ts +0 -19
  40. package/dist/hooks/devices.d.ts.map +0 -1
  41. package/dist/hooks/devices.js +0 -98
@@ -1 +1 @@
1
- {"version":3,"file":"DeviceManager.d.ts","sourceRoot":"","sources":["../src/DeviceManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DeviceManager.d.ts","sourceRoot":"","sources":["../src/DeviceManager.ts"],"names":[],"mappings":"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"}
@@ -150,11 +150,17 @@ export class DeviceManager extends EventEmitter {
150
150
  disable() {
151
151
  this.setEnable(this.rawMedia?.track ?? null, false);
152
152
  this.setEnable(this.processedMediaTrack, false);
153
+ if (this.media) {
154
+ this.media.enabled = false;
155
+ }
153
156
  this.emit("deviceDisabled", this.getState());
154
157
  }
155
158
  enable() {
156
159
  this.setEnable(this.rawMedia?.track ?? null, true);
157
160
  this.setEnable(this.processedMediaTrack, true);
161
+ if (this.media) {
162
+ this.media.enabled = true;
163
+ }
158
164
  this.emit("deviceEnabled", this.getState());
159
165
  }
160
166
  setEnable = (track, value) => {
@@ -1,14 +1,17 @@
1
1
  import { type PropsWithChildren } from "react";
2
2
  import { type ReconnectConfig } from "@fishjam-cloud/ts-client";
3
- import type { PersistLastDeviceHandlers } from "./types/public";
3
+ import type { BandwidthLimits, PersistLastDeviceHandlers, StartStreamingProps } from "./types/public";
4
4
  interface FishjamProviderProps extends PropsWithChildren {
5
5
  reconnect?: ReconnectConfig | boolean;
6
6
  constraints?: Pick<MediaStreamConstraints, "audio" | "video">;
7
7
  persistLastDevice?: boolean | PersistLastDeviceHandlers;
8
+ bandwidthLimits?: Partial<BandwidthLimits>;
9
+ autoStreamCamera?: StartStreamingProps | false;
10
+ autoStreamMicrophone?: StartStreamingProps | false;
8
11
  }
9
12
  /**
10
13
  * @category Components
11
14
  */
12
- export declare function FishjamProvider({ children, reconnect, constraints, persistLastDevice }: FishjamProviderProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare function FishjamProvider({ children, reconnect, constraints, persistLastDevice, bandwidthLimits, autoStreamCamera, autoStreamMicrophone, }: FishjamProviderProps): import("react/jsx-runtime").JSX.Element;
13
16
  export {};
14
17
  //# sourceMappingURL=fishjamProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fishjamProvider.d.ts","sourceRoot":"","sources":["../src/fishjamProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAO/E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAGhE,UAAU,oBAAqB,SAAQ,iBAAiB;IACtD,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC9D,iBAAiB,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;CACzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAAE,oBAAoB,2CAuD5G"}
1
+ {"version":3,"file":"fishjamProvider.d.ts","sourceRoot":"","sources":["../src/fishjamProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAO/E,OAAO,KAAK,EAAE,eAAe,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAItG,UAAU,oBAAqB,SAAQ,iBAAiB;IACtD,SAAS,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC;IACtC,WAAW,CAAC,EAAE,IAAI,CAAC,sBAAsB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAC9D,iBAAiB,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,gBAAgB,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;IAC/C,oBAAoB,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;CACpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,GACrB,EAAE,oBAAoB,2CA8DtB"}
@@ -8,10 +8,11 @@ import { usePeerStatus } from "./hooks/usePeerStatus";
8
8
  import { useFishjamClientState } from "./hooks/useFishjamClientState";
9
9
  import { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS } from "./constraints";
10
10
  import { useScreenShareManager } from "./hooks/useScreenShare";
11
+ import { mergeWithDefaultBandwitdthLimits } from "./utils/bandwidth";
11
12
  /**
12
13
  * @category Components
13
14
  */
14
- export function FishjamProvider({ children, reconnect, constraints, persistLastDevice }) {
15
+ export function FishjamProvider({ children, reconnect, constraints, persistLastDevice, bandwidthLimits, autoStreamCamera, autoStreamMicrophone, }) {
15
16
  const fishjamClientRef = useRef(new FishjamClient({ reconnect }));
16
17
  const hasDevicesBeenInitializedRef = useRef(false);
17
18
  const storage = persistLastDevice;
@@ -28,17 +29,22 @@ export function FishjamProvider({ children, reconnect, constraints, persistLastD
28
29
  storage,
29
30
  }));
30
31
  const { peerStatus, getCurrentPeerStatus } = usePeerStatus(fishjamClientRef.current);
32
+ const mergedBandwidthLimits = mergeWithDefaultBandwitdthLimits(bandwidthLimits);
31
33
  const videoTrackManager = useTrackManager({
32
34
  mediaManager: videoDeviceManagerRef.current,
33
35
  tsClient: fishjamClientRef.current,
34
36
  getCurrentPeerStatus,
37
+ bandwidthLimits: mergedBandwidthLimits,
38
+ autoStreamProps: autoStreamCamera,
35
39
  });
36
40
  const audioTrackManager = useTrackManager({
37
41
  mediaManager: audioDeviceManagerRef.current,
38
42
  tsClient: fishjamClientRef.current,
39
43
  getCurrentPeerStatus,
44
+ bandwidthLimits: mergedBandwidthLimits,
45
+ autoStreamProps: autoStreamMicrophone,
40
46
  });
41
- const screenShareManager = useScreenShareManager({ fishjamClient: fishjamClientRef.current });
47
+ const screenShareManager = useScreenShareManager({ fishjamClient: fishjamClientRef.current, getCurrentPeerStatus });
42
48
  const clientState = useFishjamClientState(fishjamClientRef.current);
43
49
  const context = {
44
50
  fishjamClientRef,
@@ -50,6 +56,7 @@ export function FishjamProvider({ children, reconnect, constraints, persistLastD
50
56
  audioDeviceManagerRef,
51
57
  hasDevicesBeenInitializedRef,
52
58
  clientState,
59
+ bandwidthLimits: mergedBandwidthLimits,
53
60
  };
54
61
  return _jsx(FishjamContext.Provider, { value: context, children: children });
55
62
  }
@@ -0,0 +1,7 @@
1
+ import type { Device } from "../../types/public";
2
+ /**
3
+ *
4
+ * @category Devices
5
+ */
6
+ export declare function useCamera(): Device;
7
+ //# sourceMappingURL=useCamera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCamera.d.ts","sourceRoot":"","sources":["../../../src/hooks/devices/useCamera.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAIjD;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CA+BlC"}
@@ -0,0 +1,35 @@
1
+ import { useDeviceManager } from "../deviceManagers/useDeviceManager";
2
+ import { useFishjamContext } from "../useFishjamContext";
3
+ /**
4
+ *
5
+ * @category Devices
6
+ */
7
+ export function useCamera() {
8
+ const { videoTrackManager, videoDeviceManagerRef } = useFishjamContext();
9
+ const { deviceState, status } = useDeviceManager(videoDeviceManagerRef.current);
10
+ const { currentTrack, ...trackManager } = videoTrackManager;
11
+ const stream = deviceState.media?.stream ?? null;
12
+ const currentMiddleware = deviceState.currentMiddleware ?? null;
13
+ const isStreaming = Boolean(currentTrack?.stream);
14
+ const track = stream?.getAudioTracks()[0] ?? null;
15
+ const trackId = currentTrack?.trackId ?? null;
16
+ const devices = deviceState.devices ?? [];
17
+ const activeDevice = deviceState.media?.deviceInfo ?? null;
18
+ const isMuted = !deviceState.media?.enabled;
19
+ const deviceError = deviceState.error ?? null;
20
+ const isDeviceEnabled = Boolean(deviceState.media);
21
+ return {
22
+ ...trackManager,
23
+ currentMiddleware,
24
+ status,
25
+ stream,
26
+ track,
27
+ devices,
28
+ activeDevice,
29
+ deviceError,
30
+ isMuted,
31
+ isStreaming,
32
+ trackId,
33
+ isDeviceEnabled,
34
+ };
35
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ *
3
+ * @category Devices
4
+ */
5
+ export declare const useInitializeDevices: () => {
6
+ initializeDevices: () => Promise<void>;
7
+ };
8
+ //# sourceMappingURL=useInitializeDevices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInitializeDevices.d.ts","sourceRoot":"","sources":["../../../src/hooks/devices/useInitializeDevices.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;CAqDhC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { useCallback } from "react";
2
+ import { prepareConstraints } from "../../constraints";
3
+ import { getAvailableMedia, getCorrectedResult } from "../../mediaInitializer";
4
+ import { useFishjamContext } from "../useFishjamContext";
5
+ /**
6
+ *
7
+ * @category Devices
8
+ */
9
+ export const useInitializeDevices = () => {
10
+ const { videoDeviceManagerRef, audioDeviceManagerRef, hasDevicesBeenInitializedRef } = useFishjamContext();
11
+ const initializeDevices = useCallback(async () => {
12
+ if (hasDevicesBeenInitializedRef.current)
13
+ return;
14
+ hasDevicesBeenInitializedRef.current = true;
15
+ const videoManager = videoDeviceManagerRef.current;
16
+ const audioManager = audioDeviceManagerRef.current;
17
+ const constraints = {
18
+ video: videoManager.getConstraints(),
19
+ audio: audioManager.getConstraints(),
20
+ };
21
+ const previousDevices = {
22
+ video: videoManager.getLastDevice(),
23
+ audio: audioManager.getLastDevice(),
24
+ };
25
+ // Attempt to start the last selected device to avoid an unnecessary restart.
26
+ // Without this, the first device will start, and `getCorrectedResult` will attempt to fix it.
27
+ let [stream, deviceErrors] = await getAvailableMedia({
28
+ video: prepareConstraints(previousDevices.video?.deviceId, constraints.video),
29
+ audio: prepareConstraints(previousDevices.audio?.deviceId, constraints.audio),
30
+ });
31
+ const devices = await navigator.mediaDevices.enumerateDevices();
32
+ const videoDevices = devices.filter(({ kind }) => kind === "videoinput");
33
+ const audioDevices = devices.filter(({ kind }) => kind === "audioinput");
34
+ if (stream) {
35
+ [stream, deviceErrors] = await getCorrectedResult(stream, deviceErrors, devices, constraints, previousDevices);
36
+ }
37
+ videoManager.initialize(stream, stream?.getVideoTracks()?.[0] ?? null, videoDevices, !!constraints.video, deviceErrors.video);
38
+ audioManager.initialize(stream, stream?.getAudioTracks()?.[0] ?? null, audioDevices, !!constraints.audio, deviceErrors.audio);
39
+ }, [videoDeviceManagerRef, audioDeviceManagerRef, hasDevicesBeenInitializedRef]);
40
+ return { initializeDevices };
41
+ };
@@ -0,0 +1,7 @@
1
+ import type { AudioDevice } from "../../types/public";
2
+ /**
3
+ *
4
+ * @category Devices
5
+ */
6
+ export declare function useMicrophone(): AudioDevice;
7
+ //# sourceMappingURL=useMicrophone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMicrophone.d.ts","sourceRoot":"","sources":["../../../src/hooks/devices/useMicrophone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD;;;GAGG;AACH,wBAAgB,aAAa,IAAI,WAAW,CAiC3C"}
@@ -0,0 +1,37 @@
1
+ import { useDeviceManager } from "../deviceManagers/useDeviceManager";
2
+ import { useFishjamContext } from "../useFishjamContext";
3
+ /**
4
+ *
5
+ * @category Devices
6
+ */
7
+ export function useMicrophone() {
8
+ const { audioTrackManager, audioDeviceManagerRef } = useFishjamContext();
9
+ const { deviceState, status } = useDeviceManager(audioDeviceManagerRef.current);
10
+ const { currentTrack, ...trackManager } = audioTrackManager;
11
+ const stream = deviceState.media?.stream ?? null;
12
+ const currentMiddleware = deviceState.currentMiddleware ?? null;
13
+ const isStreaming = Boolean(currentTrack?.stream);
14
+ const track = stream?.getAudioTracks()[0] ?? null;
15
+ const trackId = currentTrack?.trackId ?? null;
16
+ const devices = deviceState.devices ?? [];
17
+ const activeDevice = deviceState.media?.deviceInfo ?? null;
18
+ const isAudioPlaying = currentTrack?.vadStatus === "speech";
19
+ const isMuted = !deviceState.media?.enabled;
20
+ const deviceError = deviceState.error ?? null;
21
+ const isDeviceEnabled = Boolean(deviceState.media);
22
+ return {
23
+ ...trackManager,
24
+ currentMiddleware,
25
+ isDeviceEnabled,
26
+ status,
27
+ stream,
28
+ track,
29
+ isStreaming,
30
+ trackId,
31
+ devices,
32
+ activeDevice,
33
+ isMuted,
34
+ deviceError,
35
+ isAudioPlaying,
36
+ };
37
+ }
@@ -1,6 +1,8 @@
1
1
  export { useConnect, useDisconnect } from "./useConnection";
2
2
  export { useReconnection } from "./useReconnection";
3
- export { useCamera, useMicrophone, useInitializeDevices } from "./devices";
3
+ export { useCamera } from "./devices/useCamera";
4
+ export { useMicrophone } from "./devices/useMicrophone";
5
+ export { useInitializeDevices } from "./devices/useInitializeDevices";
4
6
  export { usePeers } from "./usePeers";
5
7
  export { useScreenShare } from "./useScreenShare";
6
8
  export { useStatus } from "./useStatus";
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/hooks/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/hooks/public.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -1,6 +1,8 @@
1
1
  export { useConnect, useDisconnect } from "./useConnection";
2
2
  export { useReconnection } from "./useReconnection";
3
- export { useCamera, useMicrophone, useInitializeDevices } from "./devices";
3
+ export { useCamera } from "./devices/useCamera";
4
+ export { useMicrophone } from "./devices/useMicrophone";
5
+ export { useInitializeDevices } from "./devices/useInitializeDevices";
4
6
  export { usePeers } from "./usePeers";
5
7
  export { useScreenShare } from "./useScreenShare";
6
8
  export { useStatus } from "./useStatus";
@@ -3,7 +3,7 @@ import { type MutableRefObject } from "react";
3
3
  import type { PeerMetadata, TrackMetadata, TrackManager } from "../types/internal";
4
4
  import type { DeviceManager } from "../DeviceManager";
5
5
  import type { FishjamClientState } from "./useFishjamClientState";
6
- import type { PeerStatus, ScreenshareApi } from "../types/public";
6
+ import type { BandwidthLimits, PeerStatus, ScreenshareApi } from "../types/public";
7
7
  export type FishjamContextType = {
8
8
  fishjamClientRef: MutableRefObject<FishjamClient<PeerMetadata, TrackMetadata>>;
9
9
  videoDeviceManagerRef: MutableRefObject<DeviceManager>;
@@ -14,6 +14,7 @@ export type FishjamContextType = {
14
14
  videoTrackManager: TrackManager;
15
15
  audioTrackManager: TrackManager;
16
16
  clientState: FishjamClientState;
17
+ bandwidthLimits: BandwidthLimits;
17
18
  };
18
19
  export declare const FishjamContext: import("react").Context<FishjamContextType | null>;
19
20
  export declare function useFishjamContext(): FishjamContextType;
@@ -1 +1 @@
1
- {"version":3,"file":"useFishjamContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useFishjamContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAiB,KAAK,gBAAgB,EAAc,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/E,qBAAqB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACvD,qBAAqB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACvD,4BAA4B,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxD,kBAAkB,EAAE,cAAc,CAAC;IACnC,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,YAAY,CAAC;IAChC,iBAAiB,EAAE,YAAY,CAAC;IAChC,WAAW,EAAE,kBAAkB,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,cAAc,oDAAiD,CAAC;AAE7E,wBAAgB,iBAAiB,IAGb,kBAAkB,CACrC"}
1
+ {"version":3,"file":"useFishjamContext.d.ts","sourceRoot":"","sources":["../../src/hooks/useFishjamContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAiB,KAAK,gBAAgB,EAAc,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEnF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/E,qBAAqB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACvD,qBAAqB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACvD,4BAA4B,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxD,kBAAkB,EAAE,cAAc,CAAC;IACnC,UAAU,EAAE,UAAU,CAAC;IACvB,iBAAiB,EAAE,YAAY,CAAC;IAChC,iBAAiB,EAAE,YAAY,CAAC;IAChC,WAAW,EAAE,kBAAkB,CAAC;IAChC,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,cAAc,oDAAiD,CAAC;AAE7E,wBAAgB,iBAAiB,IAGb,kBAAkB,CACrC"}
@@ -1,14 +1,15 @@
1
1
  import type { FishjamClient } from "@fishjam-cloud/ts-client";
2
- import type { ScreenshareApi } from "../types/public";
2
+ import type { ScreenshareApi, PeerStatus } from "../types/public";
3
3
  import type { PeerMetadata, TrackMetadata } from "../types/internal";
4
4
  interface ScreenShareManagerProps {
5
5
  fishjamClient: FishjamClient<PeerMetadata, TrackMetadata>;
6
+ getCurrentPeerStatus: () => PeerStatus;
6
7
  }
7
8
  /**
8
9
  *
9
10
  * @category Screenshare
10
11
  */
11
- export declare const useScreenShareManager: ({ fishjamClient }: ScreenShareManagerProps) => ScreenshareApi;
12
+ export declare const useScreenShareManager: ({ fishjamClient, getCurrentPeerStatus, }: ScreenShareManagerProps) => ScreenshareApi;
12
13
  export declare const useScreenShare: () => ScreenshareApi;
13
14
  export declare const getTracksFromStream: (stream: MediaStream) => [MediaStreamTrack, MediaStreamTrack | null];
14
15
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAoB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAoB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvF,UAAU,uBAAuB;IAC/B,aAAa,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;CAC3D;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,sBAAuB,uBAAuB,KAAG,cAmIlF,CAAC;AAEF,eAAO,MAAM,cAAc,sBAI1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAAY,WAAW,KAAG,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAKnG,CAAC"}
1
+ {"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAoB,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAoB,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvF,UAAU,uBAAuB;IAC/B,aAAa,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAC1D,oBAAoB,EAAE,MAAM,UAAU,CAAC;CACxC;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,6CAG/B,uBAAuB,KAAG,cAqI5B,CAAC;AAEF,eAAO,MAAM,cAAc,sBAI1B,CAAC;AAEF,eAAO,MAAM,mBAAmB,WAAY,WAAW,KAAG,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAKnG,CAAC"}
@@ -5,7 +5,7 @@ import { useFishjamContext } from "./useFishjamContext";
5
5
  *
6
6
  * @category Screenshare
7
7
  */
8
- export const useScreenShareManager = ({ fishjamClient }) => {
8
+ export const useScreenShareManager = ({ fishjamClient, getCurrentPeerStatus, }) => {
9
9
  const [state, setState] = useState({ stream: null, trackIds: null });
10
10
  const cleanMiddlewareFnRef = useRef(null);
11
11
  const stream = state.stream ?? null;
@@ -65,13 +65,15 @@ export const useScreenShareManager = ({ fishjamClient }) => {
65
65
  video.stop();
66
66
  if (audio)
67
67
  audio.stop();
68
- const removeTrackPromises = [fishjamClient.removeTrack(state.trackIds.videoId)];
69
- if (state.trackIds.audioId)
70
- removeTrackPromises.push(fishjamClient.removeTrack(state.trackIds.audioId));
71
- await Promise.all(removeTrackPromises);
68
+ if (getCurrentPeerStatus() === "connected") {
69
+ const removeTrackPromises = [fishjamClient.removeTrack(state.trackIds.videoId)];
70
+ if (state.trackIds.audioId)
71
+ removeTrackPromises.push(fishjamClient.removeTrack(state.trackIds.audioId));
72
+ await Promise.all(removeTrackPromises);
73
+ }
72
74
  cleanMiddleware();
73
75
  setState(({ tracksMiddleware }) => ({ stream: null, trackIds: null, tracksMiddleware }));
74
- }, [state, fishjamClient, setState, cleanMiddleware]);
76
+ }, [state, fishjamClient, setState, cleanMiddleware, getCurrentPeerStatus]);
75
77
  useEffect(() => {
76
78
  if (!state.stream)
77
79
  return;
@@ -1,11 +1,13 @@
1
1
  import type { FishjamClient } from "@fishjam-cloud/ts-client";
2
2
  import type { MediaManager, PeerMetadata, TrackManager, TrackMetadata } from "../types/internal";
3
- import type { PeerStatus } from "../types/public";
3
+ import type { BandwidthLimits, PeerStatus, StartStreamingProps } from "../types/public";
4
4
  interface TrackManagerConfig {
5
5
  mediaManager: MediaManager;
6
6
  tsClient: FishjamClient<PeerMetadata, TrackMetadata>;
7
7
  getCurrentPeerStatus: () => PeerStatus;
8
+ bandwidthLimits: BandwidthLimits;
9
+ autoStreamProps?: StartStreamingProps | false;
8
10
  }
9
- export declare const useTrackManager: ({ mediaManager, tsClient, getCurrentPeerStatus }: TrackManagerConfig) => TrackManager;
11
+ export declare const useTrackManager: ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits, autoStreamProps, }: TrackManagerConfig) => TrackManager;
10
12
  export {};
11
13
  //# sourceMappingURL=useTrackManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTrackManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useTrackManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAwC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGjG,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AAEnE,UAAU,kBAAkB;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACrD,oBAAoB,EAAE,MAAM,UAAU,CAAC;CACxC;AASD,eAAO,MAAM,eAAe,qDAAsD,kBAAkB,KAAG,YA0LtG,CAAC"}
1
+ {"version":3,"file":"useTrackManager.d.ts","sourceRoot":"","sources":["../../src/hooks/useTrackManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGjG,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAmB,MAAM,iBAAiB,CAAC;AAEzG,UAAU,kBAAkB;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IACrD,oBAAoB,EAAE,MAAM,UAAU,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;CAC/C;AAWD,eAAO,MAAM,eAAe,wFAMzB,kBAAkB,KAAG,YA0LvB,CAAC"}
@@ -1,14 +1,13 @@
1
- import { getRemoteOrLocalTrack } from "../utils/track";
1
+ import { getConfigAndBandwidthFromProps, getRemoteOrLocalTrack } from "../utils/track";
2
2
  import { useCallback, useEffect, useMemo, useState } from "react";
3
3
  const TRACK_TYPE_TO_DEVICE = {
4
4
  video: "camera",
5
5
  audio: "microphone",
6
6
  };
7
- export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }) => {
7
+ const getDeviceType = (mediaManager) => TRACK_TYPE_TO_DEVICE[mediaManager.getDeviceType()];
8
+ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits, autoStreamProps, }) => {
8
9
  const [currentTrackId, setCurrentTrackId] = useState(null);
9
10
  const [paused, setPaused] = useState(false);
10
- const type = TRACK_TYPE_TO_DEVICE[mediaManager.getDeviceType()];
11
- const metadata = useMemo(() => ({ type, paused }), [type, paused]);
12
11
  const currentTrack = useMemo(() => getRemoteOrLocalTrack(tsClient, currentTrackId), [tsClient, currentTrackId]);
13
12
  async function setTrackMiddleware(middleware) {
14
13
  mediaManager.setTrackMiddleware(middleware);
@@ -21,10 +20,8 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }
21
20
  const newTrack = mediaManager.getMedia()?.track ?? null;
22
21
  await tsClient.replaceTrack(currentTrackId, newTrack);
23
22
  }
24
- function stop() {
25
- return mediaManager.stop();
26
- }
27
- const startStreaming = useCallback(async (simulcastConfig, maxBandwidth) => {
23
+ const stop = useCallback(() => mediaManager.stop(), [mediaManager]);
24
+ const startStreaming = useCallback(async (props = { simulcast: ["l", "m", "h"] }) => {
28
25
  if (currentTrackId)
29
26
  throw Error("Track already added");
30
27
  const media = mediaManager.getMedia();
@@ -36,53 +33,57 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }
36
33
  // see `getRemoteOrLocalTrackContext()` explanation
37
34
  setCurrentTrackId(media.track.id);
38
35
  const displayName = tsClient.getLocalPeer()?.metadata?.peer?.displayName;
39
- const trackMetadata = { ...metadata, displayName, paused: false };
36
+ const deviceType = getDeviceType(mediaManager);
37
+ const trackMetadata = { type: deviceType, displayName, paused: false };
38
+ const [maxBandwidth, simulcastConfig] = getConfigAndBandwidthFromProps(props.simulcast, bandwidthLimits);
40
39
  const remoteTrackId = await tsClient.addTrack(media.track, trackMetadata, simulcastConfig, maxBandwidth);
41
40
  setCurrentTrackId(remoteTrackId);
42
41
  setPaused(false);
43
42
  return remoteTrackId;
44
- }, [currentTrackId, mediaManager, metadata, tsClient]);
45
- async function refreshStreamedTrack() {
43
+ }, [currentTrackId, mediaManager, tsClient, bandwidthLimits]);
44
+ const refreshStreamedTrack = useCallback(async () => {
46
45
  if (!currentTrack)
47
46
  return;
48
47
  const newTrack = mediaManager.getMedia()?.track ?? null;
49
48
  if (!newTrack)
50
49
  throw Error("New track is empty");
51
50
  return tsClient.replaceTrack(currentTrack.trackId, newTrack);
52
- }
53
- async function stopStreaming() {
51
+ }, [currentTrack, mediaManager, tsClient]);
52
+ const stopStreaming = useCallback(async () => {
54
53
  if (!currentTrack)
55
54
  return;
56
55
  setCurrentTrackId(null);
57
56
  setPaused(true);
58
57
  return tsClient.removeTrack(currentTrack.trackId);
59
- }
60
- async function pauseStreaming() {
58
+ }, [currentTrack, tsClient]);
59
+ const pauseStreaming = useCallback(async () => {
61
60
  if (!currentTrack)
62
61
  return;
63
62
  setPaused(true);
64
63
  await tsClient.replaceTrack(currentTrack.trackId, null);
65
- const trackMetadata = { ...metadata, paused: true };
64
+ const deviceType = getDeviceType(mediaManager);
65
+ const trackMetadata = { type: deviceType, paused: true };
66
66
  return tsClient.updateTrackMetadata(currentTrack.trackId, trackMetadata);
67
- }
68
- async function resumeStreaming() {
67
+ }, [currentTrack, mediaManager, tsClient]);
68
+ const resumeStreaming = useCallback(async () => {
69
69
  if (!currentTrack)
70
70
  return;
71
71
  const media = mediaManager.getMedia();
72
+ const deviceType = getDeviceType(mediaManager);
72
73
  if (!media)
73
74
  throw Error("Device is unavailable");
74
75
  setPaused(false);
75
76
  await tsClient.replaceTrack(currentTrack.trackId, media.track);
76
- const trackMetadata = { ...metadata, paused: false };
77
+ const trackMetadata = { type: deviceType, paused: false };
77
78
  return tsClient.updateTrackMetadata(currentTrack.trackId, trackMetadata);
78
- }
79
- function disableTrack() {
79
+ }, [currentTrack, mediaManager, tsClient]);
80
+ const disableTrack = useCallback(() => {
80
81
  mediaManager.disable();
81
- }
82
- function enableTrack() {
82
+ }, [mediaManager]);
83
+ const enableTrack = useCallback(() => {
83
84
  mediaManager.enable();
84
- }
85
- const stream = async () => {
85
+ }, [mediaManager]);
86
+ const stream = useCallback(async () => {
86
87
  if (getCurrentPeerStatus() !== "connected")
87
88
  return;
88
89
  if (currentTrack?.trackId) {
@@ -91,8 +92,8 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }
91
92
  else {
92
93
  await startStreaming();
93
94
  }
94
- };
95
- async function toggle(mode) {
95
+ }, [currentTrack?.trackId, getCurrentPeerStatus, resumeStreaming, startStreaming]);
96
+ const toggle = useCallback(async (mode) => {
96
97
  const mediaStream = mediaManager.getMedia()?.stream;
97
98
  const track = mediaManager.getMedia()?.track ?? null;
98
99
  const enabled = Boolean(track?.enabled);
@@ -113,23 +114,21 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }
113
114
  await mediaManager.start();
114
115
  await stream();
115
116
  }
116
- }
117
+ }, [currentTrack, mediaManager, pauseStreaming, stream]);
117
118
  /**
118
119
  * @see {@link TrackManager#toggleMute} for more details.
119
120
  */
120
- async function toggleMute() {
121
- await toggle("soft");
122
- }
121
+ const toggleMute = useCallback(() => toggle("soft"), [toggle]);
123
122
  /**
124
123
  * @see {@link TrackManager#toggleDevice} for more details.
125
124
  */
126
- async function toggleDevice() {
127
- await toggle("hard");
128
- }
125
+ const toggleDevice = useCallback(() => toggle("hard"), [toggle]);
129
126
  useEffect(() => {
127
+ if (autoStreamProps === false)
128
+ return;
130
129
  const joinedHandler = () => {
131
130
  if (mediaManager.getMedia()?.track) {
132
- startStreaming();
131
+ startStreaming(autoStreamProps);
133
132
  }
134
133
  };
135
134
  const disconnectedHandler = () => {
@@ -141,7 +140,7 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }
141
140
  tsClient.off("joined", joinedHandler);
142
141
  tsClient.off("disconnected", disconnectedHandler);
143
142
  };
144
- }, [mediaManager, startStreaming, tsClient]);
143
+ }, [mediaManager, startStreaming, tsClient, autoStreamProps]);
145
144
  return {
146
145
  currentTrack,
147
146
  setTrackMiddleware,
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { useConnect, useDisconnect, useReconnection, useCamera, useMicrophone, useInitializeDevices, usePeers, useScreenShare, useStatus, } from "./hooks/public";
2
2
  export { FishjamProvider } from "./fishjamProvider";
3
- export { Track, TrackMiddleware, TracksMiddleware, PeerStatus, Device, AudioDevice, PeerWithTracks, ConnectConfig, PersistLastDeviceHandlers, ScreenshareApi, } from "./types/public";
3
+ export { Track, TrackMiddleware, TracksMiddleware, PeerStatus, Device, AudioDevice, PeerWithTracks, ConnectConfig, PersistLastDeviceHandlers, ScreenshareApi, StartStreamingProps, } from "./types/public";
4
4
  export { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS, SCREEN_SHARING_MEDIA_CONSTRAINTS } from "./constraints";
5
5
  export type { Peer, MessageEvents, CreateConfig, TrackBandwidthLimit, SimulcastBandwidthLimit, BandwidthLimit, WebRTCEndpointEvents, TrackContextEvents, Endpoint, SimulcastConfig, TrackContext, VadStatus, EncodingReason, MetadataParser, AuthErrorReason, Encoding, } from "@fishjam-cloud/ts-client";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,WAAW,EACX,cAAc,EACd,aAAa,EACb,yBAAyB,EACzB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAEnH,YAAY,EACV,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EACf,QAAQ,GACT,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,WAAW,EACX,cAAc,EACd,aAAa,EACb,yBAAyB,EACzB,cAAc,EACd,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAEnH,YAAY,EACV,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,SAAS,EACT,cAAc,EACd,cAAc,EACd,eAAe,EACf,QAAQ,GACT,MAAM,0BAA0B,CAAC"}
@@ -1,6 +1,5 @@
1
- import type { SimulcastConfig, TrackBandwidthLimit } from "@fishjam-cloud/ts-client";
2
- import type { Track, TrackMiddleware, TracksMiddleware } from "./public";
3
1
  import type { DeviceType } from "../DeviceManager";
2
+ import type { StartStreamingProps, Track, TrackMiddleware, TracksMiddleware } from "./public";
4
3
  export type TrackId = string;
5
4
  export type PeerId = string;
6
5
  export type PeerState = {
@@ -82,7 +81,7 @@ export type ScreenShareState = ({
82
81
  export interface TrackManager {
83
82
  initialize: (deviceId?: string) => Promise<void>;
84
83
  stop: () => void;
85
- startStreaming: (simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
84
+ startStreaming: (startStreamingProps?: StartStreamingProps) => Promise<string>;
86
85
  stopStreaming: () => Promise<void>;
87
86
  pauseStreaming: () => Promise<void>;
88
87
  resumeStreaming: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Encoding, SimulcastConfig, ConnectConfig as TSClientConnectConfig, VadStatus } from "@fishjam-cloud/ts-client";
2
- import type { DeviceManagerStatus, DistinguishedTracks, PeerMetadata, PeerState, TrackId, TrackManager, TrackMetadata } from "./internal";
2
+ import type { DeviceError, DeviceManagerStatus, DistinguishedTracks, PeerMetadata, PeerState, TrackId, TrackManager, TrackMetadata } from "./internal";
3
3
  export type Track = {
4
4
  stream: MediaStream | null;
5
5
  encoding: Encoding | null;
@@ -36,6 +36,9 @@ export type Device = {
36
36
  devices: MediaDeviceInfo[];
37
37
  activeDevice: MediaDeviceInfo | null;
38
38
  currentMiddleware: TrackMiddleware;
39
+ deviceError: DeviceError | null;
40
+ isMuted: boolean;
41
+ isDeviceEnabled: boolean;
39
42
  } & Omit<TrackManager, "currentTrack">;
40
43
  export type AudioDevice = Device & {
41
44
  isAudioPlaying: boolean;
@@ -62,4 +65,12 @@ export type ScreenshareApi = {
62
65
  setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
63
66
  currentTracksMiddleware: TracksMiddleware | null;
64
67
  };
68
+ export type SimulcastBandwidthLimits = Record<Encoding, number>;
69
+ export type StartStreamingProps = {
70
+ simulcast?: Encoding[] | false;
71
+ };
72
+ export type BandwidthLimits = {
73
+ singleStream: number;
74
+ simulcast: SimulcastBandwidthLimits;
75
+ };
65
76
  //# sourceMappingURL=public.d.ts.map
@@ -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":"AAAA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,aAAa,IAAI,qBAAqB,EACtC,SAAS,EACV,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,OAAO,EACP,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,KAAK;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,GAAG,IAAI,CAAC;AAEtH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAChC;IAAE,UAAU,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC;AAEhG;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvE,MAAM,MAAM,MAAM,GAAG;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,eAAe,CAAC;IACnC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AAEvC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAE7D,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC;AAExH,MAAM,MAAM,yBAAyB,GAAG;IACtC,aAAa,EAAE,MAAM,eAAe,GAAG,IAAI,CAAC;IAC5C,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE;QACvB,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;QACnD,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;KACpD,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,mBAAmB,GAAG;IAAE,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,wBAAwB,CAAA;CAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { BandwidthLimits } from "../types/public";
2
+ export declare const mergeWithDefaultBandwitdthLimits: (limits?: Partial<BandwidthLimits>) => BandwidthLimits;
3
+ //# sourceMappingURL=bandwidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bandwidth.d.ts","sourceRoot":"","sources":["../../src/utils/bandwidth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,gCAAgC,YAAa,OAAO,CAAC,eAAe,CAAC,KAAG,eAGnF,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const mergeWithDefaultBandwitdthLimits = (limits) => ({
2
+ singleStream: limits?.singleStream ?? 0,
3
+ simulcast: limits?.simulcast ?? { l: 0, m: 0, h: 0 },
4
+ });
@@ -1,6 +1,11 @@
1
- import type { FishjamClient } from "@fishjam-cloud/ts-client";
1
+ import type { Encoding, FishjamClient } from "@fishjam-cloud/ts-client";
2
2
  import type { PeerMetadata, TrackMetadata } from "../types/internal";
3
- import type { Track } from "../types/public";
3
+ import type { BandwidthLimits, Track } from "../types/public";
4
4
  export declare const getRemoteOrLocalTrack: (tsClient: FishjamClient<PeerMetadata, TrackMetadata>, remoteOrLocalTrackId: string | null) => Track | null;
5
5
  export declare function setupOnEndedCallback(track: MediaStreamTrack, getCurrentTrackId: () => string | undefined, callback: () => Promise<void>): void;
6
+ export declare const getConfigAndBandwidthFromProps: (encodings: Encoding[] | false | undefined, bandwidthLimits: BandwidthLimits) => readonly [number, undefined] | readonly [Map<Encoding, number>, {
7
+ enabled: boolean;
8
+ activeEncodings: Encoding[];
9
+ disabledEncodings: Encoding[];
10
+ }];
6
11
  //# sourceMappingURL=track.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAoC7C,eAAO,MAAM,qBAAqB,aACtB,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,wBAC9B,MAAM,GAAG,IAAI,iBAKpC,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B"}
1
+ {"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAgB,MAAM,0BAA0B,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAoC9D,eAAO,MAAM,qBAAqB,aACtB,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,wBAC9B,MAAM,GAAG,IAAI,iBAKpC,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,cAC9B,QAAQ,EAAE,GAAG,KAAK,GAAG,SAAS,mBACxB,eAAe;;;;EAWjC,CAAC"}
@@ -41,3 +41,18 @@ export function setupOnEndedCallback(track, getCurrentTrackId, callback) {
41
41
  }
42
42
  });
43
43
  }
44
+ const getDisabledEncodings = (activeEncodings = []) => {
45
+ const allEncodings = ["l", "m", "h"];
46
+ return allEncodings.filter((encoding) => !activeEncodings.includes(encoding));
47
+ };
48
+ export const getConfigAndBandwidthFromProps = (encodings, bandwidthLimits) => {
49
+ if (!encodings)
50
+ return [bandwidthLimits.singleStream, undefined];
51
+ const config = {
52
+ enabled: true,
53
+ activeEncodings: encodings,
54
+ disabledEncodings: getDisabledEncodings(encodings),
55
+ };
56
+ const bandwidth = new Map(Object.entries(bandwidthLimits.simulcast));
57
+ return [bandwidth, config];
58
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fishjam-cloud/react-client",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "React client library for Fishjam Cloud",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Fishjam Cloud Team",
@@ -50,7 +50,7 @@
50
50
  "typescript": "^5.6.2"
51
51
  },
52
52
  "dependencies": {
53
- "@fishjam-cloud/ts-client": "0.7.2",
53
+ "@fishjam-cloud/ts-client": "0.8.0",
54
54
  "events": "3.3.0",
55
55
  "lodash.isequal": "4.5.0"
56
56
  },
@@ -1,19 +0,0 @@
1
- import type { AudioDevice, Device } from "../types/public";
2
- /**
3
- *
4
- * @category Devices
5
- */
6
- export declare function useCamera(): Device;
7
- /**
8
- *
9
- * @category Devices
10
- */
11
- export declare function useMicrophone(): AudioDevice;
12
- /**
13
- *
14
- * @category Devices
15
- */
16
- export declare const useInitializeDevices: () => {
17
- initializeDevices: () => Promise<void>;
18
- };
19
- //# sourceMappingURL=devices.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/hooks/devices.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK3D;;;GAGG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAyBlC;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,WAAW,CA2B3C;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;CAqDhC,CAAC"}
@@ -1,98 +0,0 @@
1
- import { useFishjamContext } from "./useFishjamContext";
2
- import { useCallback } from "react";
3
- import { useDeviceManager } from "./deviceManagers/useDeviceManager";
4
- import { getAvailableMedia, getCorrectedResult } from "../mediaInitializer";
5
- import { prepareConstraints } from "../constraints";
6
- /**
7
- *
8
- * @category Devices
9
- */
10
- export function useCamera() {
11
- const { videoTrackManager, videoDeviceManagerRef } = useFishjamContext();
12
- const { deviceState, status } = useDeviceManager(videoDeviceManagerRef.current);
13
- const { currentTrack, ...trackManager } = videoTrackManager;
14
- const stream = deviceState.media?.stream ?? null;
15
- const currentMiddleware = deviceState.currentMiddleware ?? null;
16
- const isStreaming = Boolean(currentTrack?.stream);
17
- const track = stream?.getAudioTracks()[0] ?? null;
18
- const trackId = currentTrack?.trackId ?? null;
19
- const devices = deviceState.devices ?? [];
20
- const activeDevice = deviceState.media?.deviceInfo ?? null;
21
- return {
22
- ...trackManager,
23
- currentMiddleware,
24
- status,
25
- stream,
26
- track,
27
- devices,
28
- activeDevice,
29
- isStreaming,
30
- trackId,
31
- };
32
- }
33
- /**
34
- *
35
- * @category Devices
36
- */
37
- export function useMicrophone() {
38
- const { audioTrackManager, audioDeviceManagerRef } = useFishjamContext();
39
- const { deviceState, status } = useDeviceManager(audioDeviceManagerRef.current);
40
- const { currentTrack, ...trackManager } = audioTrackManager;
41
- const stream = deviceState.media?.stream ?? null;
42
- const currentMiddleware = deviceState.currentMiddleware ?? null;
43
- const isStreaming = Boolean(currentTrack?.stream);
44
- const track = stream?.getAudioTracks()[0] ?? null;
45
- const trackId = currentTrack?.trackId ?? null;
46
- const devices = deviceState.devices ?? [];
47
- const activeDevice = deviceState.media?.deviceInfo ?? null;
48
- const isAudioPlaying = currentTrack?.vadStatus === "speech";
49
- return {
50
- ...trackManager,
51
- currentMiddleware,
52
- status,
53
- stream,
54
- track,
55
- isStreaming,
56
- trackId,
57
- devices,
58
- activeDevice,
59
- isAudioPlaying,
60
- };
61
- }
62
- /**
63
- *
64
- * @category Devices
65
- */
66
- export const useInitializeDevices = () => {
67
- const { videoDeviceManagerRef, audioDeviceManagerRef, hasDevicesBeenInitializedRef } = useFishjamContext();
68
- const initializeDevices = useCallback(async () => {
69
- if (hasDevicesBeenInitializedRef.current)
70
- return;
71
- hasDevicesBeenInitializedRef.current = true;
72
- const videoManager = videoDeviceManagerRef.current;
73
- const audioManager = audioDeviceManagerRef.current;
74
- const constraints = {
75
- video: videoManager.getConstraints(),
76
- audio: audioManager.getConstraints(),
77
- };
78
- const previousDevices = {
79
- video: videoManager.getLastDevice(),
80
- audio: audioManager.getLastDevice(),
81
- };
82
- // Attempt to start the last selected device to avoid an unnecessary restart.
83
- // Without this, the first device will start, and `getCorrectedResult` will attempt to fix it.
84
- let [stream, deviceErrors] = await getAvailableMedia({
85
- video: prepareConstraints(previousDevices.video?.deviceId, constraints.video),
86
- audio: prepareConstraints(previousDevices.audio?.deviceId, constraints.audio),
87
- });
88
- const devices = await navigator.mediaDevices.enumerateDevices();
89
- const videoDevices = devices.filter(({ kind }) => kind === "videoinput");
90
- const audioDevices = devices.filter(({ kind }) => kind === "audioinput");
91
- if (stream) {
92
- [stream, deviceErrors] = await getCorrectedResult(stream, deviceErrors, devices, constraints, previousDevices);
93
- }
94
- videoManager.initialize(stream, stream?.getVideoTracks()?.[0] ?? null, videoDevices, !!constraints.video, deviceErrors.video);
95
- audioManager.initialize(stream, stream?.getAudioTracks()?.[0] ?? null, audioDevices, !!constraints.audio, deviceErrors.audio);
96
- }, [videoDeviceManagerRef, audioDeviceManagerRef, hasDevicesBeenInitializedRef]);
97
- return { initializeDevices };
98
- };