-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathFishjamProvider.tsx
More file actions
140 lines (124 loc) · 5.42 KB
/
Copy pathFishjamProvider.tsx
File metadata and controls
140 lines (124 loc) · 5.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import { FishjamClient, type ReconnectConfig } from "@fishjam-cloud/ts-client";
import { type PropsWithChildren, useMemo, useRef } from "react";
import { CameraContext } from "./contexts/camera";
import { CustomSourceContext } from "./contexts/customSource";
import { FishjamClientContext } from "./contexts/fishjamClient";
import { FishjamClientStateContext } from "./contexts/fishjamState";
import { InitDevicesContext } from "./contexts/initDevices";
import { MicrophoneContext } from "./contexts/microphone";
import { PeerStatusContext } from "./contexts/peerStatus";
import { ScreenshareContext } from "./contexts/screenshare";
import { VIDEO_TRACK_CONSTRAINTS } from "./devices/constraints";
import { useMediaDevices } from "./hooks/internal/devices/useMediaDevices";
import { useCustomSourceManager } from "./hooks/internal/useCustomSourceManager";
import { useFishjamClientState } from "./hooks/internal/useFishjamClientState";
import { usePeerStatus } from "./hooks/internal/usePeerStatus";
import { useScreenShareManager } from "./hooks/internal/useScreenshareManager";
import { useTrackManager } from "./hooks/internal/useTrackManager";
import type { BandwidthLimits, PersistLastDeviceHandlers, StreamConfig } from "./types/public";
import { mergeWithDefaultBandwitdthLimits } from "./utils/bandwidth";
import { getLastDevice, saveLastDevice } from "./utils/localStorage";
/**
* @category Components
*/
export interface FishjamProviderProps extends PropsWithChildren {
/**
* Use {@link ReconnectConfig} to adjust reconnection policy to your needs or set false it.
* Set to true by default.
*/
reconnect?: ReconnectConfig | boolean;
/**
* Set preferred constraints.
* @param {MediaStreamConstraints} constraints - The media stream constraints as defined by the Web API.
* @see {@link https://udn.realityripple.com/docs/Web/API/MediaStreamConstraints MediaStreamConstraints}
*/
constraints?: Pick<MediaStreamConstraints, "audio" | "video">;
/**
* Decide if you want Fishjam SDK to persist last used device in the local storage.
* You can also provide your getter and setter by using the {@link PersistLastDeviceHandlers} interface.
*/
persistLastDevice?: boolean | PersistLastDeviceHandlers;
/**
* Adjust max bandwidth limit for a single stream and simulcast.
*/
bandwidthLimits?: Partial<BandwidthLimits>;
/**
* Configure whether to use video simulcast and which layers to send if so.
*/
videoConfig?: StreamConfig;
/**
* Configure whether to use audio simulcast and which layers to send if so.
*/
audioConfig?: StreamConfig;
}
/**
* Provides the Fishjam Context
* @category Components
*/
export function FishjamProvider(props: FishjamProviderProps) {
const fishjamClientRef = useRef(new FishjamClient({ reconnect: props.reconnect }));
const persistHandlers = useMemo(() => {
if (props.persistLastDevice === false) return undefined;
if (typeof props.persistLastDevice === "object") return props.persistLastDevice;
return { getLastDevice, saveLastDevice };
}, [props.persistLastDevice]);
const { cameraManager, microphoneManager, initializeDevices } = useMediaDevices({
videoConstraints: props.constraints?.video ?? VIDEO_TRACK_CONSTRAINTS,
audioConstraints: props.constraints?.audio ?? true,
persistHandlers,
});
const peerStatus = usePeerStatus(fishjamClientRef.current);
const mergedBandwidthLimits = useMemo(
() => mergeWithDefaultBandwitdthLimits(props.bandwidthLimits),
[props.bandwidthLimits],
);
const videoTrackManager = useTrackManager({
tsClient: fishjamClientRef.current,
peerStatus,
deviceManager: cameraManager,
bandwidthLimits: mergedBandwidthLimits,
streamConfig: props.videoConfig,
type: "camera",
});
const audioTrackManager = useTrackManager({
tsClient: fishjamClientRef.current,
peerStatus,
deviceManager: microphoneManager,
bandwidthLimits: mergedBandwidthLimits,
streamConfig: props.audioConfig,
type: "microphone",
});
const screenShareManager = useScreenShareManager({
fishjamClient: fishjamClientRef.current,
peerStatus,
});
const cameraContext = useMemo(() => ({ videoTrackManager, cameraManager }), [videoTrackManager, cameraManager]);
const microphoneContext = useMemo(
() => ({ audioTrackManager, microphoneManager }),
[audioTrackManager, microphoneManager],
);
const customSourceManager = useCustomSourceManager({
fishjamClient: fishjamClientRef.current,
peerStatus,
});
const fishjamClientState = useFishjamClientState(fishjamClientRef.current);
return (
<FishjamClientContext.Provider value={fishjamClientRef}>
<FishjamClientStateContext.Provider value={fishjamClientState}>
<InitDevicesContext.Provider value={initializeDevices}>
<PeerStatusContext.Provider value={peerStatus}>
<CameraContext.Provider value={cameraContext}>
<MicrophoneContext.Provider value={microphoneContext}>
<ScreenshareContext.Provider value={screenShareManager}>
<CustomSourceContext.Provider value={customSourceManager}>
{props.children}
</CustomSourceContext.Provider>
</ScreenshareContext.Provider>
</MicrophoneContext.Provider>
</CameraContext.Provider>
</PeerStatusContext.Provider>
</InitDevicesContext.Provider>
</FishjamClientStateContext.Provider>
</FishjamClientContext.Provider>
);
}