@fishjam-cloud/react-client 0.10.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +201 -0
- package/dist/FishjamProvider.d.ts +42 -0
- package/dist/FishjamProvider.d.ts.map +1 -0
- package/dist/{fishjamProvider.js → FishjamProvider.js} +16 -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 +1 -1
- package/dist/devices/mediaInitializer.d.ts.map +1 -1
- package/dist/devices/mediaInitializer.js +1 -1
- package/dist/hooks/devices/useCamera.d.ts +39 -3
- package/dist/hooks/devices/useCamera.d.ts.map +1 -1
- package/dist/hooks/devices/useCamera.js +41 -3
- package/dist/hooks/devices/useInitializeDevices.d.ts +9 -2
- package/dist/hooks/devices/useInitializeDevices.d.ts.map +1 -1
- package/dist/hooks/devices/useInitializeDevices.js +12 -7
- package/dist/hooks/devices/useMicrophone.d.ts +40 -3
- package/dist/hooks/devices/useMicrophone.d.ts.map +1 -1
- package/dist/hooks/devices/useMicrophone.js +42 -3
- 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 +5 -4
- package/dist/hooks/internal/useFishjamClientState.d.ts.map +1 -1
- package/dist/hooks/internal/useFishjamClientState.js +2 -2
- 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 +46 -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 +20 -7
- package/dist/hooks/useConnection.d.ts.map +1 -1
- package/dist/hooks/useConnection.js +20 -2
- package/dist/hooks/usePeers.d.ts +26 -17
- package/dist/hooks/usePeers.d.ts.map +1 -1
- package/dist/hooks/usePeers.js +22 -6
- package/dist/hooks/useScreenShare.d.ts +40 -11
- package/dist/hooks/useScreenShare.d.ts.map +1 -1
- package/dist/hooks/useScreenShare.js +37 -122
- package/dist/hooks/useUpdatePeerMetadata.d.ts +9 -0
- package/dist/hooks/useUpdatePeerMetadata.d.ts.map +1 -1
- package/dist/hooks/useUpdatePeerMetadata.js +12 -1
- package/dist/hooks/useVAD.d.ts +21 -2
- package/dist/hooks/useVAD.d.ts.map +1 -1
- package/dist/hooks/useVAD.js +22 -5
- package/dist/index.d.ts +6 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/types/internal.d.ts +6 -33
- package/dist/types/internal.d.ts.map +1 -1
- package/dist/types/public.d.ts +33 -31
- package/dist/types/public.d.ts.map +1 -1
- package/dist/utils/bandwidth.d.ts.map +1 -1
- package/dist/utils/errors.d.ts +1 -1
- package/dist/utils/errors.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 +11 -11
- package/readme.md +8 -8
- package/dist/fishjamProvider.d.ts +0 -17
- package/dist/fishjamProvider.d.ts.map +0 -1
|
@@ -1,10 +1,49 @@
|
|
|
1
|
-
import { useFishjamContext } from "../internal/useFishjamContext";
|
|
2
1
|
import { useDeviceApi } from "../internal/device/useDeviceApi";
|
|
2
|
+
import { useFishjamContext } from "../internal/useFishjamContext";
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Manage microphone
|
|
5
5
|
* @category Devices
|
|
6
6
|
*/
|
|
7
7
|
export function useMicrophone() {
|
|
8
8
|
const { audioTrackManager, audioDeviceManagerRef } = useFishjamContext();
|
|
9
|
-
|
|
9
|
+
const deviceApi = useDeviceApi({ deviceManager: audioDeviceManagerRef.current });
|
|
10
|
+
return {
|
|
11
|
+
/** Toggles current microphone on/off */
|
|
12
|
+
toggleMicrophone: audioTrackManager.toggleDevice,
|
|
13
|
+
/** Mutes/unmutes the microphone */
|
|
14
|
+
toggleMicrophoneMute: audioTrackManager.toggleMute,
|
|
15
|
+
/** Selects the microphone device */
|
|
16
|
+
selectMicrophone: audioTrackManager.selectDevice,
|
|
17
|
+
/**
|
|
18
|
+
* Indicates which microphone is now turned on and streaming audio
|
|
19
|
+
*/
|
|
20
|
+
activeMicrophone: deviceApi.activeDevice,
|
|
21
|
+
/**
|
|
22
|
+
* Indicates whether the microphone is streaming audio
|
|
23
|
+
*/
|
|
24
|
+
isMicrophoneOn: !!deviceApi.mediaStream,
|
|
25
|
+
/**
|
|
26
|
+
* Indicates whether the microphone is muted
|
|
27
|
+
*/ isMicrophoneMuted: audioTrackManager.paused,
|
|
28
|
+
/**
|
|
29
|
+
* The MediaStream object containing the current audio stream
|
|
30
|
+
*/
|
|
31
|
+
microphoneStream: deviceApi.mediaStream,
|
|
32
|
+
/**
|
|
33
|
+
* The currently set microphone middleware function
|
|
34
|
+
*/
|
|
35
|
+
currentMicrophoneMiddleware: deviceApi.currentMiddleware,
|
|
36
|
+
/**
|
|
37
|
+
* Sets the microphone middleware
|
|
38
|
+
*/
|
|
39
|
+
setMicrophoneTrackMiddleware: audioTrackManager.setTrackMiddleware,
|
|
40
|
+
/**
|
|
41
|
+
* List of available microphone devices
|
|
42
|
+
*/
|
|
43
|
+
microphoneDevices: deviceApi.devices,
|
|
44
|
+
/**
|
|
45
|
+
* Possible error thrown while setting up the microphone
|
|
46
|
+
*/
|
|
47
|
+
microphoneDeviceError: deviceApi.deviceError,
|
|
48
|
+
};
|
|
10
49
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import type { TrackManager } from "../../../types/internal";
|
|
2
|
-
import type { Device } from "../../../types/public";
|
|
3
1
|
import type { DeviceManager } from "../../../devices/DeviceManager";
|
|
2
|
+
import type { Device } from "../../../types/public";
|
|
4
3
|
type DeviceApiDependencies = {
|
|
5
|
-
trackManager: TrackManager;
|
|
6
4
|
deviceManager: DeviceManager;
|
|
7
5
|
};
|
|
8
|
-
export declare const useDeviceApi: ({
|
|
6
|
+
export declare const useDeviceApi: ({ deviceManager }: DeviceApiDependencies) => Device;
|
|
9
7
|
export {};
|
|
10
8
|
//# sourceMappingURL=useDeviceApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDeviceApi.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useDeviceApi.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceApi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,uBAAuB,CAAC;AAGhE,KAAK,qBAAqB,GAAG;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,YAAY,sBAAuB,qBAAqB,KAAG,MA+BvE,CAAC"}
|
|
@@ -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,9 +1,10 @@
|
|
|
1
|
-
import type { Component,
|
|
2
|
-
import type {
|
|
1
|
+
import type { Component, FishjamClient, GenericMetadata } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { BrandedPeer } from "../../types/internal";
|
|
3
|
+
import type { PeerId } from "../../types/public";
|
|
3
4
|
export interface FishjamClientState<P = GenericMetadata, S = GenericMetadata> {
|
|
4
|
-
peers: Record<PeerId,
|
|
5
|
+
peers: Record<PeerId, BrandedPeer<P, S>>;
|
|
5
6
|
components: Record<string, Component>;
|
|
6
|
-
localPeer:
|
|
7
|
+
localPeer: BrandedPeer<P, S> | null;
|
|
7
8
|
isReconnecting: boolean;
|
|
8
9
|
}
|
|
9
10
|
export declare function useFishjamClientState<P, S>(fishjamClient: FishjamClient<P, S>): FishjamClientState<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,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"}
|
|
@@ -63,9 +63,9 @@ export function useFishjamClientState(fishjamClient) {
|
|
|
63
63
|
const localPeer = client.getLocalPeer();
|
|
64
64
|
const isReconnecting = client.isReconnecting();
|
|
65
65
|
lastSnapshotRef.current = {
|
|
66
|
-
peers,
|
|
66
|
+
peers: peers,
|
|
67
67
|
components,
|
|
68
|
-
localPeer,
|
|
68
|
+
localPeer: localPeer,
|
|
69
69
|
isReconnecting,
|
|
70
70
|
};
|
|
71
71
|
mutationRef.current = false;
|
|
@@ -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";
|
|
5
6
|
import type { FishjamClientState } from "./useFishjamClientState";
|
|
6
|
-
import type {
|
|
7
|
+
import type { UseScreenshareResult } from "./useScreenshareManager";
|
|
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,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEpE,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,46 @@
|
|
|
1
|
+
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { PeerStatus, TracksMiddleware } from "../../types/public";
|
|
3
|
+
export type UseScreenshareResult = {
|
|
4
|
+
/**
|
|
5
|
+
* Invokes the screen sharing prompt in the user's browser and starts streaming upon approval.
|
|
6
|
+
*/
|
|
7
|
+
startStreaming: (props?: {
|
|
8
|
+
audioConstraints?: boolean | MediaTrackConstraints;
|
|
9
|
+
videoConstraints?: boolean | MediaTrackConstraints;
|
|
10
|
+
}) => Promise<void>;
|
|
11
|
+
/**
|
|
12
|
+
* Stops the stream and cancels browser screen sharing.
|
|
13
|
+
*/
|
|
14
|
+
stopStreaming: () => Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* The MediaStream object containing both tracks.
|
|
17
|
+
*/
|
|
18
|
+
stream: MediaStream | null;
|
|
19
|
+
/**
|
|
20
|
+
* The separate video MediaStreamTrack.
|
|
21
|
+
*/
|
|
22
|
+
videoTrack: MediaStreamTrack | null;
|
|
23
|
+
/**
|
|
24
|
+
* The separate audio MediaStreamTrack.
|
|
25
|
+
*/
|
|
26
|
+
audioTrack: MediaStreamTrack | null;
|
|
27
|
+
/**
|
|
28
|
+
* The middleware currently assigned to process the tracks.
|
|
29
|
+
* A screenshare may include both audio and video tracks, and this middleware is capable of processing
|
|
30
|
+
* each track type.
|
|
31
|
+
*/
|
|
32
|
+
currentTracksMiddleware: TracksMiddleware | null;
|
|
33
|
+
/**
|
|
34
|
+
* Sets the middleware responsible for processing the tracks.
|
|
35
|
+
* @param middleware The middleware to set, which can be a TracksMiddleware instance or null to remove the middleware.
|
|
36
|
+
* @returns A Promise that resolves once the middleware is successfully set.
|
|
37
|
+
*/
|
|
38
|
+
setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
|
|
39
|
+
};
|
|
40
|
+
interface ScreenShareManagerProps {
|
|
41
|
+
fishjamClient: FishjamClient;
|
|
42
|
+
getCurrentPeerStatus: () => PeerStatus;
|
|
43
|
+
}
|
|
44
|
+
export declare const useScreenShareManager: ({ fishjamClient, getCurrentPeerStatus, }: ScreenShareManagerProps) => UseScreenshareResult;
|
|
45
|
+
export {};
|
|
46
|
+
//# 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,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAAG;IACjC;;OAEG;IACH,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;;OAEG;IACH,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC;;OAEG;IACH,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;OAEG;IACH,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC;;;;OAIG;IACH,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjD;;;;OAIG;IACH,mBAAmB,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E,CAAC;AAEF,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,39 @@
|
|
|
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
|
/**
|
|
18
|
+
* Hook allows to join or leave a room and check the current connection status.
|
|
17
19
|
* @category Connection
|
|
18
|
-
* @
|
|
20
|
+
* @group Hooks
|
|
19
21
|
*/
|
|
20
22
|
export declare function useConnection(): {
|
|
23
|
+
/**
|
|
24
|
+
* Join room and start streaming camera and microphone
|
|
25
|
+
*/
|
|
21
26
|
joinRoom: <PeerMetadata extends GenericMetadata = GenericMetadata>({ url, peerToken, peerMetadata, }: JoinRoomConfig<PeerMetadata>) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Leave room and stop streaming
|
|
29
|
+
*/
|
|
22
30
|
leaveRoom: () => void;
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Current peer connection status
|
|
33
|
+
*/
|
|
34
|
+
peerStatus: PeerStatus;
|
|
35
|
+
/**
|
|
36
|
+
* Current reconnection status
|
|
37
|
+
*/ reconnectionStatus: ReconnectionStatus;
|
|
25
38
|
};
|
|
26
39
|
//# 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;;;;GAIG;AACH,wBAAgB,aAAa;IAsBzB;;OAEG;eAjBF,YAAY,SAAS,eAAe,uDAIlC,cAAc,CAAC,YAAY,CAAC;IAe/B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;EAEN"}
|
|
@@ -2,8 +2,9 @@ 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
|
-
* @
|
|
7
|
+
* @group Hooks
|
|
7
8
|
*/
|
|
8
9
|
export function useConnection() {
|
|
9
10
|
const context = useFishjamContext();
|
|
@@ -13,5 +14,22 @@ export function useConnection() {
|
|
|
13
14
|
const leaveRoom = useCallback(() => {
|
|
14
15
|
client.disconnect();
|
|
15
16
|
}, [client]);
|
|
16
|
-
|
|
17
|
+
const peerStatus = context.peerStatus;
|
|
18
|
+
return {
|
|
19
|
+
/**
|
|
20
|
+
* Join room and start streaming camera and microphone
|
|
21
|
+
*/
|
|
22
|
+
joinRoom,
|
|
23
|
+
/**
|
|
24
|
+
* Leave room and stop streaming
|
|
25
|
+
*/
|
|
26
|
+
leaveRoom,
|
|
27
|
+
/**
|
|
28
|
+
* Current peer connection status
|
|
29
|
+
*/
|
|
30
|
+
peerStatus,
|
|
31
|
+
/**
|
|
32
|
+
* Current reconnection status
|
|
33
|
+
*/ reconnectionStatus,
|
|
34
|
+
};
|
|
17
35
|
}
|