@relaymessenger/livekit 0.1.0-staging.2 → 0.1.0-staging.20

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/dist/transport.js DELETED
@@ -1,634 +0,0 @@
1
- const DEFAULT_ICE_GATHERING_TIMEOUT_MS = 10_000;
2
- const DEFAULT_CONNECTION_TIMEOUT_MS = 15_000;
3
- const AUDIO_SLICE_MS = 10;
4
- const STALL_CHECK_MS = 500;
5
- const STALL_AFTER_MS = 2_000;
6
- export class RelayCallTransportError extends Error {
7
- code;
8
- constructor(message, code) {
9
- super(message);
10
- this.name = "RelayCallTransportError";
11
- if (code !== undefined)
12
- this.code = code;
13
- }
14
- }
15
- const DEFAULT_PEER_CONFIG = { iceServers: [], iceTransportPolicy: "all" };
16
- const loadWebRTCFactory = async (engine) => {
17
- if (engine === "werift") {
18
- const { createWeriftWebRTCFactory } = await import("./engine-werift.js");
19
- return createWeriftWebRTCFactory();
20
- }
21
- const wrtc = await import("@roamhq/wrtc");
22
- return {
23
- createPeerConnection: (config = DEFAULT_PEER_CONFIG) => new wrtc.RTCPeerConnection({
24
- bundlePolicy: "max-bundle",
25
- iceServers: config.iceServers,
26
- iceTransportPolicy: config.iceTransportPolicy,
27
- }),
28
- createAudioSource: () => new wrtc.nonstandard.RTCAudioSource(),
29
- createAudioSink: (track) => new wrtc.nonstandard.RTCAudioSink(track),
30
- };
31
- };
32
- /** `candidate:<foundation> <component> <transport> <priority> <address> <port> typ <type> ...` (RFC 5245 §15.1). */
33
- const parseCandidate = (line) => {
34
- const match = /candidate:\S+\s+\d+\s+(\S+)\s+\d+\s+\S+\s+(\d+)\s+typ\s+(\S+)/i.exec(line);
35
- if (!match)
36
- return undefined;
37
- return { transport: match[1].toLowerCase(), port: Number(match[2]), type: match[3].toLowerCase() };
38
- };
39
- const seconds = (milliseconds) => `${(milliseconds / 1000).toFixed(1)}s`;
40
- const summarizeIce = (diagnostics) => {
41
- const { local, remote, transitions, connected } = diagnostics;
42
- const localPart = `local: host ${local.host}, srflx ${local.srflx}, relay ${local.relay}`
43
- + (local.other ? `, other ${local.other}` : "");
44
- const remotePart = remote.length
45
- ? `remote: ${remote.map((candidate) => `${candidate.transport} ${candidate.port}`).join(", ")}`
46
- : "remote: none";
47
- const states = [];
48
- let lastGathering = "new";
49
- for (const transition of transitions) {
50
- if (transition.kind === "gathering") {
51
- states.push(`${lastGathering}\u2192${transition.state} ${seconds(transition.atMs)}`);
52
- lastGathering = transition.state;
53
- }
54
- else if (transition.kind === "ice") {
55
- states.push(`ice ${transition.state} ${seconds(transition.atMs)}`);
56
- }
57
- else {
58
- states.push(`${transition.state} ${seconds(transition.atMs)}`);
59
- }
60
- }
61
- if (!connected)
62
- states.push("no connected");
63
- return `${localPart}; ${remotePart}; states: ${states.join(", ")}`;
64
- };
65
- const span = (first, last) => first === undefined || last === undefined ? "no packets" : `first ${seconds(first)} last ${seconds(last)}`;
66
- const summarizeInbound = (inbound) => `in: ${inbound.rtpPackets} rtp, ${inbound.decodeFailures} bad, ${inbound.frames} frames, `
67
- + `${span(inbound.firstPacketAtMs, inbound.lastPacketAtMs)}, ${inbound.recentRtpPackets}/5s`;
68
- const summarizeOutbound = (outbound) => `out: ${outbound.frames} frames, ${outbound.opusPackets} opus, ${outbound.rtpPackets} rtp, `
69
- + `${span(outbound.firstPacketAtMs, outbound.lastPacketAtMs)}, ${outbound.recentRtpPackets}/5s, `
70
- + `queue ${outbound.queued}, pacer ${outbound.pacerAlive === undefined ? "n/a" : outbound.pacerAlive ? "alive" : "idle"}`;
71
- const summarizeRoom = (room) => {
72
- const parts = [`${room.roomStates} roomState`, `${room.offers} offer`];
73
- if (room.endedReason !== undefined)
74
- parts.push(`ended ${room.endedReason}`);
75
- if (room.errors.length)
76
- parts.push(`error ${room.errors.map((text) => JSON.stringify(text)).join(", ")}`);
77
- return `room: ${parts.join(", ")}`;
78
- };
79
- const summarize = (diagnostics) => `${summarizeIce(diagnostics)}; ${summarizeInbound(diagnostics.inbound)}; `
80
- + `${summarizeOutbound(diagnostics.outbound)}; ${summarizeRoom(diagnostics.room)}`;
81
- const cloneSamples = (samples) => {
82
- const copy = new Int16Array(samples.length);
83
- copy.set(samples);
84
- return copy;
85
- };
86
- const delay = (milliseconds) => new Promise((resolve) => {
87
- const timer = setTimeout(resolve, milliseconds);
88
- timer.unref?.();
89
- });
90
- /**
91
- * Provider-neutral Node WebRTC bridge for Relay Call rooms.
92
- *
93
- * The class owns Relay media negotiation internally. Higher-level adapters only
94
- * exchange PCM16 frames and call lifecycle events.
95
- */
96
- export class RelayCallTransport {
97
- #room;
98
- #providedFactory;
99
- #engine;
100
- #iceGatheringTimeoutMs;
101
- #connectionTimeoutMs;
102
- #peerConfig;
103
- #onWarning;
104
- #connectStartedAt = 0;
105
- #inboundFrames = 0;
106
- #outboundFrames = 0;
107
- #roomStates = 0;
108
- #roomOffers = 0;
109
- #endedReason;
110
- #roomErrors = [];
111
- /** Engine stats frozen when media shuts down, so diagnostics survive the call's end. */
112
- #finalSinkStats;
113
- #finalSourceStats;
114
- #stallTimer;
115
- #stallSince;
116
- #stallWarned = false;
117
- #iceLocal = { host: 0, srflx: 0, relay: 0, other: 0 };
118
- #iceRemote = [];
119
- #iceTransitions = [];
120
- #listeners = new Map();
121
- #factory;
122
- #peer;
123
- #audioSource;
124
- #localTrack;
125
- #remoteSink;
126
- #publishTransceiver;
127
- #publishFrame;
128
- #initialAnswerSdp;
129
- #negotiationTail = Promise.resolve();
130
- #outputTail = Promise.resolve();
131
- #audioGeneration = 0;
132
- #reportedConnected = false;
133
- #readySettled = false;
134
- #readyResolve;
135
- #readyReject;
136
- #ready;
137
- #handlersAttached = false;
138
- #closed = false;
139
- constructor(options) {
140
- if (!options.callId.trim())
141
- throw new Error("callId is required.");
142
- this.#room = options.roomClient ?? options.relay.calls.room(options.callId, options.room);
143
- this.#providedFactory = options.webRTC;
144
- this.#engine = options.engine ?? "werift";
145
- this.#onWarning = options.onWarning ?? (() => undefined);
146
- if (this.#engine !== "werift" && this.#engine !== "wrtc") {
147
- throw new Error('engine must be "werift" or "wrtc".');
148
- }
149
- this.#iceGatheringTimeoutMs = options.iceGatheringTimeoutMs ?? DEFAULT_ICE_GATHERING_TIMEOUT_MS;
150
- this.#connectionTimeoutMs = options.mediaConnectTimeoutMs
151
- ?? options.connectionTimeoutMs
152
- ?? DEFAULT_CONNECTION_TIMEOUT_MS;
153
- const policy = options.iceTransportPolicy ?? "all";
154
- if (policy !== "all" && policy !== "relay") {
155
- throw new Error('iceTransportPolicy must be "all" or "relay".');
156
- }
157
- this.#peerConfig = {
158
- iceServers: (options.iceServers ?? []).map((server) => ({
159
- urls: Array.isArray(server.urls) ? [...server.urls] : server.urls,
160
- ...(server.username === undefined ? {} : { username: server.username }),
161
- ...(server.credential === undefined ? {} : { credential: server.credential }),
162
- })),
163
- iceTransportPolicy: policy,
164
- };
165
- if (!Number.isFinite(this.#iceGatheringTimeoutMs) || this.#iceGatheringTimeoutMs <= 0) {
166
- throw new Error("iceGatheringTimeoutMs must be greater than zero.");
167
- }
168
- if (!Number.isFinite(this.#connectionTimeoutMs) || this.#connectionTimeoutMs <= 0) {
169
- throw new Error("mediaConnectTimeoutMs must be greater than zero.");
170
- }
171
- this.#ready = new Promise((resolve, reject) => {
172
- this.#readyResolve = resolve;
173
- this.#readyReject = reject;
174
- });
175
- void this.#ready.catch(() => undefined);
176
- }
177
- on(event, listener) {
178
- let listeners = this.#listeners.get(event);
179
- if (!listeners) {
180
- listeners = new Set();
181
- this.#listeners.set(event, listeners);
182
- }
183
- listeners.add(listener);
184
- return this;
185
- }
186
- off(event, listener) {
187
- this.#listeners.get(event)?.delete(listener);
188
- return this;
189
- }
190
- async connect() {
191
- if (this.#closed)
192
- throw new Error("Relay Call transport is closed.");
193
- this.#attachRoomHandlers();
194
- await this.#room.connect();
195
- if (this.#peer) {
196
- await this.#waitForConnection();
197
- return;
198
- }
199
- this.#factory = this.#providedFactory ?? await loadWebRTCFactory(this.#engine);
200
- this.#audioSource = this.#factory.createAudioSource();
201
- this.#localTrack = this.#audioSource.createTrack();
202
- if (this.#localTrack.kind !== "audio") {
203
- throw new RelayCallTransportError("The WebRTC binding created a non-audio Relay track.");
204
- }
205
- this.#connectStartedAt = Date.now();
206
- const peer = this.#factory.createPeerConnection(this.#peerConfig);
207
- this.#peer = peer;
208
- this.#publishTransceiver = peer.addTransceiver(this.#localTrack, { direction: "sendonly" });
209
- this.#observeIce(peer);
210
- peer.onconnectionstatechange = () => {
211
- this.#recordTransition("connection", peer.connectionState);
212
- this.#connectionStateChanged();
213
- };
214
- peer.ontrack = (event) => this.#remoteTrack(event.track);
215
- try {
216
- await this.#publishLocalAudio();
217
- await this.#waitForConnection();
218
- }
219
- catch (error) {
220
- this.close();
221
- throw error;
222
- }
223
- }
224
- /** Replace only the room signaling socket and replay the identical publication. */
225
- async reconnect() {
226
- if (this.#closed)
227
- throw new Error("Relay Call transport is closed.");
228
- if (!this.#publishFrame)
229
- throw new Error("Relay Call transport is not connected.");
230
- await this.#room.reconnect();
231
- this.#room.send(this.#publishFrame);
232
- }
233
- /**
234
- * ICE candidates, state transitions, packet counts in both directions and
235
- * room frame counts recorded for this call, with a one-line summary.
236
- */
237
- diagnostics() {
238
- const snapshot = {
239
- local: { ...this.#iceLocal },
240
- remote: this.#iceRemote.map((candidate) => ({ ...candidate })),
241
- transitions: this.#iceTransitions.map((transition) => ({ ...transition })),
242
- connected: this.#reportedConnected,
243
- inbound: this.#inboundDiagnostics(),
244
- outbound: this.#outboundDiagnostics(),
245
- room: {
246
- roomStates: this.#roomStates,
247
- offers: this.#roomOffers,
248
- endedReason: this.#endedReason,
249
- errors: [...this.#roomErrors],
250
- },
251
- };
252
- return { ...snapshot, summary: summarize(snapshot) };
253
- }
254
- #sinceConnect(epochMs) {
255
- return epochMs === undefined ? undefined : epochMs - this.#connectStartedAt;
256
- }
257
- #inboundDiagnostics() {
258
- const stats = this.#remoteSink?.stats?.() ?? this.#finalSinkStats;
259
- return {
260
- rtpPackets: stats?.rtpPackets ?? 0,
261
- decodeFailures: stats?.decodeFailures ?? 0,
262
- frames: this.#inboundFrames,
263
- firstPacketAtMs: this.#sinceConnect(stats?.firstRtpAt),
264
- lastPacketAtMs: this.#sinceConnect(stats?.lastRtpAt),
265
- recentRtpPackets: stats?.recentRtpPackets ?? 0,
266
- };
267
- }
268
- #outboundDiagnostics() {
269
- const stats = this.#audioSource?.stats?.() ?? this.#finalSourceStats;
270
- return {
271
- frames: this.#outboundFrames,
272
- opusPackets: stats?.opusPackets ?? 0,
273
- rtpPackets: stats?.rtpPackets ?? 0,
274
- firstPacketAtMs: this.#sinceConnect(stats?.firstRtpAt),
275
- lastPacketAtMs: this.#sinceConnect(stats?.lastRtpAt),
276
- recentRtpPackets: stats?.recentRtpPackets ?? 0,
277
- queued: stats?.queued ?? 0,
278
- pacerAlive: stats?.pacerAlive,
279
- };
280
- }
281
- /**
282
- * Outbound stall guard: audio is queued for the pacer but no RTP packet has
283
- * left for 2 s while connected. Warns once with the summary; restarts nothing.
284
- */
285
- #checkStall() {
286
- if (this.#stallWarned || !this.#reportedConnected)
287
- return;
288
- const stats = this.#audioSource?.stats?.();
289
- if (!stats || stats.queued === 0) {
290
- this.#stallSince = undefined;
291
- return;
292
- }
293
- const now = Date.now();
294
- const idleSince = stats.lastRtpAt ?? (this.#stallSince ??= now);
295
- if (now - idleSince < STALL_AFTER_MS)
296
- return;
297
- this.#stallWarned = true;
298
- this.#stopStallGuard();
299
- this.#onWarning(`Relay outbound audio stalled (${this.diagnostics().summary})`);
300
- }
301
- #startStallGuard() {
302
- if (this.#stallTimer)
303
- return;
304
- this.#stallTimer = setInterval(() => this.#checkStall(), STALL_CHECK_MS);
305
- this.#stallTimer.unref?.();
306
- }
307
- #stopStallGuard() {
308
- if (!this.#stallTimer)
309
- return;
310
- clearInterval(this.#stallTimer);
311
- this.#stallTimer = undefined;
312
- }
313
- /**
314
- * Feed interleaved PCM16 audio into Relay. Frames are split into 10 ms WebRTC
315
- * source slices and paced in real time, so adapters may push larger chunks.
316
- */
317
- writeAudio(frame) {
318
- if (this.#closed)
319
- return Promise.reject(new Error("Relay Call transport is closed."));
320
- if (!this.#audioSource)
321
- return Promise.reject(new Error("Relay Call transport is not connected."));
322
- if (!Number.isInteger(frame.sampleRate) || frame.sampleRate <= 0 || frame.sampleRate % 100 !== 0) {
323
- return Promise.reject(new Error("Relay audio sampleRate must be a positive multiple of 100."));
324
- }
325
- if (!Number.isInteger(frame.channelCount) || frame.channelCount <= 0) {
326
- return Promise.reject(new Error("Relay audio channelCount must be a positive integer."));
327
- }
328
- if (frame.samples.length % frame.channelCount !== 0) {
329
- return Promise.reject(new Error("Relay audio samples must contain complete interleaved frames."));
330
- }
331
- const captured = {
332
- samples: cloneSamples(frame.samples),
333
- sampleRate: frame.sampleRate,
334
- channelCount: frame.channelCount,
335
- };
336
- const generation = this.#audioGeneration;
337
- const queued = this.#outputTail.then(() => this.#writeAudio(captured, generation));
338
- this.#outputTail = queued.catch(() => undefined);
339
- return queued;
340
- }
341
- /** Drop queued outgoing PCM. At most one already-submitted 10 ms slice remains. */
342
- clearAudio() {
343
- this.#audioGeneration += 1;
344
- }
345
- setMuted(muted) {
346
- this.#room.userUpdate({ muted });
347
- }
348
- end() {
349
- this.#room.end();
350
- }
351
- close() {
352
- if (this.#closed)
353
- return;
354
- this.#closed = true;
355
- this.#rejectReady(new RelayCallTransportError("Relay Call transport closed before media connected."));
356
- this.clearAudio();
357
- this.#shutdownMedia();
358
- this.#room.close();
359
- }
360
- async #publishLocalAudio() {
361
- const peer = this.#requirePeer();
362
- const offer = await peer.createOffer();
363
- await peer.setLocalDescription(offer);
364
- await this.#waitForIceGathering(peer);
365
- const description = this.#localDescription("offer");
366
- const mid = this.#publishTransceiver?.mid;
367
- if (!mid)
368
- throw new RelayCallTransportError("Relay audio publication has no WebRTC MID.");
369
- this.#publishFrame = {
370
- type: "offer",
371
- session_description: description,
372
- tracks: [{ mid, name: "audio" }],
373
- };
374
- this.#room.send(this.#publishFrame);
375
- }
376
- #attachRoomHandlers() {
377
- if (this.#handlersAttached)
378
- return;
379
- this.#handlersAttached = true;
380
- this.#room.on("answer", (frame) => {
381
- this.#queueNegotiation(() => this.#serverAnswer(frame));
382
- });
383
- this.#room.on("offer", (frame) => {
384
- this.#roomOffers += 1;
385
- this.#queueNegotiation(() => this.#serverOffer(frame));
386
- });
387
- this.#room.on("roomState", (frame) => {
388
- this.#roomStates += 1;
389
- this.#emit("roomState", frame);
390
- });
391
- this.#room.on("error", (error) => {
392
- if (error instanceof Error) {
393
- this.#rejectReady(error);
394
- this.#emit("error", error);
395
- }
396
- else
397
- this.#serverError(error);
398
- });
399
- this.#room.on("ended", (frame) => {
400
- this.#endedReason = frame.reason;
401
- this.#rejectReady(new RelayCallTransportError(`Relay Call ended before media connected (${frame.reason}).`));
402
- this.clearAudio();
403
- this.#shutdownMedia();
404
- this.#emit("ended", frame);
405
- });
406
- this.#room.on("close", (event) => {
407
- if (!this.#reportedConnected) {
408
- this.#rejectReady(new RelayCallTransportError(`Relay Call room closed before media connected (${event.code}).`));
409
- }
410
- this.#emit("close", event);
411
- });
412
- }
413
- #queueNegotiation(work) {
414
- const run = this.#negotiationTail.then(work);
415
- this.#negotiationTail = run.catch((error) => {
416
- const parsed = error instanceof Error ? error : new Error(String(error));
417
- this.#rejectReady(parsed);
418
- this.#emit("error", parsed);
419
- });
420
- }
421
- async #serverAnswer(frame) {
422
- const peer = this.#requirePeer();
423
- const sdp = frame.session_description.sdp;
424
- // Reconnecting the signaling socket replays the exact initial offer. Relay
425
- // returns its cached answer; applying that answer again in stable state is
426
- // invalid WebRTC signaling, so recognize and ignore the replay.
427
- if (peer.signalingState === "stable" && this.#initialAnswerSdp === sdp)
428
- return;
429
- if (this.#initialAnswerSdp === undefined)
430
- this.#recordRemoteCandidates(sdp);
431
- await peer.setRemoteDescription(frame.session_description);
432
- this.#initialAnswerSdp ??= sdp;
433
- }
434
- async #serverOffer(frame) {
435
- const peer = this.#requirePeer();
436
- await peer.setRemoteDescription(frame.session_description);
437
- const answer = await peer.createAnswer();
438
- await peer.setLocalDescription(answer);
439
- await this.#waitForIceGathering(peer);
440
- this.#room.send({ type: "answer", session_description: this.#localDescription("answer") });
441
- }
442
- #serverError(frame) {
443
- this.#roomErrors.push(frame.message);
444
- const error = new RelayCallTransportError(frame.message, frame.code);
445
- this.#rejectReady(error);
446
- this.#emit("error", error);
447
- }
448
- #connectionStateChanged() {
449
- const state = this.#peer?.connectionState;
450
- if (state === "connected" && !this.#reportedConnected) {
451
- this.#reportedConnected = true;
452
- try {
453
- this.#room.connected();
454
- this.#resolveReady();
455
- this.#startStallGuard();
456
- this.#emit("connected");
457
- }
458
- catch (error) {
459
- const parsed = error instanceof Error ? error : new Error(String(error));
460
- this.#rejectReady(parsed);
461
- this.#emit("error", parsed);
462
- }
463
- }
464
- else if (state === "failed") {
465
- const error = new RelayCallTransportError("Relay WebRTC connection failed.");
466
- this.#rejectReady(error);
467
- this.#emit("error", error);
468
- }
469
- }
470
- #remoteTrack(track) {
471
- if (track.kind !== "audio" || !this.#factory)
472
- return;
473
- this.#remoteSink?.stop();
474
- const sink = this.#factory.createAudioSink(track);
475
- this.#remoteSink = sink;
476
- sink.ondata = (data) => {
477
- if (this.#closed || this.#remoteSink !== sink)
478
- return;
479
- const channelCount = data.channelCount ?? 1;
480
- if (data.bitsPerSample !== undefined && data.bitsPerSample !== 16) {
481
- this.#emit("error", new RelayCallTransportError(`Relay WebRTC delivered unsupported ${data.bitsPerSample}-bit audio.`));
482
- return;
483
- }
484
- this.#inboundFrames += 1;
485
- this.#emit("audio", {
486
- samples: cloneSamples(data.samples),
487
- sampleRate: data.sampleRate,
488
- channelCount,
489
- });
490
- };
491
- }
492
- async #writeAudio(frame, generation) {
493
- const source = this.#audioSource;
494
- if (!source || generation !== this.#audioGeneration)
495
- return;
496
- const samplesPerChannel = frame.sampleRate / 100;
497
- const sliceSamples = samplesPerChannel * frame.channelCount;
498
- for (let offset = 0; offset < frame.samples.length; offset += sliceSamples) {
499
- if (this.#closed || generation !== this.#audioGeneration)
500
- return;
501
- const remaining = Math.min(sliceSamples, frame.samples.length - offset);
502
- const samples = new Int16Array(sliceSamples);
503
- samples.set(frame.samples.subarray(offset, offset + remaining));
504
- source.onData({
505
- samples,
506
- sampleRate: frame.sampleRate,
507
- bitsPerSample: 16,
508
- channelCount: frame.channelCount,
509
- numberOfFrames: samplesPerChannel,
510
- });
511
- this.#outboundFrames += 1;
512
- await delay(AUDIO_SLICE_MS);
513
- }
514
- }
515
- async #waitForIceGathering(peer) {
516
- if (peer.iceGatheringState === "complete")
517
- return;
518
- await new Promise((resolve, reject) => {
519
- const timeout = setTimeout(() => {
520
- cleanup();
521
- reject(new RelayCallTransportError("Timed out gathering Relay WebRTC ICE candidates."));
522
- }, this.#iceGatheringTimeoutMs);
523
- timeout.unref?.();
524
- const changed = () => {
525
- if (peer.iceGatheringState !== "complete")
526
- return;
527
- cleanup();
528
- resolve();
529
- };
530
- const cleanup = () => {
531
- clearTimeout(timeout);
532
- peer.removeEventListener("icegatheringstatechange", changed);
533
- };
534
- peer.addEventListener("icegatheringstatechange", changed);
535
- changed();
536
- });
537
- }
538
- async #waitForConnection() {
539
- if (this.#reportedConnected)
540
- return;
541
- await new Promise((resolve, reject) => {
542
- const timeout = setTimeout(() => {
543
- reject(new RelayCallTransportError(`Timed out connecting Relay WebRTC media (${this.diagnostics().summary})`));
544
- }, this.#connectionTimeoutMs);
545
- timeout.unref?.();
546
- this.#ready.then(() => {
547
- clearTimeout(timeout);
548
- resolve();
549
- }, (error) => {
550
- clearTimeout(timeout);
551
- reject(error);
552
- });
553
- });
554
- }
555
- /**
556
- * werift emits these as W3C-style handler calls (peerConnection.js:314-341:
557
- * `onicegatheringstatechange`, `oniceconnectionstatechange`,
558
- * `onconnectionstatechange`, `onicecandidate` with `{ candidate }`).
559
- */
560
- #observeIce(peer) {
561
- peer.onicecandidate = (event) => {
562
- const line = event?.candidate?.candidate;
563
- if (!line)
564
- return;
565
- const type = parseCandidate(line)?.type;
566
- if (type === "host" || type === "srflx" || type === "relay")
567
- this.#iceLocal[type] += 1;
568
- else
569
- this.#iceLocal.other += 1;
570
- };
571
- peer.onicegatheringstatechange = () => this.#recordTransition("gathering", peer.iceGatheringState);
572
- peer.oniceconnectionstatechange = () => {
573
- if (peer.iceConnectionState !== undefined)
574
- this.#recordTransition("ice", peer.iceConnectionState);
575
- };
576
- }
577
- #recordTransition(kind, state) {
578
- this.#iceTransitions.push({ kind, state, atMs: Date.now() - this.#connectStartedAt });
579
- }
580
- #recordRemoteCandidates(sdp) {
581
- for (const line of sdp.split(/\r?\n/)) {
582
- if (!line.startsWith("a=candidate:"))
583
- continue;
584
- const parsed = parseCandidate(line);
585
- if (parsed)
586
- this.#iceRemote.push({ transport: parsed.transport, port: parsed.port });
587
- }
588
- }
589
- #resolveReady() {
590
- if (this.#readySettled)
591
- return;
592
- this.#readySettled = true;
593
- this.#readyResolve?.();
594
- }
595
- #rejectReady(error) {
596
- if (this.#readySettled)
597
- return;
598
- this.#readySettled = true;
599
- this.#readyReject?.(error);
600
- }
601
- #localDescription(type) {
602
- const local = this.#requirePeer().localDescription;
603
- if (!local || local.type !== type || !local.sdp) {
604
- throw new RelayCallTransportError(`Relay WebRTC did not produce a complete ${type} SDP.`);
605
- }
606
- return { type, sdp: local.sdp };
607
- }
608
- #requirePeer() {
609
- if (!this.#peer)
610
- throw new Error("Relay Call transport is not connected.");
611
- return this.#peer;
612
- }
613
- #shutdownMedia() {
614
- this.#stopStallGuard();
615
- this.#finalSinkStats ??= this.#remoteSink?.stats?.();
616
- this.#finalSourceStats ??= this.#audioSource?.stats?.();
617
- this.#remoteSink?.stop();
618
- this.#remoteSink = undefined;
619
- this.#localTrack?.stop();
620
- this.#localTrack = undefined;
621
- this.#peer?.close();
622
- this.#peer = undefined;
623
- this.#audioSource = undefined;
624
- }
625
- #emit(event, ...args) {
626
- for (const listener of this.#listeners.get(event) ?? []) {
627
- try {
628
- listener(...args);
629
- }
630
- catch { /* adapters own listener failures */ }
631
- }
632
- }
633
- }
634
- //# sourceMappingURL=transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}