@relaymessenger/sdk 0.3.6-staging.9 → 0.3.7-staging.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 (80) hide show
  1. package/README.md +516 -29
  2. package/dist/a2ui.d.ts +111 -0
  3. package/dist/a2ui.d.ts.map +1 -0
  4. package/dist/a2ui.js +137 -0
  5. package/dist/a2ui.js.map +1 -0
  6. package/dist/calls/call-room.d.ts +110 -0
  7. package/dist/calls/call-room.d.ts.map +1 -0
  8. package/dist/calls/call-room.js +616 -0
  9. package/dist/calls/call-room.js.map +1 -0
  10. package/dist/calls/engine-werift-video.d.ts +83 -0
  11. package/dist/calls/engine-werift-video.d.ts.map +1 -0
  12. package/dist/calls/engine-werift-video.js +607 -0
  13. package/dist/calls/engine-werift-video.js.map +1 -0
  14. package/dist/calls/engine-werift.d.ts +48 -0
  15. package/dist/calls/engine-werift.d.ts.map +1 -0
  16. package/dist/calls/engine-werift.js +462 -0
  17. package/dist/calls/engine-werift.js.map +1 -0
  18. package/dist/calls/index.d.ts +11 -0
  19. package/dist/calls/index.d.ts.map +1 -0
  20. package/dist/calls/index.js +11 -0
  21. package/dist/calls/index.js.map +1 -0
  22. package/dist/calls/transport.d.ts +466 -0
  23. package/dist/calls/transport.d.ts.map +1 -0
  24. package/dist/calls/transport.js +1409 -0
  25. package/dist/calls/transport.js.map +1 -0
  26. package/dist/calls/video-frame.d.ts +56 -0
  27. package/dist/calls/video-frame.d.ts.map +1 -0
  28. package/dist/calls/video-frame.js +245 -0
  29. package/dist/calls/video-frame.js.map +1 -0
  30. package/dist/calls/video-presets.d.ts +39 -0
  31. package/dist/calls/video-presets.d.ts.map +1 -0
  32. package/dist/calls/video-presets.js +40 -0
  33. package/dist/calls/video-presets.js.map +1 -0
  34. package/dist/calls/video-rtp.d.ts +51 -0
  35. package/dist/calls/video-rtp.d.ts.map +1 -0
  36. package/dist/calls/video-rtp.js +294 -0
  37. package/dist/calls/video-rtp.js.map +1 -0
  38. package/dist/calls/video.d.ts +195 -0
  39. package/dist/calls/video.d.ts.map +1 -0
  40. package/dist/calls/video.js +228 -0
  41. package/dist/calls/video.js.map +1 -0
  42. package/dist/client.d.ts +199 -1
  43. package/dist/client.d.ts.map +1 -1
  44. package/dist/client.js +444 -0
  45. package/dist/client.js.map +1 -1
  46. package/dist/errors.d.ts +11 -0
  47. package/dist/errors.d.ts.map +1 -1
  48. package/dist/errors.js +16 -0
  49. package/dist/errors.js.map +1 -1
  50. package/dist/index.d.ts +7 -2
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +7 -2
  53. package/dist/index.js.map +1 -1
  54. package/dist/links.d.ts +17 -6
  55. package/dist/links.d.ts.map +1 -1
  56. package/dist/links.js +35 -4
  57. package/dist/links.js.map +1 -1
  58. package/dist/operations.d.ts +97 -1
  59. package/dist/operations.d.ts.map +1 -1
  60. package/dist/operations.js +129 -0
  61. package/dist/operations.js.map +1 -1
  62. package/dist/payment.d.ts +67 -0
  63. package/dist/payment.d.ts.map +1 -0
  64. package/dist/payment.js +147 -0
  65. package/dist/payment.js.map +1 -0
  66. package/dist/reply-target.d.ts +26 -0
  67. package/dist/reply-target.d.ts.map +1 -0
  68. package/dist/reply-target.js +59 -0
  69. package/dist/reply-target.js.map +1 -0
  70. package/dist/selection.d.ts +46 -0
  71. package/dist/selection.d.ts.map +1 -0
  72. package/dist/selection.js +142 -0
  73. package/dist/selection.js.map +1 -0
  74. package/dist/types.d.ts +1113 -22
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/websocket.d.ts +6 -0
  77. package/dist/websocket.d.ts.map +1 -1
  78. package/dist/websocket.js +36 -10
  79. package/dist/websocket.js.map +1 -1
  80. package/package.json +37 -2
