streemo-video-call-sdk 0.1.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.
Files changed (43) hide show
  1. package/README.md +138 -0
  2. package/dist/VideoCallWidget.d.ts +16 -0
  3. package/dist/VideoCallWidget.d.ts.map +1 -0
  4. package/dist/VideoCallWidget.js +19 -0
  5. package/dist/VideoCallWidget.js.map +1 -0
  6. package/dist/VideoTile.d.ts +15 -0
  7. package/dist/VideoTile.d.ts.map +1 -0
  8. package/dist/VideoTile.js +76 -0
  9. package/dist/VideoTile.js.map +1 -0
  10. package/dist/auth.d.ts +10 -0
  11. package/dist/auth.d.ts.map +1 -0
  12. package/dist/auth.js +11 -0
  13. package/dist/auth.js.map +1 -0
  14. package/dist/client.d.ts +10 -0
  15. package/dist/client.d.ts.map +1 -0
  16. package/dist/client.js +5 -0
  17. package/dist/client.js.map +1 -0
  18. package/dist/index.d.ts +13 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/sdkConfig.d.ts +9 -0
  23. package/dist/sdkConfig.d.ts.map +1 -0
  24. package/dist/sdkConfig.js +17 -0
  25. package/dist/sdkConfig.js.map +1 -0
  26. package/dist/sdkErrors.d.ts +8 -0
  27. package/dist/sdkErrors.d.ts.map +1 -0
  28. package/dist/sdkErrors.js +32 -0
  29. package/dist/sdkErrors.js.map +1 -0
  30. package/dist/signalingClient.d.ts +33 -0
  31. package/dist/signalingClient.d.ts.map +1 -0
  32. package/dist/signalingClient.js +95 -0
  33. package/dist/signalingClient.js.map +1 -0
  34. package/dist/styles.css +99 -0
  35. package/dist/tokenProvider.d.ts +16 -0
  36. package/dist/tokenProvider.d.ts.map +1 -0
  37. package/dist/tokenProvider.js +89 -0
  38. package/dist/tokenProvider.js.map +1 -0
  39. package/dist/useWebRTCCall.d.ts +32 -0
  40. package/dist/useWebRTCCall.d.ts.map +1 -0
  41. package/dist/useWebRTCCall.js +775 -0
  42. package/dist/useWebRTCCall.js.map +1 -0
  43. package/package.json +36 -0
