@fishjam-cloud/react-client 0.13.0 → 0.14.1
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/FishjamProvider.d.ts.map +1 -1
- package/dist/FishjamProvider.js +37 -37
- package/dist/contexts/camera.d.ts +8 -0
- package/dist/contexts/camera.d.ts.map +1 -0
- package/dist/contexts/camera.js +2 -0
- package/dist/contexts/fishjamClient.d.ts +4 -0
- package/dist/contexts/fishjamClient.d.ts.map +1 -0
- package/dist/contexts/fishjamClient.js +2 -0
- package/dist/contexts/fishjamState.d.ts +3 -0
- package/dist/contexts/fishjamState.d.ts.map +1 -0
- package/dist/contexts/fishjamState.js +2 -0
- package/dist/contexts/initDevices.d.ts +3 -0
- package/dist/contexts/initDevices.d.ts.map +1 -0
- package/dist/contexts/initDevices.js +2 -0
- package/dist/contexts/microphone.d.ts +8 -0
- package/dist/contexts/microphone.d.ts.map +1 -0
- package/dist/contexts/microphone.js +2 -0
- package/dist/contexts/peerStatus.d.ts +3 -0
- package/dist/contexts/peerStatus.d.ts.map +1 -0
- package/dist/contexts/peerStatus.js +2 -0
- package/dist/contexts/screenshare.d.ts +3 -0
- package/dist/contexts/screenshare.d.ts.map +1 -0
- package/dist/contexts/screenshare.js +2 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +1 -0
- package/dist/devices/constraints.d.ts.map +1 -1
- package/dist/devices/mediaInitializer.d.ts +7 -6
- package/dist/devices/mediaInitializer.d.ts.map +1 -1
- package/dist/devices/mediaInitializer.js +44 -26
- package/dist/hooks/devices/useCamera.d.ts +2 -2
- package/dist/hooks/devices/useCamera.d.ts.map +1 -1
- package/dist/hooks/devices/useCamera.js +18 -10
- package/dist/hooks/devices/useInitializeDevices.d.ts +1 -1
- package/dist/hooks/devices/useInitializeDevices.d.ts.map +1 -1
- package/dist/hooks/devices/useInitializeDevices.js +5 -34
- package/dist/hooks/devices/useMicrophone.d.ts +2 -2
- package/dist/hooks/devices/useMicrophone.d.ts.map +1 -1
- package/dist/hooks/devices/useMicrophone.js +19 -11
- package/dist/hooks/internal/devices/useDeviceManager.d.ts +29 -0
- package/dist/hooks/internal/devices/useDeviceManager.d.ts.map +1 -0
- package/dist/hooks/internal/devices/useDeviceManager.js +95 -0
- package/dist/hooks/internal/devices/useHandleStreamEnd.d.ts +9 -0
- package/dist/hooks/internal/devices/useHandleStreamEnd.d.ts.map +1 -0
- package/dist/hooks/internal/devices/useHandleStreamEnd.js +13 -0
- package/dist/hooks/internal/devices/useMediaDevices.d.ts +16 -0
- package/dist/hooks/internal/devices/useMediaDevices.d.ts.map +1 -0
- package/dist/hooks/internal/devices/useMediaDevices.js +108 -0
- package/dist/hooks/internal/usePeerStatus.d.ts +1 -4
- package/dist/hooks/internal/usePeerStatus.d.ts.map +1 -1
- package/dist/hooks/internal/usePeerStatus.js +3 -9
- package/dist/hooks/internal/useReconnection.d.ts.map +1 -1
- package/dist/hooks/internal/useReconnection.js +5 -3
- package/dist/hooks/internal/useScreenshareManager.d.ts +3 -3
- package/dist/hooks/internal/useScreenshareManager.d.ts.map +1 -1
- package/dist/hooks/internal/useScreenshareManager.js +25 -9
- package/dist/hooks/internal/useTrackManager.d.ts +6 -4
- package/dist/hooks/internal/useTrackManager.d.ts.map +1 -1
- package/dist/hooks/internal/useTrackManager.js +99 -107
- package/dist/hooks/internal/useTrackMiddleware.d.ts +7 -0
- package/dist/hooks/internal/useTrackMiddleware.d.ts.map +1 -0
- package/dist/hooks/internal/useTrackMiddleware.js +26 -0
- package/dist/hooks/useConnection.d.ts +4 -4
- package/dist/hooks/useConnection.d.ts.map +1 -1
- package/dist/hooks/useConnection.js +10 -6
- package/dist/hooks/usePeers.d.ts.map +1 -1
- package/dist/hooks/usePeers.js +5 -2
- package/dist/hooks/useScreenShare.d.ts.map +1 -1
- package/dist/hooks/useScreenShare.js +5 -2
- package/dist/hooks/useStatistics.d.ts +4 -0
- package/dist/hooks/useStatistics.d.ts.map +1 -0
- package/dist/hooks/useStatistics.js +13 -0
- package/dist/hooks/useUpdatePeerMetadata.d.ts.map +1 -1
- package/dist/hooks/useUpdatePeerMetadata.js +5 -3
- package/dist/hooks/useVAD.d.ts.map +1 -1
- package/dist/hooks/useVAD.js +7 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/types/internal.d.ts +9 -40
- package/dist/types/internal.d.ts.map +1 -1
- package/dist/types/public.d.ts +11 -13
- package/dist/types/public.d.ts.map +1 -1
- package/dist/utils/bandwidth.d.ts.map +1 -1
- package/dist/utils/deferred.d.ts +9 -0
- package/dist/utils/deferred.d.ts.map +1 -0
- package/dist/utils/deferred.js +17 -0
- package/dist/utils/errors.d.ts +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +2 -2
- package/dist/utils/localStorage.d.ts +3 -2
- package/dist/utils/localStorage.d.ts.map +1 -1
- package/dist/utils/localStorage.js +3 -14
- package/dist/utils/track.d.ts +3 -1
- package/dist/utils/track.d.ts.map +1 -1
- package/dist/utils/track.js +16 -4
- package/package.json +16 -12
- package/dist/devices/DeviceManager.d.ts +0 -64
- package/dist/devices/DeviceManager.d.ts.map +0 -1
- package/dist/devices/DeviceManager.js +0 -200
- package/dist/devices/MiddlewareManager.d.ts +0 -9
- package/dist/devices/MiddlewareManager.d.ts.map +0 -1
- package/dist/devices/MiddlewareManager.js +0 -26
- package/dist/hooks/internal/device/useDeviceApi.d.ts +0 -8
- package/dist/hooks/internal/device/useDeviceApi.d.ts.map +0 -1
- package/dist/hooks/internal/device/useDeviceApi.js +0 -28
- package/dist/hooks/internal/device/useDeviceManager.d.ts +0 -4
- package/dist/hooks/internal/device/useDeviceManager.d.ts.map +0 -1
- package/dist/hooks/internal/device/useDeviceManager.js +0 -40
- package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.d.ts +0 -7
- package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.d.ts.map +0 -1
- package/dist/hooks/internal/useFishjamClient_DO_NOT_USE.js +0 -11
- package/dist/hooks/internal/useFishjamContext.d.ts +0 -22
- package/dist/hooks/internal/useFishjamContext.d.ts.map +0 -1
- package/dist/hooks/internal/useFishjamContext.js +0 -8
- package/dist/internal.d.ts +0 -2
- package/dist/internal.d.ts.map +0 -1
- package/dist/internal.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAExF,
|
|
1
|
+
{"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/types/public.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bandwidth.d.ts","sourceRoot":"","sources":["../../src/utils/bandwidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,sBAAsB,8EAA+E,CAAC;AAEnH,eAAO,MAAM,gCAAgC,
|
|
1
|
+
{"version":3,"file":"bandwidth.d.ts","sourceRoot":"","sources":["../../src/utils/bandwidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,sBAAsB,8EAA+E,CAAC;AAEnH,eAAO,MAAM,gCAAgC,GAAI,SAAS,OAAO,CAAC,eAAe,CAAC,KAAG,eAGnF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deferred.d.ts","sourceRoot":"","sources":["../../src/utils/deferred.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO;IAClC,SAAgB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAEpC,OAAO,CAAC,SAAS,CAAmD;IACpE,OAAO,CAAC,QAAQ,CAAoC;;IAS7C,OAAO,CAAC,KAAK,EAAE,CAAC;IAIhB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;CAGzB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class Deferred {
|
|
2
|
+
promise;
|
|
3
|
+
resolveFn = () => null;
|
|
4
|
+
rejectFn = () => null;
|
|
5
|
+
constructor() {
|
|
6
|
+
this.promise = new Promise((resolve, reject) => {
|
|
7
|
+
this.resolveFn = resolve;
|
|
8
|
+
this.rejectFn = reject;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
resolve(value) {
|
|
12
|
+
this.resolveFn(value);
|
|
13
|
+
}
|
|
14
|
+
reject(reason) {
|
|
15
|
+
this.rejectFn(reason);
|
|
16
|
+
}
|
|
17
|
+
}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export declare const PERMISSION_DENIED: DeviceError;
|
|
|
3
3
|
export declare const OVERCONSTRAINED_ERROR: DeviceError;
|
|
4
4
|
export declare const NOT_FOUND_ERROR: DeviceError;
|
|
5
5
|
export declare const UNHANDLED_ERROR: DeviceError;
|
|
6
|
-
export declare const parseUserMediaError: (error: unknown) => DeviceError
|
|
6
|
+
export declare const parseUserMediaError: (error: unknown) => DeviceError;
|
|
7
7
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,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,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,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,GAAI,OAAO,OAAO,KAAG,WAepD,CAAC"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -7,7 +7,7 @@ export const UNHANDLED_ERROR = { name: "UNHANDLED_ERROR" };
|
|
|
7
7
|
export const parseUserMediaError = (error) => {
|
|
8
8
|
if (!(error instanceof DOMException)) {
|
|
9
9
|
console.warn({ name: "Unhandled getUserMedia error", error });
|
|
10
|
-
return
|
|
10
|
+
return UNHANDLED_ERROR;
|
|
11
11
|
}
|
|
12
12
|
if (error.name === "NotAllowedError") {
|
|
13
13
|
return PERMISSION_DENIED;
|
|
@@ -18,5 +18,5 @@ export const parseUserMediaError = (error) => {
|
|
|
18
18
|
else if (error.name === "NotFoundError") {
|
|
19
19
|
return NOT_FOUND_ERROR;
|
|
20
20
|
}
|
|
21
|
-
return
|
|
21
|
+
return UNHANDLED_ERROR;
|
|
22
22
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
import type { DeviceType
|
|
2
|
-
export declare
|
|
1
|
+
import type { DeviceType } from "../types/public";
|
|
2
|
+
export declare const getLastDevice: (deviceType: DeviceType) => MediaDeviceInfo | null;
|
|
3
|
+
export declare const saveLastDevice: (info: MediaDeviceInfo, deviceType: DeviceType) => void;
|
|
3
4
|
//# sourceMappingURL=localStorage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"localStorage.d.ts","sourceRoot":"","sources":["../../src/utils/localStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIlD,eAAO,MAAM,aAAa,GAAI,YAAY,UAAU,2BACsB,CAAC;AAE3E,eAAO,MAAM,cAAc,GAAI,MAAM,eAAe,EAAE,YAAY,UAAU,SACT,CAAC"}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
};
|
|
1
|
+
const getLocalStorageKey = (deviceType) => `last-selected-${deviceType}-device`;
|
|
2
|
+
export const getLastDevice = (deviceType) => loadObject(getLocalStorageKey(deviceType), null);
|
|
3
|
+
export const saveLastDevice = (info, deviceType) => saveObject(getLocalStorageKey(deviceType), info);
|
|
15
4
|
const loadObject = (key, defaultValue) => {
|
|
16
5
|
const stringValue = loadString(key, "");
|
|
17
6
|
if (stringValue === "") {
|
package/dist/utils/track.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { FishjamClient, SimulcastConfig } from "@fishjam-cloud/ts-client";
|
|
2
2
|
import { Variant } from "@fishjam-cloud/ts-client";
|
|
3
3
|
import type { BandwidthLimits, Track } from "../types/public";
|
|
4
|
-
export declare const getRemoteOrLocalTrack: (tsClient: FishjamClient, remoteOrLocalTrackId: string
|
|
4
|
+
export declare const getRemoteOrLocalTrack: (tsClient: FishjamClient, remoteOrLocalTrackId: string) => Track | null;
|
|
5
5
|
export declare function setupOnEndedCallback(track: MediaStreamTrack, getCurrentTrackId: () => string | undefined, callback: () => Promise<void>): void;
|
|
6
6
|
export declare const getConfigAndBandwidthFromProps: (encodings: Variant[] | false | undefined, bandwidthLimits: BandwidthLimits) => readonly [number, undefined] | readonly [Map<Variant, number>, SimulcastConfig];
|
|
7
|
+
export declare function getTrackFromStream(stream: MediaStream, type: "audio" | "video"): MediaStreamTrack;
|
|
8
|
+
export declare function stopStream(stream: MediaStream, type: "audio" | "video"): void;
|
|
7
9
|
//# 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,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../../src/utils/track.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAA+B,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAiCvE,eAAO,MAAM,qBAAqB,GAAI,UAAU,aAAa,EAAE,sBAAsB,MAAM,iBAI1F,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,EAC3C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,QAQ9B;AAOD,eAAO,MAAM,8BAA8B,GACzC,WAAW,OAAO,EAAE,GAAG,KAAK,GAAG,SAAS,EACxC,iBAAiB,eAAe,oFAcjC,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,oBAE9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,QAKtE"}
|
package/dist/utils/track.js
CHANGED
|
@@ -8,16 +8,14 @@ import { Variant } from "@fishjam-cloud/ts-client";
|
|
|
8
8
|
// However, in that event handler, we don't yet have the remote track ID.
|
|
9
9
|
// Therefore, for that brief moment, we will use the local track ID from the MediaStreamTrack object to identify the track.
|
|
10
10
|
const getRemoteOrLocalTrackContext = (tsClient, remoteOrLocalTrackId) => {
|
|
11
|
-
if (!remoteOrLocalTrackId)
|
|
12
|
-
return null;
|
|
13
11
|
const tracks = tsClient?.getLocalPeer()?.tracks;
|
|
14
12
|
if (!tracks)
|
|
15
13
|
return null;
|
|
16
14
|
const trackByRemoteId = tracks?.get(remoteOrLocalTrackId);
|
|
17
15
|
if (trackByRemoteId)
|
|
18
16
|
return trackByRemoteId;
|
|
19
|
-
const trackByLocalId = [...tracks.values()].find((track) => track
|
|
20
|
-
return trackByLocalId
|
|
17
|
+
const trackByLocalId = [...tracks.values()].find(({ track }) => track?.id === remoteOrLocalTrackId);
|
|
18
|
+
return trackByLocalId ?? null;
|
|
21
19
|
};
|
|
22
20
|
const getTrackFromContext = (context) => ({
|
|
23
21
|
metadata: context.metadata,
|
|
@@ -57,3 +55,17 @@ export const getConfigAndBandwidthFromProps = (encodings, bandwidthLimits) => {
|
|
|
57
55
|
const bandwidth = new Map(variantEntries);
|
|
58
56
|
return [bandwidth, config];
|
|
59
57
|
};
|
|
58
|
+
function getCertainTypeTracks(stream, type) {
|
|
59
|
+
if (type === "audio")
|
|
60
|
+
return stream.getAudioTracks();
|
|
61
|
+
return stream.getVideoTracks();
|
|
62
|
+
}
|
|
63
|
+
export function getTrackFromStream(stream, type) {
|
|
64
|
+
return getCertainTypeTracks(stream, type)[0] ?? null;
|
|
65
|
+
}
|
|
66
|
+
export function stopStream(stream, type) {
|
|
67
|
+
getCertainTypeTracks(stream, type).forEach((track) => {
|
|
68
|
+
track.enabled = false;
|
|
69
|
+
track.stop();
|
|
70
|
+
});
|
|
71
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fishjam-cloud/react-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "React client library for Fishjam",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Fishjam Team",
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"dist/**"
|
|
12
12
|
],
|
|
13
|
-
"repository":
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/fishjam-cloud/web-client-sdk.git",
|
|
16
|
+
"directory": "packages/react-client"
|
|
17
|
+
},
|
|
14
18
|
"homepage": "https://github.com/fishjam-cloud/web-client-sdk#readme",
|
|
15
19
|
"bugs": "https://github.com/fishjam-cloud/web-client-sdk/issues",
|
|
16
20
|
"keywords": [
|
|
@@ -22,9 +26,9 @@
|
|
|
22
26
|
"import": "./dist/index.js",
|
|
23
27
|
"types": "./dist/index.d.ts"
|
|
24
28
|
},
|
|
25
|
-
"./
|
|
26
|
-
"import": "./dist/
|
|
27
|
-
"types": "./dist/
|
|
29
|
+
"./debug": {
|
|
30
|
+
"import": "./dist/debug.js",
|
|
31
|
+
"types": "./dist/debug.d.ts"
|
|
28
32
|
}
|
|
29
33
|
},
|
|
30
34
|
"scripts": {
|
|
@@ -38,19 +42,19 @@
|
|
|
38
42
|
"prepack": "yarn workspace @fishjam-cloud/ts-client build && yarn build"
|
|
39
43
|
},
|
|
40
44
|
"devDependencies": {
|
|
41
|
-
"@playwright/test": "^1.
|
|
45
|
+
"@playwright/test": "^1.51.1",
|
|
42
46
|
"@types/events": "^3.0.3",
|
|
43
47
|
"@types/lodash.isequal": "^4.5.8",
|
|
44
|
-
"@types/node": "^22.
|
|
45
|
-
"@types/react": "^19.0.
|
|
48
|
+
"@types/node": "^22.13.10",
|
|
49
|
+
"@types/react": "^19.0.11",
|
|
46
50
|
"react": "^19.0.0",
|
|
47
51
|
"typed-emitter": "^2.1.0",
|
|
48
|
-
"typedoc": "^0.
|
|
49
|
-
"typedoc-plugin-mdn-links": "^
|
|
50
|
-
"typescript": "^5.
|
|
52
|
+
"typedoc": "^0.28.0",
|
|
53
|
+
"typedoc-plugin-mdn-links": "^5.0.1",
|
|
54
|
+
"typescript": "^5.8.2"
|
|
51
55
|
},
|
|
52
56
|
"dependencies": {
|
|
53
|
-
"@fishjam-cloud/ts-client": "0.
|
|
57
|
+
"@fishjam-cloud/ts-client": "0.14.1",
|
|
54
58
|
"events": "3.3.0",
|
|
55
59
|
"lodash.isequal": "4.5.0"
|
|
56
60
|
},
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type TypedEmitter from "typed-emitter";
|
|
2
|
-
import type { DeviceManagerStatus, DeviceState, Media, MediaManager } from "../types/internal";
|
|
3
|
-
import type { DeviceError, DeviceType, PersistLastDeviceHandlers, TrackMiddleware } from "../types/public";
|
|
4
|
-
export type DeviceManagerEvents = {
|
|
5
|
-
managerStarted: (event: DeviceState & {
|
|
6
|
-
constraints: MediaTrackConstraints | undefined;
|
|
7
|
-
}, state: DeviceState) => void;
|
|
8
|
-
managerInitialized: (state: DeviceState) => void;
|
|
9
|
-
devicesStarted: (event: {
|
|
10
|
-
restarting: boolean;
|
|
11
|
-
constraints?: MediaTrackConstraints | boolean;
|
|
12
|
-
}, state: DeviceState) => void;
|
|
13
|
-
deviceReady: (event: {
|
|
14
|
-
stream: MediaStream;
|
|
15
|
-
}, state: DeviceState) => void;
|
|
16
|
-
devicesReady: (event: DeviceState & {
|
|
17
|
-
restarted: boolean;
|
|
18
|
-
}, state: DeviceState) => void;
|
|
19
|
-
deviceStopped: (state: DeviceState) => void;
|
|
20
|
-
deviceEnabled: (state: DeviceState) => void;
|
|
21
|
-
deviceDisabled: (state: DeviceState) => void;
|
|
22
|
-
middlewareSet: (state: DeviceState) => void;
|
|
23
|
-
error: (event: any, state: DeviceState) => void;
|
|
24
|
-
};
|
|
25
|
-
export type DeviceManagerConfig = {
|
|
26
|
-
deviceType: DeviceType;
|
|
27
|
-
defaultConstraints: MediaTrackConstraints;
|
|
28
|
-
userConstraints?: boolean | MediaTrackConstraints;
|
|
29
|
-
storage?: boolean | PersistLastDeviceHandlers;
|
|
30
|
-
};
|
|
31
|
-
declare const DeviceManager_base: new () => TypedEmitter<DeviceManagerEvents>;
|
|
32
|
-
export declare class DeviceManager extends DeviceManager_base implements MediaManager {
|
|
33
|
-
private readonly constraints;
|
|
34
|
-
private status;
|
|
35
|
-
private readonly deviceType;
|
|
36
|
-
private readonly middlewareManager;
|
|
37
|
-
readonly getLastDevice: () => MediaDeviceInfo | null;
|
|
38
|
-
private readonly saveLastDevice;
|
|
39
|
-
private rawMedia;
|
|
40
|
-
private processedMediaTrack;
|
|
41
|
-
private media;
|
|
42
|
-
private mediaStatus;
|
|
43
|
-
private devices;
|
|
44
|
-
private devicesStatus;
|
|
45
|
-
private error;
|
|
46
|
-
constructor({ deviceType, storage, userConstraints, defaultConstraints }: DeviceManagerConfig);
|
|
47
|
-
getState(): DeviceState;
|
|
48
|
-
getStatus(): DeviceManagerStatus;
|
|
49
|
-
getConstraints(): MediaTrackConstraints | boolean;
|
|
50
|
-
getDeviceType: () => DeviceType;
|
|
51
|
-
getMedia: () => Media | null;
|
|
52
|
-
initialize: (stream: MediaStream | null, track: MediaStreamTrack | null, devices: MediaDeviceInfo[], requestedMedia: boolean, error?: DeviceError | null) => void;
|
|
53
|
-
start(deviceId?: string): Promise<void>;
|
|
54
|
-
setTrackMiddleware(middleware: TrackMiddleware | null): Promise<void>;
|
|
55
|
-
getMiddleware(): TrackMiddleware | null;
|
|
56
|
-
stop(): void;
|
|
57
|
-
disable(): void;
|
|
58
|
-
enable(): void;
|
|
59
|
-
private setEnable;
|
|
60
|
-
private updateMedia;
|
|
61
|
-
private setCurrentMedia;
|
|
62
|
-
}
|
|
63
|
-
export {};
|
|
64
|
-
//# sourceMappingURL=DeviceManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceManager.d.ts","sourceRoot":"","sources":["../../src/devices/DeviceManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EACV,mBAAmB,EAEnB,WAAW,EACX,KAAK,EACL,YAAY,EAEb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAO3G,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,CACd,KAAK,EAAE,WAAW,GAAG;QACnB,WAAW,EAAE,qBAAqB,GAAG,SAAS,CAAC;KAChD,EACD,KAAK,EAAE,WAAW,KACf,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACjD,cAAc,EAAE,CACd,KAAK,EAAE;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAA;KAAE,EAC7E,KAAK,EAAE,WAAW,KACf,IAAI,CAAC;IACV,WAAW,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,WAAW,CAAA;KAAE,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC1E,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACxF,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC5C,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAE5C,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,kBAAkB,EAAE,qBAAqB,CAAC;IAC1C,eAAe,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;IAClD,OAAO,CAAC,EAAE,OAAO,GAAG,yBAAyB,CAAC;CAC/C,CAAC;kCAKyB,UAAU,YAAY,CAAC,mBAAmB,CAAC;AADtE,qBAAa,aACX,SAAQ,kBACR,YAAW,YAAY;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAE9D,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;IAE7D,SAAgB,aAAa,EAAE,MAAM,eAAe,GAAG,IAAI,CAAc;IACzE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyC;IAExE,OAAO,CAAC,QAAQ,CAAsB;IAEtC,OAAO,CAAC,mBAAmB,CAAiC;IAE5D,OAAO,CAAC,KAAK,CAAsB;IAEnC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,KAAK,CAA4B;gBAE7B,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,EAAE,mBAAmB;IAYtF,QAAQ,IAAI,WAAW;IAWvB,SAAS,IAAI,mBAAmB;IAIhC,cAAc,IAAI,qBAAqB,GAAG,OAAO;IAIjD,aAAa,mBAElB;IAEK,QAAQ,QAAO,KAAK,GAAG,IAAI,CAEhC;IAEK,UAAU,WACP,WAAW,GAAG,IAAI,SACnB,gBAAgB,GAAG,IAAI,WACrB,eAAe,EAAE,kBACV,OAAO,UAChB,WAAW,GAAG,IAAI,UA8BzB;IAEW,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM;IA4EvB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3E,aAAa,IAAI,eAAe,GAAG,IAAI;IAIvC,IAAI;IAUJ,OAAO;IAWP,MAAM;IAWb,OAAO,CAAC,SAAS,CAGf;IAEF,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,eAAe;CAaxB"}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import EventEmitter from "events";
|
|
2
|
-
import { parseUserMediaError } from "../utils/errors";
|
|
3
|
-
import { createStorageConfig } from "../utils/localStorage";
|
|
4
|
-
import { setupOnEndedCallback } from "../utils/track";
|
|
5
|
-
import { prepareMediaTrackConstraints } from "./constraints";
|
|
6
|
-
import { MiddlewareManager } from "./MiddlewareManager";
|
|
7
|
-
const NOOP = () => { };
|
|
8
|
-
export class DeviceManager extends EventEmitter {
|
|
9
|
-
constraints;
|
|
10
|
-
status = "uninitialized";
|
|
11
|
-
deviceType;
|
|
12
|
-
middlewareManager = new MiddlewareManager();
|
|
13
|
-
getLastDevice = () => null;
|
|
14
|
-
saveLastDevice = NOOP;
|
|
15
|
-
rawMedia = null;
|
|
16
|
-
processedMediaTrack = null;
|
|
17
|
-
media = null;
|
|
18
|
-
mediaStatus = "Not requested";
|
|
19
|
-
devices = null;
|
|
20
|
-
devicesStatus = "Not requested";
|
|
21
|
-
error = null;
|
|
22
|
-
constructor({ deviceType, storage, userConstraints, defaultConstraints }) {
|
|
23
|
-
super();
|
|
24
|
-
const storageConfig = createStorageConfig(deviceType, storage);
|
|
25
|
-
if (storageConfig) {
|
|
26
|
-
this.getLastDevice = storageConfig.getLastDevice;
|
|
27
|
-
this.saveLastDevice = storageConfig.saveLastDevice;
|
|
28
|
-
}
|
|
29
|
-
this.deviceType = deviceType;
|
|
30
|
-
this.constraints = userConstraints ?? defaultConstraints;
|
|
31
|
-
}
|
|
32
|
-
getState() {
|
|
33
|
-
return {
|
|
34
|
-
mediaStatus: this.mediaStatus,
|
|
35
|
-
devices: this.devices,
|
|
36
|
-
devicesStatus: this.devicesStatus,
|
|
37
|
-
error: this.error,
|
|
38
|
-
media: this.media,
|
|
39
|
-
currentMiddleware: this.middlewareManager.getMiddleware(),
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
getStatus() {
|
|
43
|
-
return this.status;
|
|
44
|
-
}
|
|
45
|
-
getConstraints() {
|
|
46
|
-
return this.constraints;
|
|
47
|
-
}
|
|
48
|
-
getDeviceType = () => {
|
|
49
|
-
return this.deviceType;
|
|
50
|
-
};
|
|
51
|
-
getMedia = () => {
|
|
52
|
-
return this.media;
|
|
53
|
-
};
|
|
54
|
-
initialize = (stream, track, devices, requestedMedia, error = null) => {
|
|
55
|
-
const deviceInfo = getDeviceInfo(track?.getSettings()?.deviceId || null, devices);
|
|
56
|
-
const [devicesStatus, newError] = prepareStatus(requestedMedia, track);
|
|
57
|
-
this.devices = devices;
|
|
58
|
-
this.devicesStatus = devicesStatus;
|
|
59
|
-
this.mediaStatus = devicesStatus;
|
|
60
|
-
this.error = newError ?? error;
|
|
61
|
-
this.updateMedia({
|
|
62
|
-
stream: track ? stream : null,
|
|
63
|
-
track,
|
|
64
|
-
deviceInfo,
|
|
65
|
-
enabled: Boolean(track?.enabled),
|
|
66
|
-
});
|
|
67
|
-
if (deviceInfo)
|
|
68
|
-
this.saveLastDevice?.(deviceInfo);
|
|
69
|
-
this.status = "initialized";
|
|
70
|
-
if (track) {
|
|
71
|
-
setupOnEndedCallback(track, () => this?.rawMedia?.track?.id, async () => this.stop());
|
|
72
|
-
}
|
|
73
|
-
this.emit("managerInitialized", this.getState());
|
|
74
|
-
};
|
|
75
|
-
async start(deviceId) {
|
|
76
|
-
const newDeviceId = deviceId ?? this.getLastDevice?.()?.deviceId;
|
|
77
|
-
const currentDeviceId = this.rawMedia?.deviceInfo?.deviceId;
|
|
78
|
-
const shouldReplaceDevice = Boolean(currentDeviceId && currentDeviceId !== newDeviceId);
|
|
79
|
-
const isDeviceStopped = currentDeviceId === undefined;
|
|
80
|
-
const shouldProceed = isDeviceStopped || shouldReplaceDevice;
|
|
81
|
-
const exactConstraints = shouldProceed && prepareMediaTrackConstraints(newDeviceId, this.constraints);
|
|
82
|
-
if (!exactConstraints)
|
|
83
|
-
return;
|
|
84
|
-
this.mediaStatus = "Requesting";
|
|
85
|
-
this.emit("devicesStarted", { restarting: shouldReplaceDevice, constraints: exactConstraints }, this.getState());
|
|
86
|
-
try {
|
|
87
|
-
const stream = await navigator.mediaDevices.getUserMedia({ [this.deviceType]: exactConstraints });
|
|
88
|
-
const track = getTrack(stream, this.deviceType);
|
|
89
|
-
const trackDeviceId = track?.getSettings()?.deviceId;
|
|
90
|
-
const deviceInfo = trackDeviceId ? getDeviceInfo(trackDeviceId, this.devices ?? []) : null;
|
|
91
|
-
if (deviceInfo) {
|
|
92
|
-
this.saveLastDevice?.(deviceInfo);
|
|
93
|
-
}
|
|
94
|
-
// The device manager assumes that there is only one audio and video track.
|
|
95
|
-
// All previous tracks are deactivated even if the browser is able to handle multiple active sessions. (Chrome, Firefox)
|
|
96
|
-
//
|
|
97
|
-
// Safari always deactivates the track and emits the `ended` event.
|
|
98
|
-
// Its handling is asynchronous and can be executed even before returning a value from the re-execution of `getUserMedia`.
|
|
99
|
-
// In such a case, the tracks are already deactivated at this point (logic in `onTrackEnded` method).
|
|
100
|
-
// The track is null, so the stop method will not execute.
|
|
101
|
-
//
|
|
102
|
-
// However, if Safari has not yet handled this event, the tracks are manually stopped at this point.
|
|
103
|
-
// Manually stopping tracks on its own does not generate the `ended` event.
|
|
104
|
-
// The ended event in Safari has already been emitted and will be handled in the future.
|
|
105
|
-
// Therefore, in the `onTrackEnded` method, events for already stopped tracks are filtered out to prevent the state from being damaged.
|
|
106
|
-
if (shouldReplaceDevice) {
|
|
107
|
-
this.rawMedia?.track?.stop();
|
|
108
|
-
this.processedMediaTrack?.stop();
|
|
109
|
-
}
|
|
110
|
-
this.updateMedia({
|
|
111
|
-
stream,
|
|
112
|
-
track,
|
|
113
|
-
deviceInfo,
|
|
114
|
-
enabled: Boolean(track?.enabled),
|
|
115
|
-
});
|
|
116
|
-
if (track) {
|
|
117
|
-
setupOnEndedCallback(track, () => this?.rawMedia?.track?.id, async () => this.stop());
|
|
118
|
-
}
|
|
119
|
-
this.mediaStatus = "OK";
|
|
120
|
-
this.emit("devicesReady", { ...this.getState(), restarted: shouldReplaceDevice }, this.getState());
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
const parsedError = parseUserMediaError(err);
|
|
124
|
-
const event = {
|
|
125
|
-
parsedError,
|
|
126
|
-
constraints: exactConstraints,
|
|
127
|
-
};
|
|
128
|
-
if (exactConstraints) {
|
|
129
|
-
this.error = parsedError;
|
|
130
|
-
}
|
|
131
|
-
this.emit("error", event, this.getState());
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async setTrackMiddleware(middleware) {
|
|
135
|
-
const rawTrack = this.rawMedia?.track ?? null;
|
|
136
|
-
const processedMedia = this.middlewareManager.applyMiddleware(rawTrack, middleware);
|
|
137
|
-
this.setCurrentMedia(this.rawMedia, processedMedia);
|
|
138
|
-
this.emit("middlewareSet", this.getState());
|
|
139
|
-
}
|
|
140
|
-
getMiddleware() {
|
|
141
|
-
return this.middlewareManager.getMiddleware();
|
|
142
|
-
}
|
|
143
|
-
stop() {
|
|
144
|
-
this.middlewareManager.clearMiddleware();
|
|
145
|
-
this.processedMediaTrack?.stop();
|
|
146
|
-
this.rawMedia?.track?.stop();
|
|
147
|
-
this.updateMedia(null);
|
|
148
|
-
this.emit("deviceStopped", this.getState());
|
|
149
|
-
}
|
|
150
|
-
disable() {
|
|
151
|
-
this.setEnable(this.rawMedia?.track ?? null, false);
|
|
152
|
-
this.setEnable(this.processedMediaTrack, false);
|
|
153
|
-
if (this.media) {
|
|
154
|
-
this.media.enabled = false;
|
|
155
|
-
}
|
|
156
|
-
this.emit("deviceDisabled", this.getState());
|
|
157
|
-
}
|
|
158
|
-
enable() {
|
|
159
|
-
this.setEnable(this.rawMedia?.track ?? null, true);
|
|
160
|
-
this.setEnable(this.processedMediaTrack, true);
|
|
161
|
-
if (this.media) {
|
|
162
|
-
this.media.enabled = true;
|
|
163
|
-
}
|
|
164
|
-
this.emit("deviceEnabled", this.getState());
|
|
165
|
-
}
|
|
166
|
-
setEnable = (track, value) => {
|
|
167
|
-
if (!track)
|
|
168
|
-
return;
|
|
169
|
-
track.enabled = value;
|
|
170
|
-
};
|
|
171
|
-
updateMedia(media) {
|
|
172
|
-
this.rawMedia = !media ? null : { ...media };
|
|
173
|
-
const processedMedia = this.middlewareManager.applyMiddleware(media?.track ?? null);
|
|
174
|
-
this.setCurrentMedia(this.rawMedia, processedMedia);
|
|
175
|
-
}
|
|
176
|
-
setCurrentMedia(media, processedTrack) {
|
|
177
|
-
this.processedMediaTrack = processedTrack;
|
|
178
|
-
const streamTrack = processedTrack ? { track: processedTrack, stream: new MediaStream([processedTrack]) } : media;
|
|
179
|
-
this.media = streamTrack
|
|
180
|
-
? {
|
|
181
|
-
...streamTrack,
|
|
182
|
-
enabled: Boolean(streamTrack.track?.enabled),
|
|
183
|
-
deviceInfo: this.rawMedia?.deviceInfo ?? null,
|
|
184
|
-
}
|
|
185
|
-
: null;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
function getDeviceInfo(trackDeviceId, devices) {
|
|
189
|
-
return (trackDeviceId && devices.find(({ deviceId }) => trackDeviceId === deviceId)) || null;
|
|
190
|
-
}
|
|
191
|
-
function getTrack(stream, deviceType) {
|
|
192
|
-
return (deviceType === "audio" ? stream?.getAudioTracks()?.[0] : stream?.getVideoTracks()?.[0]) ?? null;
|
|
193
|
-
}
|
|
194
|
-
function prepareStatus(requested, track) {
|
|
195
|
-
if (!requested)
|
|
196
|
-
return ["Not requested", null];
|
|
197
|
-
if (track)
|
|
198
|
-
return ["OK", null];
|
|
199
|
-
return ["Error", null];
|
|
200
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { TrackMiddleware } from "../types/public";
|
|
2
|
-
export declare class MiddlewareManager {
|
|
3
|
-
private middleware;
|
|
4
|
-
private clearMiddlewareFn;
|
|
5
|
-
getMiddleware(): TrackMiddleware | null;
|
|
6
|
-
clearMiddleware(): void;
|
|
7
|
-
applyMiddleware(rawTrack: MediaStreamTrack | null, middleware?: TrackMiddleware | null): MediaStreamTrack | null;
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=MiddlewareManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MiddlewareManager.d.ts","sourceRoot":"","sources":["../../src/devices/MiddlewareManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGvD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,iBAAiB,CAA6B;IAE/C,aAAa,IAAI,eAAe,GAAG,IAAI;IAIvC,eAAe;IAKf,eAAe,CACpB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,EACjC,UAAU,GAAE,eAAe,GAAG,IAAsB,GACnD,gBAAgB,GAAG,IAAI;CAmB3B"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { setupOnEndedCallback } from "../utils/track";
|
|
2
|
-
export class MiddlewareManager {
|
|
3
|
-
middleware = null;
|
|
4
|
-
clearMiddlewareFn = null;
|
|
5
|
-
getMiddleware() {
|
|
6
|
-
return this.middleware;
|
|
7
|
-
}
|
|
8
|
-
clearMiddleware() {
|
|
9
|
-
this.clearMiddlewareFn?.();
|
|
10
|
-
this.clearMiddlewareFn = null;
|
|
11
|
-
}
|
|
12
|
-
applyMiddleware(rawTrack, middleware = this.middleware) {
|
|
13
|
-
this.middleware = middleware;
|
|
14
|
-
this.clearMiddleware();
|
|
15
|
-
if (!rawTrack || !middleware)
|
|
16
|
-
return null;
|
|
17
|
-
const { onClear, track } = middleware(rawTrack);
|
|
18
|
-
if (onClear)
|
|
19
|
-
this.clearMiddlewareFn = onClear;
|
|
20
|
-
setupOnEndedCallback(track, () => track.id, async () => {
|
|
21
|
-
this.clearMiddleware();
|
|
22
|
-
track.stop();
|
|
23
|
-
});
|
|
24
|
-
return track;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { DeviceManager } from "../../../devices/DeviceManager";
|
|
2
|
-
import type { Device } from "../../../types/public";
|
|
3
|
-
type DeviceApiDependencies = {
|
|
4
|
-
deviceManager: DeviceManager;
|
|
5
|
-
};
|
|
6
|
-
export declare const useDeviceApi: ({ deviceManager }: DeviceApiDependencies) => Device;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=useDeviceApi.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeviceApi.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceApi.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAc,MAAM,uBAAuB,CAAC;AAGhE,KAAK,qBAAqB,GAAG;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,YAAY,sBAAuB,qBAAqB,KAAG,MA+BvE,CAAC"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { useMemo } from "react";
|
|
2
|
-
import { useDeviceManager } from "./useDeviceManager";
|
|
3
|
-
export const useDeviceApi = ({ deviceManager }) => {
|
|
4
|
-
const { deviceState, deviceType, deviceStatus } = useDeviceManager(deviceManager);
|
|
5
|
-
const mediaStream = useMemo(() => deviceState.media?.stream ?? null, [deviceState.media?.stream]);
|
|
6
|
-
const currentMiddleware = deviceState.currentMiddleware ?? null;
|
|
7
|
-
const mediaStreamTrack = useMemo(() => {
|
|
8
|
-
if (deviceType === "video")
|
|
9
|
-
return mediaStream?.getVideoTracks()[0] ?? null;
|
|
10
|
-
return mediaStream?.getAudioTracks()[0] ?? null;
|
|
11
|
-
}, [mediaStream, deviceType]);
|
|
12
|
-
const devices = useMemo(() => deviceState.devices?.map(({ deviceId, label }) => ({ deviceId, label })) ?? [], [deviceState.devices]);
|
|
13
|
-
const activeDevice = deviceState.media?.deviceInfo
|
|
14
|
-
? { deviceId: deviceState.media.deviceInfo.deviceId, label: deviceState.media.deviceInfo.label }
|
|
15
|
-
: null;
|
|
16
|
-
const isMuted = !deviceState.media?.enabled;
|
|
17
|
-
const deviceError = deviceState.error ?? null;
|
|
18
|
-
return {
|
|
19
|
-
mediaStream,
|
|
20
|
-
currentMiddleware,
|
|
21
|
-
deviceStatus,
|
|
22
|
-
devices,
|
|
23
|
-
deviceError,
|
|
24
|
-
activeDevice,
|
|
25
|
-
isMuted,
|
|
26
|
-
mediaStreamTrack,
|
|
27
|
-
};
|
|
28
|
-
};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { DeviceManager } from "../../../devices/DeviceManager";
|
|
2
|
-
import type { DeviceManagerState } from "../../../types/internal";
|
|
3
|
-
export declare const useDeviceManager: (deviceManager: DeviceManager) => DeviceManagerState;
|
|
4
|
-
//# sourceMappingURL=useDeviceManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useDeviceManager.d.ts","sourceRoot":"","sources":["../../../../src/hooks/internal/device/useDeviceManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,gCAAgC,CAAC;AACzF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAelE,eAAO,MAAM,gBAAgB,kBAAmB,aAAa,uBAoC5D,CAAC"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { useCallback, useRef, useSyncExternalStore } from "react";
|
|
2
|
-
const eventNames = [
|
|
3
|
-
"deviceDisabled",
|
|
4
|
-
"deviceEnabled",
|
|
5
|
-
"managerStarted",
|
|
6
|
-
"deviceStopped",
|
|
7
|
-
"deviceReady",
|
|
8
|
-
"devicesStarted",
|
|
9
|
-
"devicesReady",
|
|
10
|
-
"managerInitialized",
|
|
11
|
-
"error",
|
|
12
|
-
"middlewareSet",
|
|
13
|
-
];
|
|
14
|
-
export const useDeviceManager = (deviceManager) => {
|
|
15
|
-
const mutationRef = useRef(false);
|
|
16
|
-
const subscribe = useCallback((subscribeCallback) => {
|
|
17
|
-
const callback = () => {
|
|
18
|
-
mutationRef.current = true;
|
|
19
|
-
subscribeCallback();
|
|
20
|
-
};
|
|
21
|
-
eventNames.forEach((eventName) => deviceManager.on(eventName, callback));
|
|
22
|
-
return () => {
|
|
23
|
-
eventNames.forEach((eventName) => deviceManager.removeListener(eventName, callback));
|
|
24
|
-
};
|
|
25
|
-
}, [deviceManager]);
|
|
26
|
-
const lastSnapshotRef = useRef(null);
|
|
27
|
-
const getSnapshot = useCallback(() => {
|
|
28
|
-
if (mutationRef.current || lastSnapshotRef.current === null) {
|
|
29
|
-
lastSnapshotRef.current = {
|
|
30
|
-
deviceState: deviceManager.getState(),
|
|
31
|
-
deviceStatus: deviceManager.getStatus(),
|
|
32
|
-
deviceType: deviceManager.getDeviceType(),
|
|
33
|
-
};
|
|
34
|
-
mutationRef.current = false;
|
|
35
|
-
}
|
|
36
|
-
return lastSnapshotRef.current;
|
|
37
|
-
}, [deviceManager]);
|
|
38
|
-
const deviceState = useSyncExternalStore(subscribe, getSnapshot);
|
|
39
|
-
return deviceState;
|
|
40
|
-
};
|