@fishjam-cloud/react-client 0.6.0 → 0.7.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.
Files changed (111) hide show
  1. package/dist/DeviceManager.d.ts +15 -10
  2. package/dist/DeviceManager.d.ts.map +1 -1
  3. package/dist/DeviceManager.js +29 -35
  4. package/dist/constraints.d.ts +2 -22
  5. package/dist/constraints.d.ts.map +1 -1
  6. package/dist/constraints.js +11 -16
  7. package/dist/fishjamProvider.d.ts +10 -8
  8. package/dist/fishjamProvider.d.ts.map +1 -1
  9. package/dist/fishjamProvider.js +47 -23
  10. package/dist/hooks/deviceManagers/useAudioDeviceManager.d.ts +6 -0
  11. package/dist/hooks/deviceManagers/useAudioDeviceManager.d.ts.map +1 -0
  12. package/dist/hooks/deviceManagers/useAudioDeviceManager.js +11 -0
  13. package/dist/hooks/deviceManagers/useDeviceManager.d.ts +4 -0
  14. package/dist/hooks/deviceManagers/useDeviceManager.d.ts.map +1 -0
  15. package/dist/hooks/deviceManagers/useDeviceManager.js +39 -0
  16. package/dist/hooks/deviceManagers/useVideoDeviceManager.d.ts +6 -0
  17. package/dist/hooks/deviceManagers/useVideoDeviceManager.d.ts.map +1 -0
  18. package/dist/hooks/deviceManagers/useVideoDeviceManager.js +11 -0
  19. package/dist/hooks/internal.d.ts +2 -0
  20. package/dist/hooks/internal.d.ts.map +1 -0
  21. package/dist/hooks/internal.js +1 -0
  22. package/dist/hooks/public.d.ts +6 -6
  23. package/dist/hooks/public.d.ts.map +1 -1
  24. package/dist/hooks/public.js +6 -6
  25. package/dist/hooks/useConnection.d.ts +12 -0
  26. package/dist/hooks/useConnection.d.ts.map +1 -0
  27. package/dist/hooks/useConnection.js +20 -0
  28. package/dist/hooks/useDevices.d.ts +19 -0
  29. package/dist/hooks/useDevices.d.ts.map +1 -0
  30. package/dist/hooks/useDevices.js +98 -0
  31. package/dist/hooks/useFishjamClientState.d.ts +10 -0
  32. package/dist/hooks/useFishjamClientState.d.ts.map +1 -0
  33. package/dist/hooks/{clientState.js → useFishjamClientState.js} +49 -34
  34. package/dist/hooks/useFishjamClient_DO_NOT_USE.d.ts +7 -0
  35. package/dist/hooks/useFishjamClient_DO_NOT_USE.d.ts.map +1 -0
  36. package/dist/hooks/useFishjamClient_DO_NOT_USE.js +11 -0
  37. package/dist/hooks/useFishjamContext.d.ts +20 -0
  38. package/dist/hooks/useFishjamContext.d.ts.map +1 -0
  39. package/dist/hooks/usePeerStatus.d.ts +8 -0
  40. package/dist/hooks/usePeerStatus.d.ts.map +1 -0
  41. package/dist/hooks/usePeerStatus.js +39 -0
  42. package/dist/hooks/usePeers.d.ts +10 -0
  43. package/dist/hooks/usePeers.d.ts.map +1 -0
  44. package/dist/hooks/usePeers.js +19 -0
  45. package/dist/hooks/useProcessedPreviewStream.d.ts +3 -0
  46. package/dist/hooks/useProcessedPreviewStream.d.ts.map +1 -0
  47. package/dist/hooks/useProcessedPreviewStream.js +17 -0
  48. package/dist/hooks/useReconnection.d.ts +7 -0
  49. package/dist/hooks/useReconnection.d.ts.map +1 -0
  50. package/dist/hooks/useReconnection.js +31 -0
  51. package/dist/hooks/useScreenShare.d.ts +7 -0
  52. package/dist/hooks/useScreenShare.d.ts.map +1 -0
  53. package/dist/hooks/{screenShare.js → useScreenShare.js} +53 -24
  54. package/dist/hooks/useStatus.d.ts +6 -0
  55. package/dist/hooks/useStatus.d.ts.map +1 -0
  56. package/dist/hooks/useStatus.js +8 -0
  57. package/dist/hooks/useTrackManager.d.ts +11 -0
  58. package/dist/hooks/useTrackManager.d.ts.map +1 -0
  59. package/dist/hooks/useTrackManager.js +176 -0
  60. package/dist/index.d.ts +3 -8
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +2 -4
  63. package/dist/mediaInitializer.d.ts +2 -2
  64. package/dist/mediaInitializer.d.ts.map +1 -1
  65. package/dist/types/internal.d.ts +129 -0
  66. package/dist/types/internal.d.ts.map +1 -0
  67. package/dist/types/public.d.ts +65 -0
  68. package/dist/types/public.d.ts.map +1 -0
  69. package/dist/utils/errors.d.ts +1 -1
  70. package/dist/utils/errors.d.ts.map +1 -1
  71. package/dist/utils/media.d.ts +3 -2
  72. package/dist/utils/media.d.ts.map +1 -1
  73. package/dist/utils/track.d.ts +2 -2
  74. package/dist/utils/track.d.ts.map +1 -1
  75. package/dist/utils/track.js +0 -2
  76. package/package.json +12 -15
  77. package/readme.md +20 -118
  78. package/dist/Client.d.ts +0 -198
  79. package/dist/Client.d.ts.map +0 -1
  80. package/dist/Client.js +0 -461
  81. package/dist/hooks/clientState.d.ts +0 -4
  82. package/dist/hooks/clientState.d.ts.map +0 -1
  83. package/dist/hooks/connection.d.ts +0 -6
  84. package/dist/hooks/connection.d.ts.map +0 -1
  85. package/dist/hooks/connection.js +0 -28
  86. package/dist/hooks/devices.d.ts +0 -4
  87. package/dist/hooks/devices.d.ts.map +0 -1
  88. package/dist/hooks/devices.js +0 -9
  89. package/dist/hooks/fishjamContext.d.ts +0 -4
  90. package/dist/hooks/fishjamContext.d.ts.map +0 -1
  91. package/dist/hooks/participants.d.ts +0 -6
  92. package/dist/hooks/participants.d.ts.map +0 -1
  93. package/dist/hooks/participants.js +0 -13
  94. package/dist/hooks/screenShare.d.ts +0 -3
  95. package/dist/hooks/screenShare.d.ts.map +0 -1
  96. package/dist/hooks/setupMedia.d.ts +0 -3
  97. package/dist/hooks/setupMedia.d.ts.map +0 -1
  98. package/dist/hooks/setupMedia.js +0 -200
  99. package/dist/hooks/state.d.ts +0 -6
  100. package/dist/hooks/state.d.ts.map +0 -1
  101. package/dist/hooks/state.js +0 -15
  102. package/dist/state.types.d.ts +0 -55
  103. package/dist/state.types.d.ts.map +0 -1
  104. package/dist/trackManager.d.ts +0 -9
  105. package/dist/trackManager.d.ts.map +0 -1
  106. package/dist/trackManager.js +0 -116
  107. package/dist/types.d.ts +0 -235
  108. package/dist/types.d.ts.map +0 -1
  109. /package/dist/hooks/{fishjamContext.js → useFishjamContext.js} +0 -0
  110. /package/dist/{state.types.js → types/internal.js} +0 -0
  111. /package/dist/{types.js → types/public.js} +0 -0
