@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/trackManager.js
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
currentTrackId = null;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { getRemoteOrLocalTrack } from "./utils/track";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
export const useTrackManager = ({ mediaManager, tsClient, }) => {
|
|
4
|
+
const [currentTrackId, setCurrentTrackId] = useState(null);
|
|
5
|
+
const [currentTrackMiddleware, setCurrentTrackMiddleware] = useState(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const disconnectedHandler = () => {
|
|
8
|
+
setCurrentTrackId(null);
|
|
9
|
+
};
|
|
10
|
+
tsClient.on("disconnected", disconnectedHandler);
|
|
11
|
+
return () => {
|
|
12
|
+
tsClient.off("disconnected", disconnectedHandler);
|
|
13
|
+
};
|
|
14
|
+
}, [tsClient]);
|
|
15
|
+
function getPreviousTrack() {
|
|
16
|
+
if (!currentTrackId)
|
|
11
17
|
throw Error("There is no current track id");
|
|
12
|
-
const prevTrack =
|
|
18
|
+
const prevTrack = getRemoteOrLocalTrack(tsClient, currentTrackId);
|
|
13
19
|
if (!prevTrack)
|
|
14
20
|
throw Error("There is no previous track");
|
|
15
21
|
return prevTrack;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const trackByRemoteId = tracks?.get(remoteOrLocalTrackId);
|
|
38
|
-
if (trackByRemoteId)
|
|
39
|
-
return this.trackContextToTrack(trackByRemoteId);
|
|
40
|
-
const trackByLocalId = [...tracks.values()].find((track) => track.track?.id === remoteOrLocalTrackId);
|
|
41
|
-
return trackByLocalId ? this.trackContextToTrack(trackByLocalId) : null;
|
|
42
|
-
};
|
|
43
|
-
initialize = async (deviceId) => {
|
|
44
|
-
this.mediaManager?.start(deviceId ?? true);
|
|
45
|
-
};
|
|
46
|
-
cleanup = async () => {
|
|
47
|
-
this?.mediaManager?.stop();
|
|
48
|
-
};
|
|
49
|
-
startStreaming = async (trackMetadata, simulcastConfig, maxBandwidth) => {
|
|
50
|
-
if (this.currentTrackId)
|
|
22
|
+
}
|
|
23
|
+
async function setTrackMiddleware(middleware) {
|
|
24
|
+
const currentTrack = getCurrentTrack();
|
|
25
|
+
const mediaTrack = mediaManager.getTracks()[0];
|
|
26
|
+
if (!currentTrack || !mediaTrack)
|
|
27
|
+
return;
|
|
28
|
+
const trackToSet = middleware ? middleware(mediaTrack) : mediaTrack;
|
|
29
|
+
await tsClient.replaceTrack(currentTrack.trackId, trackToSet);
|
|
30
|
+
setCurrentTrackMiddleware(() => middleware);
|
|
31
|
+
}
|
|
32
|
+
function getCurrentTrack() {
|
|
33
|
+
return getRemoteOrLocalTrack(tsClient, currentTrackId);
|
|
34
|
+
}
|
|
35
|
+
async function initialize(deviceId) {
|
|
36
|
+
mediaManager?.start(deviceId ?? true);
|
|
37
|
+
}
|
|
38
|
+
async function stop() {
|
|
39
|
+
mediaManager?.stop();
|
|
40
|
+
}
|
|
41
|
+
async function startStreaming(trackMetadata, simulcastConfig, maxBandwidth) {
|
|
42
|
+
if (currentTrackId)
|
|
51
43
|
throw Error("Track already added");
|
|
52
|
-
const media =
|
|
44
|
+
const media = mediaManager.getMedia();
|
|
53
45
|
if (!media || !media.stream || !media.track)
|
|
54
46
|
throw Error("Device is unavailable");
|
|
55
|
-
const track =
|
|
47
|
+
const track = getRemoteOrLocalTrack(tsClient, currentTrackId);
|
|
56
48
|
if (track)
|
|
57
49
|
return track.trackId;
|
|
58
|
-
// see `
|
|
59
|
-
|
|
60
|
-
const remoteTrackId = await
|
|
61
|
-
|
|
50
|
+
// see `getRemoteOrLocalTrackContext()` explanation
|
|
51
|
+
setCurrentTrackId(media.track.id);
|
|
52
|
+
const remoteTrackId = await tsClient.addTrack(media.track, trackMetadata, simulcastConfig, maxBandwidth);
|
|
53
|
+
setCurrentTrackId(remoteTrackId);
|
|
62
54
|
return remoteTrackId;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const prevTrack =
|
|
66
|
-
const newTrack =
|
|
55
|
+
}
|
|
56
|
+
async function refreshStreamedTrack() {
|
|
57
|
+
const prevTrack = getPreviousTrack();
|
|
58
|
+
const newTrack = mediaManager.getTracks()[0];
|
|
67
59
|
if (!newTrack)
|
|
68
60
|
throw Error("New track is empty");
|
|
69
|
-
return
|
|
70
|
-
}
|
|
71
|
-
stopStreaming
|
|
72
|
-
const prevTrack =
|
|
73
|
-
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
pauseStreaming
|
|
77
|
-
const prevTrack =
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
const areMediaDisabled = !media?.enabled;
|
|
84
|
-
return isTrackDisabled && areMediaDisabled;
|
|
85
|
-
};
|
|
86
|
-
resumeStreaming = async () => {
|
|
87
|
-
const prevTrack = this.getPreviousTrack();
|
|
88
|
-
const media = this.mediaManager.getMedia();
|
|
61
|
+
return tsClient.replaceTrack(prevTrack.trackId, newTrack);
|
|
62
|
+
}
|
|
63
|
+
function stopStreaming() {
|
|
64
|
+
const prevTrack = getPreviousTrack();
|
|
65
|
+
setCurrentTrackId(null);
|
|
66
|
+
return tsClient.removeTrack(prevTrack.trackId);
|
|
67
|
+
}
|
|
68
|
+
function pauseStreaming() {
|
|
69
|
+
const prevTrack = getPreviousTrack();
|
|
70
|
+
return tsClient.replaceTrack(prevTrack.trackId, null);
|
|
71
|
+
}
|
|
72
|
+
function resumeStreaming() {
|
|
73
|
+
const prevTrack = getPreviousTrack();
|
|
74
|
+
const media = mediaManager.getMedia();
|
|
89
75
|
if (!media)
|
|
90
76
|
throw Error("Device is unavailable");
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
disableTrack
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
enableTrack
|
|
97
|
-
|
|
77
|
+
return tsClient.replaceTrack(prevTrack.trackId, media.track);
|
|
78
|
+
}
|
|
79
|
+
function disableTrack() {
|
|
80
|
+
return mediaManager.disable();
|
|
81
|
+
}
|
|
82
|
+
function enableTrack() {
|
|
83
|
+
return mediaManager.enable();
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
getCurrentTrack,
|
|
87
|
+
setTrackMiddleware,
|
|
88
|
+
initialize,
|
|
89
|
+
stop,
|
|
90
|
+
startStreaming,
|
|
91
|
+
stopStreaming,
|
|
92
|
+
pauseStreaming,
|
|
93
|
+
resumeStreaming,
|
|
94
|
+
disableTrack,
|
|
95
|
+
enableTrack,
|
|
96
|
+
currentTrackMiddleware,
|
|
97
|
+
refreshStreamedTrack,
|
|
98
98
|
};
|
|
99
|
-
}
|
|
99
|
+
};
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { ConnectConfig, SimulcastConfig, TrackBandwidthLimit } from "@fishjam-cloud/ts-client";
|
|
2
|
-
import type { ScreenShareManagerConfig } from "./ScreenShareManager";
|
|
1
|
+
import type { ConnectConfig, SimulcastConfig, TrackBandwidthLimit, TrackKind } from "@fishjam-cloud/ts-client";
|
|
3
2
|
import type { PeerState, PeerStatus, Selector, State, Track, TrackId, TrackWithOrigin, UseReconnection } from "./state.types";
|
|
4
3
|
import type { JSX, ReactNode } from "react";
|
|
5
4
|
import type { Client } from "./Client";
|
|
@@ -116,7 +115,6 @@ export type UseSetupMediaConfig<TrackMetadata> = {
|
|
|
116
115
|
* Determines whether broadcasting should start when the user initiates the camera and is connected to the server.
|
|
117
116
|
*/
|
|
118
117
|
broadcastOnDeviceStart?: boolean;
|
|
119
|
-
streamConfig?: ScreenShareManagerConfig;
|
|
120
118
|
defaultTrackMetadata?: TrackMetadata;
|
|
121
119
|
defaultMaxBandwidth?: TrackBandwidthLimit;
|
|
122
120
|
};
|
|
@@ -126,7 +124,7 @@ export type UseSetupMediaConfig<TrackMetadata> = {
|
|
|
126
124
|
export type UseSetupMediaResult = {
|
|
127
125
|
init: () => void;
|
|
128
126
|
};
|
|
129
|
-
export interface
|
|
127
|
+
export interface MediaManager {
|
|
130
128
|
start: (deviceId?: string | boolean) => Promise<void>;
|
|
131
129
|
stop: () => Promise<void>;
|
|
132
130
|
disable: () => void;
|
|
@@ -138,18 +136,30 @@ export interface GenericMediaManager {
|
|
|
138
136
|
enabled: boolean;
|
|
139
137
|
} | null;
|
|
140
138
|
}
|
|
141
|
-
export
|
|
139
|
+
export type TrackMiddleware = ((track: MediaStreamTrack | null) => MediaStreamTrack | null) | null;
|
|
140
|
+
export type ScreenshareState = {
|
|
141
|
+
stream: MediaStream;
|
|
142
|
+
trackIds: {
|
|
143
|
+
videoId: string;
|
|
144
|
+
audioId?: string;
|
|
145
|
+
};
|
|
146
|
+
tracksMiddleware?: TracksMiddleware | null;
|
|
147
|
+
} | null;
|
|
148
|
+
export interface TrackManager<TrackMetadata> {
|
|
142
149
|
initialize: (deviceId?: string) => Promise<void>;
|
|
143
|
-
|
|
150
|
+
stop: () => Promise<void>;
|
|
144
151
|
startStreaming: (trackMetadata?: TrackMetadata, simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
|
|
145
152
|
stopStreaming: () => Promise<void>;
|
|
146
153
|
pauseStreaming: () => Promise<void>;
|
|
147
154
|
resumeStreaming: () => Promise<void>;
|
|
148
155
|
disableTrack: () => void;
|
|
149
156
|
enableTrack: () => void;
|
|
157
|
+
setTrackMiddleware: (middleware: TrackMiddleware) => Promise<void>;
|
|
158
|
+
currentTrackMiddleware: TrackMiddleware;
|
|
159
|
+
refreshStreamedTrack: () => Promise<void>;
|
|
160
|
+
getCurrentTrack: () => Track<TrackMetadata> | null;
|
|
150
161
|
}
|
|
151
|
-
export type UserMediaAPI
|
|
152
|
-
broadcast: Track<TrackMetadata> | null;
|
|
162
|
+
export type UserMediaAPI = {
|
|
153
163
|
status: DevicesStatus | null;
|
|
154
164
|
stream: MediaStream | null;
|
|
155
165
|
track: MediaStreamTrack | null;
|
|
@@ -159,36 +169,43 @@ export type UserMediaAPI<TrackMetadata> = {
|
|
|
159
169
|
error: DeviceError | null;
|
|
160
170
|
devices: MediaDeviceInfo[] | null;
|
|
161
171
|
};
|
|
162
|
-
export type
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
172
|
+
export type TrackManagerState = {
|
|
173
|
+
currentTrackId: TrackId | null;
|
|
174
|
+
currentTrackMiddleware: TrackMiddleware;
|
|
175
|
+
};
|
|
176
|
+
export type ScreenshareApi<TrackMetadata> = {
|
|
177
|
+
startStreaming: (props?: {
|
|
178
|
+
metadata?: TrackMetadata;
|
|
179
|
+
audioConstraints?: boolean | MediaTrackConstraints;
|
|
180
|
+
videoConstraints?: boolean | MediaTrackConstraints;
|
|
181
|
+
}) => Promise<void>;
|
|
166
182
|
stopStreaming: () => Promise<void>;
|
|
167
|
-
disableTrack: () => void;
|
|
168
|
-
enableTrack: () => void;
|
|
169
|
-
broadcast: Track<TrackMetadata> | null;
|
|
170
|
-
status: DevicesStatus | null;
|
|
171
183
|
stream: MediaStream | null;
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
184
|
+
videoTrack: MediaStreamTrack | null;
|
|
185
|
+
audioTrack: MediaStreamTrack | null;
|
|
186
|
+
videoBroadcast: Track<TrackMetadata> | null;
|
|
187
|
+
audioBroadcast: Track<TrackMetadata> | null;
|
|
188
|
+
setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
|
|
189
|
+
currentTracksMiddleware: TracksMiddleware | null;
|
|
176
190
|
};
|
|
177
|
-
export type Devices
|
|
178
|
-
camera: UserMediaAPI
|
|
179
|
-
microphone: UserMediaAPI
|
|
180
|
-
screenShare: ScreenShareAPI<TrackMetadata>;
|
|
191
|
+
export type Devices = {
|
|
192
|
+
camera: UserMediaAPI;
|
|
193
|
+
microphone: UserMediaAPI;
|
|
181
194
|
};
|
|
182
195
|
export type FishjamContextProviderProps = {
|
|
183
196
|
children: ReactNode;
|
|
184
197
|
};
|
|
198
|
+
export type TracksMiddleware = (videoTrack: MediaStreamTrack, audioTrack: MediaStreamTrack | null) => [MediaStreamTrack, MediaStreamTrack | null];
|
|
185
199
|
export type FishjamContextType<PeerMetadata, TrackMetadata> = {
|
|
186
200
|
state: State<PeerMetadata, TrackMetadata>;
|
|
201
|
+
screenshareState: [ScreenshareState, React.Dispatch<React.SetStateAction<ScreenshareState>>];
|
|
202
|
+
videoTrackManager: TrackManager<TrackMetadata>;
|
|
203
|
+
audioTrackManager: TrackManager<TrackMetadata>;
|
|
187
204
|
};
|
|
188
205
|
export type UseConnect<PeerMetadata> = (config: ConnectConfig<PeerMetadata>) => () => void;
|
|
189
206
|
type DistinguishedTracks<TrackMetadata> = {
|
|
190
|
-
|
|
191
|
-
|
|
207
|
+
videoTracks: Track<TrackMetadata>[];
|
|
208
|
+
audioTracks: Track<TrackMetadata>[];
|
|
192
209
|
};
|
|
193
210
|
export type PeerStateWithTracks<PeerMetadata, TrackMetadata> = PeerState<PeerMetadata, TrackMetadata> & DistinguishedTracks<TrackMetadata>;
|
|
194
211
|
export type CreateFishjamClient<PeerMetadata, TrackMetadata> = {
|
|
@@ -199,15 +216,17 @@ export type CreateFishjamClient<PeerMetadata, TrackMetadata> = {
|
|
|
199
216
|
useSelector: <Result>(selector: Selector<PeerMetadata, TrackMetadata, Result>) => Result;
|
|
200
217
|
useTracks: () => Record<TrackId, TrackWithOrigin<PeerMetadata, TrackMetadata>>;
|
|
201
218
|
useSetupMedia: (config: UseSetupMediaConfig<TrackMetadata>) => UseSetupMediaResult;
|
|
202
|
-
useCamera: () => Devices
|
|
203
|
-
useMicrophone: () => Devices
|
|
204
|
-
useScreenShare: () => ScreenShareAPI<TrackMetadata>;
|
|
219
|
+
useCamera: () => Devices["camera"] & TrackManager<TrackMetadata>;
|
|
220
|
+
useMicrophone: () => Devices["microphone"] & TrackManager<TrackMetadata>;
|
|
205
221
|
useClient: () => Client<PeerMetadata, TrackMetadata>;
|
|
206
222
|
useReconnection: () => UseReconnection;
|
|
207
223
|
useParticipants: () => {
|
|
208
224
|
localParticipant: PeerStateWithTracks<PeerMetadata, TrackMetadata> | null;
|
|
209
225
|
participants: PeerStateWithTracks<PeerMetadata, TrackMetadata>[];
|
|
210
226
|
};
|
|
227
|
+
useScreenShare: () => ScreenshareApi<TrackMetadata>;
|
|
211
228
|
};
|
|
229
|
+
export type TrackType = TrackKind | "audiovideo";
|
|
230
|
+
export type MediaDeviceType = "displayMedia" | "userMedia";
|
|
212
231
|
export {};
|
|
213
232
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSetupMedia.d.ts","sourceRoot":"","sources":["../src/useSetupMedia.
|
|
1
|
+
{"version":3,"file":"useSetupMedia.d.ts","sourceRoot":"","sources":["../src/useSetupMedia.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAK5F,eAAO,MAAM,uBAAuB,GAAI,YAAY,EAAE,aAAa,qBAC9C,MAAM,kBAAkB,CAAC,YAAY,EAAE,aAAa,CAAC,cAQxD,mBAAmB,CAAC,aAAa,CAAC,KAAG,mBAiQtD,CAAC"}
|
package/dist/useSetupMedia.js
CHANGED
|
@@ -3,13 +3,10 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
|
|
|
3
3
|
const isBroadcastedTrackChanged = (client, pending) => client.status === "joined" && !pending && !client.isReconnecting();
|
|
4
4
|
const isBroadcastedTrackStopped = (status, stream) => status === "joined" && stream;
|
|
5
5
|
return (config) => {
|
|
6
|
-
const { state } = useFishjamContext();
|
|
6
|
+
const { state, videoTrackManager, audioTrackManager } = useFishjamContext();
|
|
7
7
|
const configRef = useRef(config);
|
|
8
8
|
useEffect(() => {
|
|
9
9
|
configRef.current = config;
|
|
10
|
-
if (config.screenShare.streamConfig) {
|
|
11
|
-
state.client.setScreenManagerConfig(config.screenShare.streamConfig);
|
|
12
|
-
}
|
|
13
10
|
state.client.setDeviceManagerConfig({
|
|
14
11
|
storage: config.storage,
|
|
15
12
|
});
|
|
@@ -30,10 +27,8 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
|
|
|
30
27
|
let pending = false;
|
|
31
28
|
const broadcastOnCameraStart = async (client) => {
|
|
32
29
|
const config = configRef.current.camera;
|
|
33
|
-
const videoTrackManager = client.videoTrackManager;
|
|
34
30
|
const onDeviceChange = config.onDeviceChange ?? "replace";
|
|
35
|
-
const
|
|
36
|
-
const stream = camera.broadcast?.stream;
|
|
31
|
+
const stream = videoTrackManager.getCurrentTrack()?.stream;
|
|
37
32
|
if (isBroadcastedTrackChanged(client, pending)) {
|
|
38
33
|
if (!stream && config.broadcastOnDeviceStart) {
|
|
39
34
|
pending = true;
|
|
@@ -80,12 +75,10 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
|
|
|
80
75
|
state.client.removeListener("devicesReady", devicesReady);
|
|
81
76
|
state.client.removeListener("deviceReady", deviceReady);
|
|
82
77
|
};
|
|
83
|
-
}, [state.client]);
|
|
78
|
+
}, [state.client, videoTrackManager]);
|
|
84
79
|
useEffect(() => {
|
|
85
80
|
const removeOnCameraStopped = async (event, client) => {
|
|
86
|
-
const
|
|
87
|
-
const videoTrackManager = client.videoTrackManager;
|
|
88
|
-
const stream = camera.broadcast?.stream;
|
|
81
|
+
const stream = videoTrackManager.getCurrentTrack()?.stream;
|
|
89
82
|
const onDeviceStop = configRef.current.camera.onDeviceStop ?? "mute";
|
|
90
83
|
if (event.mediaDeviceType === "userMedia" &&
|
|
91
84
|
event.trackType === "video" &&
|
|
@@ -102,27 +95,25 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
|
|
|
102
95
|
return () => {
|
|
103
96
|
state.client.removeListener("deviceStopped", removeOnCameraStopped);
|
|
104
97
|
};
|
|
105
|
-
}, [state.client]);
|
|
98
|
+
}, [state.client, videoTrackManager]);
|
|
106
99
|
useEffect(() => {
|
|
107
100
|
const broadcastCameraOnConnect = async (_, client) => {
|
|
108
101
|
const camera = client.devices.camera;
|
|
109
102
|
const stream = camera.stream;
|
|
110
103
|
const config = configRef.current.camera;
|
|
111
104
|
if (stream && config.broadcastOnConnect) {
|
|
112
|
-
await
|
|
105
|
+
await videoTrackManager.startStreaming(config.defaultTrackMetadata, config.defaultSimulcastConfig, config.defaultMaxBandwidth);
|
|
113
106
|
}
|
|
114
107
|
};
|
|
115
108
|
state.client.on("joined", broadcastCameraOnConnect);
|
|
116
109
|
return () => {
|
|
117
110
|
state.client.removeListener("joined", broadcastCameraOnConnect);
|
|
118
111
|
};
|
|
119
|
-
}, [state.client]);
|
|
112
|
+
}, [state.client, videoTrackManager]);
|
|
120
113
|
useEffect(() => {
|
|
121
114
|
let pending = false;
|
|
122
115
|
const broadcastOnMicrophoneStart = async (client) => {
|
|
123
|
-
const
|
|
124
|
-
const audioTrackManager = client.audioTrackManager;
|
|
125
|
-
const stream = microphone.broadcast?.stream;
|
|
116
|
+
const stream = audioTrackManager.getCurrentTrack()?.stream;
|
|
126
117
|
const config = configRef.current.microphone;
|
|
127
118
|
const onDeviceChange = config.onDeviceChange ?? "replace";
|
|
128
119
|
if (isBroadcastedTrackChanged(client, pending)) {
|
|
@@ -171,11 +162,10 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
|
|
|
171
162
|
state.client.removeListener("deviceReady", deviceReady);
|
|
172
163
|
state.client.removeListener("devicesReady", devicesReady);
|
|
173
164
|
};
|
|
174
|
-
}, [state.client]);
|
|
165
|
+
}, [state.client, audioTrackManager]);
|
|
175
166
|
useEffect(() => {
|
|
176
167
|
const onMicrophoneStopped = async (event, client) => {
|
|
177
|
-
const
|
|
178
|
-
const stream = client.devices.microphone.broadcast?.stream;
|
|
168
|
+
const stream = audioTrackManager.getCurrentTrack()?.stream;
|
|
179
169
|
const onDeviceStop = configRef.current.microphone.onDeviceStop ?? "mute";
|
|
180
170
|
const isRightDeviceType = event.mediaDeviceType === "userMedia";
|
|
181
171
|
const isRightTrackType = event.trackType === "audio";
|
|
@@ -192,66 +182,20 @@ export const createUseSetupMediaHook = (useFishjamContext) => {
|
|
|
192
182
|
return () => {
|
|
193
183
|
state.client.removeListener("deviceStopped", onMicrophoneStopped);
|
|
194
184
|
};
|
|
195
|
-
}, [state.client]);
|
|
185
|
+
}, [state.client, audioTrackManager]);
|
|
196
186
|
useEffect(() => {
|
|
197
187
|
const broadcastMicrophoneOnConnect = async (_, client) => {
|
|
198
188
|
const config = configRef.current.microphone;
|
|
199
189
|
const microphone = client.devices.microphone;
|
|
200
190
|
if (microphone.stream && config.broadcastOnConnect) {
|
|
201
|
-
await
|
|
191
|
+
await audioTrackManager.startStreaming(config.defaultTrackMetadata, undefined, config.defaultMaxBandwidth);
|
|
202
192
|
}
|
|
203
193
|
};
|
|
204
194
|
state.client.on("joined", broadcastMicrophoneOnConnect);
|
|
205
195
|
return () => {
|
|
206
196
|
state.client.removeListener("joined", broadcastMicrophoneOnConnect);
|
|
207
197
|
};
|
|
208
|
-
}, [state.client]);
|
|
209
|
-
useEffect(() => {
|
|
210
|
-
let pending = false;
|
|
211
|
-
const broadcastOnScreenShareStart = async (event, client) => {
|
|
212
|
-
const screenShare = client.devices.screenShare;
|
|
213
|
-
const stream = screenShare.broadcast?.stream;
|
|
214
|
-
const { broadcastOnDeviceStart, defaultTrackMetadata, defaultMaxBandwidth } = configRef.current.screenShare;
|
|
215
|
-
if (event.mediaDeviceType === "displayMedia" &&
|
|
216
|
-
isBroadcastedTrackChanged(client, pending) &&
|
|
217
|
-
!stream &&
|
|
218
|
-
broadcastOnDeviceStart) {
|
|
219
|
-
pending = true;
|
|
220
|
-
await screenShare.startStreaming(defaultTrackMetadata, defaultMaxBandwidth).finally(() => {
|
|
221
|
-
pending = false;
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
};
|
|
225
|
-
state.client.on("deviceReady", broadcastOnScreenShareStart);
|
|
226
|
-
return () => {
|
|
227
|
-
state.client.removeListener("deviceReady", broadcastOnScreenShareStart);
|
|
228
|
-
};
|
|
229
|
-
}, [state.client]);
|
|
230
|
-
useEffect(() => {
|
|
231
|
-
const onScreenShareStop = async (event, client) => {
|
|
232
|
-
const stream = client.devices.screenShare.broadcast?.stream;
|
|
233
|
-
const isRightDeviceType = event.mediaDeviceType === "displayMedia";
|
|
234
|
-
const isRightTrackType = event.trackType === "video";
|
|
235
|
-
if (isRightDeviceType && isRightTrackType && isBroadcastedTrackStopped(client.status, stream)) {
|
|
236
|
-
await client.devices.screenShare.stopStreaming();
|
|
237
|
-
}
|
|
238
|
-
};
|
|
239
|
-
state.client.on("deviceStopped", onScreenShareStop);
|
|
240
|
-
return () => {
|
|
241
|
-
state.client.removeListener("deviceStopped", onScreenShareStop);
|
|
242
|
-
};
|
|
243
|
-
}, [state.client]);
|
|
244
|
-
useEffect(() => {
|
|
245
|
-
const broadcastScreenShareOnConnect = async (_, client) => {
|
|
246
|
-
if (client.devices.screenShare.stream && configRef.current.screenShare.broadcastOnConnect) {
|
|
247
|
-
await client.devices.screenShare.startStreaming(configRef.current.screenShare.defaultTrackMetadata, configRef.current.screenShare.defaultMaxBandwidth);
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
state.client.on("joined", broadcastScreenShareOnConnect);
|
|
251
|
-
return () => {
|
|
252
|
-
state.client.removeListener("joined", broadcastScreenShareOnConnect);
|
|
253
|
-
};
|
|
254
|
-
}, [state.client]);
|
|
198
|
+
}, [state.client, audioTrackManager]);
|
|
255
199
|
return useMemo(() => ({
|
|
256
200
|
init: () => state.client.initializeDevices({
|
|
257
201
|
audioTrackConstraints: configRef.current?.microphone?.trackConstraints,
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { Track } from "../state.types";
|
|
3
|
+
export declare const getRemoteOrLocalTrack: <PeerMetadata, TrackMetadata>(tsClient: FishjamClient<PeerMetadata, TrackMetadata>, remoteOrLocalTrackId: string | null) => Track<TrackMetadata> | null;
|
|
4
|
+
//# sourceMappingURL=track.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,0BAA0B,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAsC5C,eAAO,MAAM,qBAAqB,GAAI,YAAY,EAAE,aAAa,YACrD,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,wBAC9B,MAAM,GAAG,IAAI,gCAKpC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// In most cases, the track is identified by its remote track ID.
|
|
2
|
+
// This ID comes from the ts-client `addTrack` method.
|
|
3
|
+
// However, we don't have that ID before the `addTrack` method returns it.
|
|
4
|
+
//
|
|
5
|
+
// The `addTrack` method emits the `localTrackAdded` event.
|
|
6
|
+
// This event will refresh the internal state of this object.
|
|
7
|
+
// However, in that event handler, we don't yet have the remote track ID.
|
|
8
|
+
// Therefore, for that brief moment, we will use the local track ID from the MediaStreamTrack object to identify the track.
|
|
9
|
+
const getRemoteOrLocalTrackContext = (tsClient, remoteOrLocalTrackId) => {
|
|
10
|
+
if (!remoteOrLocalTrackId)
|
|
11
|
+
return null;
|
|
12
|
+
const tracks = tsClient?.getLocalPeer()?.tracks;
|
|
13
|
+
if (!tracks)
|
|
14
|
+
return null;
|
|
15
|
+
const trackByRemoteId = tracks?.get(remoteOrLocalTrackId);
|
|
16
|
+
if (trackByRemoteId)
|
|
17
|
+
return trackByRemoteId;
|
|
18
|
+
const trackByLocalId = [...tracks.values()].find((track) => track.track?.id === remoteOrLocalTrackId);
|
|
19
|
+
return trackByLocalId ? trackByLocalId : null;
|
|
20
|
+
};
|
|
21
|
+
const getTrackFromContext = (context) => ({
|
|
22
|
+
rawMetadata: context.rawMetadata,
|
|
23
|
+
metadata: context.metadata,
|
|
24
|
+
trackId: context.trackId,
|
|
25
|
+
stream: context.stream,
|
|
26
|
+
simulcastConfig: context.simulcastConfig || null,
|
|
27
|
+
encoding: context.encoding || null,
|
|
28
|
+
vadStatus: context.vadStatus,
|
|
29
|
+
track: context.track,
|
|
30
|
+
metadataParsingError: context.metadataParsingError,
|
|
31
|
+
});
|
|
32
|
+
export const getRemoteOrLocalTrack = (tsClient, remoteOrLocalTrackId) => {
|
|
33
|
+
const context = getRemoteOrLocalTrackContext(tsClient, remoteOrLocalTrackId);
|
|
34
|
+
if (!context)
|
|
35
|
+
return null;
|
|
36
|
+
return getTrackFromContext(context);
|
|
37
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-client",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "React client library for Fishjam Cloud",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fishjam Cloud Team",
|
|
@@ -42,19 +42,19 @@
|
|
|
42
42
|
"typecheck": "tsc"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@playwright/test": "^1.
|
|
45
|
+
"@playwright/test": "^1.46.1",
|
|
46
46
|
"@types/events": "^3.0.3",
|
|
47
47
|
"@types/lodash.isequal": "^4.5.8",
|
|
48
|
-
"@types/node": "^22.
|
|
48
|
+
"@types/node": "^22.4.1",
|
|
49
49
|
"@types/react": "^18.2.55",
|
|
50
50
|
"react": "^18.2.0",
|
|
51
51
|
"typed-emitter": "^2.1.0",
|
|
52
|
-
"typedoc": "^0.26.
|
|
53
|
-
"typedoc-plugin-mdn-links": "^3.2.
|
|
52
|
+
"typedoc": "^0.26.6",
|
|
53
|
+
"typedoc-plugin-mdn-links": "^3.2.9",
|
|
54
54
|
"typescript": "^5.5.4"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@fishjam-cloud/ts-client": "0.5.
|
|
57
|
+
"@fishjam-cloud/ts-client": "0.5.2",
|
|
58
58
|
"events": "3.3.0",
|
|
59
59
|
"lodash.isequal": "4.5.0"
|
|
60
60
|
},
|