@fishjam-cloud/react-client 0.14.0 → 0.15.0
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 -41
- 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 +14 -15
- 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 -6
- package/dist/hooks/devices/useInitializeDevices.d.ts.map +1 -1
- package/dist/hooks/devices/useInitializeDevices.js +5 -45
- 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 -6
- package/dist/hooks/internal/useTrackManager.d.ts.map +1 -1
- package/dist/hooks/internal/useTrackManager.js +99 -108
- 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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +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/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 +11 -11
- package/dist/devices/DeviceManager.d.ts +0 -65
- package/dist/devices/DeviceManager.d.ts.map +0 -1
- package/dist/devices/DeviceManager.js +0 -188
- 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 -41
- 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,134 +1,124 @@
|
|
|
1
|
-
import { Variant } from "@fishjam-cloud/ts-client";
|
|
2
|
-
import { useCallback, useEffect, useRef
|
|
1
|
+
import { TrackTypeError, Variant } from "@fishjam-cloud/ts-client";
|
|
2
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
3
3
|
import { getConfigAndBandwidthFromProps, getRemoteOrLocalTrack } from "../../utils/track";
|
|
4
|
-
const
|
|
5
|
-
video: "camera",
|
|
6
|
-
audio: "microphone",
|
|
7
|
-
};
|
|
8
|
-
const getDeviceType = (mediaManager) => TRACK_TYPE_TO_DEVICE[mediaManager.getDeviceType()];
|
|
9
|
-
export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus, bandwidthLimits, streamConfig, devicesInitializationRef, }) => {
|
|
4
|
+
export const useTrackManager = ({ deviceManager, tsClient, peerStatus, bandwidthLimits, streamConfig, type, }) => {
|
|
10
5
|
const currentTrackIdRef = useRef(null);
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
6
|
+
const { startDevice, stopDevice, enableDevice, disableDevice, deviceTrack, applyMiddleware, currentMiddleware } = deviceManager;
|
|
7
|
+
const getCurrentTrackId = useCallback(() => {
|
|
8
|
+
const refTrackId = currentTrackIdRef.current;
|
|
9
|
+
if (!refTrackId)
|
|
10
|
+
return null;
|
|
11
|
+
const currentTrack = getRemoteOrLocalTrack(tsClient, refTrackId);
|
|
12
|
+
return currentTrack?.trackId ?? null;
|
|
13
|
+
}, [tsClient]);
|
|
14
|
+
const selectDevice = useCallback(async (deviceId) => {
|
|
15
|
+
const [newTrack, error] = await startDevice(deviceId);
|
|
16
|
+
if (error)
|
|
17
|
+
return error;
|
|
18
|
+
const currentTrackId = getCurrentTrackId();
|
|
19
19
|
if (!currentTrackId)
|
|
20
20
|
return;
|
|
21
|
-
const newTrack = mediaManager.getMedia()?.track ?? null;
|
|
22
21
|
await tsClient.replaceTrack(currentTrackId, newTrack);
|
|
23
|
-
}
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
const currentTrackId =
|
|
27
|
-
if (currentTrackId)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// see `getRemoteOrLocalTrackContext()` explanation
|
|
36
|
-
currentTrackIdRef.current = media.track.id;
|
|
37
|
-
const deviceType = getDeviceType(mediaManager);
|
|
38
|
-
const trackMetadata = { type: deviceType, paused: false };
|
|
22
|
+
}, [getCurrentTrackId, startDevice, tsClient]);
|
|
23
|
+
const setTrackMiddleware = useCallback(async (middleware) => {
|
|
24
|
+
const processedTrack = applyMiddleware(middleware);
|
|
25
|
+
const currentTrackId = getCurrentTrackId();
|
|
26
|
+
if (!currentTrackId)
|
|
27
|
+
return;
|
|
28
|
+
await tsClient.replaceTrack(currentTrackId, processedTrack);
|
|
29
|
+
}, [applyMiddleware, getCurrentTrackId, tsClient]);
|
|
30
|
+
const startStreaming = useCallback(async (track, props = { simulcast: [Variant.VARIANT_LOW, Variant.VARIANT_MEDIUM, Variant.VARIANT_HIGH] }) => {
|
|
31
|
+
// temporarily setting the local trackId until we have the remoteTrackId
|
|
32
|
+
currentTrackIdRef.current = track.id;
|
|
33
|
+
const trackMetadata = { type, paused: false };
|
|
39
34
|
const displayName = tsClient.getLocalPeer()?.metadata?.peer?.displayName;
|
|
40
35
|
if (typeof displayName === "string") {
|
|
41
36
|
trackMetadata.displayName = displayName;
|
|
42
37
|
}
|
|
43
38
|
const [maxBandwidth, simulcastConfig] = getConfigAndBandwidthFromProps(props.simulcast, bandwidthLimits);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const pauseStreaming = useCallback(async () => {
|
|
59
|
-
const trackId = getCurrentTrackId();
|
|
60
|
-
if (!trackId)
|
|
39
|
+
try {
|
|
40
|
+
const remoteTrackId = await tsClient.addTrack(track, trackMetadata, simulcastConfig, maxBandwidth);
|
|
41
|
+
currentTrackIdRef.current = remoteTrackId;
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
if (err instanceof TrackTypeError) {
|
|
45
|
+
console.warn(err.message);
|
|
46
|
+
currentTrackIdRef.current = null;
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
50
|
+
}, [tsClient, type, bandwidthLimits]);
|
|
51
|
+
const pauseStreaming = useCallback(async (trackId) => {
|
|
52
|
+
if (peerStatus !== "connected")
|
|
61
53
|
return;
|
|
62
|
-
setPaused(true);
|
|
63
54
|
await tsClient.replaceTrack(trackId, null);
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const resumeStreaming = useCallback(async () => {
|
|
69
|
-
const trackId = getCurrentTrackId();
|
|
70
|
-
if (!trackId)
|
|
55
|
+
return tsClient.updateTrackMetadata(trackId, { type, paused: true });
|
|
56
|
+
}, [tsClient, type, peerStatus]);
|
|
57
|
+
const resumeStreaming = useCallback(async (trackId, track) => {
|
|
58
|
+
if (peerStatus !== "connected")
|
|
71
59
|
return;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
60
|
+
await tsClient.replaceTrack(trackId, track);
|
|
61
|
+
return tsClient.updateTrackMetadata(trackId, { type, paused: false });
|
|
62
|
+
}, [peerStatus, tsClient, type]);
|
|
63
|
+
/**
|
|
64
|
+
* @see {@link TrackManager#toggleMute} for more details.
|
|
65
|
+
*/
|
|
66
|
+
const toggleMute = useCallback(async () => {
|
|
67
|
+
const isTrackCurrentlyEnabled = Boolean(deviceTrack?.enabled);
|
|
68
|
+
const currentTrackId = getCurrentTrackId();
|
|
69
|
+
if (!currentTrackId) {
|
|
70
|
+
console.warn("Toggling mute is only possible while connected to a room.");
|
|
83
71
|
return;
|
|
84
|
-
const trackId = getRemoteOrLocalTrack(tsClient, currentTrackIdRef.current)?.trackId;
|
|
85
|
-
if (trackId) {
|
|
86
|
-
await resumeStreaming();
|
|
87
72
|
}
|
|
88
|
-
|
|
89
|
-
|
|
73
|
+
if (isTrackCurrentlyEnabled) {
|
|
74
|
+
disableDevice();
|
|
75
|
+
await pauseStreaming(currentTrackId);
|
|
90
76
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const mediaStream = mediaManager.getMedia()?.stream;
|
|
95
|
-
const track = mediaManager.getMedia()?.track ?? null;
|
|
96
|
-
const enabled = Boolean(track?.enabled);
|
|
97
|
-
const trackId = getRemoteOrLocalTrack(tsClient, currentTrackIdRef.current)?.trackId;
|
|
98
|
-
if (mediaStream && enabled) {
|
|
99
|
-
mediaManager.disable();
|
|
100
|
-
if (trackId) {
|
|
101
|
-
await pauseStreaming();
|
|
102
|
-
}
|
|
103
|
-
if (mode === "hard") {
|
|
104
|
-
mediaManager.stop();
|
|
105
|
-
}
|
|
77
|
+
else if (deviceTrack) {
|
|
78
|
+
enableDevice();
|
|
79
|
+
await resumeStreaming(currentTrackId, deviceTrack);
|
|
106
80
|
}
|
|
107
|
-
|
|
108
|
-
mediaManager.enable();
|
|
109
|
-
await stream();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
await mediaManager.start();
|
|
113
|
-
await stream();
|
|
114
|
-
}
|
|
115
|
-
}, [devicesInitializationRef, mediaManager, tsClient, pauseStreaming, stream]);
|
|
116
|
-
/**
|
|
117
|
-
* @see {@link TrackManager#toggleMute} for more details.
|
|
118
|
-
*/
|
|
119
|
-
const toggleMute = useCallback(() => toggle("soft"), [toggle]);
|
|
81
|
+
}, [deviceTrack, getCurrentTrackId, disableDevice, pauseStreaming, enableDevice, resumeStreaming]);
|
|
120
82
|
/**
|
|
121
83
|
* @see {@link TrackManager#toggleDevice} for more details.
|
|
122
84
|
*/
|
|
123
|
-
const toggleDevice = useCallback(() =>
|
|
85
|
+
const toggleDevice = useCallback(async () => {
|
|
86
|
+
const currentTrackId = getCurrentTrackId();
|
|
87
|
+
if (deviceTrack) {
|
|
88
|
+
stopDevice();
|
|
89
|
+
if (currentTrackId) {
|
|
90
|
+
pauseStreaming(currentTrackId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const [newTrack, error] = await startDevice();
|
|
95
|
+
if (error)
|
|
96
|
+
return error;
|
|
97
|
+
if (currentTrackId) {
|
|
98
|
+
await resumeStreaming(currentTrackId, newTrack);
|
|
99
|
+
}
|
|
100
|
+
else if (peerStatus === "connected") {
|
|
101
|
+
await startStreaming(newTrack, streamConfig);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}, [
|
|
105
|
+
getCurrentTrackId,
|
|
106
|
+
deviceTrack,
|
|
107
|
+
stopDevice,
|
|
108
|
+
pauseStreaming,
|
|
109
|
+
startDevice,
|
|
110
|
+
peerStatus,
|
|
111
|
+
resumeStreaming,
|
|
112
|
+
startStreaming,
|
|
113
|
+
streamConfig,
|
|
114
|
+
]);
|
|
124
115
|
useEffect(() => {
|
|
125
116
|
const onJoinedRoom = () => {
|
|
126
|
-
if (
|
|
127
|
-
startStreaming(streamConfig);
|
|
117
|
+
if (deviceTrack) {
|
|
118
|
+
startStreaming(deviceTrack, streamConfig);
|
|
128
119
|
}
|
|
129
120
|
};
|
|
130
121
|
const onLeftRoom = () => {
|
|
131
|
-
setPaused(true);
|
|
132
122
|
currentTrackIdRef.current = null;
|
|
133
123
|
};
|
|
134
124
|
tsClient.on("joined", onJoinedRoom);
|
|
@@ -137,9 +127,10 @@ export const useTrackManager = ({ mediaManager, tsClient, getCurrentPeerStatus,
|
|
|
137
127
|
tsClient.off("joined", onJoinedRoom);
|
|
138
128
|
tsClient.off("disconnected", onLeftRoom);
|
|
139
129
|
};
|
|
140
|
-
}, [
|
|
130
|
+
}, [deviceTrack, startStreaming, tsClient, streamConfig]);
|
|
141
131
|
return {
|
|
142
|
-
|
|
132
|
+
deviceTrack,
|
|
133
|
+
currentMiddleware,
|
|
143
134
|
setTrackMiddleware,
|
|
144
135
|
selectDevice,
|
|
145
136
|
toggleMute,
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TrackMiddleware } from "../../types/public";
|
|
2
|
+
export declare const useTrackMiddleware: (rawTrack: MediaStreamTrack | null) => {
|
|
3
|
+
processedTrack: MediaStreamTrack | null;
|
|
4
|
+
applyMiddleware: (newMiddleware: TrackMiddleware) => MediaStreamTrack | null;
|
|
5
|
+
currentMiddleware: TrackMiddleware;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=useTrackMiddleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrackMiddleware.d.ts","sourceRoot":"","sources":["../../../src/hooks/internal/useTrackMiddleware.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,GAAI,UAAU,gBAAgB,GAAG,IAAI;;qCAchD,eAAe;;CAkBlC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
2
|
+
export const useTrackMiddleware = (rawTrack) => {
|
|
3
|
+
const [currentMiddleware, setMiddleware] = useState(null);
|
|
4
|
+
const [processedTrack, setProcessedTrack] = useState(null);
|
|
5
|
+
const cleanupRef = useRef(undefined);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (!rawTrack && processedTrack) {
|
|
8
|
+
processedTrack.stop();
|
|
9
|
+
cleanupRef.current?.();
|
|
10
|
+
setProcessedTrack(null);
|
|
11
|
+
}
|
|
12
|
+
}, [rawTrack, processedTrack]);
|
|
13
|
+
const applyMiddleware = useCallback((newMiddleware) => {
|
|
14
|
+
cleanupRef.current?.();
|
|
15
|
+
setMiddleware(() => newMiddleware);
|
|
16
|
+
if (newMiddleware && rawTrack) {
|
|
17
|
+
const { track, onClear } = newMiddleware(rawTrack);
|
|
18
|
+
cleanupRef.current = onClear;
|
|
19
|
+
setProcessedTrack(track);
|
|
20
|
+
return track;
|
|
21
|
+
}
|
|
22
|
+
setProcessedTrack(null);
|
|
23
|
+
return rawTrack;
|
|
24
|
+
}, [rawTrack]);
|
|
25
|
+
return { processedTrack, applyMiddleware, currentMiddleware };
|
|
26
|
+
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { GenericMetadata
|
|
2
|
-
import type { PeerStatus } from "../types/public";
|
|
1
|
+
import type { GenericMetadata } from "@fishjam-cloud/ts-client";
|
|
3
2
|
export interface JoinRoomConfig<PeerMetadata extends GenericMetadata = GenericMetadata> {
|
|
4
3
|
/**
|
|
5
4
|
* Fishjam URL
|
|
@@ -31,9 +30,10 @@ export declare function useConnection(): {
|
|
|
31
30
|
/**
|
|
32
31
|
* Current peer connection status
|
|
33
32
|
*/
|
|
34
|
-
peerStatus: PeerStatus;
|
|
33
|
+
peerStatus: import("..").PeerStatus;
|
|
35
34
|
/**
|
|
36
35
|
* Current reconnection status
|
|
37
|
-
*/
|
|
36
|
+
*/
|
|
37
|
+
reconnectionStatus: import("@fishjam-cloud/ts-client").ReconnectionStatus;
|
|
38
38
|
};
|
|
39
39
|
//# sourceMappingURL=useConnection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConnection.d.ts","sourceRoot":"","sources":["../../src/hooks/useConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"useConnection.d.ts","sourceRoot":"","sources":["../../src/hooks/useConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAOhE,MAAM,WAAW,cAAc,CAAC,YAAY,SAAS,eAAe,GAAG,eAAe;IACpF;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,aAAa;IAuBzB;;OAEG;eAfF,YAAY,SAAS,eAAe,uDAIlC,cAAc,CAAC,YAAY,CAAC;IAa/B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;EAGN"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { useCallback } from "react";
|
|
2
|
-
import {
|
|
1
|
+
import { useCallback, useContext } from "react";
|
|
2
|
+
import { FishjamClientContext } from "../contexts/fishjamClient";
|
|
3
|
+
import { PeerStatusContext } from "../contexts/peerStatus";
|
|
3
4
|
import { useReconnection } from "./internal/useReconnection";
|
|
4
5
|
/**
|
|
5
6
|
* Hook allows to join or leave a room and check the current connection status.
|
|
@@ -7,14 +8,16 @@ import { useReconnection } from "./internal/useReconnection";
|
|
|
7
8
|
* @group Hooks
|
|
8
9
|
*/
|
|
9
10
|
export function useConnection() {
|
|
10
|
-
const
|
|
11
|
-
|
|
11
|
+
const fishjamClientRef = useContext(FishjamClientContext);
|
|
12
|
+
if (!fishjamClientRef)
|
|
13
|
+
throw Error("useConnection must be used within FishjamProvider");
|
|
14
|
+
const peerStatus = useContext(PeerStatusContext);
|
|
15
|
+
const client = fishjamClientRef.current;
|
|
12
16
|
const reconnectionStatus = useReconnection();
|
|
13
17
|
const joinRoom = useCallback(({ url, peerToken, peerMetadata, }) => client.connect({ url, token: peerToken, peerMetadata: peerMetadata ?? {} }), [client]);
|
|
14
18
|
const leaveRoom = useCallback(() => {
|
|
15
19
|
client.disconnect();
|
|
16
20
|
}, [client]);
|
|
17
|
-
const peerStatus = context.peerStatus;
|
|
18
21
|
return {
|
|
19
22
|
/**
|
|
20
23
|
* Join room and start streaming camera and microphone
|
|
@@ -30,6 +33,7 @@ export function useConnection() {
|
|
|
30
33
|
peerStatus,
|
|
31
34
|
/**
|
|
32
35
|
* Current reconnection status
|
|
33
|
-
*/
|
|
36
|
+
*/
|
|
37
|
+
reconnectionStatus,
|
|
34
38
|
};
|
|
35
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,QAAQ,EAAqC,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"usePeers.d.ts","sourceRoot":"","sources":["../../src/hooks/usePeers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,QAAQ,EAAqC,MAAM,0BAA0B,CAAC;AAKjH,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAW,MAAM,iBAAiB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,YAAY,EAAE,cAAc,IAAI;IACzD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,CAAC;IACxB,qBAAqB,CAAC,EAAE,KAAK,CAAC;IAC9B,qBAAqB,CAAC,EAAE,KAAK,CAAC;CAC/B,CAAC;AAgCF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAerG;;;OAGG;IACH;;OAEG;IACH;;;;OAIG;;EAGN"}
|
package/dist/hooks/usePeers.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import { FishjamClientStateContext } from "../contexts/fishjamState";
|
|
2
3
|
function trackContextToTrack(track) {
|
|
3
4
|
return {
|
|
4
5
|
metadata: track.metadata,
|
|
@@ -34,7 +35,9 @@ function getPeerWithDistinguishedTracks(peer) {
|
|
|
34
35
|
* @typeParam ServerMetadata Type of metadata set by the server while creating a peer.
|
|
35
36
|
*/
|
|
36
37
|
export function usePeers() {
|
|
37
|
-
const
|
|
38
|
+
const clientState = useContext(FishjamClientStateContext);
|
|
39
|
+
if (!clientState)
|
|
40
|
+
throw Error("usePeers must be used within FishjamProvider");
|
|
38
41
|
const localPeer = clientState.localPeer
|
|
39
42
|
? getPeerWithDistinguishedTracks(clientState.localPeer)
|
|
40
43
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,cAAc;IAKvB;;OAEG;;wBADoD,CAAC;wBAEpD,CAAC;;IACL;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;;;OAIG;;IAEH;;;;OAIG;;CAGN,CAAC"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import { ScreenshareContext } from "../contexts/screenshare";
|
|
2
3
|
/**
|
|
3
4
|
* Hook to enable screen sharing within a room and manage the existing stream.
|
|
4
5
|
* @category Devices
|
|
5
6
|
* @group Hooks
|
|
6
7
|
*/
|
|
7
8
|
export const useScreenShare = () => {
|
|
8
|
-
const
|
|
9
|
+
const screenShareManager = useContext(ScreenshareContext);
|
|
10
|
+
if (!screenShareManager)
|
|
11
|
+
throw Error("useScreenShare must be used within FishjamProvider");
|
|
9
12
|
return {
|
|
10
13
|
/**
|
|
11
14
|
* Invokes the screen sharing prompt in the user's browser and starts streaming upon approval.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStatistics.d.ts","sourceRoot":"","sources":["../../src/hooks/useStatistics.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;CAUzB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import { FishjamClientContext } from "../contexts/fishjamClient";
|
|
3
|
+
export const useStatistics = () => {
|
|
4
|
+
const client = useContext(FishjamClientContext);
|
|
5
|
+
if (!client)
|
|
6
|
+
throw new Error("useStatistics must be used within a FishjamProvider");
|
|
7
|
+
return {
|
|
8
|
+
/*
|
|
9
|
+
* Returns a low level RTCStatsReport statistics object about the connection.
|
|
10
|
+
*/
|
|
11
|
+
getStatistics: () => client.current.getStatistics(),
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpdatePeerMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useUpdatePeerMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,SAAS,eAAe;
|
|
1
|
+
{"version":3,"file":"useUpdatePeerMetadata.d.ts","sourceRoot":"","sources":["../../src/hooks/useUpdatePeerMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAKhE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,SAAS,eAAe,GAAG,eAAe;IAYxF;;OAEG;uCATY,YAAY;CAY9B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useCallback } from "react";
|
|
2
|
-
import {
|
|
1
|
+
import { useCallback, useContext } from "react";
|
|
2
|
+
import { FishjamClientContext } from "../contexts/fishjamClient";
|
|
3
3
|
/**
|
|
4
4
|
* Hook provides a method to update the metadata of the local peer.
|
|
5
5
|
* @category Connection
|
|
@@ -7,7 +7,9 @@ import { useFishjamContext } from "./internal/useFishjamContext";
|
|
|
7
7
|
* @returns
|
|
8
8
|
*/
|
|
9
9
|
export const useUpdatePeerMetadata = () => {
|
|
10
|
-
const
|
|
10
|
+
const fishjamClientRef = useContext(FishjamClientContext);
|
|
11
|
+
if (!fishjamClientRef)
|
|
12
|
+
throw Error("useUpdatePeerMetadata must be used within FishjamProvider");
|
|
11
13
|
const updatePeerMetadata = useCallback((peerMetadata) => {
|
|
12
14
|
fishjamClientRef.current.updatePeerMetadata(peerMetadata);
|
|
13
15
|
}, [fishjamClientRef]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useVAD.d.ts","sourceRoot":"","sources":["../../src/hooks/useVAD.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useVAD.d.ts","sourceRoot":"","sources":["../../src/hooks/useVAD.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,iBAAiB,CAAC;AAEvD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,MAAM,GAAI,aAAa;IAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAgE9F,CAAC"}
|
package/dist/hooks/useVAD.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { useEffect, useMemo, useState } from "react";
|
|
2
|
-
import {
|
|
3
|
-
import { useFishjamContext } from "./internal/useFishjamContext";
|
|
1
|
+
import { useContext, useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { FishjamClientStateContext } from "../contexts/fishjamState";
|
|
4
3
|
/**
|
|
5
4
|
* Voice activity detection. Use this hook to check if voice is detected in audio track for given peer(s).
|
|
6
5
|
*
|
|
@@ -19,14 +18,15 @@ import { useFishjamContext } from "./internal/useFishjamContext";
|
|
|
19
18
|
* @returns Each key is a peerId and the boolean value indicates if voice activity is currently detected for that peer.
|
|
20
19
|
*/
|
|
21
20
|
export const useVAD = ({ peerIds }) => {
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
const clientState = useContext(FishjamClientStateContext);
|
|
22
|
+
if (!clientState)
|
|
23
|
+
throw Error("useVAD must be used within FishjamProvider");
|
|
24
|
+
const micTracksWithSelectedPeerIds = useMemo(() => Object.values(clientState.peers)
|
|
25
25
|
.filter((peer) => peerIds.includes(peer.id))
|
|
26
26
|
.map((peer) => ({
|
|
27
27
|
peerId: peer.id,
|
|
28
28
|
microphoneTracks: Array.from(peer.tracks.values()).filter(({ metadata }) => metadata?.type === "microphone"),
|
|
29
|
-
})), [peers, peerIds]);
|
|
29
|
+
})), [clientState.peers, peerIds]);
|
|
30
30
|
const getDefaultVadStatuses = () => micTracksWithSelectedPeerIds.reduce((mappedTracks, peer) => ({
|
|
31
31
|
...mappedTracks,
|
|
32
32
|
[peer.peerId]: peer.microphoneTracks.reduce((vadStatuses, track) => ({ ...vadStatuses, [track.trackId]: track.vadStatus }), {}),
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export { FishjamProvider, type FishjamProviderProps } from "./FishjamProvider";
|
|
2
2
|
export { useCamera } from "./hooks/devices/useCamera";
|
|
3
|
-
export {
|
|
3
|
+
export { useInitializeDevices, UseInitializeDevicesParams } from "./hooks/devices/useInitializeDevices";
|
|
4
4
|
export { useMicrophone } from "./hooks/devices/useMicrophone";
|
|
5
5
|
export { type JoinRoomConfig, useConnection } from "./hooks/useConnection";
|
|
6
6
|
export { type PeerWithTracks, usePeers } from "./hooks/usePeers";
|
|
7
7
|
export { useScreenShare } from "./hooks/useScreenShare";
|
|
8
8
|
export { useUpdatePeerMetadata } from "./hooks/useUpdatePeerMetadata";
|
|
9
9
|
export { useVAD } from "./hooks/useVAD";
|
|
10
|
-
export type { BandwidthLimits, Brand, DeviceError, DeviceItem, PeerId, PeerStatus, PersistLastDeviceHandlers, SimulcastBandwidthLimits, StreamConfig, Track, TrackId, TrackMiddleware, TracksMiddleware, } from "./types/public";
|
|
10
|
+
export type { BandwidthLimits, Brand, DeviceError, DeviceItem, InitializeDevicesResult, InitializeDevicesStatus, PeerId, PeerStatus, PersistLastDeviceHandlers, SimulcastBandwidthLimits, StreamConfig, Track, TrackId, TrackMiddleware, TracksMiddleware, } from "./types/public";
|
|
11
11
|
export type { AuthErrorReason, JoinErrorReason, Metadata, ReconnectConfig, ReconnectionStatus, SimulcastBandwidthLimit, SimulcastConfig, TrackBandwidthLimit, } from "@fishjam-cloud/ts-client";
|
|
12
12
|
export { Variant } from "@fishjam-cloud/ts-client";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,KAAK,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,YAAY,EACV,eAAe,EACf,KAAK,EACL,WAAW,EACX,UAAU,EACV,uBAAuB,EACvB,uBAAuB,EACvB,MAAM,EACN,UAAU,EACV,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,KAAK,EACL,OAAO,EACP,eAAe,EACf,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,eAAe,EACf,eAAe,EACf,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { FishjamProvider } from "./FishjamProvider";
|
|
2
2
|
export { useCamera } from "./hooks/devices/useCamera";
|
|
3
|
-
export { useInitializeDevices
|
|
3
|
+
export { useInitializeDevices } from "./hooks/devices/useInitializeDevices";
|
|
4
4
|
export { useMicrophone } from "./hooks/devices/useMicrophone";
|
|
5
5
|
export { useConnection } from "./hooks/useConnection";
|
|
6
6
|
export { usePeers } from "./hooks/usePeers";
|
package/dist/types/internal.d.ts
CHANGED
|
@@ -1,49 +1,17 @@
|
|
|
1
1
|
import type { Peer } from "@fishjam-cloud/ts-client";
|
|
2
|
-
import type { DeviceError,
|
|
3
|
-
export type
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export interface DeviceManagerState {
|
|
7
|
-
deviceState: DeviceState;
|
|
8
|
-
deviceStatus: DeviceManagerStatus;
|
|
9
|
-
deviceType: DeviceType;
|
|
10
|
-
}
|
|
11
|
-
export type Media = {
|
|
12
|
-
stream: MediaStream | null;
|
|
13
|
-
track: MediaStreamTrack | null;
|
|
14
|
-
enabled: boolean;
|
|
15
|
-
deviceInfo: MediaDeviceInfo | null;
|
|
16
|
-
};
|
|
17
|
-
export type DeviceState = {
|
|
18
|
-
media: Media | null;
|
|
19
|
-
mediaStatus: MediaStatus;
|
|
20
|
-
devices: MediaDeviceInfo[] | null;
|
|
21
|
-
devicesStatus: DevicesStatus;
|
|
22
|
-
error: DeviceError | null;
|
|
23
|
-
currentMiddleware: TrackMiddleware | null;
|
|
2
|
+
import type { DeviceError, PeerId, TrackMiddleware, TracksMiddleware } from "./public";
|
|
3
|
+
export type AudioVideo<T> = {
|
|
4
|
+
audio: T;
|
|
5
|
+
video: T;
|
|
24
6
|
};
|
|
25
7
|
export type CurrentDevices = {
|
|
26
8
|
videoinput: MediaDeviceInfo | null;
|
|
27
9
|
audioinput: MediaDeviceInfo | null;
|
|
28
10
|
};
|
|
29
|
-
export interface MediaManager {
|
|
30
|
-
start: (deviceId?: string) => Promise<void>;
|
|
31
|
-
stop: () => void;
|
|
32
|
-
disable: () => void;
|
|
33
|
-
enable: () => void;
|
|
34
|
-
setTrackMiddleware: (middleware: TrackMiddleware | null) => void;
|
|
35
|
-
getMiddleware: () => TrackMiddleware | null;
|
|
36
|
-
getMedia: () => {
|
|
37
|
-
stream: MediaStream | null;
|
|
38
|
-
track: MediaStreamTrack | null;
|
|
39
|
-
enabled: boolean;
|
|
40
|
-
} | null;
|
|
41
|
-
getDeviceType: () => DeviceType;
|
|
42
|
-
}
|
|
43
11
|
export type ScreenShareState = ({
|
|
44
12
|
stream: MediaStream;
|
|
45
13
|
trackIds: {
|
|
46
|
-
videoId
|
|
14
|
+
videoId?: string;
|
|
47
15
|
audioId?: string;
|
|
48
16
|
};
|
|
49
17
|
} | {
|
|
@@ -53,8 +21,9 @@ export type ScreenShareState = ({
|
|
|
53
21
|
tracksMiddleware?: TracksMiddleware | null;
|
|
54
22
|
};
|
|
55
23
|
export interface TrackManager {
|
|
56
|
-
selectDevice: (deviceId?: string) => Promise<
|
|
57
|
-
|
|
24
|
+
selectDevice: (deviceId?: string) => Promise<undefined | DeviceError>;
|
|
25
|
+
deviceTrack: MediaStreamTrack | null;
|
|
26
|
+
currentMiddleware: TrackMiddleware;
|
|
58
27
|
setTrackMiddleware: (middleware: TrackMiddleware | null) => Promise<void>;
|
|
59
28
|
/**
|
|
60
29
|
* Either enables or disables the stream.
|
|
@@ -72,7 +41,7 @@ export interface TrackManager {
|
|
|
72
41
|
* - If started: disables the media stream, pauses streaming, and stops the device.
|
|
73
42
|
* - If stopped: starts the device and begins (or resumes) streaming.
|
|
74
43
|
*/
|
|
75
|
-
toggleDevice: () => Promise<
|
|
44
|
+
toggleDevice: () => Promise<undefined | DeviceError>;
|
|
76
45
|
}
|
|
77
46
|
export type BrandedPeer<P, S> = Omit<Peer<P, S>, "id"> & {
|
|
78
47
|
id: PeerId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/types/internal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG;IAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,gBAAgB,GAAG,CAC3B;IACE,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClD,GACD;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CACnC,GAAG;IAAE,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;IACtE,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,iBAAiB,EAAE,eAAe,CAAC;IACnC,kBAAkB,EAAE,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E;;;;;;;OAOG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC"}
|