@polymorfa/browser 0.1.0-dev.20260922094209

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +248 -0
  3. package/dist/calls/api.d.ts +22 -0
  4. package/dist/calls/api.d.ts.map +1 -0
  5. package/dist/calls/api.js +104 -0
  6. package/dist/calls/api.js.map +1 -0
  7. package/dist/calls/backend.d.ts +85 -0
  8. package/dist/calls/backend.d.ts.map +1 -0
  9. package/dist/calls/backend.js +141 -0
  10. package/dist/calls/backend.js.map +1 -0
  11. package/dist/calls/client.d.ts +56 -0
  12. package/dist/calls/client.d.ts.map +1 -0
  13. package/dist/calls/client.js +260 -0
  14. package/dist/calls/client.js.map +1 -0
  15. package/dist/calls/controller.d.ts +329 -0
  16. package/dist/calls/controller.d.ts.map +1 -0
  17. package/dist/calls/controller.js +1328 -0
  18. package/dist/calls/controller.js.map +1 -0
  19. package/dist/calls/diagnostics.d.ts +52 -0
  20. package/dist/calls/diagnostics.d.ts.map +1 -0
  21. package/dist/calls/diagnostics.js +188 -0
  22. package/dist/calls/diagnostics.js.map +1 -0
  23. package/dist/calls/index.d.ts +3 -0
  24. package/dist/calls/index.d.ts.map +1 -0
  25. package/dist/calls/index.js +5 -0
  26. package/dist/calls/index.js.map +1 -0
  27. package/dist/calls/internal.d.ts +8 -0
  28. package/dist/calls/internal.d.ts.map +1 -0
  29. package/dist/calls/internal.js +8 -0
  30. package/dist/calls/internal.js.map +1 -0
  31. package/dist/calls/media.d.ts +144 -0
  32. package/dist/calls/media.d.ts.map +1 -0
  33. package/dist/calls/media.js +512 -0
  34. package/dist/calls/media.js.map +1 -0
  35. package/dist/calls/signaling.d.ts +74 -0
  36. package/dist/calls/signaling.d.ts.map +1 -0
  37. package/dist/calls/signaling.js +169 -0
  38. package/dist/calls/signaling.js.map +1 -0
  39. package/dist/calls/socket.d.ts +95 -0
  40. package/dist/calls/socket.d.ts.map +1 -0
  41. package/dist/calls/socket.js +267 -0
  42. package/dist/calls/socket.js.map +1 -0
  43. package/dist/chat/composer.d.ts +59 -0
  44. package/dist/chat/composer.d.ts.map +1 -0
  45. package/dist/chat/composer.js +217 -0
  46. package/dist/chat/composer.js.map +1 -0
  47. package/dist/chat/conversation.d.ts +71 -0
  48. package/dist/chat/conversation.d.ts.map +1 -0
  49. package/dist/chat/conversation.js +204 -0
  50. package/dist/chat/conversation.js.map +1 -0
  51. package/dist/chat/index.d.ts +4 -0
  52. package/dist/chat/index.d.ts.map +1 -0
  53. package/dist/chat/index.js +4 -0
  54. package/dist/chat/index.js.map +1 -0
  55. package/dist/chat/voice-recorder.d.ts +75 -0
  56. package/dist/chat/voice-recorder.d.ts.map +1 -0
  57. package/dist/chat/voice-recorder.js +346 -0
  58. package/dist/chat/voice-recorder.js.map +1 -0
  59. package/dist/controller.d.ts +16 -0
  60. package/dist/controller.d.ts.map +1 -0
  61. package/dist/controller.js +50 -0
  62. package/dist/controller.js.map +1 -0
  63. package/dist/diagnostics.d.ts +27 -0
  64. package/dist/diagnostics.d.ts.map +1 -0
  65. package/dist/diagnostics.js +2 -0
  66. package/dist/diagnostics.js.map +1 -0
  67. package/dist/dropin/client.d.ts +82 -0
  68. package/dist/dropin/client.d.ts.map +1 -0
  69. package/dist/dropin/client.js +314 -0
  70. package/dist/dropin/client.js.map +1 -0
  71. package/dist/dropin/connect.d.ts +23 -0
  72. package/dist/dropin/connect.d.ts.map +1 -0
  73. package/dist/dropin/connect.js +54 -0
  74. package/dist/dropin/connect.js.map +1 -0
  75. package/dist/dropin/inbox.d.ts +131 -0
  76. package/dist/dropin/inbox.d.ts.map +1 -0
  77. package/dist/dropin/inbox.js +406 -0
  78. package/dist/dropin/inbox.js.map +1 -0
  79. package/dist/dropin/index.d.ts +5 -0
  80. package/dist/dropin/index.d.ts.map +1 -0
  81. package/dist/dropin/index.js +5 -0
  82. package/dist/dropin/index.js.map +1 -0
  83. package/dist/dropin/permissions.d.ts +29 -0
  84. package/dist/dropin/permissions.d.ts.map +1 -0
  85. package/dist/dropin/permissions.js +53 -0
  86. package/dist/dropin/permissions.js.map +1 -0
  87. package/dist/errors.d.ts +39 -0
  88. package/dist/errors.d.ts.map +1 -0
  89. package/dist/errors.js +41 -0
  90. package/dist/errors.js.map +1 -0
  91. package/dist/index.d.ts +11 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +10 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/internal.d.ts +12 -0
  96. package/dist/internal.d.ts.map +1 -0
  97. package/dist/internal.js +13 -0
  98. package/dist/internal.js.map +1 -0
  99. package/dist/messaging/client.d.ts +54 -0
  100. package/dist/messaging/client.d.ts.map +1 -0
  101. package/dist/messaging/client.js +153 -0
  102. package/dist/messaging/client.js.map +1 -0
  103. package/dist/messaging/composer.d.ts +12 -0
  104. package/dist/messaging/composer.d.ts.map +1 -0
  105. package/dist/messaging/composer.js +36 -0
  106. package/dist/messaging/composer.js.map +1 -0
  107. package/dist/messaging/index.d.ts +4 -0
  108. package/dist/messaging/index.d.ts.map +1 -0
  109. package/dist/messaging/index.js +3 -0
  110. package/dist/messaging/index.js.map +1 -0
  111. package/dist/messaging/types.d.ts +209 -0
  112. package/dist/messaging/types.d.ts.map +1 -0
  113. package/dist/messaging/types.js +2 -0
  114. package/dist/messaging/types.js.map +1 -0
  115. package/dist/templates/controller.d.ts +45 -0
  116. package/dist/templates/controller.d.ts.map +1 -0
  117. package/dist/templates/controller.js +298 -0
  118. package/dist/templates/controller.js.map +1 -0
  119. package/dist/templates/index.d.ts +4 -0
  120. package/dist/templates/index.d.ts.map +1 -0
  121. package/dist/templates/index.js +3 -0
  122. package/dist/templates/index.js.map +1 -0
  123. package/dist/templates/transport.d.ts +7 -0
  124. package/dist/templates/transport.d.ts.map +1 -0
  125. package/dist/templates/transport.js +124 -0
  126. package/dist/templates/transport.js.map +1 -0
  127. package/dist/templates/types.d.ts +141 -0
  128. package/dist/templates/types.d.ts.map +1 -0
  129. package/dist/templates/types.js +2 -0
  130. package/dist/templates/types.js.map +1 -0
  131. package/dist/token.d.ts +37 -0
  132. package/dist/token.d.ts.map +1 -0
  133. package/dist/token.js +152 -0
  134. package/dist/token.js.map +1 -0
  135. package/dist/transport.d.ts +53 -0
  136. package/dist/transport.d.ts.map +1 -0
  137. package/dist/transport.js +328 -0
  138. package/dist/transport.js.map +1 -0
  139. package/package.json +45 -0
