@edge-base/web 0.1.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 (51) hide show
  1. package/README.md +352 -0
  2. package/dist/analytics.d.ts +60 -0
  3. package/dist/analytics.d.ts.map +1 -0
  4. package/dist/analytics.js +146 -0
  5. package/dist/analytics.js.map +1 -0
  6. package/dist/auth-refresh.d.ts +5 -0
  7. package/dist/auth-refresh.d.ts.map +1 -0
  8. package/dist/auth-refresh.js +26 -0
  9. package/dist/auth-refresh.js.map +1 -0
  10. package/dist/auth.d.ts +314 -0
  11. package/dist/auth.d.ts.map +1 -0
  12. package/dist/auth.js +518 -0
  13. package/dist/auth.js.map +1 -0
  14. package/dist/browser-storage.d.ts +7 -0
  15. package/dist/browser-storage.d.ts.map +1 -0
  16. package/dist/browser-storage.js +43 -0
  17. package/dist/browser-storage.js.map +1 -0
  18. package/dist/client.d.ts +145 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +310 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/database-live.d.ts +65 -0
  23. package/dist/database-live.d.ts.map +1 -0
  24. package/dist/database-live.js +486 -0
  25. package/dist/database-live.js.map +1 -0
  26. package/dist/index.d.ts +21 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +28 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/match-filter.d.ts +30 -0
  31. package/dist/match-filter.d.ts.map +1 -0
  32. package/dist/match-filter.js +86 -0
  33. package/dist/match-filter.js.map +1 -0
  34. package/dist/room-realtime-media.d.ts +96 -0
  35. package/dist/room-realtime-media.d.ts.map +1 -0
  36. package/dist/room-realtime-media.js +418 -0
  37. package/dist/room-realtime-media.js.map +1 -0
  38. package/dist/room.d.ts +450 -0
  39. package/dist/room.d.ts.map +1 -0
  40. package/dist/room.js +1506 -0
  41. package/dist/room.js.map +1 -0
  42. package/dist/token-manager.d.ts +73 -0
  43. package/dist/token-manager.d.ts.map +1 -0
  44. package/dist/token-manager.js +378 -0
  45. package/dist/token-manager.js.map +1 -0
  46. package/dist/turnstile.d.ts +56 -0
  47. package/dist/turnstile.d.ts.map +1 -0
  48. package/dist/turnstile.js +191 -0
  49. package/dist/turnstile.js.map +1 -0
  50. package/llms.txt +549 -0
  51. package/package.json +50 -0
