@fishjam-cloud/react-client 0.5.0 → 0.5.2
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/dist/Client.d.ts +6 -17
- package/dist/Client.d.ts.map +1 -1
- package/dist/Client.js +8 -136
- package/dist/DeviceManager.d.ts +2 -2
- package/dist/DeviceManager.d.ts.map +1 -1
- package/dist/create.d.ts +1 -2
- package/dist/create.d.ts.map +1 -1
- package/dist/create.js +109 -136
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/screenShareTrackManager.d.ts +4 -0
- package/dist/screenShareTrackManager.d.ts.map +1 -0
- package/dist/screenShareTrackManager.js +92 -0
- package/dist/state.types.d.ts +1 -6
- package/dist/state.types.d.ts.map +1 -1
- package/dist/trackManager.d.ts +7 -22
- package/dist/trackManager.d.ts.map +1 -1
- package/dist/trackManager.js +84 -84
- package/dist/types.d.ts +48 -29
- package/dist/types.d.ts.map +1 -1
- package/dist/useSetupMedia.d.ts.map +1 -1
- package/dist/useSetupMedia.js +13 -69
- package/dist/utils/track.d.ts +4 -0
- package/dist/utils/track.d.ts.map +1 -0
- package/dist/utils/track.js +37 -0
- package/package.json +6 -6
- package/readme.md +10 -14
- package/dist/ScreenShareManager.d.ts +0 -57
- package/dist/ScreenShareManager.d.ts.map +0 -1
- package/dist/ScreenShareManager.js +0 -135
package/dist/create.js
CHANGED
|
@@ -1,123 +1,83 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useCallback, useContext, useMemo, useRef, useSyncExternalStore } from "react";
|
|
2
|
+
import { createContext, useCallback, useContext, useMemo, useRef, useState, useSyncExternalStore } from "react";
|
|
3
3
|
import { Client } from "./Client";
|
|
4
4
|
import { createUseSetupMediaHook } from "./useSetupMedia";
|
|
5
|
+
import { useScreenShare as _useScreenShare } from "./screenShareTrackManager";
|
|
6
|
+
import { useTrackManager } from "./trackManager";
|
|
7
|
+
const eventNames = [
|
|
8
|
+
"socketOpen",
|
|
9
|
+
"socketError",
|
|
10
|
+
"socketClose",
|
|
11
|
+
"authSuccess",
|
|
12
|
+
"authError",
|
|
13
|
+
"disconnected",
|
|
14
|
+
"joined",
|
|
15
|
+
"joinError",
|
|
16
|
+
"peerJoined",
|
|
17
|
+
"peerUpdated",
|
|
18
|
+
"peerLeft",
|
|
19
|
+
"reconnected",
|
|
20
|
+
"reconnectionRetriesLimitReached",
|
|
21
|
+
"reconnectionStarted",
|
|
22
|
+
"componentAdded",
|
|
23
|
+
"componentUpdated",
|
|
24
|
+
"componentRemoved",
|
|
25
|
+
"trackReady",
|
|
26
|
+
"trackAdded",
|
|
27
|
+
"trackRemoved",
|
|
28
|
+
"trackUpdated",
|
|
29
|
+
"bandwidthEstimationChanged",
|
|
30
|
+
"encodingChanged",
|
|
31
|
+
"voiceActivityChanged",
|
|
32
|
+
"deviceDisabled",
|
|
33
|
+
"deviceEnabled",
|
|
34
|
+
"managerInitialized",
|
|
35
|
+
"managerStarted",
|
|
36
|
+
"deviceStopped",
|
|
37
|
+
"deviceReady",
|
|
38
|
+
"devicesStarted",
|
|
39
|
+
"devicesReady",
|
|
40
|
+
"error",
|
|
41
|
+
"targetTrackEncodingRequested",
|
|
42
|
+
"localTrackAdded",
|
|
43
|
+
"localTrackRemoved",
|
|
44
|
+
"localTrackReplaced",
|
|
45
|
+
"localTrackMuted",
|
|
46
|
+
"localTrackUnmuted",
|
|
47
|
+
"localTrackBandwidthSet",
|
|
48
|
+
"localTrackEncodingBandwidthSet",
|
|
49
|
+
"localTrackEncodingEnabled",
|
|
50
|
+
"localTrackEncodingDisabled",
|
|
51
|
+
"localPeerMetadataChanged",
|
|
52
|
+
"localTrackMetadataChanged",
|
|
53
|
+
"disconnectRequested",
|
|
54
|
+
];
|
|
5
55
|
/**
|
|
6
56
|
* Create a client that can be used with a context.
|
|
7
57
|
* Returns context provider, and two hooks to interact with the context.
|
|
8
58
|
*
|
|
9
59
|
* @returns ContextProvider, useSelector, useConnect
|
|
10
60
|
*/
|
|
11
|
-
export
|
|
61
|
+
export function create(config, deviceManagerDefaultConfig) {
|
|
12
62
|
const FishjamContext = createContext(undefined);
|
|
13
|
-
|
|
63
|
+
function FishjamContextProvider({ children }) {
|
|
14
64
|
const memoClient = useMemo(() => {
|
|
15
65
|
return new Client({
|
|
16
66
|
clientConfig: config,
|
|
17
67
|
deviceManagerDefaultConfig,
|
|
18
|
-
screenShareManagerDefaultConfig,
|
|
19
68
|
});
|
|
20
69
|
}, []);
|
|
21
70
|
const clientRef = useRef(memoClient);
|
|
22
71
|
const mutationRef = useRef(false);
|
|
23
|
-
const subscribe = useCallback((
|
|
72
|
+
const subscribe = useCallback((subscribeCallback) => {
|
|
24
73
|
const client = clientRef.current;
|
|
25
74
|
const callback = () => {
|
|
26
75
|
mutationRef.current = true;
|
|
27
|
-
|
|
76
|
+
subscribeCallback();
|
|
28
77
|
};
|
|
29
|
-
client.on(
|
|
30
|
-
client.on("socketError", callback);
|
|
31
|
-
client.on("socketClose", callback);
|
|
32
|
-
client.on("authSuccess", callback);
|
|
33
|
-
client.on("authError", callback);
|
|
34
|
-
client.on("disconnected", callback);
|
|
35
|
-
client.on("joined", callback);
|
|
36
|
-
client.on("joinError", callback);
|
|
37
|
-
client.on("peerJoined", callback);
|
|
38
|
-
client.on("peerUpdated", callback);
|
|
39
|
-
client.on("peerLeft", callback);
|
|
40
|
-
client.on("reconnected", callback);
|
|
41
|
-
client.on("reconnectionRetriesLimitReached", callback);
|
|
42
|
-
client.on("reconnectionStarted", callback);
|
|
43
|
-
client.on("componentAdded", callback);
|
|
44
|
-
client.on("componentUpdated", callback);
|
|
45
|
-
client.on("componentRemoved", callback);
|
|
46
|
-
client.on("trackReady", callback);
|
|
47
|
-
client.on("trackAdded", callback);
|
|
48
|
-
client.on("trackRemoved", callback);
|
|
49
|
-
client.on("trackUpdated", callback);
|
|
50
|
-
client.on("bandwidthEstimationChanged", callback);
|
|
51
|
-
client.on("encodingChanged", callback);
|
|
52
|
-
client.on("voiceActivityChanged", callback);
|
|
53
|
-
client.on("deviceDisabled", callback);
|
|
54
|
-
client.on("deviceEnabled", callback);
|
|
55
|
-
client.on("managerInitialized", callback);
|
|
56
|
-
client.on("managerStarted", callback);
|
|
57
|
-
client.on("deviceStopped", callback);
|
|
58
|
-
client.on("deviceReady", callback);
|
|
59
|
-
client.on("devicesStarted", callback);
|
|
60
|
-
client.on("devicesReady", callback);
|
|
61
|
-
client.on("error", callback);
|
|
62
|
-
client.on("targetTrackEncodingRequested", callback);
|
|
63
|
-
client.on("localTrackAdded", callback);
|
|
64
|
-
client.on("localTrackRemoved", callback);
|
|
65
|
-
client.on("localTrackReplaced", callback);
|
|
66
|
-
client.on("localTrackMuted", callback);
|
|
67
|
-
client.on("localTrackUnmuted", callback);
|
|
68
|
-
client.on("localTrackBandwidthSet", callback);
|
|
69
|
-
client.on("localTrackEncodingBandwidthSet", callback);
|
|
70
|
-
client.on("localTrackEncodingEnabled", callback);
|
|
71
|
-
client.on("localTrackEncodingDisabled", callback);
|
|
72
|
-
client.on("localPeerMetadataChanged", callback);
|
|
73
|
-
client.on("localTrackMetadataChanged", callback);
|
|
74
|
-
client.on("disconnectRequested", callback);
|
|
78
|
+
eventNames.forEach((eventName) => client.on(eventName, callback));
|
|
75
79
|
return () => {
|
|
76
|
-
client.removeListener(
|
|
77
|
-
client.removeListener("socketError", callback);
|
|
78
|
-
client.removeListener("socketClose", callback);
|
|
79
|
-
client.removeListener("authSuccess", callback);
|
|
80
|
-
client.removeListener("authError", callback);
|
|
81
|
-
client.removeListener("disconnected", callback);
|
|
82
|
-
client.removeListener("joined", callback);
|
|
83
|
-
client.removeListener("joinError", callback);
|
|
84
|
-
client.removeListener("peerJoined", callback);
|
|
85
|
-
client.removeListener("peerUpdated", callback);
|
|
86
|
-
client.removeListener("peerLeft", callback);
|
|
87
|
-
client.removeListener("reconnected", callback);
|
|
88
|
-
client.removeListener("reconnectionRetriesLimitReached", callback);
|
|
89
|
-
client.removeListener("reconnectionStarted", callback);
|
|
90
|
-
client.removeListener("componentAdded", callback);
|
|
91
|
-
client.removeListener("componentUpdated", callback);
|
|
92
|
-
client.removeListener("componentRemoved", callback);
|
|
93
|
-
client.removeListener("trackReady", callback);
|
|
94
|
-
client.removeListener("trackAdded", callback);
|
|
95
|
-
client.removeListener("trackRemoved", callback);
|
|
96
|
-
client.removeListener("trackUpdated", callback);
|
|
97
|
-
client.removeListener("bandwidthEstimationChanged", callback);
|
|
98
|
-
client.removeListener("encodingChanged", callback);
|
|
99
|
-
client.removeListener("voiceActivityChanged", callback);
|
|
100
|
-
client.removeListener("deviceDisabled", callback);
|
|
101
|
-
client.removeListener("deviceEnabled", callback);
|
|
102
|
-
client.removeListener("managerInitialized", callback);
|
|
103
|
-
client.removeListener("managerStarted", callback);
|
|
104
|
-
client.removeListener("deviceStopped", callback);
|
|
105
|
-
client.removeListener("devicesStarted", callback);
|
|
106
|
-
client.removeListener("devicesReady", callback);
|
|
107
|
-
client.removeListener("error", callback);
|
|
108
|
-
client.removeListener("targetTrackEncodingRequested", callback);
|
|
109
|
-
client.removeListener("localTrackAdded", callback);
|
|
110
|
-
client.removeListener("localTrackRemoved", callback);
|
|
111
|
-
client.removeListener("localTrackReplaced", callback);
|
|
112
|
-
client.removeListener("localTrackMuted", callback);
|
|
113
|
-
client.removeListener("localTrackUnmuted", callback);
|
|
114
|
-
client.removeListener("localTrackBandwidthSet", callback);
|
|
115
|
-
client.removeListener("localTrackEncodingBandwidthSet", callback);
|
|
116
|
-
client.removeListener("localTrackEncodingEnabled", callback);
|
|
117
|
-
client.removeListener("localTrackEncodingDisabled", callback);
|
|
118
|
-
client.removeListener("localPeerMetadataChanged", callback);
|
|
119
|
-
client.removeListener("localTrackMetadataChanged", callback);
|
|
120
|
-
client.removeListener("disconnectRequested", callback);
|
|
80
|
+
eventNames.forEach((eventName) => client.removeListener(eventName, callback));
|
|
121
81
|
};
|
|
122
82
|
}, []);
|
|
123
83
|
const lastSnapshotRef = useRef(null);
|
|
@@ -125,15 +85,12 @@ export const create = (config, deviceManagerDefaultConfig, screenShareManagerDef
|
|
|
125
85
|
if (mutationRef.current || lastSnapshotRef.current === null) {
|
|
126
86
|
const state = {
|
|
127
87
|
remote: clientRef.current.peers,
|
|
128
|
-
screenShareManager: clientRef.current.screenShareManager,
|
|
129
88
|
media: clientRef.current.media,
|
|
130
89
|
bandwidthEstimation: clientRef.current.bandwidthEstimation,
|
|
131
90
|
tracks: clientRef.current.peersTracks,
|
|
132
91
|
local: clientRef.current.local,
|
|
133
92
|
status: clientRef.current.status,
|
|
134
93
|
devices: clientRef.current.devices,
|
|
135
|
-
videoTrackManager: clientRef.current.videoTrackManager,
|
|
136
|
-
audioTrackManager: clientRef.current.audioTrackManager,
|
|
137
94
|
client: clientRef.current,
|
|
138
95
|
reconnectionStatus: clientRef.current.reconnectionStatus,
|
|
139
96
|
};
|
|
@@ -143,19 +100,29 @@ export const create = (config, deviceManagerDefaultConfig, screenShareManagerDef
|
|
|
143
100
|
return lastSnapshotRef.current;
|
|
144
101
|
}, []);
|
|
145
102
|
const state = useSyncExternalStore(subscribe, getSnapshot);
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
103
|
+
const tsClient = state.client.getTsClient();
|
|
104
|
+
const screenshareState = useState(null);
|
|
105
|
+
const videoTrackManager = useTrackManager({
|
|
106
|
+
mediaManager: state.client.videoDeviceManager,
|
|
107
|
+
tsClient,
|
|
108
|
+
});
|
|
109
|
+
const audioTrackManager = useTrackManager({
|
|
110
|
+
mediaManager: state.client.audioDeviceManager,
|
|
111
|
+
tsClient,
|
|
112
|
+
});
|
|
113
|
+
return (_jsx(FishjamContext.Provider, { value: { state, screenshareState, videoTrackManager, audioTrackManager }, children: children }));
|
|
114
|
+
}
|
|
115
|
+
function useFishjamContext() {
|
|
149
116
|
const context = useContext(FishjamContext);
|
|
150
117
|
if (!context)
|
|
151
118
|
throw new Error("useFishjamContext must be used within a FishjamContextProvider");
|
|
152
119
|
return context;
|
|
153
|
-
}
|
|
154
|
-
|
|
120
|
+
}
|
|
121
|
+
function useSelector(selector) {
|
|
155
122
|
const { state } = useFishjamContext();
|
|
156
123
|
return useMemo(() => selector(state), [selector, state]);
|
|
157
|
-
}
|
|
158
|
-
|
|
124
|
+
}
|
|
125
|
+
function useConnect() {
|
|
159
126
|
const { state } = useFishjamContext();
|
|
160
127
|
return useMemo(() => {
|
|
161
128
|
return (config) => {
|
|
@@ -165,29 +132,31 @@ export const create = (config, deviceManagerDefaultConfig, screenShareManagerDef
|
|
|
165
132
|
};
|
|
166
133
|
};
|
|
167
134
|
}, [state.client]);
|
|
168
|
-
}
|
|
169
|
-
|
|
135
|
+
}
|
|
136
|
+
function useDisconnect() {
|
|
170
137
|
const { state } = useFishjamContext();
|
|
171
138
|
return useCallback(() => {
|
|
172
139
|
state.client.disconnect();
|
|
173
140
|
}, [state.client]);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
141
|
+
}
|
|
142
|
+
function useStatus() {
|
|
143
|
+
return useSelector((s) => s.status);
|
|
144
|
+
}
|
|
145
|
+
function useTracks() {
|
|
146
|
+
return useSelector((s) => s.tracks);
|
|
147
|
+
}
|
|
148
|
+
function useClient() {
|
|
149
|
+
return useSelector((s) => s.client);
|
|
150
|
+
}
|
|
151
|
+
function useCamera() {
|
|
152
|
+
const { state, videoTrackManager } = useFishjamContext();
|
|
153
|
+
return { ...state.devices.camera, ...videoTrackManager };
|
|
154
|
+
}
|
|
155
|
+
function useMicrophone() {
|
|
156
|
+
const { state, audioTrackManager } = useFishjamContext();
|
|
157
|
+
return { ...state.devices.microphone, ...audioTrackManager };
|
|
158
|
+
}
|
|
159
|
+
function useReconnection() {
|
|
191
160
|
const { state } = useFishjamContext();
|
|
192
161
|
return {
|
|
193
162
|
status: state.reconnectionStatus,
|
|
@@ -195,21 +164,25 @@ export const create = (config, deviceManagerDefaultConfig, screenShareManagerDef
|
|
|
195
164
|
isError: state.reconnectionStatus === "error",
|
|
196
165
|
isIdle: state.reconnectionStatus === "idle",
|
|
197
166
|
};
|
|
198
|
-
}
|
|
199
|
-
|
|
167
|
+
}
|
|
168
|
+
function getPeerWithDistinguishedTracks(peerState) {
|
|
200
169
|
const localTracks = Object.values(peerState.tracks ?? {});
|
|
201
|
-
const
|
|
202
|
-
const
|
|
203
|
-
return { ...peerState,
|
|
204
|
-
}
|
|
205
|
-
|
|
170
|
+
const videoTracks = localTracks.filter(({ track }) => track?.kind === "video");
|
|
171
|
+
const audioTracks = localTracks.filter(({ track }) => track?.kind === "audio");
|
|
172
|
+
return { ...peerState, videoTracks, audioTracks };
|
|
173
|
+
}
|
|
174
|
+
function useParticipants() {
|
|
206
175
|
const { state } = useFishjamContext();
|
|
207
176
|
const localParticipant = state.local
|
|
208
177
|
? getPeerWithDistinguishedTracks(state.local)
|
|
209
178
|
: null;
|
|
210
179
|
const participants = Object.values(state.remote).map(getPeerWithDistinguishedTracks);
|
|
211
180
|
return { localParticipant, participants };
|
|
212
|
-
}
|
|
181
|
+
}
|
|
182
|
+
function useScreenShare() {
|
|
183
|
+
const { state, screenshareState } = useFishjamContext();
|
|
184
|
+
return _useScreenShare(screenshareState, state.client.getTsClient());
|
|
185
|
+
}
|
|
213
186
|
return {
|
|
214
187
|
FishjamContextProvider,
|
|
215
188
|
useSelector,
|
|
@@ -219,10 +192,10 @@ export const create = (config, deviceManagerDefaultConfig, screenShareManagerDef
|
|
|
219
192
|
useTracks,
|
|
220
193
|
useSetupMedia: createUseSetupMediaHook(useFishjamContext),
|
|
221
194
|
useParticipants,
|
|
195
|
+
useScreenShare,
|
|
222
196
|
useCamera,
|
|
223
197
|
useMicrophone,
|
|
224
|
-
useScreenShare,
|
|
225
198
|
useClient,
|
|
226
199
|
useReconnection,
|
|
227
200
|
};
|
|
228
|
-
}
|
|
201
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,8 @@ export { create } from "./create";
|
|
|
2
2
|
export { Client } from "./Client";
|
|
3
3
|
export type { ClientEvents } from "./Client";
|
|
4
4
|
export type { PeerState, Track, PeerId, TrackId, TrackWithOrigin, Origin, PeerStatus, Selector, State, SetStore, } from "./state.types";
|
|
5
|
-
export type { DeviceManagerConfig, StorageConfig, Devices, UserMediaAPI,
|
|
6
|
-
export type { ScreenShareManagerConfig } from "./ScreenShareManager";
|
|
5
|
+
export type { DeviceManagerConfig, StorageConfig, Devices, UserMediaAPI, UseSetupMediaResult, UseSetupMediaConfig, CreateFishjamClient, ScreenshareApi, UseConnect, TrackManager, TrackMiddleware, } from "./types";
|
|
7
6
|
export { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS, SCREEN_SHARING_MEDIA_CONSTRAINTS } from "./constraints";
|
|
8
|
-
export type { Peer, MessageEvents,
|
|
7
|
+
export type { Peer, MessageEvents, CreateConfig, TrackBandwidthLimit, SimulcastBandwidthLimit, BandwidthLimit, WebRTCEndpointEvents, TrackContextEvents, Endpoint, SimulcastConfig, TrackContext, VadStatus, EncodingReason, MetadataParser, ConnectConfig, AuthErrorReason, Encoding, } from "@fishjam-cloud/ts-client";
|
|
9
8
|
export { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
10
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,YAAY,EACV,SAAS,EACT,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,YAAY,EACV,SAAS,EACT,KAAK,EACL,MAAM,EACN,OAAO,EACP,eAAe,EACf,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,mBAAmB,EACnB,aAAa,EACb,OAAO,EACP,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,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,aAAa,EACb,eAAe,EACf,QAAQ,GACT,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { ScreenshareApi, ScreenshareState } from "./types";
|
|
3
|
+
export declare const useScreenShare: <PeerMetadata, TrackMetadata>([state, setState]: [ScreenshareState, React.Dispatch<React.SetStateAction<ScreenshareState>>], tsClient: FishjamClient<PeerMetadata, TrackMetadata>) => ScreenshareApi<TrackMetadata>;
|
|
4
|
+
//# sourceMappingURL=screenShareTrackManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenShareTrackManager.d.ts","sourceRoot":"","sources":["../src/screenShareTrackManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAoB,MAAM,SAAS,CAAC;AASlF,eAAO,MAAM,cAAc,GAAI,YAAY,EAAE,aAAa,qBAErC,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,YACnF,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,KACnD,cAAc,CAAC,aAAa,CAmG9B,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { useCallback, useEffect } from "react";
|
|
2
|
+
import { getRemoteOrLocalTrack } from "./utils/track";
|
|
3
|
+
const getTracks = (stream) => {
|
|
4
|
+
const video = stream.getVideoTracks()[0];
|
|
5
|
+
const audio = stream.getAudioTracks()[0] ?? null;
|
|
6
|
+
return [video, audio];
|
|
7
|
+
};
|
|
8
|
+
export const useScreenShare = (
|
|
9
|
+
// these arguments will be removed after we get rid of create() fn, we will just use the context
|
|
10
|
+
[state, setState], tsClient) => {
|
|
11
|
+
const startStreaming = async (props) => {
|
|
12
|
+
const stream = await navigator.mediaDevices.getDisplayMedia({
|
|
13
|
+
video: props?.videoConstraints ?? true,
|
|
14
|
+
audio: props?.audioConstraints ?? true,
|
|
15
|
+
});
|
|
16
|
+
const [video, audio] = getTracks(stream);
|
|
17
|
+
const addTrackPromises = [tsClient.addTrack(video, props?.metadata)];
|
|
18
|
+
if (audio)
|
|
19
|
+
addTrackPromises.push(tsClient.addTrack(audio, props?.metadata));
|
|
20
|
+
const [videoId, audioId] = await Promise.all(addTrackPromises);
|
|
21
|
+
setState({ stream, trackIds: { videoId, audioId } });
|
|
22
|
+
};
|
|
23
|
+
const replaceTracks = async (newVideoTrack, newAudioTrack) => {
|
|
24
|
+
if (!state?.stream)
|
|
25
|
+
return;
|
|
26
|
+
const addTrackPromises = [tsClient.replaceTrack(state.trackIds.videoId, newVideoTrack)];
|
|
27
|
+
if (newAudioTrack && state.trackIds.audioId) {
|
|
28
|
+
addTrackPromises.push(tsClient.replaceTrack(state.trackIds.audioId, newAudioTrack));
|
|
29
|
+
}
|
|
30
|
+
await Promise.all(addTrackPromises);
|
|
31
|
+
};
|
|
32
|
+
const setTracksMiddleware = async (middleware) => {
|
|
33
|
+
if (!state?.stream)
|
|
34
|
+
return;
|
|
35
|
+
const [videoTrack, audioTrack] = getTracks(state.stream);
|
|
36
|
+
const [newVideoTrack, newAudioTrack] = middleware?.(videoTrack, audioTrack) ?? [videoTrack, audioTrack];
|
|
37
|
+
await replaceTracks(newVideoTrack, newAudioTrack);
|
|
38
|
+
};
|
|
39
|
+
const stopStreaming = useCallback(async () => {
|
|
40
|
+
if (!state) {
|
|
41
|
+
console.warn("No stream to stop");
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const [video, audio] = getTracks(state.stream);
|
|
45
|
+
video.stop();
|
|
46
|
+
if (audio)
|
|
47
|
+
audio.stop();
|
|
48
|
+
const removeTrackPromises = [tsClient.removeTrack(state.trackIds.videoId)];
|
|
49
|
+
if (state.trackIds.audioId)
|
|
50
|
+
removeTrackPromises.push(tsClient.removeTrack(state.trackIds.audioId));
|
|
51
|
+
await Promise.all(removeTrackPromises);
|
|
52
|
+
setState(null);
|
|
53
|
+
}, [state, tsClient, setState]);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (!state)
|
|
56
|
+
return;
|
|
57
|
+
const [video, audio] = getTracks(state.stream);
|
|
58
|
+
const trackEndedHandler = () => {
|
|
59
|
+
stopStreaming();
|
|
60
|
+
};
|
|
61
|
+
video.addEventListener("ended", trackEndedHandler);
|
|
62
|
+
audio?.addEventListener("ended", trackEndedHandler);
|
|
63
|
+
return () => {
|
|
64
|
+
video.removeEventListener("ended", trackEndedHandler);
|
|
65
|
+
audio?.removeEventListener("ended", trackEndedHandler);
|
|
66
|
+
};
|
|
67
|
+
}, [state, stopStreaming]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const onDisconnected = () => {
|
|
70
|
+
stopStreaming();
|
|
71
|
+
};
|
|
72
|
+
tsClient.on("disconnected", onDisconnected);
|
|
73
|
+
return () => {
|
|
74
|
+
tsClient.removeListener("disconnected", onDisconnected);
|
|
75
|
+
};
|
|
76
|
+
}, [stopStreaming, tsClient]);
|
|
77
|
+
const stream = state?.stream ?? null;
|
|
78
|
+
const [videoTrack, audioTrack] = stream ? getTracks(stream) : [null, null];
|
|
79
|
+
const videoBroadcast = state ? getRemoteOrLocalTrack(tsClient, state.trackIds.videoId) : null;
|
|
80
|
+
const audioBroadcast = state?.trackIds.audioId ? getRemoteOrLocalTrack(tsClient, state.trackIds.audioId) : null;
|
|
81
|
+
return {
|
|
82
|
+
startStreaming,
|
|
83
|
+
stopStreaming,
|
|
84
|
+
stream,
|
|
85
|
+
videoTrack,
|
|
86
|
+
audioTrack,
|
|
87
|
+
videoBroadcast,
|
|
88
|
+
audioBroadcast,
|
|
89
|
+
setTracksMiddleware,
|
|
90
|
+
currentTracksMiddleware: state?.tracksMiddleware ?? null,
|
|
91
|
+
};
|
|
92
|
+
};
|
package/dist/state.types.d.ts
CHANGED
|
@@ -2,8 +2,6 @@ import type { Encoding, VadStatus, SimulcastConfig, ReconnectionStatus } from "@
|
|
|
2
2
|
import type { MediaState } from "./types";
|
|
3
3
|
import type { Devices } from "./types";
|
|
4
4
|
import type { Client } from "./Client";
|
|
5
|
-
import type { ScreenShareManager } from "./ScreenShareManager";
|
|
6
|
-
import type { TrackManager } from "./trackManager";
|
|
7
5
|
export type TrackId = string;
|
|
8
6
|
export type PeerId = string;
|
|
9
7
|
export type Track<TrackMetadata> = {
|
|
@@ -48,11 +46,8 @@ export type State<PeerMetadata, TrackMetadata> = {
|
|
|
48
46
|
bandwidthEstimation: bigint;
|
|
49
47
|
status: PeerStatus;
|
|
50
48
|
media: MediaState | null;
|
|
51
|
-
devices: Devices
|
|
49
|
+
devices: Devices;
|
|
52
50
|
client: Client<PeerMetadata, TrackMetadata>;
|
|
53
|
-
videoTrackManager: TrackManager<PeerMetadata, TrackMetadata>;
|
|
54
|
-
audioTrackManager: TrackManager<PeerMetadata, TrackMetadata>;
|
|
55
|
-
screenShareManager: ScreenShareManager;
|
|
56
51
|
reconnectionStatus: ReconnectionStatus;
|
|
57
52
|
};
|
|
58
53
|
export type SetStore<PeerMetadata, TrackMetadata> = (setter: (prevState: State<PeerMetadata, TrackMetadata>) => State<PeerMetadata, TrackMetadata>) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.types.d.ts","sourceRoot":"","sources":["../src/state.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"state.types.d.ts","sourceRoot":"","sources":["../src/state.types.ts"],"names":[],"mappings":"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"}
|
package/dist/trackManager.d.ts
CHANGED
|
@@ -1,24 +1,9 @@
|
|
|
1
|
-
import type { FishjamClient
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
private tsClient;
|
|
7
|
-
private currentTrackId;
|
|
8
|
-
constructor(tsClient: FishjamClient<PeerMetadata, TrackMetadata>, deviceManager: GenericMediaManager);
|
|
9
|
-
private getPreviousTrack;
|
|
10
|
-
getCurrentTrack: () => Track<TrackMetadata> | null;
|
|
11
|
-
private trackContextToTrack;
|
|
12
|
-
private getRemoteTrack;
|
|
13
|
-
initialize: (deviceId?: string) => Promise<void>;
|
|
14
|
-
cleanup: () => Promise<void>;
|
|
15
|
-
startStreaming: (trackMetadata?: TrackMetadata, simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
|
|
16
|
-
refreshStreamedTrack: () => Promise<void>;
|
|
17
|
-
stopStreaming: () => Promise<void>;
|
|
18
|
-
pauseStreaming: () => Promise<void>;
|
|
19
|
-
isMuted: () => boolean;
|
|
20
|
-
resumeStreaming: () => Promise<void>;
|
|
21
|
-
disableTrack: () => Promise<void>;
|
|
22
|
-
enableTrack: () => Promise<void>;
|
|
1
|
+
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { MediaManager, TrackManager } from "./types";
|
|
3
|
+
interface TrackManagerConfig<PeerMetadata, TrackMetadata> {
|
|
4
|
+
mediaManager: MediaManager;
|
|
5
|
+
tsClient: FishjamClient<PeerMetadata, TrackMetadata>;
|
|
23
6
|
}
|
|
7
|
+
export declare const useTrackManager: <PeerMetadata, TrackMetadata>({ mediaManager, tsClient, }: TrackManagerConfig<PeerMetadata, TrackMetadata>) => TrackManager<TrackMetadata>;
|
|
8
|
+
export {};
|
|
24
9
|
//# sourceMappingURL=trackManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trackManager.d.ts","sourceRoot":"","sources":["../src/trackManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"trackManager.d.ts","sourceRoot":"","sources":["../src/trackManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAwC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAmB,MAAM,SAAS,CAAC;AAK3E,UAAU,kBAAkB,CAAC,YAAY,EAAE,aAAa;IACtD,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;CACtD;AAED,eAAO,MAAM,eAAe,GAAI,YAAY,EAAE,aAAa,+BAGxD,kBAAkB,CAAC,YAAY,EAAE,aAAa,CAAC,KAAG,YAAY,CAAC,aAAa,CA8H9E,CAAC"}
|