@fishjam-cloud/react-client 0.5.1 → 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/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 const create = (config, deviceManagerDefaultConfig, screenShareManagerDefaultConfig) => {
61
+ export function create(config, deviceManagerDefaultConfig) {
12
62
  const FishjamContext = createContext(undefined);
13
- const FishjamContextProvider = ({ children, }) => {
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((cb) => {
72
+ const subscribe = useCallback((subscribeCallback) => {
24
73
  const client = clientRef.current;
25
74
  const callback = () => {
26
75
  mutationRef.current = true;
27
- cb();
76
+ subscribeCallback();
28
77
  };
29
- client.on("socketOpen", callback);
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("socketOpen", callback);
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
- return _jsx(FishjamContext.Provider, { value: { state }, children: children });
147
- };
148
- const useFishjamContext = () => {
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
- const useSelector = (selector) => {
120
+ }
121
+ function useSelector(selector) {
155
122
  const { state } = useFishjamContext();
156
123
  return useMemo(() => selector(state), [selector, state]);
157
- };
158
- const useConnect = () => {
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
- const useDisconnect = () => {
135
+ }
136
+ function useDisconnect() {
170
137
  const { state } = useFishjamContext();
171
138
  return useCallback(() => {
172
139
  state.client.disconnect();
173
140
  }, [state.client]);
174
- };
175
- const useStatus = () => useSelector((s) => s.status);
176
- const useTracks = () => useSelector((s) => s.tracks);
177
- const useClient = () => useSelector((s) => s.client);
178
- const useCamera = () => {
179
- const { state } = useFishjamContext();
180
- return { ...state.devices.camera, ...state.videoTrackManager };
181
- };
182
- const useMicrophone = () => {
183
- const { state } = useFishjamContext();
184
- return { ...state.devices.microphone, ...state.audioTrackManager };
185
- };
186
- const useScreenShare = () => {
187
- const { state } = useFishjamContext();
188
- return { ...state.devices.screenShare };
189
- };
190
- const useReconnection = () => {
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
- const getPeerWithDistinguishedTracks = (peerState) => {
167
+ }
168
+ function getPeerWithDistinguishedTracks(peerState) {
200
169
  const localTracks = Object.values(peerState.tracks ?? {});
201
- const videoTrack = localTracks.find(({ track }) => track?.kind === "video");
202
- const audioTrack = localTracks.find(({ track }) => track?.kind === "audio");
203
- return { ...peerState, videoTrack, audioTrack };
204
- };
205
- const useParticipants = () => {
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, ScreenShareAPI, UseSetupMediaResult, UseSetupMediaConfig, CreateFishjamClient, UseConnect, GenericTrackManager, } from "./types";
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, SignalingUrl, CreateConfig, TrackBandwidthLimit, SimulcastBandwidthLimit, BandwidthLimit, WebRTCEndpointEvents, TrackContextEvents, Endpoint, SimulcastConfig, TrackContext, VadStatus, EncodingReason, MetadataParser, ConnectConfig, AuthErrorReason, Encoding, } from "@fishjam-cloud/ts-client";
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
@@ -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,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAEnH,YAAY,EACV,IAAI,EACJ,aAAa,EACb,YAAY,EACZ,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"}
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
+ };
@@ -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<TrackMetadata>;
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":"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"}
1
+ {"version":3,"file":"state.types.d.ts","sourceRoot":"","sources":["../src/state.types.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,9 @@
1
- import type { FishjamClient, SimulcastConfig, TrackBandwidthLimit } from "@fishjam-cloud/ts-client";
2
- import type { GenericMediaManager, GenericTrackManager } from "./types";
3
- import type { Track } from "./state.types";
4
- export declare class TrackManager<PeerMetadata, TrackMetadata> implements GenericTrackManager<TrackMetadata> {
5
- private mediaManager;
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,EAAE,eAAe,EAAE,mBAAmB,EAAgB,MAAM,0BAA0B,CAAC;AAClH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,qBAAa,YAAY,CAAC,YAAY,EAAE,aAAa,CAAE,YAAW,mBAAmB,CAAC,aAAa,CAAC;IAClG,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,QAAQ,CAA6C;IAC7D,OAAO,CAAC,cAAc,CAAuB;gBAEjC,QAAQ,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,mBAAmB;IAKpG,OAAO,CAAC,gBAAgB,CAQtB;IAEK,eAAe,QAAO,KAAK,CAAC,aAAa,CAAC,GAAG,IAAI,CAGtD;IAEF,OAAO,CAAC,mBAAmB,CAUxB;IAEH,OAAO,CAAC,cAAc,CASpB;IAEK,UAAU,cAAqB,MAAM,mBAE1C;IAEK,OAAO,sBAEZ;IAEK,cAAc,mBACH,aAAa,oBACX,eAAe,iBAClB,mBAAmB,qBAoBlC;IAEK,oBAAoB,sBAOzB;IAEK,aAAa,sBAIlB;IAEK,cAAc,sBAGnB;IAEK,OAAO,gBAMZ;IAEK,eAAe,sBAOpB;IAEK,YAAY,sBAEjB;IAEK,WAAW,sBAEhB;CACH"}
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"}