@fishjam-cloud/react-client 0.7.0 → 0.7.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/DeviceManager.d.ts +33 -17
- package/dist/DeviceManager.d.ts.map +1 -1
- package/dist/DeviceManager.js +126 -97
- package/dist/constraints.d.ts +2 -3
- package/dist/constraints.d.ts.map +1 -1
- package/dist/constraints.js +9 -10
- package/dist/devices/MiddlewareManager.d.ts +9 -0
- package/dist/devices/MiddlewareManager.d.ts.map +1 -0
- package/dist/devices/MiddlewareManager.js +26 -0
- package/dist/fishjamProvider.d.ts +8 -6
- package/dist/fishjamProvider.d.ts.map +1 -1
- package/dist/fishjamProvider.js +27 -11
- package/dist/hooks/deviceManagers/useDeviceManager.d.ts +1 -1
- package/dist/hooks/deviceManagers/useDeviceManager.d.ts.map +1 -1
- package/dist/hooks/deviceManagers/useDeviceManager.js +2 -2
- package/dist/hooks/{useDevices.d.ts → devices.d.ts} +14 -2
- package/dist/hooks/devices.d.ts.map +1 -0
- package/dist/hooks/{useDevices.js → devices.js} +29 -15
- package/dist/hooks/public.d.ts +2 -4
- package/dist/hooks/public.d.ts.map +1 -1
- package/dist/hooks/public.js +2 -4
- package/dist/hooks/useConnection.d.ts +10 -2
- package/dist/hooks/useConnection.d.ts.map +1 -1
- package/dist/hooks/useConnection.js +8 -0
- package/dist/hooks/useFishjamClientState.d.ts +1 -2
- package/dist/hooks/useFishjamClientState.d.ts.map +1 -1
- package/dist/hooks/useFishjamClientState.js +0 -4
- package/dist/hooks/useFishjamClient_DO_NOT_USE.d.ts +6 -1
- package/dist/hooks/useFishjamClient_DO_NOT_USE.d.ts.map +1 -1
- package/dist/hooks/useFishjamClient_DO_NOT_USE.js +5 -0
- package/dist/hooks/useFishjamContext.d.ts +4 -4
- package/dist/hooks/useFishjamContext.d.ts.map +1 -1
- package/dist/hooks/usePeerStatus.d.ts +8 -0
- package/dist/hooks/usePeerStatus.d.ts.map +1 -0
- package/dist/hooks/{useParticipantStatus.js → usePeerStatus.js} +12 -12
- package/dist/hooks/usePeers.d.ts +10 -0
- package/dist/hooks/usePeers.d.ts.map +1 -0
- package/dist/hooks/{useParticipants.js → usePeers.js} +8 -5
- package/dist/hooks/useReconnection.d.ts +4 -0
- package/dist/hooks/useReconnection.d.ts.map +1 -1
- package/dist/hooks/useReconnection.js +4 -0
- package/dist/hooks/useScreenShare.d.ts +13 -1
- package/dist/hooks/useScreenShare.d.ts.map +1 -1
- package/dist/hooks/useScreenShare.js +34 -31
- package/dist/hooks/useStatus.d.ts +5 -1
- package/dist/hooks/useStatus.d.ts.map +1 -1
- package/dist/hooks/useStatus.js +4 -0
- package/dist/hooks/useTrackManager.d.ts +4 -4
- package/dist/hooks/useTrackManager.d.ts.map +1 -1
- package/dist/hooks/useTrackManager.js +32 -47
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/mediaInitializer.d.ts +2 -2
- package/dist/mediaInitializer.d.ts.map +1 -1
- package/dist/mediaInitializer.js +30 -1
- package/dist/types/internal.d.ts +119 -0
- package/dist/types/internal.d.ts.map +1 -0
- package/dist/types/public.d.ts +65 -0
- package/dist/types/public.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/localStorage.d.ts +3 -4
- package/dist/utils/localStorage.d.ts.map +1 -1
- package/dist/utils/localStorage.js +18 -4
- package/dist/utils/track.d.ts +3 -2
- package/dist/utils/track.d.ts.map +1 -1
- package/dist/utils/track.js +8 -2
- package/package.json +7 -7
- package/readme.md +20 -118
- package/dist/hooks/deviceManagers/useAudioDeviceManager.d.ts +0 -2
- package/dist/hooks/deviceManagers/useAudioDeviceManager.d.ts.map +0 -1
- package/dist/hooks/deviceManagers/useAudioDeviceManager.js +0 -7
- package/dist/hooks/deviceManagers/useVideoDeviceManager.d.ts +0 -2
- package/dist/hooks/deviceManagers/useVideoDeviceManager.d.ts.map +0 -1
- package/dist/hooks/deviceManagers/useVideoDeviceManager.js +0 -7
- package/dist/hooks/useDevices.d.ts.map +0 -1
- package/dist/hooks/useParticipantStatus.d.ts +0 -8
- package/dist/hooks/useParticipantStatus.d.ts.map +0 -1
- package/dist/hooks/useParticipants.d.ts +0 -6
- package/dist/hooks/useParticipants.d.ts.map +0 -1
- package/dist/hooks/useProcessedPreviewStream.d.ts +0 -3
- package/dist/hooks/useProcessedPreviewStream.d.ts.map +0 -1
- package/dist/hooks/useProcessedPreviewStream.js +0 -17
- package/dist/state.types.d.ts +0 -42
- package/dist/state.types.d.ts.map +0 -1
- package/dist/types.d.ts +0 -255
- package/dist/types.d.ts.map +0 -1
- package/dist/utils/media.d.ts +0 -12
- package/dist/utils/media.d.ts.map +0 -1
- package/dist/utils/media.js +0 -64
- /package/dist/{state.types.js → types/internal.js} +0 -0
- /package/dist/{types.js → types/public.js} +0 -0
|
@@ -1,49 +1,28 @@
|
|
|
1
1
|
import { getRemoteOrLocalTrack } from "../utils/track";
|
|
2
|
-
import { useCallback, useEffect, useMemo,
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
3
|
const TRACK_TYPE_TO_DEVICE = {
|
|
4
4
|
video: "camera",
|
|
5
5
|
audio: "microphone",
|
|
6
6
|
};
|
|
7
|
-
export const useTrackManager = ({ mediaManager, tsClient,
|
|
7
|
+
export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus }) => {
|
|
8
8
|
const [currentTrackId, setCurrentTrackId] = useState(null);
|
|
9
9
|
const [paused, setPaused] = useState(false);
|
|
10
|
-
const clearMiddlewareFnRef = useRef(null);
|
|
11
|
-
const [currentTrackMiddleware, setCurrentTrackMiddleware] = useState(null);
|
|
12
10
|
const type = TRACK_TYPE_TO_DEVICE[mediaManager.getDeviceType()];
|
|
13
11
|
const metadata = useMemo(() => ({ type, paused }), [type, paused]);
|
|
14
12
|
const currentTrack = useMemo(() => getRemoteOrLocalTrack(tsClient, currentTrackId), [tsClient, currentTrackId]);
|
|
15
|
-
function clearMiddleware() {
|
|
16
|
-
clearMiddlewareFnRef.current?.();
|
|
17
|
-
clearMiddlewareFnRef.current = null;
|
|
18
|
-
}
|
|
19
|
-
const clearAndGetProcessedTrack = useCallback((inputTrack) => {
|
|
20
|
-
clearMiddleware();
|
|
21
|
-
const { onClear, track } = currentTrackMiddleware?.(inputTrack) ?? {};
|
|
22
|
-
if (onClear)
|
|
23
|
-
clearMiddlewareFnRef.current = onClear;
|
|
24
|
-
return track ?? inputTrack;
|
|
25
|
-
}, [currentTrackMiddleware]);
|
|
26
13
|
async function setTrackMiddleware(middleware) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!currentTrack || !mediaTrack)
|
|
30
|
-
return;
|
|
31
|
-
clearMiddleware();
|
|
32
|
-
const { onClear, track } = middleware?.(mediaTrack) ?? { track: mediaTrack };
|
|
33
|
-
if (onClear)
|
|
34
|
-
clearMiddlewareFnRef.current = onClear;
|
|
35
|
-
await tsClient.replaceTrack(currentTrack.trackId, track);
|
|
14
|
+
mediaManager.setTrackMiddleware(middleware);
|
|
15
|
+
await refreshStreamedTrack();
|
|
36
16
|
}
|
|
37
17
|
async function initialize(deviceId) {
|
|
38
18
|
await mediaManager?.start(deviceId);
|
|
39
19
|
if (!currentTrackId)
|
|
40
20
|
return;
|
|
41
|
-
const newTrack = mediaManager.
|
|
42
|
-
await tsClient.replaceTrack(currentTrackId,
|
|
21
|
+
const newTrack = mediaManager.getMedia()?.track ?? null;
|
|
22
|
+
await tsClient.replaceTrack(currentTrackId, newTrack);
|
|
43
23
|
}
|
|
44
24
|
function stop() {
|
|
45
|
-
|
|
46
|
-
return mediaManager?.stop();
|
|
25
|
+
return mediaManager.stop();
|
|
47
26
|
}
|
|
48
27
|
const startStreaming = useCallback(async (simulcastConfig, maxBandwidth) => {
|
|
49
28
|
if (currentTrackId)
|
|
@@ -56,26 +35,24 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
56
35
|
return track.trackId;
|
|
57
36
|
// see `getRemoteOrLocalTrackContext()` explanation
|
|
58
37
|
setCurrentTrackId(media.track.id);
|
|
59
|
-
const displayName = tsClient.getLocalPeer()?.metadata?.displayName;
|
|
38
|
+
const displayName = tsClient.getLocalPeer()?.metadata?.peer?.displayName;
|
|
60
39
|
const trackMetadata = { ...metadata, displayName, paused: false };
|
|
61
|
-
const
|
|
62
|
-
const remoteTrackId = await tsClient.addTrack(processedTrack, trackMetadata, simulcastConfig, maxBandwidth);
|
|
40
|
+
const remoteTrackId = await tsClient.addTrack(media.track, trackMetadata, simulcastConfig, maxBandwidth);
|
|
63
41
|
setCurrentTrackId(remoteTrackId);
|
|
64
42
|
setPaused(false);
|
|
65
43
|
return remoteTrackId;
|
|
66
|
-
}, [
|
|
44
|
+
}, [currentTrackId, mediaManager, metadata, tsClient]);
|
|
67
45
|
async function refreshStreamedTrack() {
|
|
68
46
|
if (!currentTrack)
|
|
69
47
|
return;
|
|
70
|
-
const newTrack = mediaManager.
|
|
48
|
+
const newTrack = mediaManager.getMedia()?.track ?? null;
|
|
71
49
|
if (!newTrack)
|
|
72
50
|
throw Error("New track is empty");
|
|
73
|
-
return tsClient.replaceTrack(currentTrack.trackId,
|
|
51
|
+
return tsClient.replaceTrack(currentTrack.trackId, newTrack);
|
|
74
52
|
}
|
|
75
53
|
async function stopStreaming() {
|
|
76
54
|
if (!currentTrack)
|
|
77
55
|
return;
|
|
78
|
-
clearMiddleware();
|
|
79
56
|
setCurrentTrackId(null);
|
|
80
57
|
setPaused(true);
|
|
81
58
|
return tsClient.removeTrack(currentTrack.trackId);
|
|
@@ -94,9 +71,8 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
94
71
|
const media = mediaManager.getMedia();
|
|
95
72
|
if (!media)
|
|
96
73
|
throw Error("Device is unavailable");
|
|
97
|
-
const processedTrack = media.track ? clearAndGetProcessedTrack(media.track) : null;
|
|
98
74
|
setPaused(false);
|
|
99
|
-
await tsClient.replaceTrack(currentTrack.trackId,
|
|
75
|
+
await tsClient.replaceTrack(currentTrack.trackId, media.track);
|
|
100
76
|
const trackMetadata = { ...metadata, paused: false };
|
|
101
77
|
return tsClient.updateTrackMetadata(currentTrack.trackId, trackMetadata);
|
|
102
78
|
}
|
|
@@ -107,7 +83,7 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
107
83
|
mediaManager.enable();
|
|
108
84
|
}
|
|
109
85
|
const stream = async () => {
|
|
110
|
-
if (
|
|
86
|
+
if (getCurrentPeerStatus() !== "connected")
|
|
111
87
|
return;
|
|
112
88
|
if (currentTrack?.trackId) {
|
|
113
89
|
await resumeStreaming();
|
|
@@ -116,12 +92,9 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
116
92
|
await startStreaming();
|
|
117
93
|
}
|
|
118
94
|
};
|
|
119
|
-
|
|
120
|
-
* @see {@link TrackManager#toggle} for more details.
|
|
121
|
-
*/
|
|
122
|
-
async function toggle(mode = "hard") {
|
|
95
|
+
async function toggle(mode) {
|
|
123
96
|
const mediaStream = mediaManager.getMedia()?.stream;
|
|
124
|
-
const track = mediaManager.
|
|
97
|
+
const track = mediaManager.getMedia()?.track ?? null;
|
|
125
98
|
const enabled = Boolean(track?.enabled);
|
|
126
99
|
if (mediaStream && enabled) {
|
|
127
100
|
mediaManager.disable();
|
|
@@ -129,7 +102,7 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
129
102
|
await pauseStreaming();
|
|
130
103
|
}
|
|
131
104
|
if (mode === "hard") {
|
|
132
|
-
|
|
105
|
+
mediaManager.stop();
|
|
133
106
|
}
|
|
134
107
|
}
|
|
135
108
|
else if (mediaStream && !enabled) {
|
|
@@ -141,9 +114,21 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
141
114
|
await stream();
|
|
142
115
|
}
|
|
143
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* @see {@link TrackManager#toggleMute} for more details.
|
|
119
|
+
*/
|
|
120
|
+
async function toggleMute() {
|
|
121
|
+
await toggle("soft");
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* @see {@link TrackManager#toggleDevice} for more details.
|
|
125
|
+
*/
|
|
126
|
+
async function toggleDevice() {
|
|
127
|
+
await toggle("hard");
|
|
128
|
+
}
|
|
144
129
|
useEffect(() => {
|
|
145
130
|
const joinedHandler = () => {
|
|
146
|
-
if (mediaManager.
|
|
131
|
+
if (mediaManager.getMedia()?.track) {
|
|
147
132
|
startStreaming();
|
|
148
133
|
}
|
|
149
134
|
};
|
|
@@ -168,9 +153,9 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentParticipantS
|
|
|
168
153
|
resumeStreaming,
|
|
169
154
|
disableTrack,
|
|
170
155
|
enableTrack,
|
|
171
|
-
currentTrackMiddleware,
|
|
172
156
|
refreshStreamedTrack,
|
|
173
157
|
paused,
|
|
174
|
-
|
|
158
|
+
toggleMute,
|
|
159
|
+
toggleDevice,
|
|
175
160
|
};
|
|
176
161
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export type { DeviceManagerConfig, Participiants, StorageConfig, Devices, Device, AudioDevice, UseSetupMediaResult, UseSetupMediaConfig, ScreenshareApi, UseConnect, ConnectConfig, TrackMiddleware, PeerStateWithTracks, TrackMetadata, // only for compatibility reasons, will be removed in: FCE-415
|
|
5
|
-
PeerMetadata, } from "./types";
|
|
1
|
+
export { useConnect, useDisconnect, useReconnection, useCamera, useMicrophone, useInitializeDevices, usePeers, useScreenShare, useStatus, } from "./hooks/public";
|
|
2
|
+
export { FishjamProvider } from "./fishjamProvider";
|
|
3
|
+
export { Track, TrackMiddleware, TracksMiddleware, PeerStatus, Device, AudioDevice, PeerWithTracks, ConnectConfig, PersistLastDeviceHandlers, ScreenshareApi, } from "./types/public";
|
|
6
4
|
export { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS, SCREEN_SHARING_MEDIA_CONSTRAINTS } from "./constraints";
|
|
7
5
|
export type { Peer, MessageEvents, CreateConfig, TrackBandwidthLimit, SimulcastBandwidthLimit, BandwidthLimit, WebRTCEndpointEvents, TrackContextEvents, Endpoint, SimulcastConfig, TrackContext, VadStatus, EncodingReason, MetadataParser, AuthErrorReason, Encoding, } from "@fishjam-cloud/ts-client";
|
|
8
|
-
export { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
9
6
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EACL,KAAK,EACL,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,MAAM,EACN,WAAW,EACX,cAAc,EACd,aAAa,EACb,yBAAyB,EACzB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,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,eAAe,EACf,QAAQ,GACT,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export { useConnect, useDisconnect, useReconnection, useCamera, useMicrophone, useInitializeDevices, usePeers, useScreenShare, useStatus, } from "./hooks/public";
|
|
2
|
+
export { FishjamProvider } from "./fishjamProvider";
|
|
3
3
|
export { AUDIO_TRACK_CONSTRAINTS, VIDEO_TRACK_CONSTRAINTS, SCREEN_SHARING_MEDIA_CONSTRAINTS } from "./constraints";
|
|
4
|
-
export { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { DeviceError } from "./types";
|
|
1
|
+
import type { DeviceError } from "./types/internal";
|
|
2
2
|
type AudioVideo<T> = {
|
|
3
3
|
audio: T;
|
|
4
4
|
video: T;
|
|
5
5
|
};
|
|
6
|
-
type MediaConstraints = AudioVideo<MediaTrackConstraints | undefined>;
|
|
6
|
+
type MediaConstraints = AudioVideo<MediaTrackConstraints | undefined | boolean>;
|
|
7
7
|
type PreviousDevices = AudioVideo<MediaDeviceInfo | null>;
|
|
8
8
|
export declare const getAvailableMedia: (constraints: MediaStreamConstraints, deviceErrors?: AudioVideo<DeviceError | null>) => Promise<[MediaStream | null, AudioVideo<DeviceError | null>]>;
|
|
9
9
|
export declare const getCorrectedResult: (stream: MediaStream, deviceErrors: AudioVideo<DeviceError | null>, devices: MediaDeviceInfo[], constraints: MediaConstraints, previousDevices: PreviousDevices) => Promise<[MediaStream | null, AudioVideo<DeviceError | null>]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaInitializer.d.ts","sourceRoot":"","sources":["../src/mediaInitializer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mediaInitializer.d.ts","sourceRoot":"","sources":["../src/mediaInitializer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGpE,KAAK,UAAU,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE5C,KAAK,gBAAgB,GAAG,UAAU,CAAC,qBAAqB,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;AAEhF,KAAK,eAAe,GAAG,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAsB1D,eAAO,MAAM,iBAAiB,gBACf,sBAAsB,iBACrB,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,KAC3C,OAAO,CAAC,CAAC,WAAW,GAAG,IAAI,EAAE,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAuB9D,CAAC;AAIF,eAAO,MAAM,kBAAkB,WACrB,WAAW,gBACL,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,WACnC,eAAe,EAAE,eACb,gBAAgB,mBACZ,eAAe,KAC/B,OAAO,CAAC,CAAC,WAAW,GAAG,IAAI,EAAE,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAsB9D,CAAC"}
|
package/dist/mediaInitializer.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { prepareConstraints } from "./constraints";
|
|
2
2
|
import { NOT_FOUND_ERROR, OVERCONSTRAINED_ERROR, PERMISSION_DENIED, UNHANDLED_ERROR } from "./utils/errors";
|
|
3
|
-
import { getCurrentDevicesSettings, stopTracks, isAnyDeviceDifferentFromLastSession, removeSpecifiedDeviceFromConstraints, } from "./utils/media";
|
|
4
3
|
const defaultErrors = { audio: null, video: null };
|
|
5
4
|
const tryToGetAudioOnlyThenVideoOnly = async (constraints, deviceErrors = defaultErrors, transformConstraint = () => false) => {
|
|
6
5
|
const audioOnly = await getAvailableMedia({ ...constraints, video: transformConstraint(constraints.video) }, { ...deviceErrors, audio: null });
|
|
@@ -46,3 +45,33 @@ export const getCorrectedResult = async (stream, deviceErrors, devices, constrai
|
|
|
46
45
|
};
|
|
47
46
|
return await getAvailableMedia(exactConstraints, deviceErrors);
|
|
48
47
|
};
|
|
48
|
+
const getCurrentDevicesSettings = (requestedDevices, mediaDeviceInfos) => {
|
|
49
|
+
const currentDevices = { videoinput: null, audioinput: null };
|
|
50
|
+
for (const track of requestedDevices.getTracks()) {
|
|
51
|
+
const settings = track.getSettings();
|
|
52
|
+
if (settings.deviceId) {
|
|
53
|
+
const currentDevice = mediaDeviceInfos.find((device) => device.deviceId == settings.deviceId);
|
|
54
|
+
const kind = currentDevice?.kind ?? null;
|
|
55
|
+
if ((currentDevice && kind === "videoinput") || kind === "audioinput") {
|
|
56
|
+
currentDevices[kind] = currentDevice ?? null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return currentDevices;
|
|
61
|
+
};
|
|
62
|
+
const isDeviceDifferentFromLastSession = (lastDevice, currentDevice) => lastDevice && (currentDevice?.deviceId !== lastDevice.deviceId || currentDevice?.label !== lastDevice?.label);
|
|
63
|
+
const isAnyDeviceDifferentFromLastSession = (lastVideoDevice, lastAudioDevice, currentDevices) => !!((currentDevices?.videoinput &&
|
|
64
|
+
isDeviceDifferentFromLastSession(lastVideoDevice, currentDevices?.videoinput || null)) ||
|
|
65
|
+
(currentDevices?.audioinput &&
|
|
66
|
+
isDeviceDifferentFromLastSession(lastAudioDevice, currentDevices?.audioinput || null)));
|
|
67
|
+
const stopTracks = (requestedDevices) => {
|
|
68
|
+
for (const track of requestedDevices.getTracks()) {
|
|
69
|
+
track.stop();
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
const removeSpecifiedDeviceFromConstraints = (trackConstraints) => {
|
|
73
|
+
if (typeof trackConstraints === "object") {
|
|
74
|
+
return { ...trackConstraints, deviceId: undefined };
|
|
75
|
+
}
|
|
76
|
+
return trackConstraints;
|
|
77
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { SimulcastConfig, TrackBandwidthLimit } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { Track, TrackMiddleware, TracksMiddleware } from "./public";
|
|
3
|
+
import type { DeviceType } from "../DeviceManager";
|
|
4
|
+
export type TrackId = string;
|
|
5
|
+
export type PeerId = string;
|
|
6
|
+
export type PeerState = {
|
|
7
|
+
id: PeerId;
|
|
8
|
+
metadata: {
|
|
9
|
+
peer?: PeerMetadata;
|
|
10
|
+
server: Record<string, unknown>;
|
|
11
|
+
};
|
|
12
|
+
tracks: Record<TrackId, Track>;
|
|
13
|
+
};
|
|
14
|
+
export type PeerMetadata = {
|
|
15
|
+
displayName?: string;
|
|
16
|
+
};
|
|
17
|
+
export type TrackMetadata = {
|
|
18
|
+
type: "camera" | "microphone" | "screenShareVideo" | "screenShareAudio";
|
|
19
|
+
paused: boolean;
|
|
20
|
+
displayName?: string;
|
|
21
|
+
};
|
|
22
|
+
export type DevicesStatus = "OK" | "Error" | "Not requested" | "Requesting";
|
|
23
|
+
export type MediaStatus = "OK" | "Error" | "Not requested" | "Requesting";
|
|
24
|
+
export type DeviceManagerStatus = "uninitialized" | "initializing" | "initialized" | "error";
|
|
25
|
+
export interface DeviceManagerState {
|
|
26
|
+
deviceState: DeviceState;
|
|
27
|
+
status: DeviceManagerStatus;
|
|
28
|
+
}
|
|
29
|
+
export type Media = {
|
|
30
|
+
stream: MediaStream | null;
|
|
31
|
+
track: MediaStreamTrack | null;
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
deviceInfo: MediaDeviceInfo | null;
|
|
34
|
+
};
|
|
35
|
+
export type DeviceState = {
|
|
36
|
+
media: Media | null;
|
|
37
|
+
mediaStatus: MediaStatus;
|
|
38
|
+
devices: MediaDeviceInfo[] | null;
|
|
39
|
+
devicesStatus: DevicesStatus;
|
|
40
|
+
error: DeviceError | null;
|
|
41
|
+
currentMiddleware: TrackMiddleware | null;
|
|
42
|
+
};
|
|
43
|
+
export type DeviceError = {
|
|
44
|
+
name: "OverconstrainedError";
|
|
45
|
+
} | {
|
|
46
|
+
name: "NotAllowedError";
|
|
47
|
+
} | {
|
|
48
|
+
name: "NotFoundError";
|
|
49
|
+
} | {
|
|
50
|
+
name: "UNHANDLED_ERROR";
|
|
51
|
+
};
|
|
52
|
+
export type CurrentDevices = {
|
|
53
|
+
videoinput: MediaDeviceInfo | null;
|
|
54
|
+
audioinput: MediaDeviceInfo | null;
|
|
55
|
+
};
|
|
56
|
+
export interface MediaManager {
|
|
57
|
+
start: (deviceId?: string) => Promise<void>;
|
|
58
|
+
stop: () => void;
|
|
59
|
+
disable: () => void;
|
|
60
|
+
enable: () => void;
|
|
61
|
+
setTrackMiddleware: (middleware: TrackMiddleware | null) => void;
|
|
62
|
+
getMiddleware: () => TrackMiddleware | null;
|
|
63
|
+
getMedia: () => {
|
|
64
|
+
stream: MediaStream | null;
|
|
65
|
+
track: MediaStreamTrack | null;
|
|
66
|
+
enabled: boolean;
|
|
67
|
+
} | null;
|
|
68
|
+
getDeviceType: () => DeviceType;
|
|
69
|
+
}
|
|
70
|
+
export type ScreenShareState = ({
|
|
71
|
+
stream: MediaStream;
|
|
72
|
+
trackIds: {
|
|
73
|
+
videoId: string;
|
|
74
|
+
audioId?: string;
|
|
75
|
+
};
|
|
76
|
+
} | {
|
|
77
|
+
stream: null;
|
|
78
|
+
trackIds: null;
|
|
79
|
+
}) & {
|
|
80
|
+
tracksMiddleware?: TracksMiddleware | null;
|
|
81
|
+
};
|
|
82
|
+
export interface TrackManager {
|
|
83
|
+
initialize: (deviceId?: string) => Promise<void>;
|
|
84
|
+
stop: () => void;
|
|
85
|
+
startStreaming: (simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
|
|
86
|
+
stopStreaming: () => Promise<void>;
|
|
87
|
+
pauseStreaming: () => Promise<void>;
|
|
88
|
+
resumeStreaming: () => Promise<void>;
|
|
89
|
+
paused: boolean;
|
|
90
|
+
disableTrack: () => void;
|
|
91
|
+
enableTrack: () => void;
|
|
92
|
+
setTrackMiddleware: (middleware: TrackMiddleware | null) => Promise<void>;
|
|
93
|
+
refreshStreamedTrack: () => Promise<void>;
|
|
94
|
+
currentTrack: Track | null;
|
|
95
|
+
/**
|
|
96
|
+
* Either enables or disables the stream.
|
|
97
|
+
*
|
|
98
|
+
* - **Soft Mode** - Enables and disables the media stream. Starts the device if needed.
|
|
99
|
+
* - If enabled: disables the media stream and pauses streaming, but does not stop the device.
|
|
100
|
+
* - If disabled: enables the media stream and starts (or resumes) streaming.
|
|
101
|
+
* - If stopped: starts the device, enables the media stream, and starts (or resumes) streaming.
|
|
102
|
+
*/
|
|
103
|
+
toggleMute: () => Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Either initiates or terminates the device.
|
|
106
|
+
*
|
|
107
|
+
* - **Hard Mode** - Turns the physical device on and off.
|
|
108
|
+
* - If started: disables the media stream, pauses streaming, and stops the device.
|
|
109
|
+
* - If stopped: starts the device and begins (or resumes) streaming.
|
|
110
|
+
*/
|
|
111
|
+
toggleDevice: () => Promise<void>;
|
|
112
|
+
}
|
|
113
|
+
export type DistinguishedTracks = {
|
|
114
|
+
cameraTrack?: Track;
|
|
115
|
+
microphoneTrack?: Track;
|
|
116
|
+
screenShareVideoTrack?: Track;
|
|
117
|
+
screenShareAudioTrack?: Track;
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Encoding, SimulcastConfig, ConnectConfig as TSClientConnectConfig, VadStatus } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import type { DeviceManagerStatus, DistinguishedTracks, PeerMetadata, PeerState, TrackId, TrackManager, TrackMetadata } from "./internal";
|
|
3
|
+
export type Track = {
|
|
4
|
+
stream: MediaStream | null;
|
|
5
|
+
encoding: Encoding | null;
|
|
6
|
+
trackId: TrackId;
|
|
7
|
+
metadata?: TrackMetadata;
|
|
8
|
+
simulcastConfig: SimulcastConfig | null;
|
|
9
|
+
vadStatus: VadStatus;
|
|
10
|
+
track: MediaStreamTrack | null;
|
|
11
|
+
};
|
|
12
|
+
export type TrackMiddleware = ((track: MediaStreamTrack) => {
|
|
13
|
+
track: MediaStreamTrack;
|
|
14
|
+
onClear?: () => void;
|
|
15
|
+
}) | null;
|
|
16
|
+
export type TracksMiddleware = (videoTrack: MediaStreamTrack, audioTrack: MediaStreamTrack | null) => {
|
|
17
|
+
videoTrack: MediaStreamTrack;
|
|
18
|
+
audioTrack: MediaStreamTrack | null;
|
|
19
|
+
onClear: () => void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Represents the possible statuses of a peer connection.
|
|
23
|
+
*
|
|
24
|
+
* idle - Peer is not connected, either never connected or successfully disconnected.
|
|
25
|
+
* connecting - Peer is in the process of connecting.
|
|
26
|
+
* connected - Peer has successfully connected.
|
|
27
|
+
* error - There was an error in the connection process.
|
|
28
|
+
*/
|
|
29
|
+
export type PeerStatus = "connecting" | "connected" | "error" | "idle";
|
|
30
|
+
export type Device = {
|
|
31
|
+
isStreaming: boolean;
|
|
32
|
+
status: DeviceManagerStatus;
|
|
33
|
+
trackId: TrackId | null;
|
|
34
|
+
track: MediaStreamTrack | null;
|
|
35
|
+
stream: MediaStream | null;
|
|
36
|
+
devices: MediaDeviceInfo[];
|
|
37
|
+
activeDevice: MediaDeviceInfo | null;
|
|
38
|
+
currentMiddleware: TrackMiddleware;
|
|
39
|
+
} & Omit<TrackManager, "currentTrack">;
|
|
40
|
+
export type AudioDevice = Device & {
|
|
41
|
+
isAudioPlaying: boolean;
|
|
42
|
+
};
|
|
43
|
+
export type PeerWithTracks = PeerState & DistinguishedTracks;
|
|
44
|
+
export type ConnectConfig = Omit<TSClientConnectConfig<PeerMetadata>, "peerMetadata"> & {
|
|
45
|
+
peerMetadata?: PeerMetadata;
|
|
46
|
+
};
|
|
47
|
+
export type PersistLastDeviceHandlers = {
|
|
48
|
+
getLastDevice: () => MediaDeviceInfo | null;
|
|
49
|
+
saveLastDevice: (info: MediaDeviceInfo) => void;
|
|
50
|
+
};
|
|
51
|
+
export type ScreenshareApi = {
|
|
52
|
+
startStreaming: (props?: {
|
|
53
|
+
audioConstraints?: boolean | MediaTrackConstraints;
|
|
54
|
+
videoConstraints?: boolean | MediaTrackConstraints;
|
|
55
|
+
}) => Promise<void>;
|
|
56
|
+
stopStreaming: () => Promise<void>;
|
|
57
|
+
stream: MediaStream | null;
|
|
58
|
+
videoTrack: MediaStreamTrack | null;
|
|
59
|
+
audioTrack: MediaStreamTrack | null;
|
|
60
|
+
videoBroadcast: Track | null;
|
|
61
|
+
audioBroadcast: Track | null;
|
|
62
|
+
setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
|
|
63
|
+
currentTracksMiddleware: TracksMiddleware | null;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=public.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,eAAO,MAAM,iBAAiB,EAAE,WAAyC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,EAAE,WAA8C,CAAC;AACnF,eAAO,MAAM,eAAe,EAAE,WAAuC,CAAC;AACtE,eAAO,MAAM,eAAe,EAAE,WAAyC,CAAC;AAIxE,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,WAAW,GAAG,IAelE,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export declare
|
|
4
|
-
export declare const saveString: (key: string, value: string) => void;
|
|
1
|
+
import type { PersistLastDeviceHandlers } from "../types/public";
|
|
2
|
+
import type { DeviceType } from "../DeviceManager";
|
|
3
|
+
export declare function createStorageConfig(deviceType: DeviceType, storage?: boolean | PersistLastDeviceHandlers): PersistLastDeviceHandlers | null;
|
|
5
4
|
//# sourceMappingURL=localStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,OAAO,GAAG,yBAAyB,GAC5C,yBAAyB,GAAG,IAAI,CAIlC"}
|
|
@@ -1,21 +1,35 @@
|
|
|
1
|
-
export
|
|
1
|
+
export function createStorageConfig(deviceType, storage) {
|
|
2
|
+
if (storage === false)
|
|
3
|
+
return null;
|
|
4
|
+
if (storage === true || storage === undefined)
|
|
5
|
+
return getLocalStorageConfig(deviceType);
|
|
6
|
+
return storage;
|
|
7
|
+
}
|
|
8
|
+
const getLocalStorageConfig = (deviceType) => {
|
|
9
|
+
const key = `last-selected-${deviceType}-device`;
|
|
10
|
+
return {
|
|
11
|
+
getLastDevice: () => loadObject(key, null),
|
|
12
|
+
saveLastDevice: (info) => saveObject(key, info),
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
const loadObject = (key, defaultValue) => {
|
|
2
16
|
const stringValue = loadString(key, "");
|
|
3
17
|
if (stringValue === "") {
|
|
4
18
|
return defaultValue;
|
|
5
19
|
}
|
|
6
20
|
return JSON.parse(stringValue);
|
|
7
21
|
};
|
|
8
|
-
|
|
22
|
+
const loadString = (key, defaultValue = "") => {
|
|
9
23
|
const value = localStorage.getItem(key);
|
|
10
24
|
if (value === null || value === undefined) {
|
|
11
25
|
return defaultValue;
|
|
12
26
|
}
|
|
13
27
|
return value;
|
|
14
28
|
};
|
|
15
|
-
|
|
29
|
+
const saveObject = (key, value) => {
|
|
16
30
|
const stringValue = JSON.stringify(value);
|
|
17
31
|
saveString(key, stringValue);
|
|
18
32
|
};
|
|
19
|
-
|
|
33
|
+
const saveString = (key, value) => {
|
|
20
34
|
localStorage.setItem(key, value);
|
|
21
35
|
};
|
package/dist/utils/track.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { FishjamClient } from "@fishjam-cloud/ts-client";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
2
|
+
import type { PeerMetadata, TrackMetadata } from "../types/internal";
|
|
3
|
+
import type { Track } from "../types/public";
|
|
4
4
|
export declare const getRemoteOrLocalTrack: (tsClient: FishjamClient<PeerMetadata, TrackMetadata>, remoteOrLocalTrackId: string | null) => Track | null;
|
|
5
|
+
export declare function setupOnEndedCallback(track: MediaStreamTrack, getCurrentTrackId: () => string | undefined, callback: () => Promise<void>): void;
|
|
5
6
|
//# sourceMappingURL=track.d.ts.map
|
|
@@ -1 +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,
|
|
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,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAoC7C,eAAO,MAAM,qBAAqB,aACtB,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,wBAC9B,MAAM,GAAG,IAAI,iBAKpC,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B"}
|
package/dist/utils/track.js
CHANGED
|
@@ -19,7 +19,6 @@ const getRemoteOrLocalTrackContext = (tsClient, remoteOrLocalTrackId) => {
|
|
|
19
19
|
return trackByLocalId ? trackByLocalId : null;
|
|
20
20
|
};
|
|
21
21
|
const getTrackFromContext = (context) => ({
|
|
22
|
-
rawMetadata: context.rawMetadata,
|
|
23
22
|
metadata: context.metadata,
|
|
24
23
|
trackId: context.trackId,
|
|
25
24
|
stream: context.stream,
|
|
@@ -27,7 +26,6 @@ const getTrackFromContext = (context) => ({
|
|
|
27
26
|
encoding: context.encoding || null,
|
|
28
27
|
vadStatus: context.vadStatus,
|
|
29
28
|
track: context.track,
|
|
30
|
-
metadataParsingError: context.metadataParsingError,
|
|
31
29
|
});
|
|
32
30
|
export const getRemoteOrLocalTrack = (tsClient, remoteOrLocalTrackId) => {
|
|
33
31
|
const context = getRemoteOrLocalTrackContext(tsClient, remoteOrLocalTrackId);
|
|
@@ -35,3 +33,11 @@ export const getRemoteOrLocalTrack = (tsClient, remoteOrLocalTrackId) => {
|
|
|
35
33
|
return null;
|
|
36
34
|
return getTrackFromContext(context);
|
|
37
35
|
};
|
|
36
|
+
export function setupOnEndedCallback(track, getCurrentTrackId, callback) {
|
|
37
|
+
track.addEventListener("ended", async (event) => {
|
|
38
|
+
const trackId = event.target.id;
|
|
39
|
+
if (trackId === getCurrentTrackId()) {
|
|
40
|
+
await callback();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-client",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"description": "React client library for Fishjam Cloud",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fishjam Cloud Team",
|
|
@@ -38,19 +38,19 @@
|
|
|
38
38
|
"prepack": "yarn workspace @fishjam-cloud/ts-client build && yarn build"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
-
"@playwright/test": "^1.47.
|
|
41
|
+
"@playwright/test": "^1.47.2",
|
|
42
42
|
"@types/events": "^3.0.3",
|
|
43
43
|
"@types/lodash.isequal": "^4.5.8",
|
|
44
|
-
"@types/node": "^22.
|
|
45
|
-
"@types/react": "^18.3.
|
|
44
|
+
"@types/node": "^22.7.5",
|
|
45
|
+
"@types/react": "^18.3.11",
|
|
46
46
|
"react": "^18.2.0",
|
|
47
47
|
"typed-emitter": "^2.1.0",
|
|
48
|
-
"typedoc": "^0.26.
|
|
49
|
-
"typedoc-plugin-mdn-links": "^3.2
|
|
48
|
+
"typedoc": "^0.26.8",
|
|
49
|
+
"typedoc-plugin-mdn-links": "^3.3.2",
|
|
50
50
|
"typescript": "^5.6.2"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@fishjam-cloud/ts-client": "0.7.
|
|
53
|
+
"@fishjam-cloud/ts-client": "0.7.2",
|
|
54
54
|
"events": "3.3.0",
|
|
55
55
|
"lodash.isequal": "4.5.0"
|
|
56
56
|
},
|