@@ -0,0 +1,616 @@
1
+ import NodeWebSocket from "ws";
2
+ /** Orange Meets heartbeat cadence (`app/hooks/useRoom.ts`, 5_000 ms). */
3
+ const DEFAULT_HEARTBEAT_INTERVAL_MS = 5_000;
4
+ /**
5
+ * PartySocket reconnect defaults (`partysocket/src/ws.ts` DEFAULT), PROTOCOL.md
6
+ * section 5. No retry limit: the room stops only on a close that was asked for.
7
+ */
8
+ const MIN_RECONNECTION_DELAY_MS = 3_000;
9
+ const RECONNECTION_DELAY_GROW_FACTOR = 1.3;
10
+ const MAX_RECONNECTION_DELAY_MS = 10_000;
11
+ const CONNECTION_TIMEOUT_MS = 4_000;
12
+ const MIN_UPTIME_MS = 5_000;
13
+ const CLIENT_PROTOCOL_ERROR = 4400;
14
+ const TERMINAL_STATUSES = new Set([
15
+ "completed", "no-answer", "canceled", "busy", "failed",
16
+ ]);
17
+ /**
18
+ * Server frame types this client decodes. Any other type is a frame a newer
19
+ * Relay added: it is ignored and the socket stays open, as Orange Meets'
20
+ * room client does (`app/hooks/useRoom.ts` `onMessage`: its `default` case
21
+ * only breaks).
22
+ */
23
+ const KNOWN_SERVER_FRAME_TYPES = new Set([
24
+ "heartbeat", "iceServers", "roomState", "answer", "offer", "ended", "error",
25
+ ]);
26
+ const ROOM_ERROR_CODES = new Set([
27
+ "invalid_frame", "not_allowed", "media_unavailable",
28
+ ]);
29
+ const isRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
30
+ const hasExactKeys = (value, keys) => {
31
+ const actual = Object.keys(value).sort();
32
+ const expected = [...keys].sort();
33
+ return actual.length === expected.length
34
+ && actual.every((key, index) => key === expected[index]);
35
+ };
36
+ const validDescription = (value, type) => isRecord(value)
37
+ && hasExactKeys(value, ["type", "sdp"])
38
+ && value.type === type
39
+ && typeof value.sdp === "string"
40
+ && value.sdp.length > 0
41
+ && value.sdp.length <= 65_536;
42
+ const validCall = (value) => {
43
+ if (!isRecord(value))
44
+ return false;
45
+ const status = value.status;
46
+ return typeof value.id === "string"
47
+ && typeof value.chat_id === "string"
48
+ && (status === "ringing" || status === "in-progress" || TERMINAL_STATUSES.has(status));
49
+ };
50
+ const PARTICIPANT_KEYS = ["contact_id", "kind", "attached", "track", "muted", "connected"];
51
+ /**
52
+ * `tracks`: `[]` before the participant's first offer, then `["audio"]` or
53
+ * `["audio", "video"]` (PROTOCOL.md section 3). `receiving` has the same shape
54
+ * (section 6b).
55
+ */
56
+ const validTracks = (value) => Array.isArray(value)
57
+ && value.length <= 2
58
+ && value.every((name) => name === "audio" || name === "video")
59
+ && new Set(value).size === value.length;
60
+ const validParticipant = (value) => isRecord(value)
61
+ && (hasExactKeys(value, PARTICIPANT_KEYS)
62
+ || hasExactKeys(value, [...PARTICIPANT_KEYS, "video", "tracks"])
63
+ || hasExactKeys(value, [...PARTICIPANT_KEYS, "video", "tracks", "receiving"]))
64
+ && (value.video === undefined || typeof value.video === "boolean")
65
+ && (value.tracks === undefined || validTracks(value.tracks))
66
+ && (value.receiving === undefined || validTracks(value.receiving))
67
+ && typeof value.contact_id === "string"
68
+ && (value.kind === "user" || value.kind === "agent")
69
+ && typeof value.attached === "boolean"
70
+ && (value.track === "audio" || value.track === null)
71
+ && typeof value.muted === "boolean"
72
+ && typeof value.connected === "boolean";
73
+ /** Contract `CallRoomIceServersFrame`: 1-8 servers, each 1-16 `stun:`/`turn:`/`turns:` URLs. */
74
+ const validIceServer = (value) => isRecord(value)
75
+ && Object.keys(value).every((key) => key === "urls" || key === "username" || key === "credential")
76
+ && Array.isArray(value.urls)
77
+ && value.urls.length >= 1
78
+ && value.urls.length <= 16
79
+ && value.urls.every((url) => typeof url === "string" && /^(stun|turns?):/u.test(url))
80
+ && (value.username === undefined || typeof value.username === "string")
81
+ && (value.credential === undefined || typeof value.credential === "string");
82
+ /**
83
+ * Validate one server frame before exposing it to application code. Returns
84
+ * `null` for Relay's echoed heartbeat (not part of the public server-frame
85
+ * union) and for a frame type this client does not know (a newer Relay's
86
+ * frame, ignored). Throws for a known frame type whose shape is invalid.
87
+ */
88
+ export const parseCallRoomServerFrame = (value) => {
89
+ if (!isRecord(value) || typeof value.type !== "string") {
90
+ throw new Error("Relay Call room received an invalid frame.");
91
+ }
92
+ if (!KNOWN_SERVER_FRAME_TYPES.has(value.type))
93
+ return null;
94
+ switch (value.type) {
95
+ case "heartbeat":
96
+ if (!hasExactKeys(value, ["type"]))
97
+ break;
98
+ return null;
99
+ case "iceServers":
100
+ if (!hasExactKeys(value, ["type", "ice_servers"])
101
+ || !Array.isArray(value.ice_servers)
102
+ || value.ice_servers.length < 1
103
+ || value.ice_servers.length > 8
104
+ || !value.ice_servers.every(validIceServer))
105
+ break;
106
+ return value;
107
+ case "roomState": {
108
+ if (!hasExactKeys(value, ["type", "call", "participants"])
109
+ || !validCall(value.call)
110
+ || !Array.isArray(value.participants)
111
+ || value.participants.length !== 2
112
+ || !value.participants.every(validParticipant))
113
+ break;
114
+ return value;
115
+ }
116
+ case "answer":
117
+ if (!hasExactKeys(value, ["type", "session_description"])
118
+ || !validDescription(value.session_description, "answer"))
119
+ break;
120
+ return value;
121
+ case "offer":
122
+ if (!hasExactKeys(value, ["type", "session_description", "track"])
123
+ || (value.track !== "audio" && value.track !== "video")
124
+ || !validDescription(value.session_description, "offer"))
125
+ break;
126
+ return value;
127
+ case "ended":
128
+ if (!hasExactKeys(value, ["type", "reason"])
129
+ || !TERMINAL_STATUSES.has(value.reason))
130
+ break;
131
+ return value;
132
+ case "error":
133
+ if (!hasExactKeys(value, ["type", "code", "message"])
134
+ || !ROOM_ERROR_CODES.has(value.code)
135
+ || typeof value.message !== "string")
136
+ break;
137
+ return value;
138
+ default:
139
+ break;
140
+ }
141
+ throw new Error("Relay Call room received an invalid frame.");
142
+ };
143
+ const text = async (value) => {
144
+ if (typeof value === "string")
145
+ return value;
146
+ if (value instanceof ArrayBuffer)
147
+ return new TextDecoder().decode(value);
148
+ if (ArrayBuffer.isView(value))
149
+ return new TextDecoder().decode(value);
150
+ if (typeof Blob !== "undefined" && value instanceof Blob)
151
+ return value.text();
152
+ throw new Error("Relay Call room received a non-text frame.");
153
+ };
154
+ const reasonText = (value) => {
155
+ if (typeof value === "string")
156
+ return value;
157
+ if (value instanceof Uint8Array)
158
+ return new TextDecoder().decode(value);
159
+ return "";
160
+ };
161
+ /**
162
+ * Authenticated JSON signaling socket for one Relay Call participant.
163
+ *
164
+ * The room reopens its socket after any close that neither this client nor the
165
+ * server asked for, with PartySocket's numbers (PROTOCOL.md section 5): first
166
+ * retry after 3000 ms, then x1.3, capped at 10000 ms, a 4000 ms connect
167
+ * timeout, the retry count reset once a socket stays open 5000 ms, and no
168
+ * retry limit. On every open it sends `join`, then `userUpdate` with the last
169
+ * muted/video state, then the frames queued while closed. Media is never
170
+ * re-offered by a socket-only reconnect.
171
+ */
172
+ export class CallRoom {
173
+ callID;
174
+ url;
175
+ state = null;
176
+ /**
177
+ * The STUN/TURN servers from the room's latest `iceServers` frame, or `null`
178
+ * before the first one. Relay sends fresh ones on every join, reconnects
179
+ * included, so read this again before building each new peer connection.
180
+ */
181
+ iceServers = null;
182
+ #apiKey;
183
+ #WebSocket;
184
+ #heartbeatIntervalMs;
185
+ #onWarning;
186
+ /** Unknown server frame types already warned about, so each is logged once. */
187
+ #unknownFrameTypes = new Set();
188
+ #signal;
189
+ #listeners = new Map();
190
+ /** The open socket, or the still-open socket a manual `reconnect()` is replacing. */
191
+ #socket;
192
+ /** The socket being opened, not yet accepted. */
193
+ #attempt;
194
+ #heartbeat;
195
+ #retryTimer;
196
+ #uptimeTimer;
197
+ /** PartySocket `_retryCount`: -1 before the first connect, 0 once a socket stayed up. */
198
+ #retryCount = -1;
199
+ #closed = false;
200
+ #ended = false;
201
+ #connectionState = "idle";
202
+ #queue = [];
203
+ #muted;
204
+ #video;
205
+ #openWaiters = [];
206
+ /** The pending manual `reconnect()`, rejected alone when its attempt fails and the old socket is kept. */
207
+ #manual;
208
+ constructor(callID, baseURL, apiKey, options = {}) {
209
+ this.callID = callID;
210
+ this.#apiKey = apiKey;
211
+ this.#WebSocket = options.WebSocket ?? NodeWebSocket;
212
+ this.#heartbeatIntervalMs = options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
213
+ this.#onWarning = options.onWarning ?? ((message) => console.warn(message));
214
+ this.#signal = options.signal;
215
+ if (!Number.isFinite(this.#heartbeatIntervalMs) || this.#heartbeatIntervalMs <= 0) {
216
+ throw new Error("Call room heartbeatIntervalMs must be greater than zero.");
217
+ }
218
+ const url = new URL(baseURL.replace(/\/+$/u, ""));
219
+ url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
220
+ url.pathname = `${url.pathname.replace(/\/$/u, "")}/v1/calls/${encodeURIComponent(callID)}/room`;
221
+ url.search = "";
222
+ url.hash = "";
223
+ this.url = url.toString();
224
+ if (this.#signal) {
225
+ if (this.#signal.aborted)
226
+ this.#closed = true;
227
+ else
228
+ this.#signal.addEventListener("abort", () => this.close(1000, "Aborted"), { once: true });
229
+ }
230
+ }
231
+ /** `reconnecting` while the room waits to reopen a dropped socket. */
232
+ get connectionState() {
233
+ return this.#connectionState;
234
+ }
235
+ on(event, listener) {
236
+ let listeners = this.#listeners.get(event);
237
+ if (!listeners) {
238
+ listeners = new Set();
239
+ this.#listeners.set(event, listeners);
240
+ }
241
+ listeners.add(listener);
242
+ return this;
243
+ }
244
+ off(event, listener) {
245
+ this.#listeners.get(event)?.delete(listener);
246
+ return this;
247
+ }
248
+ /** Resolves on the first open; a failed attempt is retried, not thrown. */
249
+ async connect() {
250
+ if (this.#closed)
251
+ throw new Error("Relay Call room is closed.");
252
+ if (this.#connectionState === "open")
253
+ return;
254
+ if (this.#connectionState === "connecting") {
255
+ throw new Error("Relay Call room is already connecting.");
256
+ }
257
+ const opened = this.#waitForOpen();
258
+ if (this.#connectionState === "idle") {
259
+ this.#ended = false;
260
+ this.#retryCount = -1;
261
+ this.#connect();
262
+ }
263
+ return opened;
264
+ }
265
+ /**
266
+ * Open a new signaling socket now, keeping application/WebRTC state alive.
267
+ * Relay accepts the new authenticated socket before the previous one closes,
268
+ * so an active Call is not interpreted as having lost its participant. Same
269
+ * path as the automatic reconnect (PartySocket `reconnect()`: retry count
270
+ * reset, no delay); if the new socket fails while the old one is still open,
271
+ * the old one stays and this rejects.
272
+ */
273
+ async reconnect() {
274
+ if (this.#closed)
275
+ throw new Error("Relay Call room is closed.");
276
+ let manual;
277
+ const opened = new Promise((resolve, reject) => { manual = { resolve, reject }; });
278
+ this.#openWaiters.push(manual);
279
+ this.#manual = manual;
280
+ this.#ended = false;
281
+ this.#retryCount = -1;
282
+ this.#clearRetryTimer();
283
+ this.#abandonAttempt();
284
+ this.#connect();
285
+ try {
286
+ await opened;
287
+ }
288
+ finally {
289
+ if (this.#manual === manual)
290
+ this.#manual = undefined;
291
+ }
292
+ }
293
+ /**
294
+ * Send one frame. While the socket is reopening the frame is queued and sent
295
+ * after `join` on the next open (PartySocket's queue); heartbeats are dropped.
296
+ */
297
+ send(frame) {
298
+ if (this.#closed || this.#connectionState === "idle" || this.#connectionState === "closed") {
299
+ throw new Error("Relay Call room is not connected.");
300
+ }
301
+ if (frame.type === "userUpdate") {
302
+ this.#muted = frame.muted;
303
+ if (frame.video !== undefined)
304
+ this.#video = frame.video;
305
+ }
306
+ const data = JSON.stringify(frame);
307
+ if (this.#connectionState === "open" && this.#socket) {
308
+ this.#socket.send(data);
309
+ return;
310
+ }
311
+ // `userUpdate` is re-sent from the recorded state on open, not queued.
312
+ if (frame.type === "heartbeat" || frame.type === "userUpdate")
313
+ return;
314
+ this.#queue.push(data);
315
+ }
316
+ connected() {
317
+ this.send({ type: "connected" });
318
+ }
319
+ userUpdate(update) {
320
+ this.send({
321
+ type: "userUpdate",
322
+ muted: update.muted,
323
+ ...(update.video === undefined ? {} : { video: update.video }),
324
+ });
325
+ }
326
+ end() {
327
+ this.send({ type: "end" });
328
+ }
329
+ close(code = 1000, reason = "Client closed") {
330
+ if (this.#closed)
331
+ return;
332
+ this.#closed = true;
333
+ this.#connectionState = "closed";
334
+ this.#stopHeartbeat();
335
+ this.#clearRetryTimer();
336
+ this.#clearUptimeTimer();
337
+ this.#abandonAttempt();
338
+ this.#queue = [];
339
+ const socket = this.#socket;
340
+ this.#socket = undefined;
341
+ socket?.close(code, reason);
342
+ this.#rejectOpenWaiters(new Error("Relay Call room is closed."));
343
+ }
344
+ #waitForOpen() {
345
+ return new Promise((resolve, reject) => this.#openWaiters.push({ resolve, reject }));
346
+ }
347
+ #rejectOpenWaiters(error) {
348
+ const waiters = this.#openWaiters;
349
+ this.#openWaiters = [];
350
+ for (const waiter of waiters)
351
+ waiter.reject(error);
352
+ }
353
+ /** PartySocket `_getNextDelay`. */
354
+ #nextDelay() {
355
+ if (this.#retryCount <= 0)
356
+ return 0;
357
+ return Math.min(MIN_RECONNECTION_DELAY_MS * RECONNECTION_DELAY_GROW_FACTOR ** (this.#retryCount - 1), MAX_RECONNECTION_DELAY_MS);
358
+ }
359
+ /** PartySocket `_connect`: count the attempt, wait the delay, open. */
360
+ #connect(cause = {}) {
361
+ if (this.#closed)
362
+ return;
363
+ this.#retryCount += 1;
364
+ const delayMs = this.#nextDelay();
365
+ if (!this.#socket)
366
+ this.#connectionState = this.#retryCount === 0 ? "connecting" : "reconnecting";
367
+ else
368
+ this.#connectionState = "connecting";
369
+ if (delayMs === 0) {
370
+ this.#open();
371
+ return;
372
+ }
373
+ this.#emit("reconnecting", { attempt: this.#retryCount, delayMs, ...cause });
374
+ if (this.#closed)
375
+ return;
376
+ this.#retryTimer = setTimeout(() => {
377
+ this.#retryTimer = undefined;
378
+ this.#open();
379
+ }, delayMs);
380
+ }
381
+ #open() {
382
+ if (this.#closed)
383
+ return;
384
+ const socket = new this.#WebSocket(this.url, {
385
+ headers: { Authorization: `Bearer ${this.#apiKey}` },
386
+ });
387
+ let settled = false;
388
+ const timeout = setTimeout(() => fail(new Error("Relay Call room connect timed out.")), CONNECTION_TIMEOUT_MS);
389
+ const detach = () => {
390
+ settled = true;
391
+ clearTimeout(timeout);
392
+ socket.removeEventListener("open", onOpen);
393
+ socket.removeEventListener("error", onError);
394
+ socket.removeEventListener("close", onClose);
395
+ };
396
+ const fail = (error) => {
397
+ if (settled)
398
+ return;
399
+ detach();
400
+ this.#attempt = undefined;
401
+ socket.addEventListener("error", ignore);
402
+ try {
403
+ socket.close(1000, "timeout");
404
+ }
405
+ catch { /* the socket may not be closable yet */ }
406
+ if (this.#closed)
407
+ return;
408
+ const previous = this.#socket;
409
+ const manual = this.#manual;
410
+ if (previous && manual) {
411
+ // The socket a manual reconnect was replacing is still open: keep it.
412
+ this.#connectionState = "open";
413
+ this.#flush(previous);
414
+ this.#manual = undefined;
415
+ this.#openWaiters = this.#openWaiters.filter((waiter) => waiter !== manual);
416
+ manual.reject(error);
417
+ return;
418
+ }
419
+ this.#connect({ error });
420
+ };
421
+ const onError = () => fail(new Error("Relay Call room WebSocket failed to connect."));
422
+ const onClose = (event) => fail(new Error(`Relay Call room closed before connecting (${Number(event?.code ?? 1006)}).`));
423
+ const onOpen = () => {
424
+ if (settled)
425
+ return;
426
+ detach();
427
+ this.#attempt = undefined;
428
+ if (this.#closed) {
429
+ socket.close(1000, "Client closed");
430
+ return;
431
+ }
432
+ const previous = this.#socket;
433
+ this.#socket = socket;
434
+ this.#connectionState = "open";
435
+ this.#attachOpenSocket(socket);
436
+ this.#clearUptimeTimer();
437
+ this.#uptimeTimer = setTimeout(() => {
438
+ this.#uptimeTimer = undefined;
439
+ this.#retryCount = 0;
440
+ }, MIN_UPTIME_MS);
441
+ this.#uptimeTimer.unref?.();
442
+ socket.send(JSON.stringify({ type: "join" }));
443
+ if (this.#muted !== undefined) {
444
+ socket.send(JSON.stringify({
445
+ type: "userUpdate",
446
+ muted: this.#muted,
447
+ ...(this.#video === undefined ? {} : { video: this.#video }),
448
+ }));
449
+ }
450
+ this.#flush(socket);
451
+ this.#startHeartbeat();
452
+ if (previous && previous !== socket)
453
+ previous.close(1000, "Replaced");
454
+ const waiters = this.#openWaiters;
455
+ this.#openWaiters = [];
456
+ for (const waiter of waiters)
457
+ waiter.resolve();
458
+ this.#emit("open");
459
+ };
460
+ socket.addEventListener("open", onOpen);
461
+ socket.addEventListener("error", onError);
462
+ socket.addEventListener("close", onClose);
463
+ this.#attempt = { socket, detach };
464
+ }
465
+ #flush(socket) {
466
+ const queue = this.#queue;
467
+ this.#queue = [];
468
+ for (const data of queue)
469
+ socket.send(data);
470
+ }
471
+ #abandonAttempt() {
472
+ const attempt = this.#attempt;
473
+ if (!attempt)
474
+ return;
475
+ this.#attempt = undefined;
476
+ attempt.detach();
477
+ attempt.socket.addEventListener("error", ignore);
478
+ try {
479
+ attempt.socket.close(1000, "Client closed");
480
+ }
481
+ catch { /* not closable yet */ }
482
+ }
483
+ /** A close the client or the server asked for, or the Call is over: never reopen. */
484
+ #isFinal(event) {
485
+ if (this.#closed || this.#ended)
486
+ return true;
487
+ if (event.code === CLIENT_PROTOCOL_ERROR)
488
+ return true;
489
+ if (event.code === 1000 && (event.reason === "Replaced" || event.reason === "Call ended"))
490
+ return true;
491
+ const status = this.state?.call.status;
492
+ return status !== undefined && TERMINAL_STATUSES.has(status);
493
+ }
494
+ #attachOpenSocket(socket) {
495
+ socket.addEventListener("message", (event) => {
496
+ void this.#message(socket, event?.data).catch((error) => {
497
+ if (socket !== this.#socket)
498
+ return;
499
+ const parsed = error instanceof Error ? error : new Error(String(error));
500
+ this.#emit("error", parsed);
501
+ socket.close(CLIENT_PROTOCOL_ERROR, "invalid frame");
502
+ });
503
+ });
504
+ // A socket error is always followed by its close; the close decides.
505
+ socket.addEventListener("error", ignore);
506
+ socket.addEventListener("close", (event) => {
507
+ if (socket !== this.#socket)
508
+ return;
509
+ this.#stopHeartbeat();
510
+ this.#clearUptimeTimer();
511
+ this.#socket = undefined;
512
+ const close = {
513
+ code: Number(event?.code ?? 1006),
514
+ reason: reasonText(event?.reason),
515
+ wasClean: Boolean(event?.wasClean),
516
+ };
517
+ // A manual reconnect's new socket is still opening: the server closes
518
+ // the socket it replaces ("Replaced"), and the new socket decides.
519
+ if (this.#attempt) {
520
+ this.#connectionState = "connecting";
521
+ return;
522
+ }
523
+ if (!this.#isFinal(close)) {
524
+ this.#connect({ close });
525
+ return;
526
+ }
527
+ this.#clearRetryTimer();
528
+ this.#abandonAttempt();
529
+ this.#queue = [];
530
+ if (!this.#closed)
531
+ this.#connectionState = "idle";
532
+ this.#rejectOpenWaiters(new Error(`Relay Call room closed (${close.code}).`));
533
+ this.#emit("close", close);
534
+ });
535
+ }
536
+ async #message(socket, data) {
537
+ if (socket !== this.#socket)
538
+ return;
539
+ const source = await text(data);
540
+ const value = JSON.parse(source);
541
+ if (isRecord(value) && typeof value.type === "string" && !KNOWN_SERVER_FRAME_TYPES.has(value.type)) {
542
+ if (!this.#unknownFrameTypes.has(value.type)) {
543
+ this.#unknownFrameTypes.add(value.type);
544
+ try {
545
+ this.#onWarning(`Relay Call room ignored a server frame of unknown type "${value.type}".`);
546
+ }
547
+ catch { /* a warning sink never corrupts signaling */ }
548
+ }
549
+ return;
550
+ }
551
+ const frame = parseCallRoomServerFrame(value);
552
+ if (!frame)
553
+ return;
554
+ switch (frame.type) {
555
+ case "iceServers":
556
+ this.iceServers = frame.ice_servers;
557
+ this.#emit("iceServers", frame);
558
+ return;
559
+ case "roomState":
560
+ this.state = frame;
561
+ this.#emit("roomState", frame);
562
+ return;
563
+ case "offer":
564
+ this.#emit("offer", frame);
565
+ return;
566
+ case "answer":
567
+ this.#emit("answer", frame);
568
+ return;
569
+ case "ended":
570
+ this.#ended = true;
571
+ this.#emit("ended", frame);
572
+ return;
573
+ case "error":
574
+ this.#emit("error", frame);
575
+ return;
576
+ }
577
+ }
578
+ #startHeartbeat() {
579
+ this.#stopHeartbeat();
580
+ this.#heartbeat = setInterval(() => {
581
+ if (this.#connectionState !== "open" || !this.#socket)
582
+ return;
583
+ this.#socket.send(JSON.stringify({ type: "heartbeat" }));
584
+ }, this.#heartbeatIntervalMs);
585
+ this.#heartbeat.unref?.();
586
+ }
587
+ #stopHeartbeat() {
588
+ if (!this.#heartbeat)
589
+ return;
590
+ clearInterval(this.#heartbeat);
591
+ this.#heartbeat = undefined;
592
+ }
593
+ #clearRetryTimer() {
594
+ if (!this.#retryTimer)
595
+ return;
596
+ clearTimeout(this.#retryTimer);
597
+ this.#retryTimer = undefined;
598
+ }
599
+ #clearUptimeTimer() {
600
+ if (!this.#uptimeTimer)
601
+ return;
602
+ clearTimeout(this.#uptimeTimer);
603
+ this.#uptimeTimer = undefined;
604
+ }
605
+ #emit(event, ...args) {
606
+ for (const listener of this.#listeners.get(event) ?? []) {
607
+ try {
608
+ listener(...args);
609
+ }
610
+ catch { /* listener failures never corrupt signaling */ }
611
+ }
612
+ }
613
+ }
614
+ /** Absorbs late errors from sockets the room no longer listens to (PartySocket `absorbError`). */
615
+ const ignore = () => { };
616
+ //# sourceMappingURL=call-room.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-room.js","sourceRoot":"","sources":["../../src/calls/call-room.ts"],"names":[],"mappings":"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"}