@adeeliore/p2p-core 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.
- package/API_REFERENCE.md +164 -0
- package/CHANGELOG.md +13 -0
- package/LICENSE +12 -0
- package/README.md +164 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/rtc/PeerConnectionManager.d.ts +34 -0
- package/dist/rtc/PeerConnectionManager.d.ts.map +1 -0
- package/dist/rtc/PeerConnectionManager.js +231 -0
- package/dist/rtc/constants.d.ts +15 -0
- package/dist/rtc/constants.d.ts.map +1 -0
- package/dist/rtc/constants.js +65 -0
- package/dist/rtc/defaults.d.ts +13 -0
- package/dist/rtc/defaults.d.ts.map +1 -0
- package/dist/rtc/defaults.js +15 -0
- package/dist/rtc/index.d.ts +6 -0
- package/dist/rtc/index.d.ts.map +1 -0
- package/dist/rtc/index.js +21 -0
- package/dist/rtc/native.d.ts +11 -0
- package/dist/rtc/native.d.ts.map +1 -0
- package/dist/rtc/native.js +31 -0
- package/dist/rtc/options.d.ts +6 -0
- package/dist/rtc/options.d.ts.map +1 -0
- package/dist/rtc/options.js +22 -0
- package/dist/rtc/payloadParsers.d.ts +4 -0
- package/dist/rtc/payloadParsers.d.ts.map +1 -0
- package/dist/rtc/payloadParsers.js +33 -0
- package/dist/rtc/runtime.d.ts +22 -0
- package/dist/rtc/runtime.d.ts.map +1 -0
- package/dist/rtc/runtime.js +25 -0
- package/dist/rtc/types.d.ts +56 -0
- package/dist/rtc/types.d.ts.map +1 -0
- package/dist/rtc/types.js +2 -0
- package/dist/session/P2PSession.d.ts +10 -0
- package/dist/session/P2PSession.d.ts.map +1 -0
- package/dist/session/P2PSession.js +285 -0
- package/dist/session/constants.d.ts +4 -0
- package/dist/session/constants.d.ts.map +1 -0
- package/dist/session/constants.js +6 -0
- package/dist/session/index.d.ts +3 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +18 -0
- package/dist/session/runtimeSupport.d.ts +36 -0
- package/dist/session/runtimeSupport.d.ts.map +1 -0
- package/dist/session/runtimeSupport.js +144 -0
- package/dist/session/serverMessageHandlers.d.ts +21 -0
- package/dist/session/serverMessageHandlers.d.ts.map +1 -0
- package/dist/session/serverMessageHandlers.js +30 -0
- package/dist/session/types.d.ts +195 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/signaling/SignalingClient.d.ts +39 -0
- package/dist/signaling/SignalingClient.d.ts.map +1 -0
- package/dist/signaling/SignalingClient.js +130 -0
- package/dist/signaling/constants.d.ts +14 -0
- package/dist/signaling/constants.d.ts.map +1 -0
- package/dist/signaling/constants.js +20 -0
- package/dist/signaling/index.d.ts +5 -0
- package/dist/signaling/index.d.ts.map +1 -0
- package/dist/signaling/index.js +20 -0
- package/dist/signaling/provider.d.ts +56 -0
- package/dist/signaling/provider.d.ts.map +1 -0
- package/dist/signaling/provider.js +87 -0
- package/dist/signaling/types.d.ts +62 -0
- package/dist/signaling/types.d.ts.map +1 -0
- package/dist/signaling/types.js +2 -0
- package/dist/sync/constants.d.ts +10 -0
- package/dist/sync/constants.d.ts.map +1 -0
- package/dist/sync/constants.js +12 -0
- package/dist/sync/engine.d.ts +13 -0
- package/dist/sync/engine.d.ts.map +1 -0
- package/dist/sync/engine.js +137 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +19 -0
- package/dist/sync/types.d.ts +61 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/package.json +46 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { IceConnectionState, WebRtcConfiguration, WebRtcHeartbeatConfig, WebRtcPeerManager, WebRtcReconnectConfig, WebRtcSignalEmitter, WebRtcEvents } from '../rtc/types';
|
|
2
|
+
import type { P2PCoreErrorPayload } from '../errors';
|
|
3
|
+
import type { IncomingServerMessage, SignalingClient, SignalingProvider } from '../signaling';
|
|
4
|
+
/**
|
|
5
|
+
* Describes whether a peer was already present in the room when the local
|
|
6
|
+
* client joined, or whether it appeared later.
|
|
7
|
+
*/
|
|
8
|
+
export type PeerJoinKind = 'existing' | 'new';
|
|
9
|
+
/**
|
|
10
|
+
* High-level runtime state of the P2P session.
|
|
11
|
+
*/
|
|
12
|
+
export type P2PSessionStatus = 'idle' | 'connecting' | 'connected' | 'error';
|
|
13
|
+
/**
|
|
14
|
+
* Configuration for a high-level P2P session runtime.
|
|
15
|
+
*/
|
|
16
|
+
export interface P2PSessionOptions {
|
|
17
|
+
signalBaseUrl?: string;
|
|
18
|
+
signalingProvider?: SignalingProvider;
|
|
19
|
+
sessionId: string;
|
|
20
|
+
clientId?: string;
|
|
21
|
+
accessToken?: string;
|
|
22
|
+
autoCreateOffers?: boolean;
|
|
23
|
+
offerDelayMs?: number;
|
|
24
|
+
rtcConfig?: WebRtcConfiguration;
|
|
25
|
+
heartbeat?: WebRtcHeartbeatConfig;
|
|
26
|
+
reconnect?: WebRtcReconnectConfig;
|
|
27
|
+
createSignalingClient?: (options: {
|
|
28
|
+
signalBaseUrl: string;
|
|
29
|
+
sessionId: string;
|
|
30
|
+
clientId?: string;
|
|
31
|
+
accessToken?: string;
|
|
32
|
+
onMessage?: (message: IncomingServerMessage) => void;
|
|
33
|
+
onOpen?: () => void;
|
|
34
|
+
onClose?: (event: WebSocketCloseEvent) => void;
|
|
35
|
+
onError?: (event: unknown) => void;
|
|
36
|
+
onProtocolError?: (reason: string, rawMessage: string) => void;
|
|
37
|
+
}) => SignalingClient;
|
|
38
|
+
createPeerManager?: (options: {
|
|
39
|
+
signalEmitter: WebRtcSignalEmitter;
|
|
40
|
+
events?: WebRtcEvents;
|
|
41
|
+
rtcConfig?: WebRtcConfiguration;
|
|
42
|
+
heartbeat?: WebRtcHeartbeatConfig;
|
|
43
|
+
reconnect?: WebRtcReconnectConfig;
|
|
44
|
+
}) => WebRtcPeerManager;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Observable session snapshot exposed by the runtime.
|
|
48
|
+
*/
|
|
49
|
+
export interface P2PSessionState {
|
|
50
|
+
sessionId: string;
|
|
51
|
+
localPeerId: string | null;
|
|
52
|
+
peerIds: string[];
|
|
53
|
+
status: P2PSessionStatus;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Payload emitted when the signaling socket closes.
|
|
57
|
+
*/
|
|
58
|
+
export interface P2PSessionSignalingCloseEvent {
|
|
59
|
+
code?: number;
|
|
60
|
+
reason?: string;
|
|
61
|
+
manual: boolean;
|
|
62
|
+
hadOpened: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generic runtime error payload.
|
|
66
|
+
*/
|
|
67
|
+
export interface P2PSessionErrorEvent extends P2PCoreErrorPayload {
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Transport-level error payload.
|
|
71
|
+
*/
|
|
72
|
+
export interface P2PSessionTransportErrorEvent {
|
|
73
|
+
peerId?: string;
|
|
74
|
+
code: P2PCoreErrorPayload['code'];
|
|
75
|
+
message: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Payload emitted when the signaling layer receives invalid server data.
|
|
79
|
+
*/
|
|
80
|
+
export interface P2PSessionProtocolErrorEvent {
|
|
81
|
+
code: P2PCoreErrorPayload['code'];
|
|
82
|
+
reason: string;
|
|
83
|
+
rawMessage: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Payload emitted on successful signaling welcome.
|
|
87
|
+
*/
|
|
88
|
+
export interface P2PSessionWelcomeEvent {
|
|
89
|
+
sessionId: string;
|
|
90
|
+
clientId: string;
|
|
91
|
+
peers: string[];
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Base payload for peer-related events.
|
|
95
|
+
*/
|
|
96
|
+
export interface P2PSessionPeerEvent {
|
|
97
|
+
peerId: string;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Payload emitted when a peer DataChannel becomes available.
|
|
101
|
+
*/
|
|
102
|
+
export interface P2PSessionPeerDataOpenEvent extends P2PSessionPeerEvent {
|
|
103
|
+
joinKind: PeerJoinKind;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Payload emitted for inbound peer messages.
|
|
107
|
+
*/
|
|
108
|
+
export interface P2PSessionPeerMessageEvent extends P2PSessionPeerEvent {
|
|
109
|
+
message: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Payload emitted on ICE state transitions.
|
|
113
|
+
*/
|
|
114
|
+
export interface P2PSessionIceStateChangeEvent extends P2PSessionPeerEvent {
|
|
115
|
+
state: IceConnectionState;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Payload emitted when the signaling server sends an explicit error message.
|
|
119
|
+
*/
|
|
120
|
+
export interface P2PSessionServerErrorEvent {
|
|
121
|
+
code: string;
|
|
122
|
+
message: string;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* All session runtime events exposed to consumers.
|
|
126
|
+
*/
|
|
127
|
+
export interface P2PSessionEventMap {
|
|
128
|
+
signalingOpen: void;
|
|
129
|
+
signalingClose: P2PSessionSignalingCloseEvent;
|
|
130
|
+
signalingError: P2PSessionErrorEvent;
|
|
131
|
+
transportError: P2PSessionTransportErrorEvent;
|
|
132
|
+
protocolError: P2PSessionProtocolErrorEvent;
|
|
133
|
+
welcome: P2PSessionWelcomeEvent;
|
|
134
|
+
peerJoined: P2PSessionPeerEvent;
|
|
135
|
+
peerLeft: P2PSessionPeerEvent;
|
|
136
|
+
peerDataOpen: P2PSessionPeerDataOpenEvent;
|
|
137
|
+
peerDataClose: P2PSessionPeerEvent;
|
|
138
|
+
peerMessage: P2PSessionPeerMessageEvent;
|
|
139
|
+
iceStateChange: P2PSessionIceStateChangeEvent;
|
|
140
|
+
pong: void;
|
|
141
|
+
serverError: P2PSessionServerErrorEvent;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* High-level reusable P2P session runtime.
|
|
145
|
+
*
|
|
146
|
+
* This is the main application-facing API of the package.
|
|
147
|
+
*/
|
|
148
|
+
export interface P2PSession {
|
|
149
|
+
/**
|
|
150
|
+
* Opens signaling transport and initializes the WebRTC runtime.
|
|
151
|
+
*/
|
|
152
|
+
connect: () => void;
|
|
153
|
+
/**
|
|
154
|
+
* Closes signaling transport, closes peer connections and resets runtime state.
|
|
155
|
+
*/
|
|
156
|
+
disconnect: (code?: number, reason?: string) => void;
|
|
157
|
+
/**
|
|
158
|
+
* Returns whether the signaling connection is currently open and usable.
|
|
159
|
+
*/
|
|
160
|
+
isConnected: () => boolean;
|
|
161
|
+
/**
|
|
162
|
+
* Returns a read-only snapshot of session runtime state.
|
|
163
|
+
*/
|
|
164
|
+
getState: () => P2PSessionState;
|
|
165
|
+
/**
|
|
166
|
+
* Returns the resolved local peer id from the signaling welcome event.
|
|
167
|
+
*/
|
|
168
|
+
getLocalPeerId: () => string | null;
|
|
169
|
+
/**
|
|
170
|
+
* Returns the current signaling-level list of remote peers.
|
|
171
|
+
*/
|
|
172
|
+
getPeerIds: () => string[];
|
|
173
|
+
/**
|
|
174
|
+
* Sends a signaling-level ping through the WebSocket transport.
|
|
175
|
+
*/
|
|
176
|
+
sendPing: () => boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Sends a raw string payload to a specific peer over DataChannel.
|
|
179
|
+
*/
|
|
180
|
+
sendTo: (peerId: string, message: string) => boolean;
|
|
181
|
+
/**
|
|
182
|
+
* Broadcasts a raw string payload to all known peers or a provided subset.
|
|
183
|
+
*/
|
|
184
|
+
broadcast: (message: string, peerIds?: string[]) => number;
|
|
185
|
+
/**
|
|
186
|
+
* Explicitly creates an SDP offer for a target peer.
|
|
187
|
+
*/
|
|
188
|
+
createOffer: (peerId: string) => Promise<void>;
|
|
189
|
+
/**
|
|
190
|
+
* Subscribes to a runtime event.
|
|
191
|
+
* Returns an unsubscribe function.
|
|
192
|
+
*/
|
|
193
|
+
on: <TEvent extends keyof P2PSessionEventMap>(eventName: TEvent, listener: (payload: P2PSessionEventMap[TEvent]) => void) => () => void;
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/session/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { RelayOutgoingMessage, SignalingClientOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Low-level signaling WebSocket client.
|
|
4
|
+
*
|
|
5
|
+
* Use this directly only when you want to build your own orchestration layer.
|
|
6
|
+
* Most applications should prefer `createP2PSession()`.
|
|
7
|
+
*/
|
|
8
|
+
export declare class SignalingClient {
|
|
9
|
+
private readonly options;
|
|
10
|
+
private socket;
|
|
11
|
+
constructor(options: SignalingClientOptions);
|
|
12
|
+
/**
|
|
13
|
+
* Opens the signaling WebSocket if it is not already open.
|
|
14
|
+
*/
|
|
15
|
+
connect(): void;
|
|
16
|
+
/**
|
|
17
|
+
* Closes the signaling WebSocket and drops the local socket reference.
|
|
18
|
+
*/
|
|
19
|
+
disconnect(code?: number, reason?: string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Sends a signaling-level ping frame.
|
|
22
|
+
*/
|
|
23
|
+
sendPing(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Relays an SDP or ICE payload through the signaling server to another peer.
|
|
26
|
+
*/
|
|
27
|
+
sendRelay(type: RelayOutgoingMessage['type'], to: string, payload: unknown): void;
|
|
28
|
+
/**
|
|
29
|
+
* Returns whether the underlying WebSocket is open.
|
|
30
|
+
*/
|
|
31
|
+
isConnected(): boolean;
|
|
32
|
+
private send;
|
|
33
|
+
private tryParseServerMessage;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Builds a signaling WebSocket URL from session connection options.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildSignalingUrl(options: Pick<SignalingClientOptions, 'signalBaseUrl' | 'sessionId' | 'clientId' | 'accessToken'>): string;
|
|
39
|
+
//# sourceMappingURL=SignalingClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SignalingClient.d.ts","sourceRoot":"","sources":["../../src/signaling/SignalingClient.ts"],"names":[],"mappings":"AACA,OAAO,EAGH,oBAAoB,EACpB,sBAAsB,EACzB,MAAM,SAAS,CAAC;AAIjB;;;;;GAKG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,MAAM,CAA0B;gBAE5B,OAAO,EAAE,sBAAsB;IAI3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAgCf;;OAEG;IACH,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAShD;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IASjF;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,IAAI;IAeZ,OAAO,CAAC,qBAAqB;CAgBhC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,sBAAsB,EAAE,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC,GAAG,MAAM,CAiB3I"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SignalingClient = void 0;
|
|
4
|
+
exports.buildSignalingUrl = buildSignalingUrl;
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
const OPEN_STATE = 1;
|
|
7
|
+
/**
|
|
8
|
+
* Low-level signaling WebSocket client.
|
|
9
|
+
*
|
|
10
|
+
* Use this directly only when you want to build your own orchestration layer.
|
|
11
|
+
* Most applications should prefer `createP2PSession()`.
|
|
12
|
+
*/
|
|
13
|
+
class SignalingClient {
|
|
14
|
+
constructor(options) {
|
|
15
|
+
this.socket = null;
|
|
16
|
+
this.options = options;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Opens the signaling WebSocket if it is not already open.
|
|
20
|
+
*/
|
|
21
|
+
connect() {
|
|
22
|
+
if (this.socket && this.socket.readyState === OPEN_STATE) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const url = buildSignalingUrl(this.options);
|
|
26
|
+
const socket = new WebSocket(url);
|
|
27
|
+
this.socket = socket;
|
|
28
|
+
socket.onopen = () => {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
(_b = (_a = this.options).onOpen) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
31
|
+
};
|
|
32
|
+
socket.onclose = (event) => {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
(_b = (_a = this.options).onClose) === null || _b === void 0 ? void 0 : _b.call(_a, event);
|
|
35
|
+
};
|
|
36
|
+
socket.onerror = (event) => {
|
|
37
|
+
var _a, _b;
|
|
38
|
+
(_b = (_a = this.options).onError) === null || _b === void 0 ? void 0 : _b.call(_a, event);
|
|
39
|
+
};
|
|
40
|
+
socket.onmessage = (event) => {
|
|
41
|
+
var _a, _b, _c;
|
|
42
|
+
const rawMessage = typeof event.data === 'string' ? event.data : String((_a = event.data) !== null && _a !== void 0 ? _a : '');
|
|
43
|
+
const parsed = this.tryParseServerMessage(rawMessage);
|
|
44
|
+
if (!parsed) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
(_c = (_b = this.options).onMessage) === null || _c === void 0 ? void 0 : _c.call(_b, parsed);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Closes the signaling WebSocket and drops the local socket reference.
|
|
52
|
+
*/
|
|
53
|
+
disconnect(code, reason) {
|
|
54
|
+
if (!this.socket) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.socket.close(code, reason);
|
|
58
|
+
this.socket = null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Sends a signaling-level ping frame.
|
|
62
|
+
*/
|
|
63
|
+
sendPing() {
|
|
64
|
+
this.send({ type: constants_1.SIGNAL_TYPE.PING });
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Relays an SDP or ICE payload through the signaling server to another peer.
|
|
68
|
+
*/
|
|
69
|
+
sendRelay(type, to, payload) {
|
|
70
|
+
this.send({
|
|
71
|
+
type,
|
|
72
|
+
to,
|
|
73
|
+
payload,
|
|
74
|
+
sessionId: this.options.sessionId,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns whether the underlying WebSocket is open.
|
|
79
|
+
*/
|
|
80
|
+
isConnected() {
|
|
81
|
+
var _a;
|
|
82
|
+
return ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.readyState) === OPEN_STATE;
|
|
83
|
+
}
|
|
84
|
+
send(message) {
|
|
85
|
+
if (!this.socket || this.socket.readyState !== OPEN_STATE) {
|
|
86
|
+
throw new Error('WebSocket is not connected');
|
|
87
|
+
}
|
|
88
|
+
if (constants_1.RELAY_TYPES.has(message.type)) {
|
|
89
|
+
const relay = message;
|
|
90
|
+
if (!relay.to || !relay.to.trim()) {
|
|
91
|
+
throw new Error('Relay target `to` is required');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.socket.send(JSON.stringify(message));
|
|
95
|
+
}
|
|
96
|
+
tryParseServerMessage(rawMessage) {
|
|
97
|
+
var _a, _b, _c, _d;
|
|
98
|
+
let parsed;
|
|
99
|
+
try {
|
|
100
|
+
parsed = JSON.parse(rawMessage);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
(_b = (_a = this.options).onProtocolError) === null || _b === void 0 ? void 0 : _b.call(_a, 'invalid_json', rawMessage);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
if (!parsed || typeof parsed !== 'object' || !('type' in parsed)) {
|
|
107
|
+
(_d = (_c = this.options).onProtocolError) === null || _d === void 0 ? void 0 : _d.call(_c, 'missing_type', rawMessage);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
return parsed;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.SignalingClient = SignalingClient;
|
|
114
|
+
/**
|
|
115
|
+
* Builds a signaling WebSocket URL from session connection options.
|
|
116
|
+
*/
|
|
117
|
+
function buildSignalingUrl(options) {
|
|
118
|
+
const base = options.signalBaseUrl.endsWith('/')
|
|
119
|
+
? options.signalBaseUrl.slice(0, -1)
|
|
120
|
+
: options.signalBaseUrl;
|
|
121
|
+
const url = new URL(`${base}${constants_1.SIGNALING_PATH}`);
|
|
122
|
+
url.searchParams.set('sessionId', options.sessionId);
|
|
123
|
+
if (options.clientId && options.clientId.trim()) {
|
|
124
|
+
url.searchParams.set('clientId', options.clientId.trim());
|
|
125
|
+
}
|
|
126
|
+
if (options.accessToken && options.accessToken.trim()) {
|
|
127
|
+
url.searchParams.set('accessToken', options.accessToken.trim());
|
|
128
|
+
}
|
|
129
|
+
return url.toString();
|
|
130
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const SIGNALING_PATH = "/ws";
|
|
2
|
+
export declare const SIGNAL_TYPE: {
|
|
3
|
+
readonly PING: "ping";
|
|
4
|
+
readonly PONG: "pong";
|
|
5
|
+
readonly WELCOME: "welcome";
|
|
6
|
+
readonly ERROR: "error";
|
|
7
|
+
readonly PEER_JOINED: "peer-joined";
|
|
8
|
+
readonly PEER_LEFT: "peer-left";
|
|
9
|
+
readonly OFFER: "offer";
|
|
10
|
+
readonly ANSWER: "answer";
|
|
11
|
+
readonly ICE: "ice";
|
|
12
|
+
};
|
|
13
|
+
export declare const RELAY_TYPES: Set<string>;
|
|
14
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/signaling/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAC;AAEX,eAAO,MAAM,WAAW,aAItB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RELAY_TYPES = exports.SIGNAL_TYPE = exports.SIGNALING_PATH = void 0;
|
|
4
|
+
exports.SIGNALING_PATH = '/ws';
|
|
5
|
+
exports.SIGNAL_TYPE = {
|
|
6
|
+
PING: 'ping',
|
|
7
|
+
PONG: 'pong',
|
|
8
|
+
WELCOME: 'welcome',
|
|
9
|
+
ERROR: 'error',
|
|
10
|
+
PEER_JOINED: 'peer-joined',
|
|
11
|
+
PEER_LEFT: 'peer-left',
|
|
12
|
+
OFFER: 'offer',
|
|
13
|
+
ANSWER: 'answer',
|
|
14
|
+
ICE: 'ice',
|
|
15
|
+
};
|
|
16
|
+
exports.RELAY_TYPES = new Set([
|
|
17
|
+
exports.SIGNAL_TYPE.OFFER,
|
|
18
|
+
exports.SIGNAL_TYPE.ANSWER,
|
|
19
|
+
exports.SIGNAL_TYPE.ICE,
|
|
20
|
+
]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/signaling/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./constants"), exports);
|
|
18
|
+
__exportStar(require("./provider"), exports);
|
|
19
|
+
__exportStar(require("./SignalingClient"), exports);
|
|
20
|
+
__exportStar(require("./types"), exports);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { IncomingServerMessage, RelayOutgoingMessage, SignalingClientOptions } from './types';
|
|
2
|
+
import { SignalingClient } from './SignalingClient';
|
|
3
|
+
export type SignalingProviderStatus = 'idle' | 'connecting' | 'open' | 'closed' | 'error';
|
|
4
|
+
export interface SignalingProviderCloseEvent {
|
|
5
|
+
code?: number;
|
|
6
|
+
reason?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SignalingProviderErrorEvent {
|
|
9
|
+
message: string;
|
|
10
|
+
cause?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface SignalingProviderConnectOptions {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
clientId?: string;
|
|
15
|
+
accessToken?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SignalingProviderHandlers {
|
|
18
|
+
onOpen?: () => void;
|
|
19
|
+
onClose?: (event: SignalingProviderCloseEvent) => void;
|
|
20
|
+
onError?: (event: SignalingProviderErrorEvent) => void;
|
|
21
|
+
onProtocolError?: (reason: string, rawMessage: string) => void;
|
|
22
|
+
onMessage?: (message: IncomingServerMessage) => void;
|
|
23
|
+
onStatusChange?: (status: SignalingProviderStatus) => void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Transport-neutral signaling contract consumed by P2PSession.
|
|
27
|
+
*
|
|
28
|
+
* Implementations may use a remote WebSocket server, Android/iOS LAN host,
|
|
29
|
+
* Multipeer Connectivity, or any other control-plane transport. User data
|
|
30
|
+
* should still flow over WebRTC DataChannels unless the app explicitly adds a
|
|
31
|
+
* relay fallback.
|
|
32
|
+
*/
|
|
33
|
+
export interface SignalingProvider {
|
|
34
|
+
connect(options: SignalingProviderConnectOptions, handlers: SignalingProviderHandlers): void | Promise<void>;
|
|
35
|
+
disconnect(code?: number, reason?: string): void;
|
|
36
|
+
sendPing(): void;
|
|
37
|
+
sendRelay(type: RelayOutgoingMessage['type'], to: string, payload: unknown): void;
|
|
38
|
+
isConnected(): boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface WebSocketSignalingProviderOptions {
|
|
41
|
+
signalBaseUrl: string;
|
|
42
|
+
createSignalingClient?: (options: SignalingClientOptions) => SignalingClient;
|
|
43
|
+
}
|
|
44
|
+
export declare class WebSocketSignalingProvider implements SignalingProvider {
|
|
45
|
+
private readonly options;
|
|
46
|
+
private client;
|
|
47
|
+
constructor(options: WebSocketSignalingProviderOptions);
|
|
48
|
+
connect(options: SignalingProviderConnectOptions, handlers: SignalingProviderHandlers): void;
|
|
49
|
+
disconnect(code?: number, reason?: string): void;
|
|
50
|
+
sendPing(): void;
|
|
51
|
+
sendRelay(type: RelayOutgoingMessage['type'], to: string, payload: unknown): void;
|
|
52
|
+
isConnected(): boolean;
|
|
53
|
+
private send;
|
|
54
|
+
}
|
|
55
|
+
export declare function createWebSocketSignalingProvider(options: WebSocketSignalingProviderOptions): SignalingProvider;
|
|
56
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/signaling/provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE1F,MAAM,WAAW,2BAA2B;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,+BAA+B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,yBAAyB;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACvD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACvD,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACrD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;CAC9D;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,yBAAyB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7G,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjD,QAAQ,IAAI,IAAI,CAAC;IACjB,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAClF,WAAW,IAAI,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iCAAiC;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,eAAe,CAAC;CAChF;AAED,qBAAa,0BAA2B,YAAW,iBAAiB;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,MAAM,CAAgC;gBAElC,OAAO,EAAE,iCAAiC;IAItD,OAAO,CAAC,OAAO,EAAE,+BAA+B,EAAE,QAAQ,EAAE,yBAAyB,GAAG,IAAI;IAuC5F,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAKhD,QAAQ,IAAI,IAAI;IAIhB,SAAS,CAAC,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAQjF,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,IAAI;CAiBf;AAED,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,iCAAiC,GAAG,iBAAiB,CAE9G"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketSignalingProvider = void 0;
|
|
4
|
+
exports.createWebSocketSignalingProvider = createWebSocketSignalingProvider;
|
|
5
|
+
const constants_1 = require("./constants");
|
|
6
|
+
const SignalingClient_1 = require("./SignalingClient");
|
|
7
|
+
class WebSocketSignalingProvider {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.client = null;
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
connect(options, handlers) {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
if ((_a = this.client) === null || _a === void 0 ? void 0 : _a.isConnected()) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
(_b = handlers.onStatusChange) === null || _b === void 0 ? void 0 : _b.call(handlers, 'connecting');
|
|
18
|
+
const clientOptions = {
|
|
19
|
+
signalBaseUrl: this.options.signalBaseUrl,
|
|
20
|
+
sessionId: options.sessionId,
|
|
21
|
+
clientId: options.clientId,
|
|
22
|
+
accessToken: options.accessToken,
|
|
23
|
+
onOpen: () => {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
(_a = handlers.onStatusChange) === null || _a === void 0 ? void 0 : _a.call(handlers, 'open');
|
|
26
|
+
(_b = handlers.onOpen) === null || _b === void 0 ? void 0 : _b.call(handlers);
|
|
27
|
+
},
|
|
28
|
+
onClose: (event) => {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
(_a = handlers.onStatusChange) === null || _a === void 0 ? void 0 : _a.call(handlers, 'closed');
|
|
31
|
+
(_b = handlers.onClose) === null || _b === void 0 ? void 0 : _b.call(handlers, { code: event.code, reason: event.reason });
|
|
32
|
+
},
|
|
33
|
+
onError: (event) => {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
(_a = handlers.onStatusChange) === null || _a === void 0 ? void 0 : _a.call(handlers, 'error');
|
|
36
|
+
(_b = handlers.onError) === null || _b === void 0 ? void 0 : _b.call(handlers, {
|
|
37
|
+
message: 'Signaling socket error',
|
|
38
|
+
cause: event,
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
onProtocolError: handlers.onProtocolError,
|
|
42
|
+
onMessage: handlers.onMessage,
|
|
43
|
+
};
|
|
44
|
+
const client = this.options.createSignalingClient
|
|
45
|
+
? this.options.createSignalingClient(clientOptions)
|
|
46
|
+
: new SignalingClient_1.SignalingClient(clientOptions);
|
|
47
|
+
this.client = client;
|
|
48
|
+
client.connect();
|
|
49
|
+
}
|
|
50
|
+
disconnect(code, reason) {
|
|
51
|
+
var _a;
|
|
52
|
+
(_a = this.client) === null || _a === void 0 ? void 0 : _a.disconnect(code, reason);
|
|
53
|
+
this.client = null;
|
|
54
|
+
}
|
|
55
|
+
sendPing() {
|
|
56
|
+
this.send({ type: constants_1.SIGNAL_TYPE.PING });
|
|
57
|
+
}
|
|
58
|
+
sendRelay(type, to, payload) {
|
|
59
|
+
this.send({
|
|
60
|
+
type,
|
|
61
|
+
to,
|
|
62
|
+
payload,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
isConnected() {
|
|
66
|
+
var _a;
|
|
67
|
+
return ((_a = this.client) === null || _a === void 0 ? void 0 : _a.isConnected()) === true;
|
|
68
|
+
}
|
|
69
|
+
send(message) {
|
|
70
|
+
if (!this.client) {
|
|
71
|
+
throw new Error('Signaling provider is not connected');
|
|
72
|
+
}
|
|
73
|
+
if (message.type === constants_1.SIGNAL_TYPE.PING) {
|
|
74
|
+
this.client.sendPing();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (constants_1.RELAY_TYPES.has(message.type)) {
|
|
78
|
+
this.client.sendRelay(message.type, message.to, message.payload);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
throw new Error(`Unsupported signaling message type: ${message.type}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.WebSocketSignalingProvider = WebSocketSignalingProvider;
|
|
85
|
+
function createWebSocketSignalingProvider(options) {
|
|
86
|
+
return new WebSocketSignalingProvider(options);
|
|
87
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
export type RelayType = 'offer' | 'answer' | 'ice';
|
|
2
|
+
export type ServerMessageType = 'welcome' | 'peer-joined' | 'peer-left' | 'pong' | 'offer' | 'answer' | 'ice' | 'error';
|
|
3
|
+
export interface PeerInfo {
|
|
4
|
+
clientId: string;
|
|
5
|
+
}
|
|
6
|
+
export interface WelcomeMessage {
|
|
7
|
+
type: 'welcome';
|
|
8
|
+
sessionId: string;
|
|
9
|
+
clientId: string;
|
|
10
|
+
peers: PeerInfo[];
|
|
11
|
+
}
|
|
12
|
+
export interface PeerJoinedMessage {
|
|
13
|
+
type: 'peer-joined';
|
|
14
|
+
sessionId: string;
|
|
15
|
+
clientId: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PeerLeftMessage {
|
|
18
|
+
type: 'peer-left';
|
|
19
|
+
sessionId: string;
|
|
20
|
+
clientId: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PongMessage {
|
|
23
|
+
type: 'pong';
|
|
24
|
+
}
|
|
25
|
+
export interface RelayServerMessage {
|
|
26
|
+
type: RelayType;
|
|
27
|
+
sessionId: string;
|
|
28
|
+
from: string;
|
|
29
|
+
to: string;
|
|
30
|
+
payload?: unknown;
|
|
31
|
+
}
|
|
32
|
+
export interface ErrorMessage {
|
|
33
|
+
type: 'error';
|
|
34
|
+
code: string;
|
|
35
|
+
message: string;
|
|
36
|
+
}
|
|
37
|
+
export type IncomingServerMessage = WelcomeMessage | PeerJoinedMessage | PeerLeftMessage | PongMessage | RelayServerMessage | ErrorMessage;
|
|
38
|
+
export interface OutgoingMessageBase {
|
|
39
|
+
type: string;
|
|
40
|
+
sessionId?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface PingMessage extends OutgoingMessageBase {
|
|
43
|
+
type: 'ping';
|
|
44
|
+
}
|
|
45
|
+
export interface RelayOutgoingMessage extends OutgoingMessageBase {
|
|
46
|
+
type: RelayType;
|
|
47
|
+
to: string;
|
|
48
|
+
payload: unknown;
|
|
49
|
+
}
|
|
50
|
+
export type OutgoingClientMessage = PingMessage | RelayOutgoingMessage;
|
|
51
|
+
export interface SignalingClientOptions {
|
|
52
|
+
signalBaseUrl: string;
|
|
53
|
+
sessionId: string;
|
|
54
|
+
clientId?: string;
|
|
55
|
+
accessToken?: string;
|
|
56
|
+
onMessage?: (message: IncomingServerMessage) => void;
|
|
57
|
+
onOpen?: () => void;
|
|
58
|
+
onClose?: (event: WebSocketCloseEvent) => void;
|
|
59
|
+
onError?: (event: unknown) => void;
|
|
60
|
+
onProtocolError?: (reason: string, rawMessage: string) => void;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/signaling/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GACvB,SAAS,GACT,aAAa,GACb,WAAW,GACX,MAAM,GACN,OAAO,GACP,QAAQ,GACR,KAAK,GACL,OAAO,CAAC;AAEd,MAAM,WAAW,QAAQ;IACrB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,qBAAqB,GAC3B,cAAc,GACd,iBAAiB,GACjB,eAAe,GACf,WAAW,GACX,kBAAkB,GAClB,YAAY,CAAC;AAEnB,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,mBAAmB;IACpD,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CAClE"}
|