package/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # @streemo-video-call-sdk
2
+
3
+ React SDK and signaling client to connect any website to your Streemo video-chat signaling server.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @streemo-video-call-sdk
9
+ ```
10
+
11
+ ## React usage (auto room token from server)
12
+
13
+ ```tsx
14
+ import { useState } from 'react'
15
+ import { VideoCallWidget, initVideoSDK } from '@streemo-video-call-sdk'
16
+ import '@streemo-video-call-sdk/styles.css'
17
+
18
+ initVideoSDK({
19
+ auth: {
20
+ clientId: 'YOUR_CLIENT_ID',
21
+ appId: 'YOUR_APP_ID',
22
+ },
23
+ })
24
+
25
+ export function MyCallPage() {
26
+ const [enabled, setEnabled] = useState(false)
27
+
28
+ return (
29
+ <div>
30
+ {!enabled && <button onClick={() => setEnabled(true)}>Enable camera and microphone</button>}
31
+ <VideoCallWidget
32
+ roomId="ROOM_ID"
33
+ userId="USER_ID"
34
+ userName="Alice"
35
+ enabled={enabled}
36
+ />
37
+ </div>
38
+ )
39
+ }
40
+ ```
41
+
42
+ The widget will call your server automatically:
43
+
44
+ - `POST /v1/rooms/:roomId/join`
45
+ - `POST /v1/rooms/:roomId/token`
46
+
47
+ Then it opens WS connection to `/v1/ws` and starts signaling.
48
+
49
+ If `apiBaseUrl` is not provided, SDK uses `https://api.streemo.ru` by default.
50
+ If `auth` is not passed into hook/widget/client, SDK uses values from `initVideoSDK(...)`.
51
+
52
+ ## React usage (custom tokenProvider)
53
+
54
+ ```tsx
55
+ import { useWebRTCCall } from '@streemo-video-call-sdk'
56
+
57
+ const call = useWebRTCCall({
58
+ roomId,
59
+ userId,
60
+ enabled: true,
61
+ wsBaseUrl: 'wss://your-domain.com',
62
+ tokenProvider: async ({ roomId }) => {
63
+ // custom flow if your backend differs
64
+ const response = await fetch(`/api/my-room-token?roomId=${roomId}`)
65
+ const data = await response.json()
66
+ return data.token
67
+ },
68
+ })
69
+ ```
70
+
71
+ ## Non-React usage (signaling-only entrypoint)
72
+
73
+ ```ts
74
+ import { VideoSignalingClient } from '@streemo-video-call-sdk/client'
75
+
76
+ const client = new VideoSignalingClient({
77
+ roomId: 'ROOM_ID',
78
+ userId: 'USER_ID',
79
+ apiBaseUrl: 'https://your-domain.com',
80
+ auth: {
81
+ authToken: 'PRE_ISSUED_AUTH_TOKEN',
82
+ clientId: 'YOUR_CLIENT_ID',
83
+ appId: 'YOUR_APP_ID',
84
+ },
85
+ onMessage: (msg) => console.log('signal', msg),
86
+ })
87
+
88
+ await client.connect()
89
+ client.send({ type: 'join', payload: { joinedAt: new Date().toISOString() } })
90
+ ```
91
+
92
+ ## Server compatibility
93
+
94
+ The SDK expects your server to support:
95
+
96
+ - `GET /v1/ws?roomId=<id>&token=<jwt>` WebSocket endpoint
97
+ - `POST /v1/rooms/:roomId/join` endpoint
98
+ - `POST /v1/rooms/:roomId/token` endpoint returning `{ "token": "..." }`
99
+ - Signaling message types:
100
+ - `welcome`
101
+ - `join` / `participant_joined`
102
+ - `participant_left`
103
+ - `offer`
104
+ - `answer`
105
+ - `ice_candidate`
106
+
107
+ By default, SDK sends auth headers:
108
+
109
+ - `X-Client-Id: <clientId>`
110
+ - `X-App-Id: <appId>`
111
+ - `X-Guest-Id: <userId>`
112
+
113
+ `Authorization` header is optional. If `auth.authToken` is provided, SDK also sends `Authorization: Bearer <authToken>`.
114
+ You can override header names in `auth` config (`authHeader`, `clientIdHeader`, `appIdHeader`).
115
+
116
+ ## Auth error mapping for UI
117
+
118
+ SDK normalizes server auth errors into typed codes:
119
+
120
+ - `invalid_app`
121
+ - `invalid_client`
122
+ - `expired_token`
123
+ - `unauthorized`
124
+ - `forbidden`
125
+
126
+ Helpers:
127
+
128
+ - `mapSDKErrorToUIMessage(error)` from `@streemo-video-call-sdk`
129
+ - `mapSDKErrorToUIMessage(error)` from `@streemo-video-call-sdk/client`
130
+
131
+ ## Publish to npm
132
+
133
+ ```bash
134
+ npm run clean
135
+ npm install
136
+ npm run build
137
+ npm publish --access public
138
+ ```
@@ -0,0 +1,16 @@
1
+ import type { ServerAuthConfig } from './auth';
2
+ import type { TokenProvider } from './tokenProvider';
3
+ export type VideoCallWidgetProps = {
4
+ roomId: string;
5
+ userId: string;
6
+ userName: string;
7
+ roomToken?: string;
8
+ wsBaseUrl?: string;
9
+ tokenProvider?: TokenProvider;
10
+ apiBaseUrl?: string;
11
+ auth?: ServerAuthConfig;
12
+ enabled: boolean;
13
+ localLabelSuffix?: string;
14
+ };
15
+ export declare function VideoCallWidget({ roomId, userId, userName, roomToken, wsBaseUrl, tokenProvider, apiBaseUrl, auth, enabled, localLabelSuffix, }: VideoCallWidgetProps): import("react/jsx-runtime").JSX.Element;
16
+ //# sourceMappingURL=VideoCallWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoCallWidget.d.ts","sourceRoot":"","sources":["../src/VideoCallWidget.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,UAAU,EACV,IAAI,EACJ,OAAO,EACP,gBAA0B,GAC3B,EAAE,oBAAoB,2CA6CtB"}
@@ -0,0 +1,19 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { useWebRTCCall } from './useWebRTCCall';
4
+ import { VideoTile } from './VideoTile';
5
+ export function VideoCallWidget({ roomId, userId, userName, roomToken, wsBaseUrl, tokenProvider, apiBaseUrl, auth, enabled, localLabelSuffix = '(you)', }) {
6
+ const call = useWebRTCCall({
7
+ roomId,
8
+ userId,
9
+ roomToken,
10
+ wsBaseUrl,
11
+ tokenProvider,
12
+ apiBaseUrl,
13
+ auth,
14
+ enabled,
15
+ });
16
+ const remotes = useMemo(() => Object.entries(call.remoteStreams), [call.remoteStreams]);
17
+ return (_jsxs("div", { className: "vc-root", children: [_jsxs("div", { className: "vc-toolbar", children: [_jsxs("span", { className: "vc-muted", children: ["WS: ", call.connected ? 'connected' : 'disconnected', " | participants: ", call.participants.length + 1] }), _jsxs("div", { className: "vc-row vc-wrap", children: [_jsx("button", { onClick: call.toggleMic, disabled: !call.hasMicTrack, children: call.micEnabled ? 'Mute mic' : 'Unmute mic' }), _jsx("button", { onClick: call.toggleCamera, disabled: !call.hasCameraTrack, children: call.cameraEnabled ? 'Disable camera' : 'Enable camera' })] })] }), call.error && _jsx("p", { className: "vc-error", children: call.error }), _jsxs("section", { className: "vc-video-grid", children: [_jsx(VideoTile, { stream: call.localStream, muted: true, mirrored: true, label: `${userName} ${localLabelSuffix}`.trim() }), remotes.map(([peerUserId, stream]) => (_jsx(VideoTile, { stream: stream, label: `peer: ${peerUserId.slice(0, 8)}`, subtitle: `remote video: ${call.remoteTrackStates[peerUserId]?.video ? 'on' : 'off'} | remote audio: ${call.remoteTrackStates[peerUserId]?.audio ? 'on' : 'off'} | pc: ${call.remoteTrackStates[peerUserId]?.connectionState ?? 'new'}` }, peerUserId)))] })] }));
18
+ }
19
+ //# sourceMappingURL=VideoCallWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoCallWidget.js","sourceRoot":"","sources":["../src/VideoCallWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAiBvC,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,MAAM,EACN,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,UAAU,EACV,IAAI,EACJ,OAAO,EACP,gBAAgB,GAAG,OAAO,GACL;IACrB,MAAM,IAAI,GAAG,aAAa,CAAC;QACzB,MAAM;QACN,MAAM;QACN,SAAS;QACT,SAAS;QACT,aAAa;QACb,UAAU;QACV,IAAI;QACJ,OAAO;KACR,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IAEvF,OAAO,CACL,eAAK,SAAS,EAAC,SAAS,aACtB,eAAK,SAAS,EAAC,YAAY,aACzB,gBAAM,SAAS,EAAC,UAAU,qBACnB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,uBAAmB,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAC5F,EACP,eAAK,SAAS,EAAC,gBAAgB,aAC7B,iBAAQ,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,WAAW,YACzD,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,GACrC,EACT,iBAAQ,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,cAAc,YAC/D,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,GACjD,IACL,IACF,EAEL,IAAI,CAAC,KAAK,IAAI,YAAG,SAAS,EAAC,UAAU,YAAE,IAAI,CAAC,KAAK,GAAK,EAEvD,mBAAS,SAAS,EAAC,eAAe,aAChC,KAAC,SAAS,IAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,QAAC,QAAQ,QAAC,KAAK,EAAE,GAAG,QAAQ,IAAI,gBAAgB,EAAE,CAAC,IAAI,EAAE,GAAI,EACtG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CACrC,KAAC,SAAS,IAER,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EACxC,QAAQ,EAAE,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,eAAe,IAAI,KAAK,EAAE,IAHlO,UAAU,CAIf,CACH,CAAC,IACM,IACN,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ type Props = {
2
+ stream: MediaStream | null;
3
+ muted?: boolean;
4
+ mirrored?: boolean;
5
+ label: string;
6
+ subtitle?: string;
7
+ i18n?: {
8
+ resumePlayback?: string;
9
+ audioOnlyMuted?: string;
10
+ audioOnlyConnected?: string;
11
+ };
12
+ };
13
+ export declare function VideoTile({ stream, muted, mirrored, label, subtitle, i18n }: Props): import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=VideoTile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoTile.d.ts","sourceRoot":"","sources":["../src/VideoTile.tsx"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE;QACL,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;KAC5B,CAAA;CACF,CAAA;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,KAAa,EAAE,QAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,KAAK,2CAoGlG"}
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from 'react';
3
+ export function VideoTile({ stream, muted = false, mirrored = false, label, subtitle, i18n }) {
4
+ const ref = useRef(null);
5
+ const [hasVideoTrack, setHasVideoTrack] = useState(false);
6
+ const [needsInteraction, setNeedsInteraction] = useState(false);
7
+ const texts = {
8
+ resumePlayback: i18n?.resumePlayback ?? 'Enable video/audio',
9
+ audioOnlyMuted: i18n?.audioOnlyMuted ?? 'Microphone only',
10
+ audioOnlyConnected: i18n?.audioOnlyConnected ?? 'Audio connected',
11
+ };
12
+ const initials = useMemo(() => {
13
+ const parts = label
14
+ .replace(/\(.*\)/g, '')
15
+ .trim()
16
+ .split(/\s+/)
17
+ .filter(Boolean);
18
+ if (parts.length === 0)
19
+ return 'U';
20
+ if (parts.length === 1)
21
+ return parts[0].slice(0, 2).toUpperCase();
22
+ return `${parts[0][0] ?? ''}${parts[1][0] ?? ''}`.toUpperCase();
23
+ }, [label]);
24
+ useEffect(() => {
25
+ if (!ref.current)
26
+ return;
27
+ ref.current.srcObject = stream;
28
+ ref.current.muted = muted;
29
+ void ref.current.play()
30
+ .then(() => setNeedsInteraction(false))
31
+ .catch(() => setNeedsInteraction(true));
32
+ }, [stream, muted]);
33
+ useEffect(() => {
34
+ if (!stream) {
35
+ setHasVideoTrack(false);
36
+ return;
37
+ }
38
+ const update = () => {
39
+ const hasVideo = stream
40
+ .getVideoTracks()
41
+ .some((track) => track.readyState === 'live' && track.enabled);
42
+ setHasVideoTrack(hasVideo);
43
+ };
44
+ update();
45
+ stream.getVideoTracks().forEach((track) => {
46
+ track.addEventListener('mute', update);
47
+ track.addEventListener('unmute', update);
48
+ track.addEventListener('ended', update);
49
+ });
50
+ stream.addEventListener('addtrack', update);
51
+ stream.addEventListener('removetrack', update);
52
+ return () => {
53
+ stream.getVideoTracks().forEach((track) => {
54
+ track.removeEventListener('mute', update);
55
+ track.removeEventListener('unmute', update);
56
+ track.removeEventListener('ended', update);
57
+ });
58
+ stream.removeEventListener('addtrack', update);
59
+ stream.removeEventListener('removetrack', update);
60
+ };
61
+ }, [stream]);
62
+ const handleResumePlayback = async () => {
63
+ if (!ref.current)
64
+ return;
65
+ try {
66
+ ref.current.muted = muted;
67
+ await ref.current.play();
68
+ setNeedsInteraction(false);
69
+ }
70
+ catch {
71
+ setNeedsInteraction(true);
72
+ }
73
+ };
74
+ return (_jsxs("div", { className: `vc-video-tile ${hasVideoTrack ? '' : 'audio-only'}`, children: [_jsx("video", { ref: ref, autoPlay: true, playsInline: true, muted: muted, className: mirrored ? 'vc-video-mirrored' : '', style: { display: hasVideoTrack ? 'block' : 'none' } }), needsInteraction && (_jsx("button", { className: "vc-video-play-button", onClick: handleResumePlayback, children: texts.resumePlayback })), !hasVideoTrack && (_jsxs("div", { className: "vc-video-placeholder", children: [_jsx("div", { className: "vc-avatar-circle", children: initials }), _jsx("span", { className: "vc-muted", children: muted ? texts.audioOnlyMuted : texts.audioOnlyConnected })] })), _jsx("p", { children: label }), subtitle && _jsx("p", { className: "vc-video-subtitle", children: subtitle })] }));
75
+ }
76
+ //# sourceMappingURL=VideoTile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VideoTile.js","sourceRoot":"","sources":["../src/VideoTile.tsx"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export type ServerAuthConfig = {
2
+ authToken?: string;
3
+ clientId: string;
4
+ appId: string;
5
+ authHeader?: string;
6
+ clientIdHeader?: string;
7
+ appIdHeader?: string;
8
+ };
9
+ export declare function buildAuthHeaders(auth: ServerAuthConfig): Record<string, string>;
10
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS/E"}
package/dist/auth.js ADDED
@@ -0,0 +1,11 @@
1
+ export function buildAuthHeaders(auth) {
2
+ const headers = {
3
+ [auth.clientIdHeader ?? 'X-Client-Id']: auth.clientId,
4
+ [auth.appIdHeader ?? 'X-App-Id']: auth.appId,
5
+ };
6
+ if (auth.authToken) {
7
+ headers[auth.authHeader ?? 'Authorization'] = `Bearer ${auth.authToken}`;
8
+ }
9
+ return headers;
10
+ }
11
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,gBAAgB,CAAC,IAAsB;IACrD,MAAM,OAAO,GAA2B;QACtC,CAAC,IAAI,CAAC,cAAc,IAAI,aAAa,CAAC,EAAE,IAAI,CAAC,QAAQ;QACrD,CAAC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,EAAE,IAAI,CAAC,KAAK;KAC7C,CAAA;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,SAAS,EAAE,CAAA;IAC1E,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { VideoSignalingClient } from './signalingClient';
2
+ export type { SignalingClientConfig, SignalMessage } from './signalingClient';
3
+ export { createServerTokenProvider, defaultWsBaseUrlFromApi, defaultApiBaseUrl } from './tokenProvider';
4
+ export type { TokenProvider, TokenProviderContext, ServerTokenProviderOptions } from './tokenProvider';
5
+ export type { ServerAuthConfig } from './auth';
6
+ export { SDKError, mapSDKErrorToUIMessage } from './sdkErrors';
7
+ export type { SDKErrorCode } from './sdkErrors';
8
+ export { initVideoSDK, getVideoSDKConfig } from './sdkConfig';
9
+ export type { VideoSDKConfig } from './sdkConfig';
10
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACvG,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AACtG,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
package/dist/client.js ADDED
@@ -0,0 +1,5 @@
1
+ export { VideoSignalingClient } from './signalingClient';
2
+ export { createServerTokenProvider, defaultWsBaseUrlFromApi, defaultApiBaseUrl } from './tokenProvider';
3
+ export { SDKError, mapSDKErrorToUIMessage } from './sdkErrors';
4
+ export { initVideoSDK, getVideoSDKConfig } from './sdkConfig';
5
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGvG,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,13 @@
1
+ export { useWebRTCCall } from './useWebRTCCall';
2
+ export type { UseWebRTCCallParams, RemoteTrackState } from './useWebRTCCall';
3
+ export { VideoTile } from './VideoTile';
4
+ export { VideoCallWidget } from './VideoCallWidget';
5
+ export type { VideoCallWidgetProps } from './VideoCallWidget';
6
+ export { createServerTokenProvider, defaultWsBaseUrlFromApi, defaultApiBaseUrl } from './tokenProvider';
7
+ export type { TokenProvider, TokenProviderContext, ServerTokenProviderOptions } from './tokenProvider';
8
+ export type { ServerAuthConfig } from './auth';
9
+ export { SDKError, mapSDKErrorToUIMessage } from './sdkErrors';
10
+ export type { SDKErrorCode } from './sdkErrors';
11
+ export { initVideoSDK, getVideoSDKConfig } from './sdkConfig';
12
+ export type { VideoSDKConfig } from './sdkConfig';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACvG,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AACtG,YAAY,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAC9C,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { useWebRTCCall } from './useWebRTCCall';
2
+ export { VideoTile } from './VideoTile';
3
+ export { VideoCallWidget } from './VideoCallWidget';
4
+ export { createServerTokenProvider, defaultWsBaseUrlFromApi, defaultApiBaseUrl } from './tokenProvider';
5
+ export { SDKError, mapSDKErrorToUIMessage } from './sdkErrors';
6
+ export { initVideoSDK, getVideoSDKConfig } from './sdkConfig';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAGvG,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { ServerAuthConfig } from './auth';
2
+ export type VideoSDKConfig = {
3
+ apiBaseUrl?: string;
4
+ wsBaseUrl?: string;
5
+ auth?: ServerAuthConfig;
6
+ };
7
+ export declare function initVideoSDK(config: VideoSDKConfig): void;
8
+ export declare function getVideoSDKConfig(): VideoSDKConfig;
9
+ //# sourceMappingURL=sdkConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkConfig.d.ts","sourceRoot":"","sources":["../src/sdkConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAE9C,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,gBAAgB,CAAA;CACxB,CAAA;AAUD,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAMzD;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAElD"}
@@ -0,0 +1,17 @@
1
+ const DEFAULT_API_BASE_URL = 'https://api.streemo.ru';
2
+ const DEFAULT_WS_BASE_URL = 'wss://api.streemo.ru';
3
+ let globalConfig = {
4
+ apiBaseUrl: DEFAULT_API_BASE_URL,
5
+ wsBaseUrl: DEFAULT_WS_BASE_URL,
6
+ };
7
+ export function initVideoSDK(config) {
8
+ globalConfig = {
9
+ ...globalConfig,
10
+ ...config,
11
+ auth: config.auth ? { ...(globalConfig.auth ?? {}), ...config.auth } : globalConfig.auth,
12
+ };
13
+ }
14
+ export function getVideoSDKConfig() {
15
+ return globalConfig;
16
+ }
17
+ //# sourceMappingURL=sdkConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkConfig.js","sourceRoot":"","sources":["../src/sdkConfig.ts"],"names":[],"mappings":"AAQA,MAAM,oBAAoB,GAAG,wBAAwB,CAAA;AACrD,MAAM,mBAAmB,GAAG,sBAAsB,CAAA;AAElD,IAAI,YAAY,GAAmB;IACjC,UAAU,EAAE,oBAAoB;IAChC,SAAS,EAAE,mBAAmB;CAC/B,CAAA;AAED,MAAM,UAAU,YAAY,CAAC,MAAsB;IACjD,YAAY,GAAG;QACb,GAAG,YAAY;QACf,GAAG,MAAM;QACT,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI;KACzF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,YAAY,CAAA;AACrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type SDKErrorCode = 'invalid_app' | 'invalid_client' | 'expired_token' | 'unauthorized' | 'forbidden' | 'network_error' | 'unknown_error';
2
+ export declare class SDKError extends Error {
3
+ code: SDKErrorCode;
4
+ status?: number;
5
+ constructor(code: SDKErrorCode, message: string, status?: number);
6
+ }
7
+ export declare function mapSDKErrorToUIMessage(err: unknown): string;
8
+ //# sourceMappingURL=sdkErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkErrors.d.ts","sourceRoot":"","sources":["../src/sdkErrors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,WAAW,GACX,eAAe,GACf,eAAe,CAAA;AAEnB,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;gBAEH,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;CAMjE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAqB3D"}
@@ -0,0 +1,32 @@
1
+ export class SDKError extends Error {
2
+ code;
3
+ status;
4
+ constructor(code, message, status) {
5
+ super(message);
6
+ this.code = code;
7
+ this.status = status;
8
+ this.name = 'SDKError';
9
+ }
10
+ }
11
+ export function mapSDKErrorToUIMessage(err) {
12
+ if (!(err instanceof SDKError)) {
13
+ return 'Unexpected error while connecting to call server.';
14
+ }
15
+ switch (err.code) {
16
+ case 'invalid_app':
17
+ return 'Application is not allowed to use this video service.';
18
+ case 'invalid_client':
19
+ return 'Client is not recognized by video service.';
20
+ case 'expired_token':
21
+ return 'Authorization token is expired. Please sign in again.';
22
+ case 'unauthorized':
23
+ return 'Authorization failed. Please check your credentials.';
24
+ case 'forbidden':
25
+ return 'Access is forbidden for this application/client.';
26
+ case 'network_error':
27
+ return 'Network error while connecting to video service.';
28
+ default:
29
+ return err.message || 'Unknown video service error.';
30
+ }
31
+ }
32
+ //# sourceMappingURL=sdkErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkErrors.js","sourceRoot":"","sources":["../src/sdkErrors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,IAAI,CAAc;IAClB,MAAM,CAAS;IAEf,YAAY,IAAkB,EAAE,OAAe,EAAE,MAAe;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,IAAI,CAAC,CAAC,GAAG,YAAY,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,mDAAmD,CAAA;IAC5D,CAAC;IAED,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,aAAa;YAChB,OAAO,uDAAuD,CAAA;QAChE,KAAK,gBAAgB;YACnB,OAAO,4CAA4C,CAAA;QACrD,KAAK,eAAe;YAClB,OAAO,uDAAuD,CAAA;QAChE,KAAK,cAAc;YACjB,OAAO,sDAAsD,CAAA;QAC/D,KAAK,WAAW;YACd,OAAO,kDAAkD,CAAA;QAC3D,KAAK,eAAe;YAClB,OAAO,kDAAkD,CAAA;QAC3D;YACE,OAAO,GAAG,CAAC,OAAO,IAAI,8BAA8B,CAAA;IACxD,CAAC;AACH,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type TokenProvider } from './tokenProvider';
2
+ import type { ServerAuthConfig } from './auth';
3
+ export type SignalMessage = {
4
+ type: string;
5
+ roomId: string;
6
+ userId: string;
7
+ targetUserId?: string;
8
+ payload?: unknown;
9
+ };
10
+ export type SignalingClientConfig = {
11
+ roomId: string;
12
+ userId: string;
13
+ roomToken?: string;
14
+ wsBaseUrl?: string;
15
+ tokenProvider?: TokenProvider;
16
+ apiBaseUrl?: string;
17
+ auth?: ServerAuthConfig;
18
+ onOpen?: () => void;
19
+ onClose?: (event: CloseEvent) => void;
20
+ onError?: (event: Event) => void;
21
+ onMessage?: (message: SignalMessage) => void;
22
+ };
23
+ export declare class VideoSignalingClient {
24
+ private readonly config;
25
+ private ws;
26
+ private connected;
27
+ constructor(config: SignalingClientConfig);
28
+ isConnected(): boolean;
29
+ connect(): Promise<void>;
30
+ send(message: Omit<SignalMessage, 'roomId' | 'userId'>): void;
31
+ disconnect(): void;
32
+ }
33
+ //# sourceMappingURL=signalingClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signalingClient.d.ts","sourceRoot":"","sources":["../src/signalingClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAA;AAG9C,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,gBAAgB,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;CAC7C,CAAA;AAsCD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,SAAS,CAAQ;gBAEb,MAAM,EAAE,qBAAqB;IAIzC,WAAW,IAAI,OAAO;IAIhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC9B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,GAAG,QAAQ,CAAC,GAAG,IAAI;IAW7D,UAAU,IAAI,IAAI;CAKnB"}
@@ -0,0 +1,95 @@
1
+ import { createServerTokenProvider, defaultApiBaseUrl, defaultWsBaseUrlFromApi, } from './tokenProvider';
2
+ import { getVideoSDKConfig } from './sdkConfig';
3
+ function resolveTokenProvider(config) {
4
+ const sdkConfig = getVideoSDKConfig();
5
+ const apiBaseUrl = config.apiBaseUrl ?? sdkConfig.apiBaseUrl;
6
+ const auth = config.auth ?? sdkConfig.auth;
7
+ if (config.tokenProvider)
8
+ return config.tokenProvider;
9
+ if (auth) {
10
+ return createServerTokenProvider({
11
+ apiBaseUrl: apiBaseUrl ?? defaultApiBaseUrl(),
12
+ auth,
13
+ });
14
+ }
15
+ return null;
16
+ }
17
+ async function resolveRoomToken(config) {
18
+ if (config.roomToken)
19
+ return config.roomToken;
20
+ const provider = resolveTokenProvider(config);
21
+ if (!provider) {
22
+ throw new Error('roomToken or tokenProvider/apiBaseUrl+auth is required');
23
+ }
24
+ const ctx = {
25
+ roomId: config.roomId,
26
+ userId: config.userId,
27
+ };
28
+ return provider(ctx);
29
+ }
30
+ function resolveWsBaseUrl(config) {
31
+ const sdkConfig = getVideoSDKConfig();
32
+ if (config.wsBaseUrl)
33
+ return config.wsBaseUrl.replace(/\/+$/, '');
34
+ if (sdkConfig.wsBaseUrl)
35
+ return sdkConfig.wsBaseUrl.replace(/\/+$/, '');
36
+ const apiBaseUrl = config.apiBaseUrl ?? sdkConfig.apiBaseUrl ?? defaultApiBaseUrl();
37
+ if (apiBaseUrl)
38
+ return defaultWsBaseUrlFromApi(apiBaseUrl);
39
+ throw new Error('wsBaseUrl or apiBaseUrl is required');
40
+ }
41
+ export class VideoSignalingClient {
42
+ config;
43
+ ws = null;
44
+ connected = false;
45
+ constructor(config) {
46
+ this.config = config;
47
+ }
48
+ isConnected() {
49
+ return this.connected;
50
+ }
51
+ async connect() {
52
+ if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
53
+ return;
54
+ }
55
+ const roomToken = await resolveRoomToken(this.config);
56
+ const wsBase = resolveWsBaseUrl(this.config);
57
+ const wsURL = `${wsBase}/v1/ws?roomId=${encodeURIComponent(this.config.roomId)}&token=${encodeURIComponent(roomToken)}`;
58
+ await new Promise((resolve, reject) => {
59
+ const ws = new WebSocket(wsURL);
60
+ this.ws = ws;
61
+ ws.onopen = () => {
62
+ this.connected = true;
63
+ this.config.onOpen?.();
64
+ resolve();
65
+ };
66
+ ws.onclose = (event) => {
67
+ this.connected = false;
68
+ this.config.onClose?.(event);
69
+ };
70
+ ws.onerror = (event) => {
71
+ this.config.onError?.(event);
72
+ reject(new Error('WebSocket connection error'));
73
+ };
74
+ ws.onmessage = (event) => {
75
+ const message = JSON.parse(event.data);
76
+ this.config.onMessage?.(message);
77
+ };
78
+ });
79
+ }
80
+ send(message) {
81
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
82
+ return;
83
+ this.ws.send(JSON.stringify({
84
+ roomId: this.config.roomId,
85
+ userId: this.config.userId,
86
+ ...message,
87
+ }));
88
+ }
89
+ disconnect() {
90
+ this.ws?.close();
91
+ this.ws = null;
92
+ this.connected = false;
93
+ }
94
+ }
95
+ //# sourceMappingURL=signalingClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signalingClient.js","sourceRoot":"","sources":["../src/signalingClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,GAGxB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAwB/C,SAAS,oBAAoB,CAAC,MAA6B;IACzD,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAA;IACrC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,CAAA;IAC5D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAA;IAC1C,IAAI,MAAM,CAAC,aAAa;QAAE,OAAO,MAAM,CAAC,aAAa,CAAA;IACrD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,yBAAyB,CAAC;YAC/B,UAAU,EAAE,UAAU,IAAI,iBAAiB,EAAE;YAC7C,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,MAA6B;IAC3D,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,CAAA;IAC7C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAA;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC3E,CAAC;IACD,MAAM,GAAG,GAAyB;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAA;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;AACtB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA6B;IACrD,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAA;IACrC,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACjE,IAAI,SAAS,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IACvE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,SAAS,CAAC,UAAU,IAAI,iBAAiB,EAAE,CAAA;IACnF,IAAI,UAAU;QAAE,OAAO,uBAAuB,CAAC,UAAU,CAAC,CAAA;IAC1D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,OAAO,oBAAoB;IACd,MAAM,CAAuB;IACtC,EAAE,GAAqB,IAAI,CAAA;IAC3B,SAAS,GAAG,KAAK,CAAA;IAEzB,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;YACtG,OAAM;QACR,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAG,GAAG,MAAM,iBAAiB,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAA;QAEvH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAA;YAC/B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAA;YAEZ,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;gBACf,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;gBACrB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAA;gBACtB,OAAO,EAAE,CAAA;YACX,CAAC,CAAA;YACD,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;gBACtB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;YAC9B,CAAC,CAAA;YACD,EAAE,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;YACjD,CAAC,CAAA;YACD,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBACvB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;gBACvD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAA;YAClC,CAAC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,OAAiD;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;YAAE,OAAM;QAC7D,IAAI,CAAC,EAAE,CAAC,IAAI,CACV,IAAI,CAAC,SAAS,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,GAAG,OAAO;SACX,CAAC,CACH,CAAA;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAA;QAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QACd,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IACxB,CAAC;CACF"}