@fishjam-cloud/react-client 0.10.2 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +201 -0
- package/dist/FishjamProvider.d.ts +43 -0
- package/dist/FishjamProvider.d.ts.map +1 -0
- package/dist/{fishjamProvider.js → FishjamProvider.js} +17 -15
- package/dist/devices/DeviceManager.d.ts +2 -2
- package/dist/devices/DeviceManager.d.ts.map +1 -1
- package/dist/devices/DeviceManager.js +5 -5
- package/dist/devices/mediaInitializer.d.ts.map +1 -1
- package/dist/devices/mediaInitializer.js +1 -1
- package/dist/hooks/devices/useCamera.d.ts +44 -2
- package/dist/hooks/devices/useCamera.d.ts.map +1 -1
- package/dist/hooks/devices/useCamera.js +13 -2
- package/dist/hooks/devices/useInitializeDevices.d.ts +14 -3
- package/dist/hooks/devices/useInitializeDevices.d.ts.map +1 -1
- package/dist/hooks/devices/useInitializeDevices.js +6 -6
- package/dist/hooks/devices/useMicrophone.d.ts +46 -2
- package/dist/hooks/devices/useMicrophone.d.ts.map +1 -1
- package/dist/hooks/devices/useMicrophone.js +15 -2
- package/dist/hooks/internal/device/useDeviceApi.d.ts +2 -4
- package/dist/hooks/internal/device/useDeviceApi.d.ts.map +1 -1
- package/dist/hooks/internal/device/useDeviceApi.js +16 -22
- package/dist/hooks/internal/device/useDeviceManager.d.ts +1 -1
- package/dist/hooks/internal/device/useDeviceManager.d.ts.map +1 -1
- package/dist/hooks/internal/device/useDeviceManager.js +2 -2
- package/dist/hooks/internal/useFishjamClientState.d.ts +1 -1
- package/dist/hooks/internal/useFishjamClientState.d.ts.map +1 -1
- package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.d.ts.map +1 -1
- package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.js +1 -1
- package/dist/hooks/internal/useFishjamContext.d.ts +4 -3
- package/dist/hooks/internal/useFishjamContext.d.ts.map +1 -1
- package/dist/hooks/internal/usePeerStatus.d.ts.map +1 -1
- package/dist/hooks/internal/usePeerStatus.js +2 -0
- package/dist/hooks/internal/useReconnection.d.ts.map +1 -1
- package/dist/hooks/internal/useScreenshareManager.d.ts +10 -0
- package/dist/hooks/internal/useScreenshareManager.d.ts.map +1 -0
- package/dist/hooks/internal/useScreenshareManager.js +114 -0
- package/dist/hooks/internal/useTrackManager.d.ts +3 -3
- package/dist/hooks/internal/useTrackManager.d.ts.map +1 -1
- package/dist/hooks/internal/useTrackManager.js +13 -36
- package/dist/hooks/useConnection.d.ts +30 -10
- package/dist/hooks/useConnection.d.ts.map +1 -1
- package/dist/hooks/useConnection.js +10 -3
- package/dist/hooks/usePeers.d.ts +31 -11
- package/dist/hooks/usePeers.d.ts.map +1 -1
- package/dist/hooks/usePeers.js +7 -5
- package/dist/hooks/useScreenShare.d.ts +46 -10
- package/dist/hooks/useScreenShare.d.ts.map +1 -1
- package/dist/hooks/useScreenShare.js +3 -121
- package/dist/hooks/useUpdatePeerMetadata.d.ts +6 -0
- package/dist/hooks/useUpdatePeerMetadata.d.ts.map +1 -1
- package/dist/hooks/useUpdatePeerMetadata.js +6 -0
- package/dist/hooks/useVAD.d.ts +6 -0
- package/dist/hooks/useVAD.d.ts.map +1 -1
- package/dist/hooks/useVAD.js +10 -4
- package/dist/index.d.ts +9 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/types/internal.d.ts +4 -24
- package/dist/types/internal.d.ts.map +1 -1
- package/dist/types/public.d.ts +17 -31
- package/dist/types/public.d.ts.map +1 -1
- package/dist/utils/bandwidth.d.ts.map +1 -1
- package/dist/utils/localStorage.d.ts +1 -1
- package/dist/utils/localStorage.d.ts.map +1 -1
- package/dist/utils/track.d.ts.map +1 -1
- package/dist/utils/track.js +0 -1
- package/package.json +10 -10
- package/readme.md +8 -8
- package/dist/fishjamProvider.d.ts +0 -17
- package/dist/fishjamProvider.d.ts.map +0 -1
|
@@ -1,34 +1,28 @@
|
|
|
1
1
|
import { useMemo } from "react";
|
|
2
2
|
import { useDeviceManager } from "./useDeviceManager";
|
|
3
|
-
export const useDeviceApi = ({
|
|
4
|
-
const { deviceState,
|
|
5
|
-
const
|
|
6
|
-
const stream = useMemo(() => deviceState.media?.stream ?? null, [deviceState.media?.stream]);
|
|
3
|
+
export const useDeviceApi = ({ deviceManager }) => {
|
|
4
|
+
const { deviceState, deviceType, deviceStatus } = useDeviceManager(deviceManager);
|
|
5
|
+
const mediaStream = useMemo(() => deviceState.media?.stream ?? null, [deviceState.media?.stream]);
|
|
7
6
|
const currentMiddleware = deviceState.currentMiddleware ?? null;
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}, [
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
const mediaStreamTrack = useMemo(() => {
|
|
8
|
+
if (deviceType === "video")
|
|
9
|
+
return mediaStream?.getVideoTracks()[0] ?? null;
|
|
10
|
+
return mediaStream?.getAudioTracks()[0] ?? null;
|
|
11
|
+
}, [mediaStream, deviceType]);
|
|
12
|
+
const devices = useMemo(() => deviceState.devices?.map(({ deviceId, label }) => ({ deviceId, label })) ?? [], [deviceState.devices]);
|
|
13
|
+
const activeDevice = deviceState.media?.deviceInfo
|
|
14
|
+
? { deviceId: deviceState.media.deviceInfo.deviceId, label: deviceState.media.deviceInfo.label }
|
|
15
|
+
: null;
|
|
17
16
|
const isMuted = !deviceState.media?.enabled;
|
|
18
17
|
const deviceError = deviceState.error ?? null;
|
|
19
|
-
const isDeviceEnabled = Boolean(deviceState.media);
|
|
20
18
|
return {
|
|
21
|
-
|
|
19
|
+
mediaStream,
|
|
22
20
|
currentMiddleware,
|
|
23
|
-
|
|
24
|
-
stream,
|
|
21
|
+
deviceStatus,
|
|
25
22
|
devices,
|
|
23
|
+
deviceError,
|
|
26
24
|
activeDevice,
|
|
27
|
-
isStreaming,
|
|
28
|
-
track,
|
|
29
|
-
trackId,
|
|
30
25
|
isMuted,
|
|
31
|
-
|
|
32
|
-
isDeviceEnabled,
|
|
26
|
+
mediaStreamTrack,
|
|
33
27
|
};
|
|
34
28
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DeviceManagerState } from "../../../types/internal";
|
|
2
1
|
import type { DeviceManager } from "../../../devices/DeviceManager";
|
|
2
|
+
import type { DeviceManagerState } from "../../../types/internal";
|
|
3
3
|
export declare const useDeviceManager: (deviceManager: DeviceManager) => DeviceManagerState;
|
|
4
4
|
//# sourceMappingURL=useDeviceManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,gCAAgC,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAelE,eAAO,MAAM,gBAAgB,kBAAmB,aAAa,uBAoC5D,CAAC"}
|
|
@@ -28,8 +28,8 @@ export const useDeviceManager = (deviceManager) => {
|
|
|
28
28
|
if (mutationRef.current || lastSnapshotRef.current === null) {
|
|
29
29
|
lastSnapshotRef.current = {
|
|
30
30
|
deviceState: deviceManager.getState(),
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
deviceStatus: deviceManager.getStatus(),
|
|
32
|
+
deviceType: deviceManager.getDeviceType(),
|
|
33
33
|
};
|
|
34
34
|
mutationRef.current = false;
|
|
35
35
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Component,
|
|
1
|
+
import type { Component, FishjamClient, GenericMetadata, Peer } from "@fishjam-cloud/ts-client";
|
|
2
2
|
import type { PeerId } from "../../types/internal";
|
|
3
3
|
export interface FishjamClientState<P = GenericMetadata, S = GenericMetadata> {
|
|
4
4
|
peers: Record<PeerId, Peer<P, S>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFishjamClientState.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamClientState.ts"],"names":[],"mappings":"
|
|
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,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAG/G,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AA0CnD,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,eAAe,EAAE,CAAC,GAAG,eAAe;IAC1E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAC7B,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFishjamClient_DO_NOT_USE.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamClient_DO_NOT_USE.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useFishjamClient_DO_NOT_USE.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamClient_DO_NOT_USE.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,2BAA2B,6JAI1C"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
2
|
import { type MutableRefObject } from "react";
|
|
3
|
-
import type { TrackManager } from "../../types/internal";
|
|
4
3
|
import type { DeviceManager } from "../../devices/DeviceManager";
|
|
4
|
+
import type { TrackManager } from "../../types/internal";
|
|
5
|
+
import type { BandwidthLimits, PeerStatus } from "../../types/public";
|
|
6
|
+
import type { UseScreenshareResult } from "../useScreenShare";
|
|
5
7
|
import type { FishjamClientState } from "./useFishjamClientState";
|
|
6
|
-
import type { BandwidthLimits, PeerStatus, ScreenshareApi } from "../../types/public";
|
|
7
8
|
export type FishjamContextType = {
|
|
8
9
|
fishjamClientRef: MutableRefObject<FishjamClient>;
|
|
9
10
|
videoDeviceManagerRef: MutableRefObject<DeviceManager>;
|
|
10
11
|
audioDeviceManagerRef: MutableRefObject<DeviceManager>;
|
|
11
12
|
hasDevicesBeenInitializedRef: MutableRefObject<boolean>;
|
|
12
|
-
screenShareManager:
|
|
13
|
+
screenShareManager: UseScreenshareResult;
|
|
13
14
|
peerStatus: PeerStatus;
|
|
14
15
|
videoTrackManager: TrackManager;
|
|
15
16
|
audioTrackManager: TrackManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFishjamContext.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAiB,KAAK,gBAAgB,EAAc,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useFishjamContext.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useFishjamContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAiB,KAAK,gBAAgB,EAAc,MAAM,OAAO,CAAC;AAEzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gBAAgB,EAAE,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAClD,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,oBAAoB,CAAC;IACzC,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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeerStatus.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/usePeerStatus.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePeerStatus.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/usePeerStatus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,eAAO,MAAM,aAAa,WAAY,aAAa;;;CAgDlD,CAAC"}
|
|
@@ -21,6 +21,7 @@ export const usePeerStatus = (client) => {
|
|
|
21
21
|
setPeerStatus("idle");
|
|
22
22
|
};
|
|
23
23
|
client.on("connectionStarted", setConnecting);
|
|
24
|
+
client.on("reconnected", setJoined);
|
|
24
25
|
client.on("joined", setJoined);
|
|
25
26
|
client.on("authError", setError);
|
|
26
27
|
client.on("joinError", setError);
|
|
@@ -28,6 +29,7 @@ export const usePeerStatus = (client) => {
|
|
|
28
29
|
client.on("disconnected", setDisconnected);
|
|
29
30
|
return () => {
|
|
30
31
|
client.off("connectionStarted", setConnecting);
|
|
32
|
+
client.off("reconnected", setJoined);
|
|
31
33
|
client.off("joined", setJoined);
|
|
32
34
|
client.off("authError", setError);
|
|
33
35
|
client.off("joinError", setError);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useReconnection.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useReconnection.ts"],"names":[],"mappings":"
|
|
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,kBA6BlC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { PeerStatus } from "../../types/public";
|
|
3
|
+
import type { UseScreenshareResult } from "../useScreenShare";
|
|
4
|
+
interface ScreenShareManagerProps {
|
|
5
|
+
fishjamClient: FishjamClient;
|
|
6
|
+
getCurrentPeerStatus: () => PeerStatus;
|
|
7
|
+
}
|
|
8
|
+
export declare const useScreenShareManager: ({ fishjamClient, getCurrentPeerStatus, }: ScreenShareManagerProps) => UseScreenshareResult;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=useScreenshareManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScreenshareManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useScreenshareManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,UAAU,uBAAuB;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,oBAAoB,EAAE,MAAM,UAAU,CAAC;CACxC;AAED,eAAO,MAAM,qBAAqB,6CAG/B,uBAAuB,KAAG,oBAmI5B,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
export const useScreenShareManager = ({ fishjamClient, getCurrentPeerStatus, }) => {
|
|
3
|
+
const [state, setState] = useState({ stream: null, trackIds: null });
|
|
4
|
+
const cleanMiddlewareFnRef = useRef(null);
|
|
5
|
+
const stream = state.stream ?? null;
|
|
6
|
+
const [mediaVideoTrack, mediaAudioTrack] = stream ? getTracksFromStream(stream) : [null, null];
|
|
7
|
+
const getDisplayName = () => {
|
|
8
|
+
const name = fishjamClient.getLocalPeer()?.metadata?.peer?.displayName;
|
|
9
|
+
if (typeof name === "string")
|
|
10
|
+
return name;
|
|
11
|
+
};
|
|
12
|
+
const startStreaming = async (props) => {
|
|
13
|
+
const displayStream = await navigator.mediaDevices.getDisplayMedia({
|
|
14
|
+
video: props?.videoConstraints ?? true,
|
|
15
|
+
audio: props?.audioConstraints ?? true,
|
|
16
|
+
});
|
|
17
|
+
const displayName = getDisplayName();
|
|
18
|
+
let [video, audio] = getTracksFromStream(displayStream);
|
|
19
|
+
if (state.tracksMiddleware) {
|
|
20
|
+
const { videoTrack, audioTrack, onClear } = state.tracksMiddleware(video, audio);
|
|
21
|
+
video = videoTrack;
|
|
22
|
+
audio = audioTrack;
|
|
23
|
+
cleanMiddlewareFnRef.current = onClear;
|
|
24
|
+
}
|
|
25
|
+
const addTrackPromises = [fishjamClient.addTrack(video, { displayName, type: "screenShareVideo", paused: false })];
|
|
26
|
+
if (audio)
|
|
27
|
+
addTrackPromises.push(fishjamClient.addTrack(audio, { displayName, type: "screenShareAudio", paused: false }));
|
|
28
|
+
const [videoId, audioId] = await Promise.all(addTrackPromises);
|
|
29
|
+
setState({ stream: displayStream, trackIds: { videoId, audioId } });
|
|
30
|
+
};
|
|
31
|
+
const replaceTracks = async (newVideoTrack, newAudioTrack) => {
|
|
32
|
+
if (!state?.stream)
|
|
33
|
+
return;
|
|
34
|
+
const addTrackPromises = [fishjamClient.replaceTrack(state.trackIds.videoId, newVideoTrack)];
|
|
35
|
+
if (newAudioTrack && state.trackIds.audioId) {
|
|
36
|
+
addTrackPromises.push(fishjamClient.replaceTrack(state.trackIds.audioId, newAudioTrack));
|
|
37
|
+
}
|
|
38
|
+
await Promise.all(addTrackPromises);
|
|
39
|
+
};
|
|
40
|
+
const cleanMiddleware = useCallback(() => {
|
|
41
|
+
cleanMiddlewareFnRef.current?.();
|
|
42
|
+
cleanMiddlewareFnRef.current = null;
|
|
43
|
+
}, []);
|
|
44
|
+
const setTracksMiddleware = async (middleware) => {
|
|
45
|
+
if (!state?.stream)
|
|
46
|
+
return;
|
|
47
|
+
const [video, audio] = getTracksFromStream(state.stream);
|
|
48
|
+
cleanMiddleware();
|
|
49
|
+
const { videoTrack, audioTrack, onClear } = middleware?.(video, audio) ?? {
|
|
50
|
+
videoTrack: video,
|
|
51
|
+
audioTrack: audio,
|
|
52
|
+
onClear: null,
|
|
53
|
+
};
|
|
54
|
+
cleanMiddlewareFnRef.current = onClear;
|
|
55
|
+
await replaceTracks(videoTrack, audioTrack);
|
|
56
|
+
};
|
|
57
|
+
const stopStreaming = useCallback(async () => {
|
|
58
|
+
if (!state.stream) {
|
|
59
|
+
console.warn("No stream to stop");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const [video, audio] = getTracksFromStream(state.stream);
|
|
63
|
+
video.stop();
|
|
64
|
+
if (audio)
|
|
65
|
+
audio.stop();
|
|
66
|
+
if (getCurrentPeerStatus() === "connected") {
|
|
67
|
+
const removeTrackPromises = [fishjamClient.removeTrack(state.trackIds.videoId)];
|
|
68
|
+
if (state.trackIds.audioId)
|
|
69
|
+
removeTrackPromises.push(fishjamClient.removeTrack(state.trackIds.audioId));
|
|
70
|
+
await Promise.all(removeTrackPromises);
|
|
71
|
+
}
|
|
72
|
+
cleanMiddleware();
|
|
73
|
+
setState(({ tracksMiddleware }) => ({ stream: null, trackIds: null, tracksMiddleware }));
|
|
74
|
+
}, [state, fishjamClient, setState, cleanMiddleware, getCurrentPeerStatus]);
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
if (!state.stream)
|
|
77
|
+
return;
|
|
78
|
+
const [video, audio] = getTracksFromStream(state.stream);
|
|
79
|
+
const trackEndedHandler = () => {
|
|
80
|
+
stopStreaming();
|
|
81
|
+
};
|
|
82
|
+
video.addEventListener("ended", trackEndedHandler);
|
|
83
|
+
audio?.addEventListener("ended", trackEndedHandler);
|
|
84
|
+
return () => {
|
|
85
|
+
video.removeEventListener("ended", trackEndedHandler);
|
|
86
|
+
audio?.removeEventListener("ended", trackEndedHandler);
|
|
87
|
+
};
|
|
88
|
+
}, [state, stopStreaming]);
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
const onDisconnected = () => {
|
|
91
|
+
if (stream) {
|
|
92
|
+
stopStreaming();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
fishjamClient.on("disconnected", onDisconnected);
|
|
96
|
+
return () => {
|
|
97
|
+
fishjamClient.removeListener("disconnected", onDisconnected);
|
|
98
|
+
};
|
|
99
|
+
}, [stopStreaming, fishjamClient, stream]);
|
|
100
|
+
return {
|
|
101
|
+
startStreaming,
|
|
102
|
+
stopStreaming,
|
|
103
|
+
stream,
|
|
104
|
+
videoTrack: mediaVideoTrack,
|
|
105
|
+
audioTrack: mediaAudioTrack,
|
|
106
|
+
setTracksMiddleware,
|
|
107
|
+
currentTracksMiddleware: state?.tracksMiddleware ?? null,
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
const getTracksFromStream = (stream) => {
|
|
111
|
+
const video = stream.getVideoTracks()[0];
|
|
112
|
+
const audio = stream.getAudioTracks()[0] ?? null;
|
|
113
|
+
return [video, audio];
|
|
114
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { type FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
2
|
import type { MediaManager, TrackManager } from "../../types/internal";
|
|
3
|
-
import type { BandwidthLimits, PeerStatus,
|
|
3
|
+
import type { BandwidthLimits, PeerStatus, StreamConfig } from "../../types/public";
|
|
4
4
|
interface TrackManagerConfig {
|
|
5
5
|
mediaManager: MediaManager;
|
|
6
6
|
tsClient: FishjamClient;
|
|
7
7
|
getCurrentPeerStatus: () => PeerStatus;
|
|
8
8
|
bandwidthLimits: BandwidthLimits;
|
|
9
|
-
|
|
9
|
+
streamConfig?: StreamConfig;
|
|
10
10
|
}
|
|
11
|
-
export declare const useTrackManager: ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits,
|
|
11
|
+
export declare const useTrackManager: ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits, streamConfig, }: TrackManagerConfig) => TrackManager;
|
|
12
12
|
export {};
|
|
13
13
|
//# sourceMappingURL=useTrackManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTrackManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useTrackManager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"useTrackManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useTrackManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAA+B,MAAM,0BAA0B,CAAC;AAG3F,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAGrG,UAAU,kBAAkB;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC;IACxB,oBAAoB,EAAE,MAAM,UAAU,CAAC;IACvC,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAWD,eAAO,MAAM,eAAe,qFAMzB,kBAAkB,KAAG,YAsKvB,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Variant } from "@fishjam-cloud/ts-client";
|
|
2
|
-
import { getConfigAndBandwidthFromProps, getRemoteOrLocalTrack } from "../../utils/track";
|
|
3
2
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { getConfigAndBandwidthFromProps, getRemoteOrLocalTrack } from "../../utils/track";
|
|
4
4
|
const TRACK_TYPE_TO_DEVICE = {
|
|
5
5
|
video: "camera",
|
|
6
6
|
audio: "microphone",
|
|
7
7
|
};
|
|
8
8
|
const getDeviceType = (mediaManager) => TRACK_TYPE_TO_DEVICE[mediaManager.getDeviceType()];
|
|
9
|
-
export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits,
|
|
9
|
+
export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits, streamConfig, }) => {
|
|
10
10
|
const [currentTrackId, setCurrentTrackId] = useState(null);
|
|
11
11
|
const [paused, setPaused] = useState(false);
|
|
12
12
|
const currentTrack = useMemo(() => getRemoteOrLocalTrack(tsClient, currentTrackId), [tsClient, currentTrackId]);
|
|
@@ -14,14 +14,13 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus,
|
|
|
14
14
|
mediaManager.setTrackMiddleware(middleware);
|
|
15
15
|
await refreshStreamedTrack();
|
|
16
16
|
}
|
|
17
|
-
async function
|
|
17
|
+
async function selectDevice(deviceId) {
|
|
18
18
|
await mediaManager?.start(deviceId);
|
|
19
19
|
if (!currentTrackId)
|
|
20
20
|
return;
|
|
21
21
|
const newTrack = mediaManager.getMedia()?.track ?? null;
|
|
22
22
|
await tsClient.replaceTrack(currentTrackId, newTrack);
|
|
23
23
|
}
|
|
24
|
-
const stop = useCallback(() => mediaManager.stop(), [mediaManager]);
|
|
25
24
|
const startStreaming = useCallback(async (props = { simulcast: [Variant.VARIANT_LOW, Variant.VARIANT_MEDIUM, Variant.VARIANT_HIGH] }) => {
|
|
26
25
|
if (currentTrackId)
|
|
27
26
|
throw Error("Track already added");
|
|
@@ -53,13 +52,6 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus,
|
|
|
53
52
|
throw Error("New track is empty");
|
|
54
53
|
return tsClient.replaceTrack(currentTrack.trackId, newTrack);
|
|
55
54
|
}, [currentTrack, mediaManager, tsClient]);
|
|
56
|
-
const stopStreaming = useCallback(async () => {
|
|
57
|
-
if (!currentTrack)
|
|
58
|
-
return;
|
|
59
|
-
setCurrentTrackId(null);
|
|
60
|
-
setPaused(true);
|
|
61
|
-
return tsClient.removeTrack(currentTrack.trackId);
|
|
62
|
-
}, [currentTrack, tsClient]);
|
|
63
55
|
const pauseStreaming = useCallback(async () => {
|
|
64
56
|
if (!currentTrack)
|
|
65
57
|
return;
|
|
@@ -81,12 +73,6 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus,
|
|
|
81
73
|
const trackMetadata = { type: deviceType, paused: false };
|
|
82
74
|
return tsClient.updateTrackMetadata(currentTrack.trackId, trackMetadata);
|
|
83
75
|
}, [currentTrack, mediaManager, tsClient]);
|
|
84
|
-
const disableTrack = useCallback(() => {
|
|
85
|
-
mediaManager.disable();
|
|
86
|
-
}, [mediaManager]);
|
|
87
|
-
const enableTrack = useCallback(() => {
|
|
88
|
-
mediaManager.enable();
|
|
89
|
-
}, [mediaManager]);
|
|
90
76
|
const stream = useCallback(async () => {
|
|
91
77
|
if (getCurrentPeerStatus() !== "connected")
|
|
92
78
|
return;
|
|
@@ -128,36 +114,27 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus,
|
|
|
128
114
|
*/
|
|
129
115
|
const toggleDevice = useCallback(() => toggle("hard"), [toggle]);
|
|
130
116
|
useEffect(() => {
|
|
131
|
-
|
|
132
|
-
return;
|
|
133
|
-
const joinedHandler = () => {
|
|
117
|
+
const onJoinedRoom = () => {
|
|
134
118
|
if (mediaManager.getMedia()?.track) {
|
|
135
|
-
startStreaming(
|
|
119
|
+
startStreaming(streamConfig);
|
|
136
120
|
}
|
|
137
121
|
};
|
|
138
|
-
const
|
|
122
|
+
const onLeftRoom = () => {
|
|
123
|
+
setPaused(true);
|
|
139
124
|
setCurrentTrackId(null);
|
|
140
125
|
};
|
|
141
|
-
tsClient.on("joined",
|
|
142
|
-
tsClient.on("disconnected",
|
|
126
|
+
tsClient.on("joined", onJoinedRoom);
|
|
127
|
+
tsClient.on("disconnected", onLeftRoom);
|
|
143
128
|
return () => {
|
|
144
|
-
tsClient.off("joined",
|
|
145
|
-
tsClient.off("disconnected",
|
|
129
|
+
tsClient.off("joined", onJoinedRoom);
|
|
130
|
+
tsClient.off("disconnected", onLeftRoom);
|
|
146
131
|
};
|
|
147
|
-
}, [mediaManager, startStreaming, tsClient,
|
|
132
|
+
}, [mediaManager, startStreaming, tsClient, streamConfig, currentTrackId]);
|
|
148
133
|
return {
|
|
149
134
|
currentTrack,
|
|
150
135
|
setTrackMiddleware,
|
|
151
|
-
initialize,
|
|
152
|
-
stop,
|
|
153
|
-
startStreaming,
|
|
154
|
-
stopStreaming,
|
|
155
|
-
pauseStreaming,
|
|
156
|
-
resumeStreaming,
|
|
157
|
-
disableTrack,
|
|
158
|
-
enableTrack,
|
|
159
|
-
refreshStreamedTrack,
|
|
160
136
|
paused,
|
|
137
|
+
selectDevice,
|
|
161
138
|
toggleMute,
|
|
162
139
|
toggleDevice,
|
|
163
140
|
};
|
|
@@ -1,26 +1,46 @@
|
|
|
1
|
-
import type { GenericMetadata } from "@fishjam-cloud/ts-client";
|
|
1
|
+
import type { GenericMetadata, ReconnectionStatus } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { PeerStatus } from "../types/public";
|
|
2
3
|
export interface JoinRoomConfig<PeerMetadata extends GenericMetadata = GenericMetadata> {
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
* Fishjam URL
|
|
5
6
|
*/
|
|
6
7
|
url: string;
|
|
7
8
|
/**
|
|
8
|
-
*
|
|
9
|
+
* Token received from server (or Room Manager)
|
|
9
10
|
*/
|
|
10
11
|
peerToken: string;
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* String indexed record with metadata, that will be available to all other peers
|
|
13
14
|
*/
|
|
14
15
|
peerMetadata?: PeerMetadata;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
18
|
* @category Connection
|
|
18
|
-
* @returns
|
|
19
19
|
*/
|
|
20
|
-
export
|
|
21
|
-
|
|
20
|
+
export interface UseConnectionResult {
|
|
21
|
+
/**
|
|
22
|
+
* Join room and start streaming camera and microphone
|
|
23
|
+
*
|
|
24
|
+
* @param {JoinRoomConfig}
|
|
25
|
+
*/
|
|
26
|
+
joinRoom: <PeerMetadata extends GenericMetadata = GenericMetadata>(config: JoinRoomConfig<PeerMetadata>) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Leave room and stop streaming
|
|
29
|
+
*/
|
|
22
30
|
leaveRoom: () => void;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Current peer connection status
|
|
33
|
+
*/
|
|
34
|
+
peerStatus: PeerStatus;
|
|
35
|
+
/**
|
|
36
|
+
* Current reconnection status
|
|
37
|
+
*/
|
|
38
|
+
reconnectionStatus: ReconnectionStatus;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hook allows to join or leave a room and check the current connection status.
|
|
42
|
+
* @category Connection
|
|
43
|
+
* @returns {UseConnectionResult}
|
|
44
|
+
*/
|
|
45
|
+
export declare function useConnection(): UseConnectionResult;
|
|
26
46
|
//# sourceMappingURL=useConnection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConnection.d.ts","sourceRoot":"","sources":["../../src/hooks/useConnection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useConnection.d.ts","sourceRoot":"","sources":["../../src/hooks/useConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,MAAM,WAAW,cAAc,CAAC,YAAY,SAAS,eAAe,GAAG,eAAe;IACpF;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,QAAQ,EAAE,CAAC,YAAY,SAAS,eAAe,GAAG,eAAe,EAC/D,MAAM,EAAE,cAAc,CAAC,YAAY,CAAC,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC;IACvB;;OAEG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,mBAAmB,CAuBnD"}
|
|
@@ -2,16 +2,23 @@ import { useCallback } from "react";
|
|
|
2
2
|
import { useFishjamContext } from "./internal/useFishjamContext";
|
|
3
3
|
import { useReconnection } from "./internal/useReconnection";
|
|
4
4
|
/**
|
|
5
|
+
* Hook allows to join or leave a room and check the current connection status.
|
|
5
6
|
* @category Connection
|
|
6
|
-
* @returns
|
|
7
|
+
* @returns {UseConnectionResult}
|
|
7
8
|
*/
|
|
8
9
|
export function useConnection() {
|
|
9
10
|
const context = useFishjamContext();
|
|
10
11
|
const client = context.fishjamClientRef.current;
|
|
11
12
|
const reconnectionStatus = useReconnection();
|
|
12
|
-
const joinRoom = useCallback(({ url, peerToken, peerMetadata
|
|
13
|
+
const joinRoom = useCallback(({ url, peerToken, peerMetadata }) => client.connect({ url, token: peerToken, peerMetadata: peerMetadata ?? {} }), [client]);
|
|
13
14
|
const leaveRoom = useCallback(() => {
|
|
14
15
|
client.disconnect();
|
|
15
16
|
}, [client]);
|
|
16
|
-
|
|
17
|
+
const peerStatus = context.peerStatus;
|
|
18
|
+
return {
|
|
19
|
+
joinRoom,
|
|
20
|
+
leaveRoom,
|
|
21
|
+
peerStatus,
|
|
22
|
+
reconnectionStatus,
|
|
23
|
+
};
|
|
17
24
|
}
|
package/dist/hooks/usePeers.d.ts
CHANGED
|
@@ -1,31 +1,51 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { Metadata } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { PeerId } from "../types/internal";
|
|
3
|
+
import type { Track } from "../types/public";
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* @category Connection
|
|
7
|
+
* @typeParam PeerMetadata Type of metadata set by peer while connecting to a room.
|
|
8
|
+
* @typeParam ServerMetadata Type of metadata set by the server while creating a peer.
|
|
9
|
+
*/
|
|
10
|
+
export type PeerWithTracks<PeerMetadata, ServerMetadata> = {
|
|
11
|
+
id: PeerId;
|
|
12
|
+
metadata?: Metadata<PeerMetadata, ServerMetadata>;
|
|
13
|
+
tracks: Track[];
|
|
14
|
+
cameraTrack?: Track;
|
|
15
|
+
microphoneTrack?: Track;
|
|
16
|
+
screenShareVideoTrack?: Track;
|
|
17
|
+
screenShareAudioTrack?: Track;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @category Connection
|
|
22
|
+
* @typeParam PeerMetadata Type of metadata set by peer while connecting to a room.
|
|
23
|
+
* @typeParam ServerMetadata Type of metadata set by the server while creating a peer.
|
|
5
24
|
*/
|
|
6
|
-
export type UsePeersResult<
|
|
25
|
+
export type UsePeersResult<PeerMetadata, ServerMetadata> = {
|
|
7
26
|
/**
|
|
8
27
|
* The local peer with distinguished tracks (camera, microphone, screen share).
|
|
9
28
|
* Will be null if the local peer is not found.
|
|
10
29
|
*/
|
|
11
|
-
localPeer: PeerWithTracks<
|
|
30
|
+
localPeer: PeerWithTracks<PeerMetadata, ServerMetadata> | null;
|
|
12
31
|
/**
|
|
13
32
|
* Array of remote peers with distinguished tracks (camera, microphone, screen share).
|
|
14
33
|
*/
|
|
15
|
-
remotePeers: PeerWithTracks<
|
|
34
|
+
remotePeers: PeerWithTracks<PeerMetadata, ServerMetadata>[];
|
|
16
35
|
/**
|
|
17
36
|
* @deprecated Use remotePeers instead
|
|
18
37
|
* Legacy array containing remote peers.
|
|
19
38
|
* This property will be removed in future versions.
|
|
20
39
|
*/
|
|
21
|
-
peers: PeerWithTracks<
|
|
40
|
+
peers: PeerWithTracks<PeerMetadata, ServerMetadata>[];
|
|
22
41
|
};
|
|
23
42
|
/**
|
|
43
|
+
* Hook allows to access id, tracks and metadata of the local and remote peers.
|
|
24
44
|
*
|
|
25
45
|
* @category Connection
|
|
26
|
-
*
|
|
27
|
-
* @typeParam
|
|
28
|
-
* @typeParam
|
|
46
|
+
* @group Hooks
|
|
47
|
+
* @typeParam PeerMetadata Type of metadata set by peer while connecting to a room.
|
|
48
|
+
* @typeParam ServerMetadata Type of metadata set by the server while creating a peer.
|
|
29
49
|
*/
|
|
30
|
-
export declare function usePeers<
|
|
50
|
+
export declare function usePeers<PeerMetadata = Record<string, unknown>, ServerMetadata = Record<string, unknown>>(): UsePeersResult<PeerMetadata, ServerMetadata>;
|
|
31
51
|
//# sourceMappingURL=usePeers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,QAAQ,EAIT,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;;;;GAKG;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;CAC/B,CAAC;AAgCF;;;;;GAKG;AACH,MAAM,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,IAAI;IACzD;;;OAGG;IACH,SAAS,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,IAAI,CAAC;IAE/D;;OAEG;IACH,WAAW,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;IAE5D;;;;OAIG;IACH,KAAK,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC;CACvD,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CACtB,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACrC,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,CAYhD"}
|
package/dist/hooks/usePeers.js
CHANGED
|
@@ -6,7 +6,6 @@ function trackContextToTrack(track) {
|
|
|
6
6
|
stream: track.stream,
|
|
7
7
|
simulcastConfig: track.simulcastConfig ?? null,
|
|
8
8
|
encoding: track.encoding ?? null,
|
|
9
|
-
vadStatus: track.vadStatus,
|
|
10
9
|
track: track.track,
|
|
11
10
|
};
|
|
12
11
|
}
|
|
@@ -27,15 +26,18 @@ function getPeerWithDistinguishedTracks(peer) {
|
|
|
27
26
|
};
|
|
28
27
|
}
|
|
29
28
|
/**
|
|
29
|
+
* Hook allows to access id, tracks and metadata of the local and remote peers.
|
|
30
30
|
*
|
|
31
31
|
* @category Connection
|
|
32
|
-
*
|
|
33
|
-
* @typeParam
|
|
34
|
-
* @typeParam
|
|
32
|
+
* @group Hooks
|
|
33
|
+
* @typeParam PeerMetadata Type of metadata set by peer while connecting to a room.
|
|
34
|
+
* @typeParam ServerMetadata Type of metadata set by the server while creating a peer.
|
|
35
35
|
*/
|
|
36
36
|
export function usePeers() {
|
|
37
37
|
const { clientState } = useFishjamContext();
|
|
38
|
-
const localPeer = clientState.localPeer
|
|
38
|
+
const localPeer = clientState.localPeer
|
|
39
|
+
? getPeerWithDistinguishedTracks(clientState.localPeer)
|
|
40
|
+
: null;
|
|
39
41
|
const remotePeers = Object.values(clientState.peers).map((peer) => getPeerWithDistinguishedTracks(peer));
|
|
40
42
|
return { localPeer, remotePeers, peers: remotePeers };
|
|
41
43
|
}
|