@@ -0,0 +1,512 @@
1
+ import { createConnectionId, isConnectionId, isParticipant, isSourceHandle, } from "@polymorfa/sdk/calls/internal";
2
+ /** Label and id of the control data channel, negotiated out of band. */
3
+ export const CALLS_DATA_CHANNEL = { label: "pmfa.calls", id: 0 };
4
+ /** Receive-only video transceivers offered up front. */
5
+ export const DEFAULT_VIDEO_SLOTS = 3;
6
+ /** Upper bound on video transceivers per connection (camera included). */
7
+ export const MAX_VIDEO_SLOTS = 32;
8
+ /** Validate one data-channel message; malformed messages yield `undefined`. */
9
+ export function parseDataChannelMessage(data) {
10
+ if (typeof data !== "string" || data.length > 4096)
11
+ return undefined;
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(data);
15
+ }
16
+ catch {
17
+ return undefined;
18
+ }
19
+ if (parsed === null || typeof parsed !== "object")
20
+ return undefined;
21
+ const m = parsed;
22
+ const mid = typeof m["mid"] === "string" && m["mid"].length > 0;
23
+ switch (m["type"]) {
24
+ case "video_source": {
25
+ if (!isSourceHandle(m["source"]) || !mid)
26
+ return undefined;
27
+ const connectionParticipant = m["connectionParticipant"];
28
+ const byConnection = isConnectionId(m["connectionId"]) &&
29
+ (connectionParticipant === undefined ||
30
+ typeof connectionParticipant === "string") &&
31
+ m["participant"] === undefined;
32
+ const byParticipant = isParticipant(m["participant"]) &&
33
+ m["connectionId"] === undefined &&
34
+ connectionParticipant === undefined;
35
+ return byConnection || byParticipant
36
+ ? parsed
37
+ : undefined;
38
+ }
39
+ case "video_source_removed":
40
+ return isSourceHandle(m["source"]) && mid
41
+ ? parsed
42
+ : undefined;
43
+ case "video_slots_exhausted":
44
+ return Number.isInteger(m["slots"]) && Number.isInteger(m["needed"])
45
+ ? parsed
46
+ : undefined;
47
+ case "pong":
48
+ return parsed;
49
+ default:
50
+ return undefined;
51
+ }
52
+ }
53
+ export class WebRtcMediaFactory {
54
+ #signaling;
55
+ #candidateTransport;
56
+ #mediaDevices;
57
+ #createPeer;
58
+ #pollIntervalMs;
59
+ #videoSlots;
60
+ #maxVideoSlots;
61
+ #setInterval;
62
+ #clearInterval;
63
+ constructor(options) {
64
+ this.#signaling = options.signaling;
65
+ this.#candidateTransport = options.candidateTransport;
66
+ this.#mediaDevices = options.mediaDevices ?? navigator.mediaDevices;
67
+ this.#createPeer =
68
+ options.createPeerConnection ??
69
+ ((configuration) => {
70
+ if (typeof RTCPeerConnection === "undefined")
71
+ throw unsupported("This browser does not support WebRTC calls.");
72
+ return new RTCPeerConnection(configuration);
73
+ });
74
+ this.#pollIntervalMs = options.pollIntervalMs ?? 1_000;
75
+ this.#maxVideoSlots = Math.max(1, Math.min(MAX_VIDEO_SLOTS, Math.floor(options.maxVideoSlots ?? MAX_VIDEO_SLOTS)));
76
+ this.#videoSlots = Math.max(0, Math.min(this.#maxVideoSlots - 1, Math.floor(options.videoSlots ?? DEFAULT_VIDEO_SLOTS)));
77
+ this.#setInterval =
78
+ options.setInterval ?? globalThis.setInterval.bind(globalThis);
79
+ this.#clearInterval =
80
+ options.clearInterval ?? globalThis.clearInterval.bind(globalThis);
81
+ }
82
+ async listDevices() {
83
+ const devices = await this.#mediaDevices.enumerateDevices();
84
+ return devices
85
+ .filter((device) => ["audioinput", "videoinput", "audiooutput"].includes(device.kind))
86
+ .map((device) => ({
87
+ deviceId: device.deviceId,
88
+ kind: device.kind,
89
+ label: device.label,
90
+ }));
91
+ }
92
+ async open(callId, video, callbacks, signal, preferences = {}) {
93
+ throwIfAborted(signal);
94
+ const connectionId = preferences.connectionId ?? createConnectionId();
95
+ if (!isConnectionId(connectionId))
96
+ throw new Error("connectionId must be 8–64 characters of A–Z, a–z, 0–9, _ or -.");
97
+ if (typeof this.#mediaDevices?.getUserMedia !== "function")
98
+ throw unsupported("This browser cannot capture a microphone or camera.");
99
+ const local = await this.#mediaDevices.getUserMedia(constraintsFor(video, preferences.devices));
100
+ if (signal.aborted) {
101
+ for (const track of local.getTracks())
102
+ track.stop();
103
+ throw signal.reason;
104
+ }
105
+ const peer = this.#createPeer();
106
+ const remote = new MediaStream();
107
+ // Transceiver order is part of the contract: audio, then the camera
108
+ // (sendrecv, also a receive slot), then receive-only video slots.
109
+ const control = peer.createDataChannel(CALLS_DATA_CHANNEL.label, {
110
+ negotiated: true,
111
+ id: CALLS_DATA_CHANNEL.id,
112
+ });
113
+ peer.addTransceiver(local.getAudioTracks()[0] ?? "audio", {
114
+ direction: "sendrecv",
115
+ streams: [local],
116
+ });
117
+ const camera = peer.addTransceiver(local.getVideoTracks()[0] ?? "video", {
118
+ direction: "sendrecv",
119
+ streams: [local],
120
+ });
121
+ for (let i = 0; i < this.#videoSlots; i += 1)
122
+ peer.addTransceiver("video", { direction: "recvonly" });
123
+ const transport = this.#candidateTransport;
124
+ peer.onicecandidate = (event) => {
125
+ if (event.candidate === null)
126
+ return;
127
+ const candidate = candidateFrom(event.candidate.toJSON());
128
+ if (transport?.sendCandidate(callId, candidate, connectionId) === true)
129
+ return;
130
+ void this.#signaling
131
+ .candidate(callId, candidate, connectionId, signal)
132
+ .catch(() => undefined);
133
+ };
134
+ // Pushed candidates can arrive before the answer; addIceCandidate rejects
135
+ // until the remote description exists, so hold them.
136
+ let remoteDescribed = false;
137
+ const pendingCandidates = [];
138
+ const unsubscribeCandidates = transport?.onCandidate((id, candidate, forConnection) => {
139
+ if (id !== callId)
140
+ return;
141
+ if (forConnection !== undefined && forConnection !== connectionId)
142
+ return;
143
+ if (!remoteDescribed) {
144
+ pendingCandidates.push(candidate);
145
+ return;
146
+ }
147
+ void peer.addIceCandidate(candidate).catch(() => undefined);
148
+ });
149
+ peer.ontrack = (event) => {
150
+ // Video tracks are exposed per source once the platform maps them.
151
+ if (event.track.kind !== "audio")
152
+ return;
153
+ remote.addTrack(event.track);
154
+ callbacks.onRemoteStream(remote);
155
+ };
156
+ peer.onconnectionstatechange = () => callbacks.onConnectionState(peer.connectionState);
157
+ peer.oniceconnectionstatechange = () => callbacks.onIceConnectionState?.(peer.iceConnectionState);
158
+ let closed = false;
159
+ const videos = new Map();
160
+ const publishVideos = () => {
161
+ if (!closed)
162
+ callbacks.onRemoteVideos?.([...videos.values()]);
163
+ };
164
+ const videoTransceivers = () => peer
165
+ .getTransceivers()
166
+ .filter((t) => t.receiver.track?.kind === "video" &&
167
+ t.currentDirection !== "stopped");
168
+ const keyFor = (source, base) => [...videos.values()].some((v) => v.key === base && v.source !== source)
169
+ ? `${base}:${source}`
170
+ : base;
171
+ // Video receive slots the remote side has agreed to. Transceivers added
172
+ // for a re-offer that failed are not counted until one succeeds.
173
+ let negotiatedSlots = 0;
174
+ let negotiating = Promise.resolve();
175
+ const renegotiate = (options, renegotiateSignal) => {
176
+ const run = async () => {
177
+ const renegotiateWith = this.#signaling.renegotiate;
178
+ if (renegotiateWith === undefined)
179
+ throw new Error("Signaling does not support renegotiation.");
180
+ throwIfAborted(renegotiateSignal);
181
+ const offered = videoTransceivers().length;
182
+ const offer = await peer.createOffer(options);
183
+ await peer.setLocalDescription(offer);
184
+ try {
185
+ const answer = await renegotiateWith.call(this.#signaling, callId, {
186
+ sdp: peer.localDescription?.sdp ?? offer.sdp ?? "",
187
+ connectionId,
188
+ }, renegotiateSignal);
189
+ if (closed)
190
+ return;
191
+ await peer.setRemoteDescription({ type: "answer", sdp: answer.sdp });
192
+ negotiatedSlots = offered;
193
+ }
194
+ catch (cause) {
195
+ // Without this the peer is stranded in `have-local-offer`.
196
+ if (!closed)
197
+ await peer
198
+ .setLocalDescription({ type: "rollback" })
199
+ .catch(() => undefined);
200
+ throw cause;
201
+ }
202
+ };
203
+ negotiating = negotiating.catch(() => undefined).then(run);
204
+ return negotiating;
205
+ };
206
+ // The platform found more video sources than receive slots. Offer more,
207
+ // up to the bound, so every participant can be seen. Only a successful
208
+ // re-offer counts: after a failed one, the next report offers the
209
+ // already-added slots again. One slot re-offer runs at a time; a report
210
+ // that arrives meanwhile is handled when it settles.
211
+ let slotsWanted = 0;
212
+ let growing = false;
213
+ const growSlots = (needed) => {
214
+ if (this.#signaling.renegotiate === undefined || closed)
215
+ return;
216
+ slotsWanted = Math.max(slotsWanted, Math.min(this.#maxVideoSlots, Math.floor(needed)));
217
+ if (growing || slotsWanted <= negotiatedSlots)
218
+ return;
219
+ const add = slotsWanted - videoTransceivers().length;
220
+ for (let i = 0; i < add; i += 1)
221
+ peer.addTransceiver("video", { direction: "recvonly" });
222
+ growing = true;
223
+ void renegotiate({}, signal).then(() => {
224
+ growing = false;
225
+ // A larger report arrived while this re-offer ran.
226
+ if (slotsWanted > negotiatedSlots)
227
+ growSlots(slotsWanted);
228
+ }, () => {
229
+ // Transient failure: wait for the platform to report again.
230
+ growing = false;
231
+ slotsWanted = negotiatedSlots;
232
+ });
233
+ };
234
+ control.onmessage = (event) => {
235
+ const message = parseDataChannelMessage(event.data);
236
+ if (message === undefined || closed)
237
+ return;
238
+ switch (message.type) {
239
+ case "video_source": {
240
+ const transceiver = peer
241
+ .getTransceivers()
242
+ .find((t) => t.mid === message.mid);
243
+ const track = transceiver?.receiver.track;
244
+ if (track === undefined || track.kind !== "video")
245
+ return;
246
+ for (const [handle, existing] of videos)
247
+ if (existing.mid === message.mid && handle !== message.source)
248
+ videos.delete(handle);
249
+ const base = message.connectionId !== undefined
250
+ ? `connection:${message.connectionId}`
251
+ : `participant:${message.participant.id}`;
252
+ videos.set(message.source, {
253
+ key: keyFor(message.source, base),
254
+ source: message.source,
255
+ mid: message.mid,
256
+ ...(message.connectionId !== undefined
257
+ ? {
258
+ connectionId: message.connectionId,
259
+ ...(message.connectionParticipant === undefined
260
+ ? {}
261
+ : {
262
+ connectionParticipant: message.connectionParticipant,
263
+ }),
264
+ }
265
+ : { participant: message.participant }),
266
+ stream: new MediaStream([track]),
267
+ });
268
+ publishVideos();
269
+ return;
270
+ }
271
+ case "video_source_removed": {
272
+ const existing = videos.get(message.source);
273
+ if (existing === undefined || existing.mid !== message.mid)
274
+ return;
275
+ videos.delete(message.source);
276
+ publishVideos();
277
+ return;
278
+ }
279
+ case "video_slots_exhausted":
280
+ growSlots(message.needed);
281
+ return;
282
+ default:
283
+ return;
284
+ }
285
+ };
286
+ try {
287
+ const offer = await peer.createOffer();
288
+ await peer.setLocalDescription(offer);
289
+ const answer = await this.#signaling.offer(callId, { sdp: peer.localDescription?.sdp ?? offer.sdp ?? "", connectionId }, signal);
290
+ applyIceServers(peer, answer);
291
+ await peer.setRemoteDescription({ type: "answer", sdp: answer.sdp });
292
+ negotiatedSlots = videoTransceivers().length;
293
+ remoteDescribed = true;
294
+ for (const candidate of pendingCandidates.splice(0))
295
+ void peer.addIceCandidate(candidate).catch(() => undefined);
296
+ }
297
+ catch (cause) {
298
+ unsubscribeCandidates?.();
299
+ closePeer(peer, local, control);
300
+ throw cause;
301
+ }
302
+ const switching = new Map();
303
+ const swap = async (kind, deviceId, switchSignal) => {
304
+ throwIfAborted(switchSignal);
305
+ const old = local.getTracks().find((t) => t.kind === kind);
306
+ if (old === undefined) {
307
+ // Nothing of this kind is being sent — an audio-only call asked to
308
+ // switch camera. enableVideo() starts the camera instead.
309
+ return;
310
+ }
311
+ const stream = await this.#mediaDevices.getUserMedia(kind === "audio"
312
+ ? { audio: { deviceId: { ideal: deviceId } } }
313
+ : { video: { deviceId: { ideal: deviceId } } });
314
+ if (closed || switchSignal.aborted) {
315
+ stopTracks(stream);
316
+ return;
317
+ }
318
+ const track = kind === "audio"
319
+ ? stream.getAudioTracks()[0]
320
+ : stream.getVideoTracks()[0];
321
+ if (track === undefined) {
322
+ stopTracks(stream);
323
+ return;
324
+ }
325
+ track.enabled = old.enabled;
326
+ const sender = peer.getSenders().find((s) => s.track === old);
327
+ if (sender !== undefined) {
328
+ try {
329
+ await sender.replaceTrack(track);
330
+ }
331
+ catch (cause) {
332
+ stopTracks(stream);
333
+ throw cause;
334
+ }
335
+ if (closed || switchSignal.aborted) {
336
+ stopTracks(stream);
337
+ return;
338
+ }
339
+ }
340
+ old.stop();
341
+ local.removeTrack(old);
342
+ local.addTrack(track);
343
+ };
344
+ let upgrading = Promise.resolve();
345
+ const upgrade = async (enableSignal, devices) => {
346
+ throwIfAborted(enableSignal);
347
+ if (local.getVideoTracks().length > 0)
348
+ return;
349
+ const stream = await this.#mediaDevices.getUserMedia(constraintsFor(true, devices ?? preferences.devices, {
350
+ audio: false,
351
+ }));
352
+ if (closed || enableSignal.aborted) {
353
+ stopTracks(stream);
354
+ return;
355
+ }
356
+ const track = stream.getVideoTracks()[0];
357
+ if (track === undefined) {
358
+ stopTracks(stream);
359
+ return;
360
+ }
361
+ local.addTrack(track);
362
+ // The camera transceiver already exists; attach the track to it and
363
+ // re-offer so the platform learns the new stream.
364
+ try {
365
+ await camera.sender.replaceTrack(track);
366
+ camera.sender.setStreams?.(local);
367
+ await renegotiate({}, enableSignal);
368
+ }
369
+ catch (cause) {
370
+ await camera.sender.replaceTrack(null).catch(() => undefined);
371
+ local.removeTrack(track);
372
+ track.stop();
373
+ throw cause;
374
+ }
375
+ };
376
+ const poll = this.#setInterval(() => {
377
+ // The socket delivers remote candidates while it is up.
378
+ if (transport?.connected === true)
379
+ return;
380
+ void drainCandidates(this.#signaling, callId, peer, signal);
381
+ }, this.#pollIntervalMs);
382
+ return {
383
+ connectionId,
384
+ localStream: local,
385
+ remoteStream: remote,
386
+ get remoteVideos() {
387
+ return [...videos.values()];
388
+ },
389
+ setMuted: (muted) => {
390
+ if (muted.audio !== undefined)
391
+ setTracks(local.getAudioTracks(), !muted.audio);
392
+ if (muted.video !== undefined)
393
+ setTracks(local.getVideoTracks(), !muted.video);
394
+ },
395
+ getStats: () => peer.getStats(),
396
+ audioEnabled: () => local.getAudioTracks().some(({ enabled }) => enabled),
397
+ videoEnabled: () => local.getVideoTracks().some(({ enabled }) => enabled),
398
+ // Same-kind switches run one at a time so the last request wins.
399
+ switchInput: (kind, deviceId, switchSignal) => {
400
+ const run = (switching.get(kind) ?? Promise.resolve()).then(() => swap(kind, deviceId, switchSignal));
401
+ switching.set(kind, run.catch(() => undefined));
402
+ return run;
403
+ },
404
+ // Both need a re-offer, so signaling that cannot renegotiate does not
405
+ // get them at all.
406
+ ...(this.#signaling.renegotiate === undefined
407
+ ? {}
408
+ : {
409
+ enableVideo: (enableSignal, devices) => {
410
+ const run = upgrading.then(() => upgrade(enableSignal, devices));
411
+ upgrading = run.catch(() => undefined);
412
+ return run;
413
+ },
414
+ restartIce: (restartSignal) => renegotiate({ iceRestart: true }, restartSignal),
415
+ }),
416
+ close: async (options = {}) => {
417
+ if (closed)
418
+ return;
419
+ closed = true;
420
+ this.#clearInterval(poll);
421
+ unsubscribeCandidates?.();
422
+ videos.clear();
423
+ closePeer(peer, local, control);
424
+ if (options.leave === false)
425
+ return;
426
+ try {
427
+ await this.#signaling.leave(callId, connectionId);
428
+ }
429
+ catch {
430
+ // Local media teardown must complete even when leave fails.
431
+ }
432
+ },
433
+ };
434
+ }
435
+ }
436
+ function constraintsFor(video, devices, options = {}) {
437
+ const audioInput = devices?.audioInput;
438
+ const videoInput = devices?.videoInput;
439
+ return {
440
+ audio: options.audio === false
441
+ ? false
442
+ : audioInput === undefined
443
+ ? true
444
+ : { deviceId: { ideal: audioInput } },
445
+ video: video
446
+ ? videoInput === undefined
447
+ ? true
448
+ : { deviceId: { ideal: videoInput } }
449
+ : false,
450
+ };
451
+ }
452
+ function candidateFrom(candidate) {
453
+ return {
454
+ candidate: candidate.candidate ?? "",
455
+ ...(candidate.sdpMid == null ? {} : { sdpMid: candidate.sdpMid }),
456
+ ...(candidate.sdpMLineIndex == null
457
+ ? {}
458
+ : { sdpMLineIndex: candidate.sdpMLineIndex }),
459
+ };
460
+ }
461
+ /** A missing browser capability; reported as `unsupported_browser`. */
462
+ function unsupported(message) {
463
+ const error = new Error(message);
464
+ error.name = "NotSupportedError";
465
+ return error;
466
+ }
467
+ function applyIceServers(peer, answer) {
468
+ peer.setConfiguration({
469
+ iceServers: answer.iceServers.map((server) => ({
470
+ ...server,
471
+ urls: typeof server.urls === "string" ? server.urls : [...server.urls],
472
+ })),
473
+ });
474
+ }
475
+ async function drainCandidates(signaling, callId, peer, signal) {
476
+ try {
477
+ for (const candidate of await signaling.candidates(callId, signal)) {
478
+ try {
479
+ await peer.addIceCandidate(candidate);
480
+ }
481
+ catch {
482
+ // Ignore stale candidates and continue draining.
483
+ }
484
+ }
485
+ }
486
+ catch {
487
+ // Polling retries on the next interval.
488
+ }
489
+ }
490
+ function stopTracks(stream) {
491
+ for (const track of stream.getTracks())
492
+ track.stop();
493
+ }
494
+ function setTracks(tracks, enabled) {
495
+ for (const track of tracks)
496
+ track.enabled = enabled;
497
+ }
498
+ function closePeer(peer, stream, control) {
499
+ peer.onicecandidate = null;
500
+ peer.ontrack = null;
501
+ peer.onconnectionstatechange = null;
502
+ peer.oniceconnectionstatechange = null;
503
+ control.onmessage = null;
504
+ for (const track of stream.getTracks())
505
+ track.stop();
506
+ peer.close();
507
+ }
508
+ function throwIfAborted(signal) {
509
+ if (signal.aborted)
510
+ throw signal.reason ?? new DOMException("Aborted", "AbortError");
511
+ }
512
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/calls/media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { type AcceptCallOptions, type AcceptCallResult, type CallReport, type CallsToken, type CallsTokenRequest } from "@polymorfa/sdk/calls/internal";
2
+ import { BrowserTransport } from "../transport.js";
3
+ export interface IceServer {
4
+ readonly urls: string | readonly string[];
5
+ readonly username?: string;
6
+ readonly credential?: string;
7
+ }
8
+ export interface SdpAnswer {
9
+ readonly sdp: string;
10
+ readonly iceServers: readonly IceServer[];
11
+ }
12
+ export interface TrickleCandidate {
13
+ readonly candidate: string;
14
+ readonly sdpMid?: string;
15
+ readonly sdpMLineIndex?: number;
16
+ }
17
+ /** An SDP offer for one media connection of a call. */
18
+ export interface OfferRequest {
19
+ readonly sdp: string;
20
+ readonly connectionId: string;
21
+ }
22
+ export interface CallsSignaling {
23
+ offer(callId: string, request: OfferRequest, signal?: AbortSignal): Promise<SdpAnswer>;
24
+ /**
25
+ * Re-offer on an established connection (camera upgrade, more receive
26
+ * slots, ICE restart). Optional for fakes.
27
+ */
28
+ renegotiate?(callId: string, request: OfferRequest, signal?: AbortSignal): Promise<SdpAnswer>;
29
+ candidate(callId: string, candidate: TrickleCandidate, connectionId: string, signal?: AbortSignal): Promise<void>;
30
+ /** Poll the pod's queued candidates for the call. */
31
+ candidates(callId: string, signal?: AbortSignal): Promise<readonly TrickleCandidate[]>;
32
+ /** Answer or join. Optional for fakes. */
33
+ accept?(callId: string, options: AcceptCallOptions, signal?: AbortSignal): Promise<AcceptCallResult>;
34
+ /** Decline a ringing call; ends it for everyone. Optional for fakes. */
35
+ reject?(callId: string, signal?: AbortSignal): Promise<void>;
36
+ /** Close one media connection; the call continues. */
37
+ leave(callId: string, connectionId: string, signal?: AbortSignal): Promise<void>;
38
+ /** End the call for every participant. */
39
+ end(callId: string, signal?: AbortSignal): Promise<void>;
40
+ /** Send a diagnostics report for one connection. Optional for fakes. */
41
+ report?(callId: string, report: CallReport, signal?: AbortSignal): Promise<void>;
42
+ /** Credential for socket authentication frames. Optional for fakes. */
43
+ token?(request?: CallsTokenRequest): Promise<CallsToken>;
44
+ /** Absolute `ws(s)://` URL for a socket path. Optional for fakes. */
45
+ socketUrl?(path: string): string;
46
+ }
47
+ /** Client-token signaling over the Messaging REST routes. */
48
+ export declare class CallsSignalingClient implements CallsSignaling {
49
+ #private;
50
+ constructor(transport: BrowserTransport, apiPrefix?: string);
51
+ offer(callId: string, request: OfferRequest, signal?: AbortSignal): Promise<SdpAnswer>;
52
+ renegotiate(callId: string, request: OfferRequest, signal?: AbortSignal): Promise<SdpAnswer>;
53
+ candidate(callId: string, candidate: TrickleCandidate, connectionId: string, signal?: AbortSignal): Promise<void>;
54
+ candidates(callId: string, signal?: AbortSignal): Promise<readonly TrickleCandidate[]>;
55
+ accept(callId: string, options: AcceptCallOptions, signal?: AbortSignal): Promise<AcceptCallResult>;
56
+ reject(callId: string, signal?: AbortSignal): Promise<void>;
57
+ leave(callId: string, connectionId: string, signal?: AbortSignal): Promise<void>;
58
+ end(callId: string, signal?: AbortSignal): Promise<void>;
59
+ /**
60
+ * Best-effort: one attempt, no retries. A client token acts as its own
61
+ * participant, so the report names none.
62
+ */
63
+ report(callId: string, report: CallReport, signal?: AbortSignal): Promise<void>;
64
+ token(request?: CallsTokenRequest): Promise<CallsToken>;
65
+ socketUrl(path: string): string;
66
+ }
67
+ /**
68
+ * Turn a `409 call_claimed` HTTP failure into {@link CallClaimedError} and a
69
+ * `403 calls_disabled` one into {@link CallsDisabledError}.
70
+ */
71
+ export declare function claimedError(cause: unknown): unknown;
72
+ /** True for a `409` failure whose code (or response body code) is `call_claimed`. */
73
+ export declare function isCallClaimed(cause: unknown): boolean;
74
+ //# sourceMappingURL=signaling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signaling.d.ts","sourceRoot":"","sources":["../../src/calls/signaling.ts"],"names":[],"mappings":"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"}