@polymorfa/sdk 0.1.0-dev.20260922093854
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/LICENSE +21 -0
- package/README.md +1881 -0
- package/dist/bridge.d.ts +31 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +39 -0
- package/dist/bridge.js.map +1 -0
- package/dist/calls/api.d.ts +109 -0
- package/dist/calls/api.d.ts.map +1 -0
- package/dist/calls/api.js +179 -0
- package/dist/calls/api.js.map +1 -0
- package/dist/calls/call.d.ts +286 -0
- package/dist/calls/call.d.ts.map +1 -0
- package/dist/calls/call.js +860 -0
- package/dist/calls/call.js.map +1 -0
- package/dist/calls/client.d.ts +124 -0
- package/dist/calls/client.d.ts.map +1 -0
- package/dist/calls/client.js +447 -0
- package/dist/calls/client.js.map +1 -0
- package/dist/calls/diagnostics.d.ts +74 -0
- package/dist/calls/diagnostics.d.ts.map +1 -0
- package/dist/calls/diagnostics.js +133 -0
- package/dist/calls/diagnostics.js.map +1 -0
- package/dist/calls/errors.d.ts +37 -0
- package/dist/calls/errors.d.ts.map +1 -0
- package/dist/calls/errors.js +52 -0
- package/dist/calls/errors.js.map +1 -0
- package/dist/calls/events.d.ts +15 -0
- package/dist/calls/events.d.ts.map +1 -0
- package/dist/calls/events.js +34 -0
- package/dist/calls/events.js.map +1 -0
- package/dist/calls/index.d.ts +6 -0
- package/dist/calls/index.d.ts.map +1 -0
- package/dist/calls/index.js +7 -0
- package/dist/calls/index.js.map +1 -0
- package/dist/calls/internal.d.ts +18 -0
- package/dist/calls/internal.d.ts.map +1 -0
- package/dist/calls/internal.js +18 -0
- package/dist/calls/internal.js.map +1 -0
- package/dist/calls/lifecycle.d.ts +111 -0
- package/dist/calls/lifecycle.d.ts.map +1 -0
- package/dist/calls/lifecycle.js +490 -0
- package/dist/calls/lifecycle.js.map +1 -0
- package/dist/calls/media.d.ts +102 -0
- package/dist/calls/media.d.ts.map +1 -0
- package/dist/calls/media.js +414 -0
- package/dist/calls/media.js.map +1 -0
- package/dist/calls/protocol.d.ts +216 -0
- package/dist/calls/protocol.d.ts.map +1 -0
- package/dist/calls/protocol.js +268 -0
- package/dist/calls/protocol.js.map +1 -0
- package/dist/calls/token.d.ts +43 -0
- package/dist/calls/token.d.ts.map +1 -0
- package/dist/calls/token.js +146 -0
- package/dist/calls/token.js.map +1 -0
- package/dist/client.d.ts +65 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +119 -0
- package/dist/client.js.map +1 -0
- package/dist/credentials.d.ts +50 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +73 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.d.ts +71 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +129 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/media/whatsapp.d.ts +105 -0
- package/dist/media/whatsapp.d.ts.map +1 -0
- package/dist/media/whatsapp.js +624 -0
- package/dist/media/whatsapp.js.map +1 -0
- package/dist/messaging/bansafe.d.ts +30 -0
- package/dist/messaging/bansafe.d.ts.map +1 -0
- package/dist/messaging/bansafe.js +86 -0
- package/dist/messaging/bansafe.js.map +1 -0
- package/dist/messaging/business.d.ts +35 -0
- package/dist/messaging/business.d.ts.map +1 -0
- package/dist/messaging/business.js +145 -0
- package/dist/messaging/business.js.map +1 -0
- package/dist/messaging/calls.d.ts +9 -0
- package/dist/messaging/calls.d.ts.map +1 -0
- package/dist/messaging/calls.js +16 -0
- package/dist/messaging/calls.js.map +1 -0
- package/dist/messaging/campaigns.d.ts +19 -0
- package/dist/messaging/campaigns.d.ts.map +1 -0
- package/dist/messaging/campaigns.js +77 -0
- package/dist/messaging/campaigns.js.map +1 -0
- package/dist/messaging/channels.d.ts +23 -0
- package/dist/messaging/channels.d.ts.map +1 -0
- package/dist/messaging/channels.js +104 -0
- package/dist/messaging/channels.js.map +1 -0
- package/dist/messaging/chats.d.ts +14 -0
- package/dist/messaging/chats.d.ts.map +1 -0
- package/dist/messaging/chats.js +51 -0
- package/dist/messaging/chats.js.map +1 -0
- package/dist/messaging/client-tokens.d.ts +15 -0
- package/dist/messaging/client-tokens.d.ts.map +1 -0
- package/dist/messaging/client-tokens.js +64 -0
- package/dist/messaging/client-tokens.js.map +1 -0
- package/dist/messaging/client.d.ts +58 -0
- package/dist/messaging/client.d.ts.map +1 -0
- package/dist/messaging/client.js +100 -0
- package/dist/messaging/client.js.map +1 -0
- package/dist/messaging/contacts.d.ts +20 -0
- package/dist/messaging/contacts.d.ts.map +1 -0
- package/dist/messaging/contacts.js +75 -0
- package/dist/messaging/contacts.js.map +1 -0
- package/dist/messaging/groups.d.ts +34 -0
- package/dist/messaging/groups.d.ts.map +1 -0
- package/dist/messaging/groups.js +97 -0
- package/dist/messaging/groups.js.map +1 -0
- package/dist/messaging/identities.d.ts +9 -0
- package/dist/messaging/identities.d.ts.map +1 -0
- package/dist/messaging/identities.js +21 -0
- package/dist/messaging/identities.js.map +1 -0
- package/dist/messaging/labels.d.ts +16 -0
- package/dist/messaging/labels.d.ts.map +1 -0
- package/dist/messaging/labels.js +65 -0
- package/dist/messaging/labels.js.map +1 -0
- package/dist/messaging/media.d.ts +72 -0
- package/dist/messaging/media.d.ts.map +1 -0
- package/dist/messaging/media.js +142 -0
- package/dist/messaging/media.js.map +1 -0
- package/dist/messaging/messages.d.ts +18 -0
- package/dist/messaging/messages.d.ts.map +1 -0
- package/dist/messaging/messages.js +32 -0
- package/dist/messaging/messages.js.map +1 -0
- package/dist/messaging/observation-policies.d.ts +10 -0
- package/dist/messaging/observation-policies.d.ts.map +1 -0
- package/dist/messaging/observation-policies.js +28 -0
- package/dist/messaging/observation-policies.js.map +1 -0
- package/dist/messaging/onboarding.d.ts +53 -0
- package/dist/messaging/onboarding.d.ts.map +1 -0
- package/dist/messaging/onboarding.js +69 -0
- package/dist/messaging/onboarding.js.map +1 -0
- package/dist/messaging/presence.d.ts +12 -0
- package/dist/messaging/presence.d.ts.map +1 -0
- package/dist/messaging/presence.js +43 -0
- package/dist/messaging/presence.js.map +1 -0
- package/dist/messaging/privacy.d.ts +11 -0
- package/dist/messaging/privacy.d.ts.map +1 -0
- package/dist/messaging/privacy.js +34 -0
- package/dist/messaging/privacy.js.map +1 -0
- package/dist/messaging/profile.d.ts +13 -0
- package/dist/messaging/profile.d.ts.map +1 -0
- package/dist/messaging/profile.js +49 -0
- package/dist/messaging/profile.js.map +1 -0
- package/dist/messaging/quick-replies.d.ts +13 -0
- package/dist/messaging/quick-replies.d.ts.map +1 -0
- package/dist/messaging/quick-replies.js +45 -0
- package/dist/messaging/quick-replies.js.map +1 -0
- package/dist/messaging/quicklinks.d.ts +69 -0
- package/dist/messaging/quicklinks.d.ts.map +1 -0
- package/dist/messaging/quicklinks.js +45 -0
- package/dist/messaging/quicklinks.js.map +1 -0
- package/dist/messaging/session-configuration.d.ts +67 -0
- package/dist/messaging/session-configuration.d.ts.map +1 -0
- package/dist/messaging/session-configuration.js +2 -0
- package/dist/messaging/session-configuration.js.map +1 -0
- package/dist/messaging/sessions.d.ts +26 -0
- package/dist/messaging/sessions.d.ts.map +1 -0
- package/dist/messaging/sessions.js +108 -0
- package/dist/messaging/sessions.js.map +1 -0
- package/dist/messaging/templates.d.ts +15 -0
- package/dist/messaging/templates.d.ts.map +1 -0
- package/dist/messaging/templates.js +67 -0
- package/dist/messaging/templates.js.map +1 -0
- package/dist/messaging/testing-configuration.d.ts +89 -0
- package/dist/messaging/testing-configuration.d.ts.map +1 -0
- package/dist/messaging/testing-configuration.js +14 -0
- package/dist/messaging/testing-configuration.js.map +1 -0
- package/dist/messaging/types.d.ts +1793 -0
- package/dist/messaging/types.d.ts.map +1 -0
- package/dist/messaging/types.js +25 -0
- package/dist/messaging/types.js.map +1 -0
- package/dist/messaging/users.d.ts +9 -0
- package/dist/messaging/users.d.ts.map +1 -0
- package/dist/messaging/users.js +15 -0
- package/dist/messaging/users.js.map +1 -0
- package/dist/messaging/voip.d.ts +51 -0
- package/dist/messaging/voip.d.ts.map +1 -0
- package/dist/messaging/voip.js +293 -0
- package/dist/messaging/voip.js.map +1 -0
- package/dist/messaging/webhooks.d.ts +13 -0
- package/dist/messaging/webhooks.d.ts.map +1 -0
- package/dist/messaging/webhooks.js +48 -0
- package/dist/messaging/webhooks.js.map +1 -0
- package/dist/node.d.ts +55 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +237 -0
- package/dist/node.js.map +1 -0
- package/dist/pagination.d.ts +24 -0
- package/dist/pagination.d.ts.map +1 -0
- package/dist/pagination.js +28 -0
- package/dist/pagination.js.map +1 -0
- package/dist/platform/api-keys.d.ts +10 -0
- package/dist/platform/api-keys.d.ts.map +1 -0
- package/dist/platform/api-keys.js +22 -0
- package/dist/platform/api-keys.js.map +1 -0
- package/dist/platform/audiences.d.ts +16 -0
- package/dist/platform/audiences.d.ts.map +1 -0
- package/dist/platform/audiences.js +46 -0
- package/dist/platform/audiences.js.map +1 -0
- package/dist/platform/audit-logs.d.ts +9 -0
- package/dist/platform/audit-logs.d.ts.map +1 -0
- package/dist/platform/audit-logs.js +20 -0
- package/dist/platform/audit-logs.js.map +1 -0
- package/dist/platform/bansafe.d.ts +24 -0
- package/dist/platform/bansafe.d.ts.map +1 -0
- package/dist/platform/bansafe.js +70 -0
- package/dist/platform/bansafe.js.map +1 -0
- package/dist/platform/billing.d.ts +13 -0
- package/dist/platform/billing.d.ts.map +1 -0
- package/dist/platform/billing.js +27 -0
- package/dist/platform/billing.js.map +1 -0
- package/dist/platform/campaigns.d.ts +28 -0
- package/dist/platform/campaigns.d.ts.map +1 -0
- package/dist/platform/campaigns.js +92 -0
- package/dist/platform/campaigns.js.map +1 -0
- package/dist/platform/customers.d.ts +23 -0
- package/dist/platform/customers.d.ts.map +1 -0
- package/dist/platform/customers.js +140 -0
- package/dist/platform/customers.js.map +1 -0
- package/dist/platform/developer-resources.d.ts +101 -0
- package/dist/platform/developer-resources.d.ts.map +1 -0
- package/dist/platform/developer-resources.js +250 -0
- package/dist/platform/developer-resources.js.map +1 -0
- package/dist/platform/developer-types.d.ts +378 -0
- package/dist/platform/developer-types.d.ts.map +1 -0
- package/dist/platform/developer-types.js +2 -0
- package/dist/platform/developer-types.js.map +1 -0
- package/dist/platform/event-stream.d.ts +114 -0
- package/dist/platform/event-stream.d.ts.map +1 -0
- package/dist/platform/event-stream.js +308 -0
- package/dist/platform/event-stream.js.map +1 -0
- package/dist/platform/media.d.ts +13 -0
- package/dist/platform/media.d.ts.map +1 -0
- package/dist/platform/media.js +33 -0
- package/dist/platform/media.js.map +1 -0
- package/dist/platform/members.d.ts +9 -0
- package/dist/platform/members.d.ts.map +1 -0
- package/dist/platform/members.js +15 -0
- package/dist/platform/members.js.map +1 -0
- package/dist/platform/opt-outs.d.ts +15 -0
- package/dist/platform/opt-outs.d.ts.map +1 -0
- package/dist/platform/opt-outs.js +36 -0
- package/dist/platform/opt-outs.js.map +1 -0
- package/dist/platform/organizations.d.ts +9 -0
- package/dist/platform/organizations.d.ts.map +1 -0
- package/dist/platform/organizations.js +15 -0
- package/dist/platform/organizations.js.map +1 -0
- package/dist/platform/project-tokens.d.ts +9 -0
- package/dist/platform/project-tokens.d.ts.map +1 -0
- package/dist/platform/project-tokens.js +16 -0
- package/dist/platform/project-tokens.js.map +1 -0
- package/dist/platform/projects.d.ts +24 -0
- package/dist/platform/projects.d.ts.map +1 -0
- package/dist/platform/projects.js +83 -0
- package/dist/platform/projects.js.map +1 -0
- package/dist/platform/quicklink-settings.d.ts +85 -0
- package/dist/platform/quicklink-settings.d.ts.map +1 -0
- package/dist/platform/quicklink-settings.js +35 -0
- package/dist/platform/quicklink-settings.js.map +1 -0
- package/dist/platform/response.d.ts +10 -0
- package/dist/platform/response.d.ts.map +1 -0
- package/dist/platform/response.js +41 -0
- package/dist/platform/response.js.map +1 -0
- package/dist/platform/security-incidents.d.ts +10 -0
- package/dist/platform/security-incidents.d.ts.map +1 -0
- package/dist/platform/security-incidents.js +22 -0
- package/dist/platform/security-incidents.js.map +1 -0
- package/dist/platform/session-bans.d.ts +13 -0
- package/dist/platform/session-bans.d.ts.map +1 -0
- package/dist/platform/session-bans.js +21 -0
- package/dist/platform/session-bans.js.map +1 -0
- package/dist/platform/session-configuration.d.ts +15 -0
- package/dist/platform/session-configuration.d.ts.map +1 -0
- package/dist/platform/session-configuration.js +36 -0
- package/dist/platform/session-configuration.js.map +1 -0
- package/dist/platform/sessions.d.ts +26 -0
- package/dist/platform/sessions.d.ts.map +1 -0
- package/dist/platform/sessions.js +121 -0
- package/dist/platform/sessions.js.map +1 -0
- package/dist/platform/sip-trunks.d.ts +141 -0
- package/dist/platform/sip-trunks.d.ts.map +1 -0
- package/dist/platform/sip-trunks.js +140 -0
- package/dist/platform/sip-trunks.js.map +1 -0
- package/dist/platform/types.d.ts +897 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +2 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/raw.d.ts +26 -0
- package/dist/raw.d.ts.map +1 -0
- package/dist/raw.js +79 -0
- package/dist/raw.js.map +1 -0
- package/dist/system.d.ts +37 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +45 -0
- package/dist/system.js.map +1 -0
- package/dist/transport/body.d.ts +6 -0
- package/dist/transport/body.d.ts.map +1 -0
- package/dist/transport/body.js +33 -0
- package/dist/transport/body.js.map +1 -0
- package/dist/transport/content-disposition.d.ts +9 -0
- package/dist/transport/content-disposition.d.ts.map +1 -0
- package/dist/transport/content-disposition.js +107 -0
- package/dist/transport/content-disposition.js.map +1 -0
- package/dist/transport/http.d.ts +35 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +660 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/idempotency.d.ts +10 -0
- package/dist/transport/idempotency.d.ts.map +1 -0
- package/dist/transport/idempotency.js +13 -0
- package/dist/transport/idempotency.js.map +1 -0
- package/dist/transport/retry.d.ts +11 -0
- package/dist/transport/retry.d.ts.map +1 -0
- package/dist/transport/retry.js +45 -0
- package/dist/transport/retry.js.map +1 -0
- package/dist/transport/types.d.ts +58 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +2 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/webhooks/events.d.ts +741 -0
- package/dist/webhooks/events.d.ts.map +1 -0
- package/dist/webhooks/events.js +80 -0
- package/dist/webhooks/events.js.map +1 -0
- package/dist/webhooks/index.d.ts +4 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +4 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/utilities.d.ts +33 -0
- package/dist/webhooks/utilities.d.ts.map +1 -0
- package/dist/webhooks/utilities.js +67 -0
- package/dist/webhooks/utilities.js.map +1 -0
- package/dist/webhooks/verify.d.ts +9 -0
- package/dist/webhooks/verify.d.ts.map +1 -0
- package/dist/webhooks/verify.js +77 -0
- package/dist/webhooks/verify.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { CallClaimedError, CallsAuthError, CallsDisabledError, CallsError, } from "./errors.js";
|
|
2
|
+
import { Emitter } from "./events.js";
|
|
3
|
+
import { AUTH_FAILED_CLOSE_CODE, DEFAULT_SAMPLE_RATE, MEDIA_SUBPROTOCOL, decodeMediaFrame, encodeAudioFrame, encodeVideoFrame, mediaSocketPath, parseMediaControl, } from "./protocol.js";
|
|
4
|
+
import { isClientToken } from "./token.js";
|
|
5
|
+
/**
|
|
6
|
+
* Close code for a call-state refusal. With the reason "call claimed" (or a
|
|
7
|
+
* preceding `call_claimed` error frame) another participant claimed the call;
|
|
8
|
+
* otherwise the call is not available (ended or not ready).
|
|
9
|
+
*/
|
|
10
|
+
export const CALL_CLAIMED_CLOSE_CODE = 4409;
|
|
11
|
+
/** Close code for a connection refused because calling is turned off. */
|
|
12
|
+
export const CALLS_DISABLED_CLOSE_CODE = 4403;
|
|
13
|
+
/** Close codes after which reattaching can succeed. */
|
|
14
|
+
const RETRYABLE_CLOSE_CODES = new Set([1001, 1006, 1011, 1012, 1013, 4429]);
|
|
15
|
+
/**
|
|
16
|
+
* One media connection to a call: tagged binary frames for audio and video,
|
|
17
|
+
* JSON text frames for control. The first frame authenticates the
|
|
18
|
+
* connection. A socket does not reconnect by itself; the call opens a new one
|
|
19
|
+
* with the same connection id.
|
|
20
|
+
*/
|
|
21
|
+
export class MediaSocket extends Emitter {
|
|
22
|
+
#o;
|
|
23
|
+
#WS;
|
|
24
|
+
#socket;
|
|
25
|
+
#beat;
|
|
26
|
+
#awaitingPong = false;
|
|
27
|
+
#sampleRate = DEFAULT_SAMPLE_RATE;
|
|
28
|
+
#closed = false;
|
|
29
|
+
#ready = false;
|
|
30
|
+
#intent;
|
|
31
|
+
#claimed = false;
|
|
32
|
+
/** The last error frame before `ready`; the close that follows explains it. */
|
|
33
|
+
#refusal;
|
|
34
|
+
#pending;
|
|
35
|
+
#connecting;
|
|
36
|
+
constructor(options) {
|
|
37
|
+
super();
|
|
38
|
+
this.#o = options;
|
|
39
|
+
const WS = options.WebSocket ?? globalThis.WebSocket;
|
|
40
|
+
if (WS === undefined)
|
|
41
|
+
throw new Error("No WebSocket implementation: pass `WebSocket` (Node < 22) or run on Node 22+.");
|
|
42
|
+
this.#WS = WS;
|
|
43
|
+
}
|
|
44
|
+
get connectionId() {
|
|
45
|
+
return this.#o.connectionId;
|
|
46
|
+
}
|
|
47
|
+
/** The PCM rate in force; updated from the platform's `ready` frame. */
|
|
48
|
+
get sampleRate() {
|
|
49
|
+
return this.#sampleRate;
|
|
50
|
+
}
|
|
51
|
+
get connected() {
|
|
52
|
+
return (this.#ready &&
|
|
53
|
+
this.#socket !== undefined &&
|
|
54
|
+
this.#socket.readyState === this.#WS.OPEN);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Authenticate and attach; resolves when the platform reports `ready`.
|
|
58
|
+
* Rejects with {@link CallClaimedError} or {@link CallsAuthError} when the
|
|
59
|
+
* platform refuses the connection for those reasons.
|
|
60
|
+
*/
|
|
61
|
+
connect() {
|
|
62
|
+
if (this.#closed)
|
|
63
|
+
return Promise.reject(new Error("Media socket is closed."));
|
|
64
|
+
if (this.#connecting !== undefined)
|
|
65
|
+
return this.#connecting;
|
|
66
|
+
if (this.#socket !== undefined)
|
|
67
|
+
return Promise.resolve();
|
|
68
|
+
const attempt = new Promise((resolve, reject) => {
|
|
69
|
+
const readyMs = this.#o.readyTimeoutMs ?? 10_000;
|
|
70
|
+
let readyTimer;
|
|
71
|
+
let settled = false;
|
|
72
|
+
const done = (err) => {
|
|
73
|
+
if (settled)
|
|
74
|
+
return;
|
|
75
|
+
settled = true;
|
|
76
|
+
if (readyTimer !== undefined) {
|
|
77
|
+
(this.#o.clearTimeout ?? clearTimeout)(readyTimer);
|
|
78
|
+
readyTimer = undefined;
|
|
79
|
+
}
|
|
80
|
+
if (this.#pending === done)
|
|
81
|
+
this.#pending = undefined;
|
|
82
|
+
this.#connecting = undefined;
|
|
83
|
+
if (err)
|
|
84
|
+
reject(err);
|
|
85
|
+
else
|
|
86
|
+
resolve();
|
|
87
|
+
};
|
|
88
|
+
this.#pending = done;
|
|
89
|
+
if (readyMs > 0)
|
|
90
|
+
readyTimer = (this.#o.setTimeout ?? setTimeout)(() => {
|
|
91
|
+
readyTimer = undefined;
|
|
92
|
+
done(new CallsError("media_timeout", "The platform did not report media ready in time."));
|
|
93
|
+
this.close();
|
|
94
|
+
}, readyMs);
|
|
95
|
+
void this.#open(done);
|
|
96
|
+
});
|
|
97
|
+
this.#connecting = attempt;
|
|
98
|
+
return attempt;
|
|
99
|
+
}
|
|
100
|
+
async #open(done) {
|
|
101
|
+
let token;
|
|
102
|
+
try {
|
|
103
|
+
token = (await this.#o.api.token(this.#o.refreshToken === true ? { refresh: true } : {})).value;
|
|
104
|
+
}
|
|
105
|
+
catch (cause) {
|
|
106
|
+
done(new CallsError("token_failed", cause instanceof Error
|
|
107
|
+
? cause.message
|
|
108
|
+
: "Could not obtain a token for the media socket.", { cause }));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
if (this.#closed)
|
|
112
|
+
return;
|
|
113
|
+
let socket;
|
|
114
|
+
try {
|
|
115
|
+
socket = new this.#WS(this.#o.api.socketUrl(mediaSocketPath(this.#o.callId)), [MEDIA_SUBPROTOCOL]);
|
|
116
|
+
}
|
|
117
|
+
catch (cause) {
|
|
118
|
+
done(cause instanceof Error
|
|
119
|
+
? cause
|
|
120
|
+
: new Error("WebSocket construction failed."));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
socket.binaryType = "arraybuffer";
|
|
124
|
+
this.#socket = socket;
|
|
125
|
+
let opened = false;
|
|
126
|
+
socket.onopen = () => {
|
|
127
|
+
opened = true;
|
|
128
|
+
const auth = {
|
|
129
|
+
type: "auth",
|
|
130
|
+
token,
|
|
131
|
+
connectionId: this.#o.connectionId,
|
|
132
|
+
...(this.#o.participant === undefined || isClientToken(token)
|
|
133
|
+
? {}
|
|
134
|
+
: { participant: this.#o.participant }),
|
|
135
|
+
};
|
|
136
|
+
socket.send(JSON.stringify(auth));
|
|
137
|
+
};
|
|
138
|
+
socket.onmessage = (event) => {
|
|
139
|
+
const data = event.data;
|
|
140
|
+
if (typeof data === "string") {
|
|
141
|
+
const control = parseMediaControl(data);
|
|
142
|
+
if (control === undefined)
|
|
143
|
+
return;
|
|
144
|
+
if (control.type === "ready") {
|
|
145
|
+
this.#sampleRate = control.sampleRate;
|
|
146
|
+
this.#ready = true;
|
|
147
|
+
this.#startHeartbeat(socket);
|
|
148
|
+
try {
|
|
149
|
+
this.emit("ready", {
|
|
150
|
+
sampleRate: control.sampleRate,
|
|
151
|
+
video: control.video,
|
|
152
|
+
...(control.callId === undefined
|
|
153
|
+
? {}
|
|
154
|
+
: { callId: control.callId }),
|
|
155
|
+
...(control.connectionId === undefined
|
|
156
|
+
? {}
|
|
157
|
+
: { connectionId: control.connectionId }),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
done();
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (control.type === "error" && control.code === "call_claimed")
|
|
166
|
+
this.#claimed = true;
|
|
167
|
+
if (!this.#ready) {
|
|
168
|
+
// The platform sends an error frame and then closes; settle on the
|
|
169
|
+
// close so the close code decides the error type.
|
|
170
|
+
if (control.type === "error")
|
|
171
|
+
this.#refusal = errorFrom(control);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
this.#control(control);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (!this.#ready)
|
|
178
|
+
return;
|
|
179
|
+
const bytes = data instanceof ArrayBuffer
|
|
180
|
+
? new Uint8Array(data)
|
|
181
|
+
: ArrayBuffer.isView(data)
|
|
182
|
+
? new Uint8Array(data.buffer, data.byteOffset, data.byteLength)
|
|
183
|
+
: undefined;
|
|
184
|
+
if (bytes === undefined)
|
|
185
|
+
return;
|
|
186
|
+
const frame = decodeMediaFrame(bytes);
|
|
187
|
+
if (frame === undefined)
|
|
188
|
+
return;
|
|
189
|
+
if (frame.kind === "audio")
|
|
190
|
+
this.emit("audio", frame.pcm);
|
|
191
|
+
else
|
|
192
|
+
this.emit("video", frame.frame);
|
|
193
|
+
};
|
|
194
|
+
// Node 22's WebSocket reports a failed handshake (refused, reset, or a
|
|
195
|
+
// non-101 reply) with an error event and never fires close, so treat an
|
|
196
|
+
// error before open as the close that other runtimes deliver.
|
|
197
|
+
socket.onerror = () => {
|
|
198
|
+
if (opened || this.#socket !== socket)
|
|
199
|
+
return;
|
|
200
|
+
const onclose = socket.onclose;
|
|
201
|
+
socket.onopen = socket.onmessage = socket.onclose = socket.onerror = null;
|
|
202
|
+
try {
|
|
203
|
+
socket.close();
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// never opened
|
|
207
|
+
}
|
|
208
|
+
onclose?.call(socket, { code: 1006 });
|
|
209
|
+
};
|
|
210
|
+
socket.onclose = (event) => {
|
|
211
|
+
this.#stopHeartbeat();
|
|
212
|
+
if (this.#socket === socket)
|
|
213
|
+
this.#socket = undefined;
|
|
214
|
+
this.#closed = true;
|
|
215
|
+
this.#ready = false;
|
|
216
|
+
const close = this.#classify(event);
|
|
217
|
+
done(closeError(close, this.#refusal));
|
|
218
|
+
this.emit("close", close);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/** Push s16le mono PCM at {@link sampleRate}. Returns false when not connected. */
|
|
222
|
+
writeAudio(pcm) {
|
|
223
|
+
if (!this.connected)
|
|
224
|
+
return false;
|
|
225
|
+
this.#socket.send(encodeAudioFrame(pcm));
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
/** Push one H.264 Annex-B access unit. Send decoder configuration with keyframes. */
|
|
229
|
+
writeVideo(frame) {
|
|
230
|
+
if (!this.connected)
|
|
231
|
+
return false;
|
|
232
|
+
this.#socket.send(encodeVideoFrame({ ...frame, source: 0 }));
|
|
233
|
+
return true;
|
|
234
|
+
}
|
|
235
|
+
send(frame) {
|
|
236
|
+
if (!this.connected)
|
|
237
|
+
return false;
|
|
238
|
+
this.#socket.send(JSON.stringify(frame));
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
/** Close this connection only; the call continues. False when not connected. */
|
|
242
|
+
leave() {
|
|
243
|
+
if (!this.send({ type: "leave" }))
|
|
244
|
+
return false;
|
|
245
|
+
this.#intent = "left";
|
|
246
|
+
this.#finish("left");
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
/** End the call for every participant. False when not connected. */
|
|
250
|
+
endCall() {
|
|
251
|
+
if (!this.send({ type: "end_call" }))
|
|
252
|
+
return false;
|
|
253
|
+
this.#intent = "ended";
|
|
254
|
+
this.#finish("ended");
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
close() {
|
|
258
|
+
this.#finish("local");
|
|
259
|
+
}
|
|
260
|
+
#finish(reason) {
|
|
261
|
+
if (this.#closed)
|
|
262
|
+
return;
|
|
263
|
+
this.#closed = true;
|
|
264
|
+
this.#stopHeartbeat();
|
|
265
|
+
this.#pending?.(new Error("Media socket closed before media was bridged."));
|
|
266
|
+
const socket = this.#socket;
|
|
267
|
+
this.#socket = undefined;
|
|
268
|
+
this.#ready = false;
|
|
269
|
+
if (socket === undefined)
|
|
270
|
+
return;
|
|
271
|
+
socket.onopen = socket.onmessage = socket.onclose = socket.onerror = null;
|
|
272
|
+
try {
|
|
273
|
+
socket.close(1000, reason === "local" ? "closed" : reason);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// already closed
|
|
277
|
+
}
|
|
278
|
+
this.emit("close", { reason });
|
|
279
|
+
}
|
|
280
|
+
#classify(event) {
|
|
281
|
+
const code = event?.code;
|
|
282
|
+
const text = (event?.reason ?? "").toLowerCase();
|
|
283
|
+
const withCode = code === undefined ? {} : { code };
|
|
284
|
+
if (this.#intent !== undefined)
|
|
285
|
+
return { reason: this.#intent, ...withCode };
|
|
286
|
+
if (code === AUTH_FAILED_CLOSE_CODE)
|
|
287
|
+
return { reason: "unauthorized", ...withCode };
|
|
288
|
+
if (this.#claimed ||
|
|
289
|
+
text === "call claimed" ||
|
|
290
|
+
(code === CALL_CLAIMED_CLOSE_CODE && this.#refusal === undefined))
|
|
291
|
+
return {
|
|
292
|
+
reason: this.#claimed || text === "call claimed" ? "claimed" : "ended",
|
|
293
|
+
...withCode,
|
|
294
|
+
};
|
|
295
|
+
// 4409 for another reason: the call is ended or not available.
|
|
296
|
+
if (code === CALL_CLAIMED_CLOSE_CODE)
|
|
297
|
+
return { reason: "ended", ...withCode };
|
|
298
|
+
// The platform closes a connection normally when it leaves or the call
|
|
299
|
+
// ends; the lifecycle stream reports which.
|
|
300
|
+
if (code === 1000)
|
|
301
|
+
return { reason: "ended", ...withCode };
|
|
302
|
+
if (code === 4400 ||
|
|
303
|
+
code === CALLS_DISABLED_CLOSE_CODE ||
|
|
304
|
+
code === 1008 ||
|
|
305
|
+
code === 1009)
|
|
306
|
+
return { reason: "refused", ...withCode };
|
|
307
|
+
if (code === undefined || RETRYABLE_CLOSE_CODES.has(code))
|
|
308
|
+
return { reason: "lost", ...withCode };
|
|
309
|
+
return { reason: "lost", ...withCode };
|
|
310
|
+
}
|
|
311
|
+
#control(frame) {
|
|
312
|
+
switch (frame.type) {
|
|
313
|
+
case "pong":
|
|
314
|
+
this.#awaitingPong = false;
|
|
315
|
+
return;
|
|
316
|
+
case "participant_joined":
|
|
317
|
+
this.emit("participantJoined", frame.participant);
|
|
318
|
+
return;
|
|
319
|
+
case "participant_left":
|
|
320
|
+
this.emit("participantLeft", frame.participantId, frame.reason);
|
|
321
|
+
return;
|
|
322
|
+
case "participant_state":
|
|
323
|
+
this.emit("participantState", frame.participant);
|
|
324
|
+
return;
|
|
325
|
+
case "video_source":
|
|
326
|
+
this.emit("videoSource", frame.connectionId !== undefined
|
|
327
|
+
? {
|
|
328
|
+
source: frame.source,
|
|
329
|
+
connectionId: frame.connectionId,
|
|
330
|
+
...(frame.connectionParticipant === undefined
|
|
331
|
+
? {}
|
|
332
|
+
: { connectionParticipant: frame.connectionParticipant }),
|
|
333
|
+
}
|
|
334
|
+
: { source: frame.source, participant: frame.participant });
|
|
335
|
+
return;
|
|
336
|
+
case "video_source_removed":
|
|
337
|
+
this.emit("videoSourceRemoved", frame.source);
|
|
338
|
+
return;
|
|
339
|
+
case "keyframe_request":
|
|
340
|
+
this.emit("keyframeRequest");
|
|
341
|
+
return;
|
|
342
|
+
case "error":
|
|
343
|
+
this.emit("error", errorFrom(frame));
|
|
344
|
+
return;
|
|
345
|
+
default:
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
#startHeartbeat(socket) {
|
|
350
|
+
this.#stopHeartbeat();
|
|
351
|
+
const every = this.#o.heartbeatMs ?? 5_000;
|
|
352
|
+
if (every <= 0)
|
|
353
|
+
return;
|
|
354
|
+
this.#beat = (this.#o.setInterval ?? setInterval)(() => {
|
|
355
|
+
if (this.#socket !== socket)
|
|
356
|
+
return;
|
|
357
|
+
if (this.#awaitingPong) {
|
|
358
|
+
// Treat a silent socket as lost so the call can reconnect it.
|
|
359
|
+
this.#stopHeartbeat();
|
|
360
|
+
this.#closed = true;
|
|
361
|
+
this.#socket = undefined;
|
|
362
|
+
this.#ready = false;
|
|
363
|
+
socket.onopen =
|
|
364
|
+
socket.onmessage =
|
|
365
|
+
socket.onclose =
|
|
366
|
+
socket.onerror =
|
|
367
|
+
null;
|
|
368
|
+
try {
|
|
369
|
+
socket.close();
|
|
370
|
+
}
|
|
371
|
+
catch {
|
|
372
|
+
// already gone
|
|
373
|
+
}
|
|
374
|
+
this.emit("close", { reason: "lost" });
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
this.#awaitingPong = this.send({ type: "ping" });
|
|
378
|
+
}, every);
|
|
379
|
+
}
|
|
380
|
+
#stopHeartbeat() {
|
|
381
|
+
if (this.#beat !== undefined) {
|
|
382
|
+
(this.#o.clearInterval ?? clearInterval)(this.#beat);
|
|
383
|
+
this.#beat = undefined;
|
|
384
|
+
}
|
|
385
|
+
this.#awaitingPong = false;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
function errorFrom(frame) {
|
|
389
|
+
if (frame.code === "call_claimed")
|
|
390
|
+
return new CallClaimedError(frame.message);
|
|
391
|
+
if (frame.code === "unauthorized")
|
|
392
|
+
return new CallsAuthError(frame.message);
|
|
393
|
+
if (frame.code === "calls_disabled")
|
|
394
|
+
return new CallsDisabledError(frame.message);
|
|
395
|
+
return new CallsError(frame.code, frame.message ??
|
|
396
|
+
`The platform refused the media connection (${frame.code}).`);
|
|
397
|
+
}
|
|
398
|
+
function closeError(close, refusal) {
|
|
399
|
+
switch (close.reason) {
|
|
400
|
+
case "claimed":
|
|
401
|
+
return new CallClaimedError();
|
|
402
|
+
case "unauthorized":
|
|
403
|
+
return new CallsAuthError(refusal?.message);
|
|
404
|
+
case "ended":
|
|
405
|
+
return (refusal ?? new CallsError("call_ended", "The call is not available."));
|
|
406
|
+
case "refused":
|
|
407
|
+
return (refusal ??
|
|
408
|
+
new CallsError("media_refused", "The platform refused the media connection."));
|
|
409
|
+
default:
|
|
410
|
+
return (refusal ??
|
|
411
|
+
new CallsError("media_closed", "Media socket closed before media was bridged."));
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../../calls/src/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire contract between this client and the platform (Calls contract
|
|
3
|
+
* revision 1). Two sockets carry a call:
|
|
4
|
+
*
|
|
5
|
+
* 1. The **lifecycle socket** (`GET /voip/ws`) — one per client. No credential
|
|
6
|
+
* travels in the URL: the first frame is `{ type: "auth", token }` and the
|
|
7
|
+
* platform answers `ready`. Server credentials name the session with
|
|
8
|
+
* `?session=` (and optionally `&participant=`); client tokens send no query
|
|
9
|
+
* parameters. A later `auth` frame replaces an expiring token and must
|
|
10
|
+
* resolve to the same organization, project, session and participant. The
|
|
11
|
+
* platform closes the socket with 4401 once the token stops authorizing
|
|
12
|
+
* the session.
|
|
13
|
+
*
|
|
14
|
+
* 2. The **media socket** (`GET /voip/calls/{callId}/media`, subprotocol
|
|
15
|
+
* `pmfa.calls.v2`) — one per media connection. The first frame is
|
|
16
|
+
* `{ type: "auth", token, connectionId, participant? }`; the URL carries no
|
|
17
|
+
* query parameters. Replacement auth frames cannot change the connection
|
|
18
|
+
* or participant. Binary frames
|
|
19
|
+
* carry media, text frames carry JSON control. Every binary frame starts
|
|
20
|
+
* with a one-byte kind tag so audio and video share the socket.
|
|
21
|
+
*/
|
|
22
|
+
/** Lifecycle socket path on the API host. */
|
|
23
|
+
export declare const LIFECYCLE_SOCKET_PATH = "/voip/ws";
|
|
24
|
+
/** Close code for a token that no longer authorizes the socket. */
|
|
25
|
+
export declare const AUTH_FAILED_CLOSE_CODE = 4401;
|
|
26
|
+
/** Media socket subprotocol. */
|
|
27
|
+
export declare const MEDIA_SUBPROTOCOL = "pmfa.calls.v2";
|
|
28
|
+
export declare function mediaSocketPath(callId: string): string;
|
|
29
|
+
/** A media connection id: 8–64 characters of `[A-Za-z0-9_-]`. */
|
|
30
|
+
export declare function isConnectionId(value: unknown): value is string;
|
|
31
|
+
/** A server-credential participant name: 1–128 characters of `[A-Za-z0-9._:@-]`. */
|
|
32
|
+
export declare function isParticipantName(value: unknown): value is string;
|
|
33
|
+
/**
|
|
34
|
+
* A new connection id: 18 crypto-random bytes as base64url (24 characters).
|
|
35
|
+
* Reuse the same id to reconnect the same connection.
|
|
36
|
+
*/
|
|
37
|
+
export declare function createConnectionId(random?: (bytes: Uint8Array<ArrayBuffer>) => Uint8Array): string;
|
|
38
|
+
export interface TrickleCandidate {
|
|
39
|
+
readonly candidate: string;
|
|
40
|
+
readonly sdpMid?: string;
|
|
41
|
+
readonly sdpMLineIndex?: number;
|
|
42
|
+
}
|
|
43
|
+
export type LifecycleFrame = {
|
|
44
|
+
readonly type: "ready";
|
|
45
|
+
readonly session?: string;
|
|
46
|
+
/** Participant reference of the authenticated credential, when sent. */
|
|
47
|
+
readonly participant?: string;
|
|
48
|
+
} | {
|
|
49
|
+
readonly type: "event";
|
|
50
|
+
readonly event: string;
|
|
51
|
+
readonly callId: string;
|
|
52
|
+
readonly payload: unknown;
|
|
53
|
+
readonly timestamp: string;
|
|
54
|
+
} | {
|
|
55
|
+
readonly type: "candidate";
|
|
56
|
+
readonly callId: string;
|
|
57
|
+
readonly connectionId?: string;
|
|
58
|
+
readonly candidate: TrickleCandidate;
|
|
59
|
+
} | {
|
|
60
|
+
readonly type: "error";
|
|
61
|
+
readonly code: string;
|
|
62
|
+
readonly message: string;
|
|
63
|
+
} | {
|
|
64
|
+
readonly type: "pong";
|
|
65
|
+
};
|
|
66
|
+
export type LifecycleClientFrame = {
|
|
67
|
+
readonly type: "auth";
|
|
68
|
+
readonly token: string;
|
|
69
|
+
} | {
|
|
70
|
+
readonly type: "ping";
|
|
71
|
+
} | {
|
|
72
|
+
readonly type: "candidate";
|
|
73
|
+
readonly callId: string;
|
|
74
|
+
readonly connectionId: string;
|
|
75
|
+
readonly candidate: TrickleCandidate;
|
|
76
|
+
};
|
|
77
|
+
/** Parse one lifecycle frame; unknown or malformed frames yield `undefined`. */
|
|
78
|
+
export declare function parseLifecycleFrame(data: unknown): LifecycleFrame | undefined;
|
|
79
|
+
/** First byte of every binary media frame. */
|
|
80
|
+
export declare const MediaFrameKind: {
|
|
81
|
+
/** s16le mono PCM at the `ready` frame's sample rate. */
|
|
82
|
+
readonly Audio: 1;
|
|
83
|
+
/** One encoded access unit; payload is {@link VIDEO_HEADER_BYTES} of header then the bytes. */
|
|
84
|
+
readonly Video: 2;
|
|
85
|
+
};
|
|
86
|
+
export type MediaFrameKind = (typeof MediaFrameKind)[keyof typeof MediaFrameKind];
|
|
87
|
+
/** Default PCM rate until the `ready` frame names one. */
|
|
88
|
+
export declare const DEFAULT_SAMPLE_RATE = 16000;
|
|
89
|
+
/**
|
|
90
|
+
* Header that follows the {@link MediaFrameKind.Video} tag. Fixed 14 bytes,
|
|
91
|
+
* big-endian: codec (1) · flags (1) · source (4) · timestamp µs (8), then one
|
|
92
|
+
* Annex-B access unit.
|
|
93
|
+
*/
|
|
94
|
+
export declare const VIDEO_HEADER_BYTES = 14;
|
|
95
|
+
export declare const VideoCodec: {
|
|
96
|
+
readonly H264: 1;
|
|
97
|
+
};
|
|
98
|
+
export type VideoCodec = (typeof VideoCodec)[keyof typeof VideoCodec];
|
|
99
|
+
export declare const VideoFlags: {
|
|
100
|
+
readonly Keyframe: 1;
|
|
101
|
+
};
|
|
102
|
+
export interface VideoFrameHeader {
|
|
103
|
+
readonly codec: VideoCodec;
|
|
104
|
+
readonly keyframe: boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Source handle. Inbound frames carry the producing source announced by a
|
|
107
|
+
* `video_source` frame. Clients send 0; the platform assigns the handle.
|
|
108
|
+
*/
|
|
109
|
+
readonly source: number;
|
|
110
|
+
/** Capture timestamp in microseconds. */
|
|
111
|
+
readonly timestampUs: number;
|
|
112
|
+
}
|
|
113
|
+
export interface VideoFrame extends VideoFrameHeader {
|
|
114
|
+
readonly data: Uint8Array;
|
|
115
|
+
}
|
|
116
|
+
/** An outbound frame; `source` defaults to 0 and `codec` to H.264. */
|
|
117
|
+
export type OutboundVideoFrame = Omit<VideoFrame, "source" | "codec"> & {
|
|
118
|
+
readonly source?: number;
|
|
119
|
+
readonly codec?: VideoCodec;
|
|
120
|
+
};
|
|
121
|
+
export declare function encodeAudioFrame(pcm: Int16Array): Uint8Array<ArrayBuffer>;
|
|
122
|
+
export declare function encodeVideoFrame(frame: OutboundVideoFrame): Uint8Array<ArrayBuffer>;
|
|
123
|
+
export type DecodedMediaFrame = {
|
|
124
|
+
readonly kind: "audio";
|
|
125
|
+
readonly pcm: Int16Array;
|
|
126
|
+
} | {
|
|
127
|
+
readonly kind: "video";
|
|
128
|
+
readonly frame: VideoFrame;
|
|
129
|
+
};
|
|
130
|
+
/** Decode one binary media frame; malformed frames yield `undefined`. */
|
|
131
|
+
export declare function decodeMediaFrame(bytes: Uint8Array): DecodedMediaFrame | undefined;
|
|
132
|
+
export interface Participant {
|
|
133
|
+
readonly id: string;
|
|
134
|
+
readonly phoneNumber?: string;
|
|
135
|
+
readonly bsuid?: string;
|
|
136
|
+
readonly username?: string;
|
|
137
|
+
readonly audioMuted: boolean;
|
|
138
|
+
readonly video: boolean;
|
|
139
|
+
readonly state: "invited" | "ringing" | "connected" | "left";
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Who sends a video source: another media connection of this call, or a
|
|
143
|
+
* WhatsApp participant.
|
|
144
|
+
*/
|
|
145
|
+
export type VideoSourceOwner = {
|
|
146
|
+
readonly connectionId: string;
|
|
147
|
+
/** Participant reference (`client:<id>` or `server:<name>`) of that connection, when known. */
|
|
148
|
+
readonly connectionParticipant?: string;
|
|
149
|
+
readonly participant?: undefined;
|
|
150
|
+
} | {
|
|
151
|
+
readonly participant: Participant;
|
|
152
|
+
readonly connectionId?: undefined;
|
|
153
|
+
readonly connectionParticipant?: undefined;
|
|
154
|
+
};
|
|
155
|
+
export type VideoSourceFrame = {
|
|
156
|
+
readonly type: "video_source";
|
|
157
|
+
readonly source: number;
|
|
158
|
+
} & VideoSourceOwner;
|
|
159
|
+
/** Text frames the platform sends on the media socket. */
|
|
160
|
+
export type MediaControlFrame = {
|
|
161
|
+
readonly type: "ready";
|
|
162
|
+
readonly callId?: string;
|
|
163
|
+
readonly connectionId?: string;
|
|
164
|
+
/** PCM rate both directions use. */
|
|
165
|
+
readonly sampleRate: number;
|
|
166
|
+
readonly video: boolean;
|
|
167
|
+
} | {
|
|
168
|
+
readonly type: "pong";
|
|
169
|
+
} | {
|
|
170
|
+
readonly type: "participant_joined";
|
|
171
|
+
readonly participant: Participant;
|
|
172
|
+
} | {
|
|
173
|
+
readonly type: "participant_left";
|
|
174
|
+
readonly participantId: string;
|
|
175
|
+
readonly reason?: string;
|
|
176
|
+
} | {
|
|
177
|
+
readonly type: "participant_state";
|
|
178
|
+
readonly participant: Participant;
|
|
179
|
+
} | VideoSourceFrame | {
|
|
180
|
+
readonly type: "video_source_removed";
|
|
181
|
+
readonly source: number;
|
|
182
|
+
}
|
|
183
|
+
/** Send a keyframe (with decoder configuration) on the next video frame. */
|
|
184
|
+
| {
|
|
185
|
+
readonly type: "keyframe_request";
|
|
186
|
+
}
|
|
187
|
+
/** `message` is absent on authentication refusals. */
|
|
188
|
+
| {
|
|
189
|
+
readonly type: "error";
|
|
190
|
+
readonly code: string;
|
|
191
|
+
readonly message?: string;
|
|
192
|
+
};
|
|
193
|
+
/** Text frames the client sends on the media socket. */
|
|
194
|
+
export type MediaClientFrame = {
|
|
195
|
+
readonly type: "auth";
|
|
196
|
+
readonly token: string;
|
|
197
|
+
readonly connectionId: string;
|
|
198
|
+
readonly participant?: string;
|
|
199
|
+
} | {
|
|
200
|
+
readonly type: "ping";
|
|
201
|
+
}
|
|
202
|
+
/** Close this connection only. */
|
|
203
|
+
| {
|
|
204
|
+
readonly type: "leave";
|
|
205
|
+
}
|
|
206
|
+
/** End the call for every participant. */
|
|
207
|
+
| {
|
|
208
|
+
readonly type: "end_call";
|
|
209
|
+
};
|
|
210
|
+
export declare function parseMediaControl(data: unknown): MediaControlFrame | undefined;
|
|
211
|
+
/** Validate an already-decoded media control value. @internal */
|
|
212
|
+
export declare function parseMediaControlValue(parsed: unknown): MediaControlFrame | undefined;
|
|
213
|
+
/** A positive uint32 source handle. */
|
|
214
|
+
export declare function isSourceHandle(value: unknown): value is number;
|
|
215
|
+
export declare function isParticipant(value: unknown): value is Participant;
|
|
216
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../calls/src/protocol.ts"],"names":[],"mappings":"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"}
|