@@ -0,0 +1,86 @@
1
+ // ─── Filter Matching ───
2
+ /**
3
+ * Check if data matches all filter conditions.
4
+ * Filter keys can include an operator suffix: "field.operator"
5
+ * e.g. "score.>" → field "score", operator ">"
6
+ * Without suffix, defaults to "=="
7
+ */
8
+ export function matchesFilter(data, filters) {
9
+ const entries = Array.isArray(filters) && filters.length > 0 && Array.isArray(filters[0])
10
+ ? parseTupleFilters(filters)
11
+ : parseFilters(filters);
12
+ return entries.every(({ field, operator, value }) => evaluateCondition(data[field], operator, value));
13
+ }
14
+ /**
15
+ * Parse filter object into structured FilterEntry array.
16
+ * "field" → { field, ==, value }
17
+ * "field.>" → { field, >, value }
18
+ */
19
+ function parseFilters(filters) {
20
+ const entries = [];
21
+ for (const [key, value] of Object.entries(filters)) {
22
+ // Check for operator suffix
23
+ const dotIdx = key.lastIndexOf('.');
24
+ if (dotIdx > 0) {
25
+ const possibleOp = key.slice(dotIdx + 1);
26
+ if (isValidOperator(possibleOp)) {
27
+ entries.push({
28
+ field: key.slice(0, dotIdx),
29
+ operator: possibleOp,
30
+ value,
31
+ });
32
+ continue;
33
+ }
34
+ }
35
+ // Default: equality
36
+ entries.push({ field: key, operator: '==', value });
37
+ }
38
+ return entries;
39
+ }
40
+ /**
41
+ * Parse tuple-format filters: [field, operator, value][]
42
+ * This is the standard filter format used by SDK query builders.
43
+ */
44
+ function parseTupleFilters(tuples) {
45
+ return tuples.map(([field, operator, value]) => ({ field, operator, value }));
46
+ }
47
+ function isValidOperator(op) {
48
+ return ['==', '!=', '<', '>', '<=', '>=', 'contains', 'contains-any', 'in', 'not in'].includes(op);
49
+ }
50
+ function evaluateCondition(fieldValue, operator, expected) {
51
+ switch (operator) {
52
+ case '==':
53
+ return fieldValue === expected;
54
+ case '!=':
55
+ return fieldValue !== expected;
56
+ case '<':
57
+ return fieldValue < expected;
58
+ case '>':
59
+ return fieldValue > expected;
60
+ case '<=':
61
+ return fieldValue <= expected;
62
+ case '>=':
63
+ return fieldValue >= expected;
64
+ case 'contains':
65
+ if (typeof fieldValue === 'string')
66
+ return fieldValue.includes(expected);
67
+ if (Array.isArray(fieldValue))
68
+ return fieldValue.includes(expected);
69
+ return false;
70
+ case 'contains-any':
71
+ if (!Array.isArray(fieldValue) || !Array.isArray(expected))
72
+ return false;
73
+ return expected.some(value => fieldValue.includes(value));
74
+ case 'in':
75
+ if (Array.isArray(expected))
76
+ return expected.includes(fieldValue);
77
+ return false;
78
+ case 'not in':
79
+ if (Array.isArray(expected))
80
+ return !expected.includes(fieldValue);
81
+ return true;
82
+ default:
83
+ return false;
84
+ }
85
+ }
86
+ //# sourceMappingURL=match-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match-filter.js","sourceRoot":"","sources":["../src/match-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ import type { RoomMediaKind, RoomMediaTrack, Subscription, RoomRealtimeCloseTracksRequest, RoomRealtimeCreateSessionRequest, RoomRealtimeCreateSessionResponse, RoomRealtimeIceServersRequest, RoomRealtimeIceServersResponse, RoomRealtimeRenegotiateRequest, RoomRealtimeTracksRequest, RoomRealtimeTracksResponse } from './room.js';
2
+ interface RoomRealtimeAudioVideoControls {
3
+ disable(): Promise<void>;
4
+ setMuted?(muted: boolean): Promise<void>;
5
+ }
6
+ interface RoomRealtimeScreenControls {
7
+ stop(): Promise<void>;
8
+ }
9
+ interface RoomRealtimeMediaAdapter {
10
+ media: {
11
+ list(): Array<{
12
+ tracks: RoomMediaTrack[];
13
+ }>;
14
+ audio: RoomRealtimeAudioVideoControls;
15
+ video: RoomRealtimeAudioVideoControls;
16
+ screen: RoomRealtimeScreenControls;
17
+ devices: {
18
+ switch(payload: {
19
+ audioInputId?: string;
20
+ videoInputId?: string;
21
+ screenInputId?: string;
22
+ }): Promise<void>;
23
+ };
24
+ onTrack(handler: (track: RoomMediaTrack) => void): Subscription;
25
+ onTrackRemoved(handler: (track: RoomMediaTrack) => void): Subscription;
26
+ realtime: {
27
+ createSession(payload?: RoomRealtimeCreateSessionRequest): Promise<RoomRealtimeCreateSessionResponse>;
28
+ getIceServers(payload?: RoomRealtimeIceServersRequest): Promise<RoomRealtimeIceServersResponse>;
29
+ addTracks(payload: RoomRealtimeTracksRequest): Promise<RoomRealtimeTracksResponse>;
30
+ renegotiate(payload: RoomRealtimeRenegotiateRequest): Promise<RoomRealtimeTracksResponse>;
31
+ closeTracks(payload: RoomRealtimeCloseTracksRequest): Promise<RoomRealtimeTracksResponse>;
32
+ };
33
+ };
34
+ }
35
+ type DisplayCaptureConstraints = NonNullable<MediaDevices['getDisplayMedia']> extends (constraints?: infer T) => Promise<MediaStream> ? T : MediaStreamConstraints;
36
+ export interface RoomRealtimeMediaTransportOptions {
37
+ autoSubscribe?: boolean;
38
+ turn?: boolean | {
39
+ ttl?: number;
40
+ filterBrowserIncompatibleUrls?: boolean;
41
+ };
42
+ rtcConfiguration?: RTCConfiguration;
43
+ peerConnectionFactory?: (configuration: RTCConfiguration) => RTCPeerConnection;
44
+ mediaDevices?: Pick<MediaDevices, 'getUserMedia' | 'getDisplayMedia'>;
45
+ }
46
+ export interface RoomRealtimeRemoteTrackEvent {
47
+ kind: RoomMediaKind;
48
+ track: MediaStreamTrack;
49
+ stream: MediaStream;
50
+ trackName?: string;
51
+ providerSessionId?: string;
52
+ }
53
+ export declare class RoomRealtimeMediaTransport {
54
+ private readonly room;
55
+ private readonly options;
56
+ private readonly localTracks;
57
+ private readonly remoteSubscriptions;
58
+ private readonly remoteSubscriptionByMid;
59
+ private readonly remoteTrackHandlers;
60
+ private readonly unsubscribers;
61
+ private peerConnection;
62
+ private sessionId;
63
+ constructor(room: RoomRealtimeMediaAdapter, options?: RoomRealtimeMediaTransportOptions);
64
+ getSessionId(): string | null;
65
+ getPeerConnection(): RTCPeerConnection | null;
66
+ connect(payload?: RoomRealtimeCreateSessionRequest): Promise<string>;
67
+ enableAudio(constraints?: MediaTrackConstraints | boolean): Promise<MediaStreamTrack>;
68
+ enableVideo(constraints?: MediaTrackConstraints | boolean): Promise<MediaStreamTrack>;
69
+ startScreenShare(constraints?: DisplayCaptureConstraints): Promise<MediaStreamTrack>;
70
+ disableAudio(): Promise<void>;
71
+ disableVideo(): Promise<void>;
72
+ stopScreenShare(): Promise<void>;
73
+ setMuted(kind: Extract<RoomMediaKind, 'audio' | 'video'>, muted: boolean): Promise<void>;
74
+ switchDevices(payload: {
75
+ audioInputId?: string;
76
+ videoInputId?: string;
77
+ }): Promise<void>;
78
+ onRemoteTrack(handler: (event: RoomRealtimeRemoteTrackEvent) => void): Subscription;
79
+ destroy(): void;
80
+ private attachRoomSubscriptions;
81
+ private subscribeExistingPublishedTracks;
82
+ private subscribeRemoteTrack;
83
+ private unsubscribeRemoteTrack;
84
+ private publishLocalTrack;
85
+ private replaceLocalTrack;
86
+ private unpublishLocalTrack;
87
+ private applyTracksResponse;
88
+ private createLocalOffer;
89
+ private waitForIceGatheringComplete;
90
+ private resolveIceServers;
91
+ private handleRemoteTrack;
92
+ private findTransceiverMid;
93
+ private requireMediaDevices;
94
+ }
95
+ export {};
96
+ //# sourceMappingURL=room-realtime-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-realtime-media.d.ts","sourceRoot":"","sources":["../src/room-realtime-media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,418 @@
1
+ function generateTrackName(kind) {
2
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
3
+ return `${kind}-${crypto.randomUUID()}`;
4
+ }
5
+ return `${kind}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
6
+ }
7
+ function buildRemoteTrackKey(track) {
8
+ if (!track.providerSessionId || !track.trackId)
9
+ return null;
10
+ return `${track.providerSessionId}:${track.trackId}:${track.kind}`;
11
+ }
12
+ function toSessionDescription(description) {
13
+ if (!description?.sdp || !description.type) {
14
+ throw new Error('PeerConnection is missing a local session description');
15
+ }
16
+ return {
17
+ sdp: description.sdp,
18
+ type: description.type,
19
+ };
20
+ }
21
+ function normalizeIceServers(response, filterBrowserIncompatibleUrls) {
22
+ return (response.iceServers ?? []).map((server) => {
23
+ const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
24
+ return {
25
+ ...server,
26
+ urls: filterBrowserIncompatibleUrls
27
+ ? urls.filter((url) => !url.includes(':53'))
28
+ : urls,
29
+ };
30
+ });
31
+ }
32
+ export class RoomRealtimeMediaTransport {
33
+ room;
34
+ options;
35
+ localTracks = new Map();
36
+ remoteSubscriptions = new Map();
37
+ remoteSubscriptionByMid = new Map();
38
+ remoteTrackHandlers = [];
39
+ unsubscribers = [];
40
+ peerConnection = null;
41
+ sessionId = null;
42
+ constructor(room, options) {
43
+ this.room = room;
44
+ this.options = {
45
+ autoSubscribe: options?.autoSubscribe ?? true,
46
+ turn: options?.turn ?? true,
47
+ rtcConfiguration: options?.rtcConfiguration ?? {},
48
+ peerConnectionFactory: options?.peerConnectionFactory
49
+ ?? ((configuration) => new RTCPeerConnection(configuration)),
50
+ mediaDevices: options?.mediaDevices
51
+ ?? (typeof navigator !== 'undefined' ? navigator.mediaDevices : undefined),
52
+ };
53
+ }
54
+ getSessionId() {
55
+ return this.sessionId;
56
+ }
57
+ getPeerConnection() {
58
+ return this.peerConnection;
59
+ }
60
+ async connect(payload) {
61
+ if (this.peerConnection && this.sessionId) {
62
+ return this.sessionId;
63
+ }
64
+ const configuration = {
65
+ ...this.options.rtcConfiguration,
66
+ iceServers: await this.resolveIceServers(),
67
+ };
68
+ this.peerConnection = this.options.peerConnectionFactory(configuration);
69
+ this.peerConnection.ontrack = (event) => this.handleRemoteTrack(event);
70
+ const response = await this.room.media.realtime.createSession(payload);
71
+ this.sessionId = response.sessionId;
72
+ this.attachRoomSubscriptions();
73
+ await this.subscribeExistingPublishedTracks();
74
+ return response.sessionId;
75
+ }
76
+ async enableAudio(constraints = true) {
77
+ const devices = this.requireMediaDevices();
78
+ const stream = await devices.getUserMedia({ audio: constraints, video: false });
79
+ const track = stream.getAudioTracks()[0];
80
+ if (!track) {
81
+ throw new Error('No audio track was returned by getUserMedia()');
82
+ }
83
+ await this.publishLocalTrack('audio', track, stream, track.getSettings().deviceId);
84
+ return track;
85
+ }
86
+ async enableVideo(constraints = true) {
87
+ const devices = this.requireMediaDevices();
88
+ const stream = await devices.getUserMedia({ audio: false, video: constraints });
89
+ const track = stream.getVideoTracks()[0];
90
+ if (!track) {
91
+ throw new Error('No video track was returned by getUserMedia()');
92
+ }
93
+ await this.publishLocalTrack('video', track, stream, track.getSettings().deviceId);
94
+ return track;
95
+ }
96
+ async startScreenShare(constraints = { video: true, audio: false }) {
97
+ const devices = this.requireMediaDevices();
98
+ if (!devices.getDisplayMedia) {
99
+ throw new Error('navigator.mediaDevices.getDisplayMedia() is not available in this environment');
100
+ }
101
+ const stream = await devices.getDisplayMedia(constraints);
102
+ const track = stream.getVideoTracks()[0];
103
+ if (!track) {
104
+ throw new Error('No screen-share track was returned by getDisplayMedia()');
105
+ }
106
+ track.addEventListener('ended', () => {
107
+ void this.stopScreenShare();
108
+ }, { once: true });
109
+ await this.publishLocalTrack('screen', track, stream, track.getSettings().deviceId);
110
+ return track;
111
+ }
112
+ async disableAudio() {
113
+ await this.unpublishLocalTrack('audio');
114
+ }
115
+ async disableVideo() {
116
+ await this.unpublishLocalTrack('video');
117
+ }
118
+ async stopScreenShare() {
119
+ await this.unpublishLocalTrack('screen');
120
+ }
121
+ async setMuted(kind, muted) {
122
+ const local = this.localTracks.get(kind);
123
+ if (local) {
124
+ local.track.enabled = !muted;
125
+ }
126
+ if (kind === 'audio') {
127
+ await this.room.media.audio.setMuted?.(muted);
128
+ }
129
+ else {
130
+ await this.room.media.video.setMuted?.(muted);
131
+ }
132
+ }
133
+ async switchDevices(payload) {
134
+ const devices = this.requireMediaDevices();
135
+ if (payload.audioInputId && this.localTracks.has('audio')) {
136
+ const stream = await devices.getUserMedia({
137
+ audio: { deviceId: { exact: payload.audioInputId } },
138
+ video: false,
139
+ });
140
+ const track = stream.getAudioTracks()[0];
141
+ if (track) {
142
+ await this.replaceLocalTrack('audio', track, stream, payload.audioInputId);
143
+ }
144
+ }
145
+ if (payload.videoInputId && this.localTracks.has('video')) {
146
+ const stream = await devices.getUserMedia({
147
+ audio: false,
148
+ video: { deviceId: { exact: payload.videoInputId } },
149
+ });
150
+ const track = stream.getVideoTracks()[0];
151
+ if (track) {
152
+ await this.replaceLocalTrack('video', track, stream, payload.videoInputId);
153
+ }
154
+ }
155
+ await this.room.media.devices.switch(payload);
156
+ }
157
+ onRemoteTrack(handler) {
158
+ this.remoteTrackHandlers.push(handler);
159
+ return {
160
+ unsubscribe: () => {
161
+ const index = this.remoteTrackHandlers.indexOf(handler);
162
+ if (index >= 0) {
163
+ this.remoteTrackHandlers.splice(index, 1);
164
+ }
165
+ },
166
+ };
167
+ }
168
+ destroy() {
169
+ for (const local of this.localTracks.values()) {
170
+ local.track.stop();
171
+ }
172
+ this.localTracks.clear();
173
+ for (const unsubscribe of this.unsubscribers) {
174
+ unsubscribe.unsubscribe();
175
+ }
176
+ this.unsubscribers.length = 0;
177
+ this.remoteSubscriptions.clear();
178
+ this.remoteSubscriptionByMid.clear();
179
+ if (this.peerConnection) {
180
+ this.peerConnection.close();
181
+ this.peerConnection = null;
182
+ }
183
+ this.sessionId = null;
184
+ }
185
+ attachRoomSubscriptions() {
186
+ if (this.unsubscribers.length > 0 || !this.options.autoSubscribe) {
187
+ return;
188
+ }
189
+ this.unsubscribers.push(this.room.media.onTrack((track) => {
190
+ void this.subscribeRemoteTrack(track);
191
+ }), this.room.media.onTrackRemoved((track) => {
192
+ void this.unsubscribeRemoteTrack(track);
193
+ }));
194
+ }
195
+ async subscribeExistingPublishedTracks() {
196
+ if (!this.options.autoSubscribe)
197
+ return;
198
+ for (const member of this.room.media.list()) {
199
+ for (const track of member.tracks) {
200
+ await this.subscribeRemoteTrack(track);
201
+ }
202
+ }
203
+ }
204
+ async subscribeRemoteTrack(track) {
205
+ if (!this.sessionId || !this.peerConnection)
206
+ return;
207
+ if (!track.providerSessionId || !track.trackId || track.providerSessionId === this.sessionId) {
208
+ return;
209
+ }
210
+ const key = buildRemoteTrackKey(track);
211
+ if (!key || this.remoteSubscriptions.has(key)) {
212
+ return;
213
+ }
214
+ const response = await this.room.media.realtime.addTracks({
215
+ sessionId: this.sessionId,
216
+ tracks: [
217
+ {
218
+ location: 'remote',
219
+ sessionId: track.providerSessionId,
220
+ trackName: track.trackId,
221
+ },
222
+ ],
223
+ });
224
+ const subscription = {
225
+ key,
226
+ kind: track.kind,
227
+ providerSessionId: track.providerSessionId,
228
+ trackName: track.trackId,
229
+ mid: response.tracks?.[0]?.mid,
230
+ };
231
+ this.remoteSubscriptions.set(key, subscription);
232
+ if (subscription.mid) {
233
+ this.remoteSubscriptionByMid.set(subscription.mid, subscription);
234
+ }
235
+ await this.applyTracksResponse(response);
236
+ }
237
+ async unsubscribeRemoteTrack(track) {
238
+ if (!this.sessionId)
239
+ return;
240
+ const key = buildRemoteTrackKey(track);
241
+ if (!key)
242
+ return;
243
+ const subscription = this.remoteSubscriptions.get(key);
244
+ if (!subscription?.mid) {
245
+ this.remoteSubscriptions.delete(key);
246
+ return;
247
+ }
248
+ const response = await this.room.media.realtime.closeTracks({
249
+ sessionId: this.sessionId,
250
+ tracks: [{ mid: subscription.mid }],
251
+ });
252
+ this.remoteSubscriptionByMid.delete(subscription.mid);
253
+ this.remoteSubscriptions.delete(subscription.key);
254
+ await this.applyTracksResponse(response);
255
+ }
256
+ async publishLocalTrack(kind, track, stream, deviceId) {
257
+ await this.connect();
258
+ if (!this.peerConnection || !this.sessionId) {
259
+ throw new Error('Realtime media transport is not connected');
260
+ }
261
+ if (this.localTracks.has(kind)) {
262
+ await this.replaceLocalTrack(kind, track, stream, deviceId);
263
+ return;
264
+ }
265
+ const transceiver = this.peerConnection.addTransceiver(track, { direction: 'sendonly' });
266
+ const offer = await this.createLocalOffer();
267
+ const trackName = generateTrackName(kind);
268
+ const mid = transceiver.mid ?? this.findTransceiverMid(transceiver);
269
+ const response = await this.room.media.realtime.addTracks({
270
+ sessionId: this.sessionId,
271
+ sessionDescription: offer,
272
+ tracks: [
273
+ {
274
+ location: 'local',
275
+ mid: mid ?? undefined,
276
+ trackName,
277
+ },
278
+ ],
279
+ publish: {
280
+ kind,
281
+ trackId: trackName,
282
+ deviceId,
283
+ muted: !track.enabled,
284
+ },
285
+ });
286
+ await this.applyTracksResponse(response);
287
+ this.localTracks.set(kind, {
288
+ kind,
289
+ track,
290
+ transceiver,
291
+ stream,
292
+ trackName,
293
+ deviceId,
294
+ });
295
+ }
296
+ async replaceLocalTrack(kind, track, stream, deviceId) {
297
+ const existing = this.localTracks.get(kind);
298
+ if (!existing) {
299
+ await this.publishLocalTrack(kind, track, stream, deviceId);
300
+ return;
301
+ }
302
+ await existing.transceiver.sender.replaceTrack(track);
303
+ existing.track.stop();
304
+ existing.track = track;
305
+ existing.stream = stream;
306
+ existing.deviceId = deviceId;
307
+ }
308
+ async unpublishLocalTrack(kind) {
309
+ const local = this.localTracks.get(kind);
310
+ if (!local || !this.peerConnection || !this.sessionId) {
311
+ return;
312
+ }
313
+ local.transceiver.direction = 'inactive';
314
+ const offer = await this.createLocalOffer();
315
+ const mid = local.transceiver.mid ?? this.findTransceiverMid(local.transceiver);
316
+ if (!mid) {
317
+ throw new Error(`Cannot unpublish ${kind}: missing transceiver mid`);
318
+ }
319
+ const response = await this.room.media.realtime.closeTracks({
320
+ sessionId: this.sessionId,
321
+ sessionDescription: offer,
322
+ tracks: [{ mid }],
323
+ unpublish: { kind },
324
+ });
325
+ await this.applyTracksResponse(response);
326
+ local.track.stop();
327
+ this.localTracks.delete(kind);
328
+ }
329
+ async applyTracksResponse(response) {
330
+ if (!this.peerConnection)
331
+ return;
332
+ if (response.errorCode) {
333
+ throw new Error(response.errorDescription || response.errorCode);
334
+ }
335
+ const trackError = response.tracks?.find((track) => track.errorCode);
336
+ if (trackError?.errorCode) {
337
+ throw new Error(trackError.errorDescription || trackError.errorCode);
338
+ }
339
+ const sessionDescription = response.sessionDescription;
340
+ if (!sessionDescription) {
341
+ return;
342
+ }
343
+ if (sessionDescription.type === 'answer') {
344
+ await this.peerConnection.setRemoteDescription(sessionDescription);
345
+ return;
346
+ }
347
+ await this.peerConnection.setRemoteDescription(sessionDescription);
348
+ const answer = await this.peerConnection.createAnswer();
349
+ await this.peerConnection.setLocalDescription(answer);
350
+ await this.waitForIceGatheringComplete();
351
+ const renegotiateResponse = await this.room.media.realtime.renegotiate({
352
+ sessionId: this.sessionId,
353
+ sessionDescription: toSessionDescription(this.peerConnection.localDescription),
354
+ });
355
+ if (renegotiateResponse.sessionDescription?.type === 'answer') {
356
+ await this.peerConnection.setRemoteDescription(renegotiateResponse.sessionDescription);
357
+ }
358
+ }
359
+ async createLocalOffer() {
360
+ if (!this.peerConnection) {
361
+ throw new Error('Realtime media transport is not connected');
362
+ }
363
+ const offer = await this.peerConnection.createOffer();
364
+ await this.peerConnection.setLocalDescription(offer);
365
+ await this.waitForIceGatheringComplete();
366
+ return toSessionDescription(this.peerConnection.localDescription);
367
+ }
368
+ async waitForIceGatheringComplete() {
369
+ if (!this.peerConnection || this.peerConnection.iceGatheringState === 'complete') {
370
+ return;
371
+ }
372
+ await new Promise((resolve) => {
373
+ const onStateChange = () => {
374
+ if (this.peerConnection?.iceGatheringState === 'complete') {
375
+ this.peerConnection.removeEventListener('icegatheringstatechange', onStateChange);
376
+ resolve();
377
+ }
378
+ };
379
+ this.peerConnection?.addEventListener('icegatheringstatechange', onStateChange);
380
+ });
381
+ }
382
+ async resolveIceServers() {
383
+ if (!this.options.turn) {
384
+ return this.options.rtcConfiguration.iceServers;
385
+ }
386
+ const turnOptions = typeof this.options.turn === 'object' ? this.options.turn : {};
387
+ const response = await this.room.media.realtime.getIceServers({
388
+ ttl: turnOptions.ttl,
389
+ });
390
+ return normalizeIceServers(response, turnOptions.filterBrowserIncompatibleUrls !== false);
391
+ }
392
+ handleRemoteTrack(event) {
393
+ const stream = event.streams[0] ?? new MediaStream([event.track]);
394
+ const subscription = event.transceiver.mid
395
+ ? this.remoteSubscriptionByMid.get(event.transceiver.mid)
396
+ : undefined;
397
+ const payload = {
398
+ kind: subscription?.kind ?? (event.track.kind === 'audio' ? 'audio' : 'video'),
399
+ track: event.track,
400
+ stream,
401
+ trackName: subscription?.trackName,
402
+ providerSessionId: subscription?.providerSessionId,
403
+ };
404
+ for (const handler of this.remoteTrackHandlers) {
405
+ handler(payload);
406
+ }
407
+ }
408
+ findTransceiverMid(transceiver) {
409
+ return transceiver.mid ?? null;
410
+ }
411
+ requireMediaDevices() {
412
+ if (!this.options.mediaDevices?.getUserMedia) {
413
+ throw new Error('navigator.mediaDevices.getUserMedia() is not available in this environment');
414
+ }
415
+ return this.options.mediaDevices;
416
+ }
417
+ }
418
+ //# sourceMappingURL=room-realtime-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-realtime-media.js","sourceRoot":"","sources":["../src/room-realtime-media.ts"],"names":[],"mappings":"AA6FA,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAqE;IAChG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAqE;IACjG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,IAAI,EAAE,WAAW,CAAC,IAA0B;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAwC,EACxC,6BAAsC;IAEtC,OAAO,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,6BAA6B;gBACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC,CAAC,IAAI;SACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,0BAA0B;IACpB,IAAI,CAA2B;IAC/B,OAAO,CAA8C;IACrD,WAAW,GAAG,IAAI,GAAG,EAAkC,CAAC;IACxD,mBAAmB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACjE,uBAAuB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACrE,mBAAmB,GAAyD,EAAE,CAAC;IAC/E,aAAa,GAAmB,EAAE,CAAC;IAC5C,cAAc,GAA6B,IAAI,CAAC;IAChD,SAAS,GAAkB,IAAI,CAAC;IAExC,YAAY,IAA8B,EAAE,OAA2C;QACrF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,IAAI;YAC7C,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;YAC3B,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,IAAI,EAAE;YACjD,qBAAqB,EACnB,OAAO,EAAE,qBAAqB;mBAC3B,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAC9D,YAAY,EACV,OAAO,EAAE,YAAY;mBAClB,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAkB,CAAC;SACtF,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0C;QACtD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB;YAChC,UAAU,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE;SAChB,CAAC;QAE7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACxE,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAC9C,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAA+C,IAAI;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAA+C,IAAI;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,cAAyC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;QAEtE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACnC,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnB,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAA+C,EAAE,KAAc;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAGnB;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3C,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBACxC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;gBACpD,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBACxC,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;aACrD,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,OAAsD;QAClE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;YACL,WAAW,EAAE,GAAG,EAAE;gBAChB,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACf,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5C,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAEO,uBAAuB;QAC7B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,KAAK,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,EACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,KAAK,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gCAAgC;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa;YAAE,OAAO;QACxC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,KAAqB;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACpD,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,KAAK,CAAC,iBAAiB;oBAClC,SAAS,EAAE,KAAK,CAAC,OAAO;iBACS;aACpC;SACF,CAAC,CAAC;QAEH,MAAM,YAAY,GAA4B;YAC5C,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,SAAS,EAAE,KAAK,CAAC,OAAO;YACxB,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;SAC/B,CAAC;QAEF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,KAAqB;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC1D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,IAAmB,EACnB,KAAuB,EACvB,MAAmB,EACnB,QAAiB;QAEjB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kBAAkB,EAAE,KAAK;YACzB,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,OAAO;oBACjB,GAAG,EAAE,GAAG,IAAI,SAAS;oBACrB,SAAS;iBACwB;aACpC;YACD,OAAO,EAAE;gBACP,IAAI;gBACJ,OAAO,EAAE,SAAS;gBAClB,QAAQ;gBACR,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE;YACzB,IAAI;YACJ,KAAK;YACL,WAAW;YACX,MAAM;YACN,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,IAAmB,EACnB,KAAuB,EACvB,MAAmB,EACnB,QAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAmB;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,2BAA2B,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC1D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kBAAkB,EAAE,KAAK;YACzB,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;YACjB,SAAS,EAAE,EAAE,IAAI,EAAE;SACpB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAoC;QACpE,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAEjC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,gBAAgB,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QACvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,kBAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEzC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YACrE,SAAS,EAAE,IAAI,CAAC,SAAU;YAC1B,kBAAkB,EAAE,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;SAC/E,CAAC,CAAC;QAEH,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACzC,OAAO,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,2BAA2B;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;YACjF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,IAAI,IAAI,CAAC,cAAc,EAAE,iBAAiB,KAAK,UAAU,EAAE,CAAC;oBAC1D,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;oBAClF,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAClD,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC5D,GAAG,EAAE,WAAW,CAAC,GAAG;SACrB,CAAC,CAAC;QAEH,OAAO,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,6BAA6B,KAAK,KAAK,CAAC,CAAC;IAC5F,CAAC;IAEO,iBAAiB,CAAC,KAAoB;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG;YACxC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;YACzD,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,OAAO,GAAiC;YAC5C,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM;YACN,SAAS,EAAE,YAAY,EAAE,SAAS;YAClC,iBAAiB,EAAE,YAAY,EAAE,iBAAiB;SACnD,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,WAA8B;QACvD,OAAO,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACnC,CAAC;CACF"}