@@ -1,200 +0,0 @@
1
- import { useEffect, useMemo, useRef } from "react";
2
- import { useFishjamContext } from "./fishjamContext";
3
- const isBroadcastedTrackChanged = (client, pending) => client.status === "joined" && !pending && !client.isReconnecting();
4
- const isBroadcastedTrackStopped = (status, stream) => status === "joined" && stream;
5
- export const useSetupMedia = (config) => {
6
- const { state, videoTrackManager, audioTrackManager } = useFishjamContext();
7
- const configRef = useRef(config);
8
- useEffect(() => {
9
- configRef.current = config;
10
- state.client.setDeviceManagerConfig({
11
- storage: config.storage,
12
- });
13
- }, [config, state.client]);
14
- useEffect(() => {
15
- if (!configRef.current.startOnMount)
16
- return;
17
- state.client.initializeDevices({
18
- audioTrackConstraints: configRef?.current.microphone.trackConstraints,
19
- videoTrackConstraints: configRef?.current.camera.trackConstraints,
20
- });
21
- // eslint-disable-next-line
22
- }, []);
23
- useEffect(() => {
24
- let pending = false;
25
- const broadcastOnCameraStart = async (client) => {
26
- const config = configRef.current.camera;
27
- const onDeviceChange = config.onDeviceChange ?? "replace";
28
- const stream = videoTrackManager.getCurrentTrack()?.stream;
29
- if (isBroadcastedTrackChanged(client, pending)) {
30
- if (!stream && config.broadcastOnDeviceStart) {
31
- pending = true;
32
- await videoTrackManager
33
- .startStreaming(config.defaultSimulcastConfig, config.defaultMaxBandwidth)
34
- .finally(() => {
35
- pending = false;
36
- });
37
- }
38
- else if (stream && onDeviceChange === "replace") {
39
- pending = true;
40
- await videoTrackManager.refreshStreamedTrack().finally(() => {
41
- pending = false;
42
- });
43
- }
44
- else if (stream && onDeviceChange === "remove") {
45
- pending = true;
46
- await videoTrackManager.stopStreaming().finally(() => {
47
- pending = false;
48
- });
49
- }
50
- }
51
- };
52
- const managerInitialized = async (event, client) => {
53
- if (event.video?.media?.stream) {
54
- await broadcastOnCameraStart(client);
55
- }
56
- };
57
- const devicesReady = async (event, client) => {
58
- if (event.trackType === "video" && event.restarted && event?.media?.stream) {
59
- await broadcastOnCameraStart(client);
60
- }
61
- };
62
- const deviceReady = async (event, client) => {
63
- if (event.trackType === "video") {
64
- await broadcastOnCameraStart(client);
65
- }
66
- };
67
- state.client.on("managerInitialized", managerInitialized);
68
- state.client.on("devicesReady", devicesReady);
69
- state.client.on("deviceReady", deviceReady);
70
- return () => {
71
- state.client.removeListener("managerInitialized", managerInitialized);
72
- state.client.removeListener("devicesReady", devicesReady);
73
- state.client.removeListener("deviceReady", deviceReady);
74
- };
75
- }, [state.client, videoTrackManager]);
76
- useEffect(() => {
77
- const removeOnCameraStopped = async (event, client) => {
78
- const stream = videoTrackManager.getCurrentTrack()?.stream;
79
- const onDeviceStop = configRef.current.camera.onDeviceStop ?? "mute";
80
- if (event.mediaDeviceType === "userMedia" &&
81
- event.trackType === "video" &&
82
- isBroadcastedTrackStopped(client.status, stream)) {
83
- if (onDeviceStop === "mute") {
84
- await videoTrackManager.pauseStreaming();
85
- }
86
- else {
87
- await videoTrackManager.stopStreaming();
88
- }
89
- }
90
- };
91
- state.client.on("deviceStopped", removeOnCameraStopped);
92
- return () => {
93
- state.client.removeListener("deviceStopped", removeOnCameraStopped);
94
- };
95
- }, [state.client, videoTrackManager]);
96
- useEffect(() => {
97
- const broadcastCameraOnConnect = async (_, client) => {
98
- const camera = client.devices.camera;
99
- const stream = camera.stream;
100
- const config = configRef.current.camera;
101
- if (stream && config.broadcastOnConnect) {
102
- await videoTrackManager.startStreaming(config.defaultSimulcastConfig, config.defaultMaxBandwidth);
103
- }
104
- };
105
- state.client.on("joined", broadcastCameraOnConnect);
106
- return () => {
107
- state.client.removeListener("joined", broadcastCameraOnConnect);
108
- };
109
- }, [state.client, videoTrackManager]);
110
- useEffect(() => {
111
- let pending = false;
112
- const broadcastOnMicrophoneStart = async (client) => {
113
- const stream = audioTrackManager.getCurrentTrack()?.stream;
114
- const config = configRef.current.microphone;
115
- const onDeviceChange = config.onDeviceChange ?? "replace";
116
- if (isBroadcastedTrackChanged(client, pending)) {
117
- if (!stream && config.broadcastOnDeviceStart) {
118
- pending = true;
119
- await audioTrackManager.startStreaming(undefined, config.defaultMaxBandwidth).finally(() => {
120
- pending = false;
121
- });
122
- }
123
- else if (stream && onDeviceChange === "replace") {
124
- pending = true;
125
- await audioTrackManager.refreshStreamedTrack().finally(() => {
126
- pending = false;
127
- });
128
- }
129
- else if (stream && onDeviceChange === "remove") {
130
- pending = true;
131
- await audioTrackManager.stopStreaming().finally(() => {
132
- pending = false;
133
- });
134
- }
135
- }
136
- };
137
- const managerInitialized = async (event, client) => {
138
- if (event.audio?.media?.stream) {
139
- await broadcastOnMicrophoneStart(client);
140
- }
141
- };
142
- const devicesReady = async (event, client) => {
143
- if (event.trackType === "audio" && event.restarted && event?.media?.stream) {
144
- await broadcastOnMicrophoneStart(client);
145
- }
146
- };
147
- const deviceReady = async (event, client) => {
148
- if (event.trackType === "audio") {
149
- await broadcastOnMicrophoneStart(client);
150
- }
151
- };
152
- state.client.on("managerInitialized", managerInitialized);
153
- state.client.on("deviceReady", deviceReady);
154
- state.client.on("devicesReady", devicesReady);
155
- return () => {
156
- state.client.removeListener("managerInitialized", managerInitialized);
157
- state.client.removeListener("deviceReady", deviceReady);
158
- state.client.removeListener("devicesReady", devicesReady);
159
- };
160
- }, [state.client, audioTrackManager]);
161
- useEffect(() => {
162
- const onMicrophoneStopped = async (event, client) => {
163
- const stream = audioTrackManager.getCurrentTrack()?.stream;
164
- const onDeviceStop = configRef.current.microphone.onDeviceStop ?? "mute";
165
- const isRightDeviceType = event.mediaDeviceType === "userMedia";
166
- const isRightTrackType = event.trackType === "audio";
167
- if (isRightDeviceType && isRightTrackType && isBroadcastedTrackStopped(client.status, stream)) {
168
- if (onDeviceStop === "mute") {
169
- await audioTrackManager.pauseStreaming();
170
- }
171
- else {
172
- await audioTrackManager.stopStreaming();
173
- }
174
- }
175
- };
176
- state.client.on("deviceStopped", onMicrophoneStopped);
177
- return () => {
178
- state.client.removeListener("deviceStopped", onMicrophoneStopped);
179
- };
180
- }, [state.client, audioTrackManager]);
181
- useEffect(() => {
182
- const broadcastMicrophoneOnConnect = async (_, client) => {
183
- const config = configRef.current.microphone;
184
- const microphone = client.devices.microphone;
185
- if (microphone.stream && config.broadcastOnConnect) {
186
- await audioTrackManager.startStreaming(undefined, config.defaultMaxBandwidth);
187
- }
188
- };
189
- state.client.on("joined", broadcastMicrophoneOnConnect);
190
- return () => {
191
- state.client.removeListener("joined", broadcastMicrophoneOnConnect);
192
- };
193
- }, [state.client, audioTrackManager]);
194
- return useMemo(() => ({
195
- init: () => state.client.initializeDevices({
196
- audioTrackConstraints: configRef.current?.microphone?.trackConstraints,
197
- videoTrackConstraints: configRef.current?.camera?.trackConstraints,
198
- }),
199
- }), [state.client]);
200
- };
@@ -1,6 +0,0 @@
1
- import type { Selector } from "../state.types";
2
- export declare function useSelector<Result>(selector: Selector<Result>): Result;
3
- export declare function useStatus(): import("../state.types").PeerStatus;
4
- export declare function useTracks(): Record<string, import("../state.types").TrackWithOrigin>;
5
- export declare function useClient(): import("..").Client;
6
- //# sourceMappingURL=state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/hooks/state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,wBAAgB,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,CAItE;AAED,wBAAgB,SAAS,wCAExB;AAED,wBAAgB,SAAS,6DAExB;AAED,wBAAgB,SAAS,wBAExB"}
@@ -1,15 +0,0 @@
1
- import { useMemo } from "react";
2
- import { useFishjamContext } from "./fishjamContext";
3
- export function useSelector(selector) {
4
- const { state } = useFishjamContext();
5
- return useMemo(() => selector(state), [selector, state]);
6
- }
7
- export function useStatus() {
8
- return useSelector((s) => s.status);
9
- }
10
- export function useTracks() {
11
- return useSelector((s) => s.tracks);
12
- }
13
- export function useClient() {
14
- return useSelector((s) => s.client);
15
- }
@@ -1,55 +0,0 @@
1
- import type { Encoding, VadStatus, SimulcastConfig, ReconnectionStatus } from "@fishjam-cloud/ts-client";
2
- import type { MediaState, PeerMetadata, TrackMetadata } from "./types";
3
- import type { Devices } from "./types";
4
- import type { Client } from "./Client";
5
- export type TrackId = string;
6
- export type PeerId = string;
7
- export type Track = {
8
- stream: MediaStream | null;
9
- encoding: Encoding | null;
10
- trackId: TrackId;
11
- metadata?: TrackMetadata;
12
- rawMetadata: Record<string, unknown>;
13
- metadataParsingError?: any;
14
- simulcastConfig: SimulcastConfig | null;
15
- vadStatus: VadStatus;
16
- track: MediaStreamTrack | null;
17
- };
18
- export interface Origin {
19
- id: string;
20
- type: string;
21
- metadata?: PeerMetadata;
22
- rawMetadata: Record<string, unknown>;
23
- metadataParsingError?: any;
24
- }
25
- export type TrackWithOrigin = Track & {
26
- origin: Origin;
27
- };
28
- export type PeerState = {
29
- id: PeerId;
30
- metadata?: PeerMetadata;
31
- rawMetadata: Record<string, unknown>;
32
- metadataParsingError?: any;
33
- tracks: Record<TrackId, Track>;
34
- };
35
- export type PeerStatus = "connecting" | "connected" | "authenticated" | "joined" | "error" | "closed" | null;
36
- export type UseReconnection = {
37
- status: ReconnectionStatus;
38
- isReconnecting: boolean;
39
- isError: boolean;
40
- isIdle: boolean;
41
- };
42
- export type State = {
43
- local: PeerState | null;
44
- remote: Record<PeerId, PeerState>;
45
- tracks: Record<TrackId, TrackWithOrigin>;
46
- bandwidthEstimation: bigint;
47
- status: PeerStatus;
48
- media: MediaState | null;
49
- devices: Devices;
50
- client: Client;
51
- reconnectionStatus: ReconnectionStatus;
52
- };
53
- export type SetStore = (setter: (prevState: State) => State) => void;
54
- export type Selector<Result> = (snapshot: State) => Result;
55
- //# sourceMappingURL=state.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.types.d.ts","sourceRoot":"","sources":["../src/state.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACzG,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,SAAS,EAAE,SAAS,CAAC;IACrB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,GAAG,CAAC;CAC5B;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,WAAW,GAAG,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;AAE7G,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,kBAAkB,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAErE,MAAM,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { FishjamClient } from "@fishjam-cloud/ts-client";
2
- import type { MediaManager, PeerMetadata, TrackManager, TrackMetadata } from "./types";
3
- interface TrackManagerConfig {
4
- mediaManager: MediaManager;
5
- tsClient: FishjamClient<PeerMetadata, TrackMetadata>;
6
- }
7
- export declare const useTrackManager: ({ mediaManager, tsClient }: TrackManagerConfig) => TrackManager;
8
- export {};
9
- //# sourceMappingURL=trackManager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"trackManager.d.ts","sourceRoot":"","sources":["../src/trackManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAwC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAmB,MAAM,SAAS,CAAC;AAKxG,UAAU,kBAAkB;IAC1B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,aAAa,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;CACtD;AAOD,eAAO,MAAM,eAAe,+BAAgC,kBAAkB,KAAG,YA6IhF,CAAC"}
@@ -1,116 +0,0 @@
1
- import { getRemoteOrLocalTrack } from "./utils/track";
2
- import { useEffect, useState } from "react";
3
- const TRACK_TYPE_TO_DEVICE = {
4
- video: "camera",
5
- audio: "microphone",
6
- };
7
- export const useTrackManager = ({ mediaManager, tsClient }) => {
8
- const [currentTrackId, setCurrentTrackId] = useState(null);
9
- const [paused, setPaused] = useState(false);
10
- const [currentTrackMiddleware, setCurrentTrackMiddleware] = useState(null);
11
- const type = TRACK_TYPE_TO_DEVICE[mediaManager.getDeviceType()];
12
- const metadata = { type, paused };
13
- useEffect(() => {
14
- const disconnectedHandler = () => {
15
- setCurrentTrackId(null);
16
- };
17
- tsClient.on("disconnected", disconnectedHandler);
18
- return () => {
19
- tsClient.off("disconnected", disconnectedHandler);
20
- };
21
- }, [tsClient]);
22
- function getPreviousTrack() {
23
- if (!currentTrackId)
24
- throw Error("There is no current track id");
25
- const prevTrack = getRemoteOrLocalTrack(tsClient, currentTrackId);
26
- if (!prevTrack)
27
- throw Error("There is no previous track");
28
- return prevTrack;
29
- }
30
- async function setTrackMiddleware(middleware) {
31
- const currentTrack = getCurrentTrack();
32
- const mediaTrack = mediaManager.getTracks()[0];
33
- if (!currentTrack || !mediaTrack)
34
- return;
35
- const trackToSet = middleware ? middleware(mediaTrack) : mediaTrack;
36
- await tsClient.replaceTrack(currentTrack.trackId, trackToSet);
37
- setCurrentTrackMiddleware(() => middleware);
38
- }
39
- function getCurrentTrack() {
40
- return getRemoteOrLocalTrack(tsClient, currentTrackId);
41
- }
42
- function initialize(deviceId) {
43
- return mediaManager?.start(deviceId ?? true);
44
- }
45
- function stop() {
46
- return mediaManager?.stop();
47
- }
48
- async function startStreaming(simulcastConfig, maxBandwidth) {
49
- if (currentTrackId)
50
- throw Error("Track already added");
51
- const media = mediaManager.getMedia();
52
- if (!media || !media.stream || !media.track)
53
- throw Error("Device is unavailable");
54
- const track = getRemoteOrLocalTrack(tsClient, currentTrackId);
55
- if (track)
56
- return track.trackId;
57
- // see `getRemoteOrLocalTrackContext()` explanation
58
- setCurrentTrackId(media.track.id);
59
- const trackMetadata = { ...metadata, paused: false };
60
- const remoteTrackId = await tsClient.addTrack(media.track, trackMetadata, simulcastConfig, maxBandwidth);
61
- setCurrentTrackId(remoteTrackId);
62
- setPaused(false);
63
- return remoteTrackId;
64
- }
65
- function refreshStreamedTrack() {
66
- const prevTrack = getPreviousTrack();
67
- const newTrack = mediaManager.getTracks()[0];
68
- if (!newTrack)
69
- throw Error("New track is empty");
70
- return tsClient.replaceTrack(prevTrack.trackId, newTrack);
71
- }
72
- function stopStreaming() {
73
- const prevTrack = getPreviousTrack();
74
- setCurrentTrackId(null);
75
- setPaused(true);
76
- return tsClient.removeTrack(prevTrack.trackId);
77
- }
78
- async function pauseStreaming() {
79
- const prevTrack = getPreviousTrack();
80
- setPaused(true);
81
- await tsClient.replaceTrack(prevTrack.trackId, null);
82
- const trackMetadata = { ...metadata, paused: true };
83
- return tsClient.updateTrackMetadata(prevTrack.trackId, trackMetadata);
84
- }
85
- async function resumeStreaming() {
86
- const prevTrack = getPreviousTrack();
87
- const media = mediaManager.getMedia();
88
- if (!media)
89
- throw Error("Device is unavailable");
90
- setPaused(false);
91
- await tsClient.replaceTrack(prevTrack.trackId, media.track);
92
- const trackMetadata = { ...metadata, paused: false };
93
- return tsClient.updateTrackMetadata(prevTrack.trackId, trackMetadata);
94
- }
95
- function disableTrack() {
96
- mediaManager.disable();
97
- }
98
- function enableTrack() {
99
- mediaManager.enable();
100
- }
101
- return {
102
- getCurrentTrack,
103
- setTrackMiddleware,
104
- initialize,
105
- stop,
106
- startStreaming,
107
- stopStreaming,
108
- pauseStreaming,
109
- resumeStreaming,
110
- disableTrack,
111
- enableTrack,
112
- currentTrackMiddleware,
113
- refreshStreamedTrack,
114
- paused,
115
- };
116
- };
package/dist/types.d.ts DELETED
@@ -1,235 +0,0 @@
1
- import type { ConnectConfig as TSClientConnectConfig, SimulcastConfig, TrackBandwidthLimit, TrackKind } from "@fishjam-cloud/ts-client";
2
- import type { PeerState, PeerStatus, Selector, State, Track, TrackId, TrackWithOrigin, UseReconnection } from "./state.types";
3
- import type { JSX, PropsWithChildren } from "react";
4
- import type { Client } from "./Client";
5
- export type PeerMetadata = {
6
- displayName?: string;
7
- };
8
- export type TrackMetadata = {
9
- type: "camera" | "microphone" | "screenShareVideo" | "screenShareAudio";
10
- paused: boolean;
11
- displayName?: string;
12
- };
13
- export type DevicesStatus = "OK" | "Error" | "Not requested" | "Requesting";
14
- export type MediaStatus = "OK" | "Error" | "Not requested" | "Requesting";
15
- export type Media = {
16
- stream: MediaStream | null;
17
- track: MediaStreamTrack | null;
18
- enabled: boolean;
19
- deviceInfo: MediaDeviceInfo | null;
20
- };
21
- export type DeviceState = {
22
- media: Media | null;
23
- mediaStatus: MediaStatus;
24
- devices: MediaDeviceInfo[] | null;
25
- devicesStatus: DevicesStatus;
26
- error: DeviceError | null;
27
- };
28
- export type MediaState = {
29
- video: DeviceState;
30
- audio: DeviceState;
31
- };
32
- export type DeviceManagerInitConfig = {
33
- videoTrackConstraints?: boolean | MediaTrackConstraints;
34
- audioTrackConstraints?: boolean | MediaTrackConstraints;
35
- };
36
- export type DeviceManagerConfig = {
37
- trackConstraints?: boolean | MediaTrackConstraints;
38
- startOnMount?: boolean;
39
- storage?: boolean | StorageConfig;
40
- };
41
- export type StorageConfig = {
42
- getLastDevice: (() => MediaDeviceInfo | null) | null;
43
- saveLastDevice: (info: MediaDeviceInfo) => void;
44
- };
45
- export type DeviceManagerStartConfig = {
46
- audioDeviceId?: string | boolean;
47
- videoDeviceId?: string | boolean;
48
- };
49
- export type DeviceError = {
50
- name: "OverconstrainedError";
51
- } | {
52
- name: "NotAllowedError";
53
- } | {
54
- name: "NotFoundError";
55
- } | {
56
- name: "UNHANDLED_ERROR";
57
- };
58
- export type CurrentDevices = {
59
- videoinput: MediaDeviceInfo | null;
60
- audioinput: MediaDeviceInfo | null;
61
- };
62
- export type UseSetupMediaConfig = {
63
- camera: {
64
- /**
65
- * Determines whether broadcasting should start when the user connects to the server with an active camera stream.
66
- */
67
- broadcastOnConnect?: boolean;
68
- /**
69
- * Determines whether broadcasting should start when the user initiates the camera and is connected to the server.
70
- */
71
- broadcastOnDeviceStart?: boolean;
72
- /**
73
- * Determines whether track should be replaced when the user requests a device.
74
- * default: replace
75
- */
76
- onDeviceChange?: "replace" | "remove";
77
- /**
78
- * Determines whether currently broadcasted track should be removed or muted
79
- * when the user stopped a device.
80
- * default: replace
81
- */
82
- onDeviceStop?: "remove" | "mute";
83
- trackConstraints: boolean | MediaTrackConstraints;
84
- defaultSimulcastConfig?: SimulcastConfig;
85
- defaultMaxBandwidth?: TrackBandwidthLimit;
86
- };
87
- microphone: {
88
- /**
89
- * Determines whether broadcasting should start when the user connects to the server with an active camera stream.
90
- */
91
- broadcastOnConnect?: boolean;
92
- /**
93
- * Determines whether broadcasting should start when the user initiates the camera and is connected to the server.
94
- */
95
- broadcastOnDeviceStart?: boolean;
96
- /**
97
- * Determines whether currently broadcasted track should be replaced or stopped
98
- * when the user changed a device.
99
- * default: replace
100
- */
101
- onDeviceChange?: "replace" | "remove";
102
- /**
103
- * Determines whether currently broadcasted track should be removed or muted
104
- * when the user stopped a device.
105
- * default: replace
106
- */
107
- onDeviceStop?: "remove" | "mute";
108
- trackConstraints: boolean | MediaTrackConstraints;
109
- defaultMaxBandwidth?: TrackBandwidthLimit;
110
- };
111
- screenShare: {
112
- /**
113
- * Determines whether broadcasting should start when the user connects to the server with an active camera stream.
114
- */
115
- broadcastOnConnect?: boolean;
116
- /**
117
- * Determines whether broadcasting should start when the user initiates the camera and is connected to the server.
118
- */
119
- broadcastOnDeviceStart?: boolean;
120
- defaultMaxBandwidth?: TrackBandwidthLimit;
121
- };
122
- startOnMount?: boolean;
123
- storage?: boolean | StorageConfig;
124
- };
125
- export type UseSetupMediaResult = {
126
- init: () => void;
127
- };
128
- export interface MediaManager {
129
- start: (deviceId?: string | boolean) => Promise<void>;
130
- stop: () => Promise<void>;
131
- disable: () => void;
132
- enable: () => void;
133
- getTracks: () => MediaStreamTrack[];
134
- getMedia: () => {
135
- stream: MediaStream | null;
136
- track: MediaStreamTrack | null;
137
- enabled: boolean;
138
- } | null;
139
- getDeviceType: () => "audio" | "video";
140
- }
141
- export type TrackMiddleware = ((track: MediaStreamTrack | null) => MediaStreamTrack | null) | null;
142
- export type ScreenshareState = {
143
- stream: MediaStream;
144
- trackIds: {
145
- videoId: string;
146
- audioId?: string;
147
- };
148
- tracksMiddleware?: TracksMiddleware | null;
149
- } | null;
150
- export interface TrackManager {
151
- initialize: (deviceId?: string) => Promise<void>;
152
- stop: () => Promise<void>;
153
- startStreaming: (simulcastConfig?: SimulcastConfig, maxBandwidth?: TrackBandwidthLimit) => Promise<string>;
154
- stopStreaming: () => Promise<void>;
155
- pauseStreaming: () => Promise<void>;
156
- resumeStreaming: () => Promise<void>;
157
- paused: boolean;
158
- disableTrack: () => void;
159
- enableTrack: () => void;
160
- setTrackMiddleware: (middleware: TrackMiddleware) => Promise<void>;
161
- currentTrackMiddleware: TrackMiddleware;
162
- refreshStreamedTrack: () => Promise<void>;
163
- getCurrentTrack: () => Track | null;
164
- }
165
- export type UserMediaAPI = {
166
- status: DevicesStatus | null;
167
- stream: MediaStream | null;
168
- track: MediaStreamTrack | null;
169
- enabled: boolean;
170
- mediaStatus: MediaStatus | null;
171
- deviceInfo: MediaDeviceInfo | null;
172
- error: DeviceError | null;
173
- devices: MediaDeviceInfo[] | null;
174
- };
175
- export type TrackManagerState = {
176
- currentTrackId: TrackId | null;
177
- currentTrackMiddleware: TrackMiddleware;
178
- };
179
- export type ScreenshareApi = {
180
- startStreaming: (props?: {
181
- audioConstraints?: boolean | MediaTrackConstraints;
182
- videoConstraints?: boolean | MediaTrackConstraints;
183
- }) => Promise<void>;
184
- stopStreaming: () => Promise<void>;
185
- stream: MediaStream | null;
186
- videoTrack: MediaStreamTrack | null;
187
- audioTrack: MediaStreamTrack | null;
188
- videoBroadcast: Track | null;
189
- audioBroadcast: Track | null;
190
- setTracksMiddleware: (middleware: TracksMiddleware | null) => Promise<void>;
191
- currentTracksMiddleware: TracksMiddleware | null;
192
- };
193
- export type Devices = {
194
- camera: UserMediaAPI;
195
- microphone: UserMediaAPI;
196
- };
197
- export type TracksMiddleware = (videoTrack: MediaStreamTrack, audioTrack: MediaStreamTrack | null) => [MediaStreamTrack, MediaStreamTrack | null];
198
- export type FishjamContextType = {
199
- state: State;
200
- screenshareState: [ScreenshareState, React.Dispatch<React.SetStateAction<ScreenshareState>>];
201
- videoTrackManager: TrackManager;
202
- audioTrackManager: TrackManager;
203
- };
204
- export type ConnectConfig = Omit<TSClientConnectConfig<PeerMetadata>, "peerMetadata"> & {
205
- peerMetadata?: PeerMetadata;
206
- };
207
- export type UseConnect = (config: ConnectConfig) => () => void;
208
- type DistinguishedTracks = {
209
- videoTracks: Track[];
210
- audioTracks: Track[];
211
- };
212
- export type PeerStateWithTracks = PeerState & DistinguishedTracks;
213
- export type Participiants = {
214
- localParticipant: PeerStateWithTracks | null;
215
- participants: PeerStateWithTracks[];
216
- };
217
- export type CreateFishjamClient = {
218
- FishjamContextProvider: ({ children }: PropsWithChildren) => JSX.Element;
219
- useConnect: () => (config: ConnectConfig) => () => void;
220
- useDisconnect: () => () => void;
221
- useStatus: () => PeerStatus;
222
- useSelector: <Result>(selector: Selector<Result>) => Result;
223
- useTracks: () => Record<TrackId, TrackWithOrigin>;
224
- useSetupMedia: (config: UseSetupMediaConfig) => UseSetupMediaResult;
225
- useCamera: () => Devices["camera"] & TrackManager;
226
- useMicrophone: () => Devices["microphone"] & TrackManager;
227
- useClient: () => Client;
228
- useReconnection: () => UseReconnection;
229
- useParticipants: () => Participiants;
230
- useScreenShare: () => ScreenshareApi;
231
- };
232
- export type TrackType = TrackKind | "audiovideo";
233
- export type MediaDeviceType = "displayMedia" | "userMedia";
234
- export {};
235
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,IAAI,qBAAqB,EACtC,eAAe,EACf,mBAAmB,EACnB,SAAS,EACV,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,KAAK,EACL,KAAK,EACL,OAAO,EACP,eAAe,EACf,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;IACxE,MAAM,EAAE,OAAO,CAAC;IAEhB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,OAAO,GAAG,eAAe,GAAG,YAAY,CAAC;AAC5E,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,GAAG,eAAe,GAAG,YAAY,CAAC;AAE1E,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,qBAAqB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;IACxD,qBAAqB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,cAAc,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC3B;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG;IAAE,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE;QACN;;WAEG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;WAEG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC;;;WAGG;QACH,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;QACtC;;;;WAIG;QACH,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;QAEjC,gBAAgB,EAAE,OAAO,GAAG,qBAAqB,CAAC;QAClD,sBAAsB,CAAC,EAAE,eAAe,CAAC;QACzC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,UAAU,EAAE;QACV;;WAEG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;WAEG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QACjC;;;;WAIG;QACH,cAAc,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;QAEtC;;;;WAIG;QACH,YAAY,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;QAEjC,gBAAgB,EAAE,OAAO,GAAG,qBAAqB,CAAC;QAClD,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,WAAW,EAAE;QACX;;WAEG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B;;WAEG;QACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;QAEjC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IACF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,gBAAgB,EAAE,CAAC;IACpC,QAAQ,EAAE,MAAM;QAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACxG,aAAa,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,KAAK,gBAAgB,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAEnG,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC5C,GAAG,IAAI,CAAC;AAET,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,cAAc,EAAE,CAAC,eAAe,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3G,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,kBAAkB,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,sBAAsB,EAAE,eAAe,CAAC;IACxC,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,eAAe,EAAE,MAAM,KAAK,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,sBAAsB,EAAE,eAAe,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE;QACvB,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;QACnD,gBAAgB,CAAC,EAAE,OAAO,GAAG,qBAAqB,CAAC;KACpD,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACpC,cAAc,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,cAAc,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,uBAAuB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,UAAU,EAAE,YAAY,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAC7B,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,gBAAgB,GAAG,IAAI,KAChC,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,gBAAgB,EAAE,CAAC,gBAAgB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC7F,iBAAiB,EAAE,YAAY,CAAC;IAChC,iBAAiB,EAAE,YAAY,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE,cAAc,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC;AACxH,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,IAAI,CAAC;AAE/D,KAAK,mBAAmB,GAAG;IACzB,WAAW,EAAE,KAAK,EAAE,CAAC;IACrB,WAAW,EAAE,KAAK,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG;IAC1B,gBAAgB,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC7C,YAAY,EAAE,mBAAmB,EAAE,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,sBAAsB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,KAAK,GAAG,CAAC,OAAO,CAAC;IACzE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,IAAI,CAAC;IACxD,aAAa,EAAE,MAAM,MAAM,IAAI,CAAC;IAChC,SAAS,EAAE,MAAM,UAAU,CAAC;IAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC;IAC5D,SAAS,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAClD,aAAa,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,mBAAmB,CAAC;IACpE,SAAS,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;IAClD,aAAa,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;IAC1D,SAAS,EAAE,MAAM,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,eAAe,CAAC;IACvC,eAAe,EAAE,MAAM,aAAa,CAAC;IACrC,cAAc,EAAE,MAAM,cAAc,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AACjD,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,WAAW,CAAC"}
File without changes