@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.
Files changed (347) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1881 -0
  3. package/dist/bridge.d.ts +31 -0
  4. package/dist/bridge.d.ts.map +1 -0
  5. package/dist/bridge.js +39 -0
  6. package/dist/bridge.js.map +1 -0
  7. package/dist/calls/api.d.ts +109 -0
  8. package/dist/calls/api.d.ts.map +1 -0
  9. package/dist/calls/api.js +179 -0
  10. package/dist/calls/api.js.map +1 -0
  11. package/dist/calls/call.d.ts +286 -0
  12. package/dist/calls/call.d.ts.map +1 -0
  13. package/dist/calls/call.js +860 -0
  14. package/dist/calls/call.js.map +1 -0
  15. package/dist/calls/client.d.ts +124 -0
  16. package/dist/calls/client.d.ts.map +1 -0
  17. package/dist/calls/client.js +447 -0
  18. package/dist/calls/client.js.map +1 -0
  19. package/dist/calls/diagnostics.d.ts +74 -0
  20. package/dist/calls/diagnostics.d.ts.map +1 -0
  21. package/dist/calls/diagnostics.js +133 -0
  22. package/dist/calls/diagnostics.js.map +1 -0
  23. package/dist/calls/errors.d.ts +37 -0
  24. package/dist/calls/errors.d.ts.map +1 -0
  25. package/dist/calls/errors.js +52 -0
  26. package/dist/calls/errors.js.map +1 -0
  27. package/dist/calls/events.d.ts +15 -0
  28. package/dist/calls/events.d.ts.map +1 -0
  29. package/dist/calls/events.js +34 -0
  30. package/dist/calls/events.js.map +1 -0
  31. package/dist/calls/index.d.ts +6 -0
  32. package/dist/calls/index.d.ts.map +1 -0
  33. package/dist/calls/index.js +7 -0
  34. package/dist/calls/index.js.map +1 -0
  35. package/dist/calls/internal.d.ts +18 -0
  36. package/dist/calls/internal.d.ts.map +1 -0
  37. package/dist/calls/internal.js +18 -0
  38. package/dist/calls/internal.js.map +1 -0
  39. package/dist/calls/lifecycle.d.ts +111 -0
  40. package/dist/calls/lifecycle.d.ts.map +1 -0
  41. package/dist/calls/lifecycle.js +490 -0
  42. package/dist/calls/lifecycle.js.map +1 -0
  43. package/dist/calls/media.d.ts +102 -0
  44. package/dist/calls/media.d.ts.map +1 -0
  45. package/dist/calls/media.js +414 -0
  46. package/dist/calls/media.js.map +1 -0
  47. package/dist/calls/protocol.d.ts +216 -0
  48. package/dist/calls/protocol.d.ts.map +1 -0
  49. package/dist/calls/protocol.js +268 -0
  50. package/dist/calls/protocol.js.map +1 -0
  51. package/dist/calls/token.d.ts +43 -0
  52. package/dist/calls/token.d.ts.map +1 -0
  53. package/dist/calls/token.js +146 -0
  54. package/dist/calls/token.js.map +1 -0
  55. package/dist/client.d.ts +65 -0
  56. package/dist/client.d.ts.map +1 -0
  57. package/dist/client.js +119 -0
  58. package/dist/client.js.map +1 -0
  59. package/dist/credentials.d.ts +50 -0
  60. package/dist/credentials.d.ts.map +1 -0
  61. package/dist/credentials.js +73 -0
  62. package/dist/credentials.js.map +1 -0
  63. package/dist/errors.d.ts +71 -0
  64. package/dist/errors.d.ts.map +1 -0
  65. package/dist/errors.js +129 -0
  66. package/dist/errors.js.map +1 -0
  67. package/dist/index.d.ts +70 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +61 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/media/whatsapp.d.ts +105 -0
  72. package/dist/media/whatsapp.d.ts.map +1 -0
  73. package/dist/media/whatsapp.js +624 -0
  74. package/dist/media/whatsapp.js.map +1 -0
  75. package/dist/messaging/bansafe.d.ts +30 -0
  76. package/dist/messaging/bansafe.d.ts.map +1 -0
  77. package/dist/messaging/bansafe.js +86 -0
  78. package/dist/messaging/bansafe.js.map +1 -0
  79. package/dist/messaging/business.d.ts +35 -0
  80. package/dist/messaging/business.d.ts.map +1 -0
  81. package/dist/messaging/business.js +145 -0
  82. package/dist/messaging/business.js.map +1 -0
  83. package/dist/messaging/calls.d.ts +9 -0
  84. package/dist/messaging/calls.d.ts.map +1 -0
  85. package/dist/messaging/calls.js +16 -0
  86. package/dist/messaging/calls.js.map +1 -0
  87. package/dist/messaging/campaigns.d.ts +19 -0
  88. package/dist/messaging/campaigns.d.ts.map +1 -0
  89. package/dist/messaging/campaigns.js +77 -0
  90. package/dist/messaging/campaigns.js.map +1 -0
  91. package/dist/messaging/channels.d.ts +23 -0
  92. package/dist/messaging/channels.d.ts.map +1 -0
  93. package/dist/messaging/channels.js +104 -0
  94. package/dist/messaging/channels.js.map +1 -0
  95. package/dist/messaging/chats.d.ts +14 -0
  96. package/dist/messaging/chats.d.ts.map +1 -0
  97. package/dist/messaging/chats.js +51 -0
  98. package/dist/messaging/chats.js.map +1 -0
  99. package/dist/messaging/client-tokens.d.ts +15 -0
  100. package/dist/messaging/client-tokens.d.ts.map +1 -0
  101. package/dist/messaging/client-tokens.js +64 -0
  102. package/dist/messaging/client-tokens.js.map +1 -0
  103. package/dist/messaging/client.d.ts +58 -0
  104. package/dist/messaging/client.d.ts.map +1 -0
  105. package/dist/messaging/client.js +100 -0
  106. package/dist/messaging/client.js.map +1 -0
  107. package/dist/messaging/contacts.d.ts +20 -0
  108. package/dist/messaging/contacts.d.ts.map +1 -0
  109. package/dist/messaging/contacts.js +75 -0
  110. package/dist/messaging/contacts.js.map +1 -0
  111. package/dist/messaging/groups.d.ts +34 -0
  112. package/dist/messaging/groups.d.ts.map +1 -0
  113. package/dist/messaging/groups.js +97 -0
  114. package/dist/messaging/groups.js.map +1 -0
  115. package/dist/messaging/identities.d.ts +9 -0
  116. package/dist/messaging/identities.d.ts.map +1 -0
  117. package/dist/messaging/identities.js +21 -0
  118. package/dist/messaging/identities.js.map +1 -0
  119. package/dist/messaging/labels.d.ts +16 -0
  120. package/dist/messaging/labels.d.ts.map +1 -0
  121. package/dist/messaging/labels.js +65 -0
  122. package/dist/messaging/labels.js.map +1 -0
  123. package/dist/messaging/media.d.ts +72 -0
  124. package/dist/messaging/media.d.ts.map +1 -0
  125. package/dist/messaging/media.js +142 -0
  126. package/dist/messaging/media.js.map +1 -0
  127. package/dist/messaging/messages.d.ts +18 -0
  128. package/dist/messaging/messages.d.ts.map +1 -0
  129. package/dist/messaging/messages.js +32 -0
  130. package/dist/messaging/messages.js.map +1 -0
  131. package/dist/messaging/observation-policies.d.ts +10 -0
  132. package/dist/messaging/observation-policies.d.ts.map +1 -0
  133. package/dist/messaging/observation-policies.js +28 -0
  134. package/dist/messaging/observation-policies.js.map +1 -0
  135. package/dist/messaging/onboarding.d.ts +53 -0
  136. package/dist/messaging/onboarding.d.ts.map +1 -0
  137. package/dist/messaging/onboarding.js +69 -0
  138. package/dist/messaging/onboarding.js.map +1 -0
  139. package/dist/messaging/presence.d.ts +12 -0
  140. package/dist/messaging/presence.d.ts.map +1 -0
  141. package/dist/messaging/presence.js +43 -0
  142. package/dist/messaging/presence.js.map +1 -0
  143. package/dist/messaging/privacy.d.ts +11 -0
  144. package/dist/messaging/privacy.d.ts.map +1 -0
  145. package/dist/messaging/privacy.js +34 -0
  146. package/dist/messaging/privacy.js.map +1 -0
  147. package/dist/messaging/profile.d.ts +13 -0
  148. package/dist/messaging/profile.d.ts.map +1 -0
  149. package/dist/messaging/profile.js +49 -0
  150. package/dist/messaging/profile.js.map +1 -0
  151. package/dist/messaging/quick-replies.d.ts +13 -0
  152. package/dist/messaging/quick-replies.d.ts.map +1 -0
  153. package/dist/messaging/quick-replies.js +45 -0
  154. package/dist/messaging/quick-replies.js.map +1 -0
  155. package/dist/messaging/quicklinks.d.ts +69 -0
  156. package/dist/messaging/quicklinks.d.ts.map +1 -0
  157. package/dist/messaging/quicklinks.js +45 -0
  158. package/dist/messaging/quicklinks.js.map +1 -0
  159. package/dist/messaging/session-configuration.d.ts +67 -0
  160. package/dist/messaging/session-configuration.d.ts.map +1 -0
  161. package/dist/messaging/session-configuration.js +2 -0
  162. package/dist/messaging/session-configuration.js.map +1 -0
  163. package/dist/messaging/sessions.d.ts +26 -0
  164. package/dist/messaging/sessions.d.ts.map +1 -0
  165. package/dist/messaging/sessions.js +108 -0
  166. package/dist/messaging/sessions.js.map +1 -0
  167. package/dist/messaging/templates.d.ts +15 -0
  168. package/dist/messaging/templates.d.ts.map +1 -0
  169. package/dist/messaging/templates.js +67 -0
  170. package/dist/messaging/templates.js.map +1 -0
  171. package/dist/messaging/testing-configuration.d.ts +89 -0
  172. package/dist/messaging/testing-configuration.d.ts.map +1 -0
  173. package/dist/messaging/testing-configuration.js +14 -0
  174. package/dist/messaging/testing-configuration.js.map +1 -0
  175. package/dist/messaging/types.d.ts +1793 -0
  176. package/dist/messaging/types.d.ts.map +1 -0
  177. package/dist/messaging/types.js +25 -0
  178. package/dist/messaging/types.js.map +1 -0
  179. package/dist/messaging/users.d.ts +9 -0
  180. package/dist/messaging/users.d.ts.map +1 -0
  181. package/dist/messaging/users.js +15 -0
  182. package/dist/messaging/users.js.map +1 -0
  183. package/dist/messaging/voip.d.ts +51 -0
  184. package/dist/messaging/voip.d.ts.map +1 -0
  185. package/dist/messaging/voip.js +293 -0
  186. package/dist/messaging/voip.js.map +1 -0
  187. package/dist/messaging/webhooks.d.ts +13 -0
  188. package/dist/messaging/webhooks.d.ts.map +1 -0
  189. package/dist/messaging/webhooks.js +48 -0
  190. package/dist/messaging/webhooks.js.map +1 -0
  191. package/dist/node.d.ts +55 -0
  192. package/dist/node.d.ts.map +1 -0
  193. package/dist/node.js +237 -0
  194. package/dist/node.js.map +1 -0
  195. package/dist/pagination.d.ts +24 -0
  196. package/dist/pagination.d.ts.map +1 -0
  197. package/dist/pagination.js +28 -0
  198. package/dist/pagination.js.map +1 -0
  199. package/dist/platform/api-keys.d.ts +10 -0
  200. package/dist/platform/api-keys.d.ts.map +1 -0
  201. package/dist/platform/api-keys.js +22 -0
  202. package/dist/platform/api-keys.js.map +1 -0
  203. package/dist/platform/audiences.d.ts +16 -0
  204. package/dist/platform/audiences.d.ts.map +1 -0
  205. package/dist/platform/audiences.js +46 -0
  206. package/dist/platform/audiences.js.map +1 -0
  207. package/dist/platform/audit-logs.d.ts +9 -0
  208. package/dist/platform/audit-logs.d.ts.map +1 -0
  209. package/dist/platform/audit-logs.js +20 -0
  210. package/dist/platform/audit-logs.js.map +1 -0
  211. package/dist/platform/bansafe.d.ts +24 -0
  212. package/dist/platform/bansafe.d.ts.map +1 -0
  213. package/dist/platform/bansafe.js +70 -0
  214. package/dist/platform/bansafe.js.map +1 -0
  215. package/dist/platform/billing.d.ts +13 -0
  216. package/dist/platform/billing.d.ts.map +1 -0
  217. package/dist/platform/billing.js +27 -0
  218. package/dist/platform/billing.js.map +1 -0
  219. package/dist/platform/campaigns.d.ts +28 -0
  220. package/dist/platform/campaigns.d.ts.map +1 -0
  221. package/dist/platform/campaigns.js +92 -0
  222. package/dist/platform/campaigns.js.map +1 -0
  223. package/dist/platform/customers.d.ts +23 -0
  224. package/dist/platform/customers.d.ts.map +1 -0
  225. package/dist/platform/customers.js +140 -0
  226. package/dist/platform/customers.js.map +1 -0
  227. package/dist/platform/developer-resources.d.ts +101 -0
  228. package/dist/platform/developer-resources.d.ts.map +1 -0
  229. package/dist/platform/developer-resources.js +250 -0
  230. package/dist/platform/developer-resources.js.map +1 -0
  231. package/dist/platform/developer-types.d.ts +378 -0
  232. package/dist/platform/developer-types.d.ts.map +1 -0
  233. package/dist/platform/developer-types.js +2 -0
  234. package/dist/platform/developer-types.js.map +1 -0
  235. package/dist/platform/event-stream.d.ts +114 -0
  236. package/dist/platform/event-stream.d.ts.map +1 -0
  237. package/dist/platform/event-stream.js +308 -0
  238. package/dist/platform/event-stream.js.map +1 -0
  239. package/dist/platform/media.d.ts +13 -0
  240. package/dist/platform/media.d.ts.map +1 -0
  241. package/dist/platform/media.js +33 -0
  242. package/dist/platform/media.js.map +1 -0
  243. package/dist/platform/members.d.ts +9 -0
  244. package/dist/platform/members.d.ts.map +1 -0
  245. package/dist/platform/members.js +15 -0
  246. package/dist/platform/members.js.map +1 -0
  247. package/dist/platform/opt-outs.d.ts +15 -0
  248. package/dist/platform/opt-outs.d.ts.map +1 -0
  249. package/dist/platform/opt-outs.js +36 -0
  250. package/dist/platform/opt-outs.js.map +1 -0
  251. package/dist/platform/organizations.d.ts +9 -0
  252. package/dist/platform/organizations.d.ts.map +1 -0
  253. package/dist/platform/organizations.js +15 -0
  254. package/dist/platform/organizations.js.map +1 -0
  255. package/dist/platform/project-tokens.d.ts +9 -0
  256. package/dist/platform/project-tokens.d.ts.map +1 -0
  257. package/dist/platform/project-tokens.js +16 -0
  258. package/dist/platform/project-tokens.js.map +1 -0
  259. package/dist/platform/projects.d.ts +24 -0
  260. package/dist/platform/projects.d.ts.map +1 -0
  261. package/dist/platform/projects.js +83 -0
  262. package/dist/platform/projects.js.map +1 -0
  263. package/dist/platform/quicklink-settings.d.ts +85 -0
  264. package/dist/platform/quicklink-settings.d.ts.map +1 -0
  265. package/dist/platform/quicklink-settings.js +35 -0
  266. package/dist/platform/quicklink-settings.js.map +1 -0
  267. package/dist/platform/response.d.ts +10 -0
  268. package/dist/platform/response.d.ts.map +1 -0
  269. package/dist/platform/response.js +41 -0
  270. package/dist/platform/response.js.map +1 -0
  271. package/dist/platform/security-incidents.d.ts +10 -0
  272. package/dist/platform/security-incidents.d.ts.map +1 -0
  273. package/dist/platform/security-incidents.js +22 -0
  274. package/dist/platform/security-incidents.js.map +1 -0
  275. package/dist/platform/session-bans.d.ts +13 -0
  276. package/dist/platform/session-bans.d.ts.map +1 -0
  277. package/dist/platform/session-bans.js +21 -0
  278. package/dist/platform/session-bans.js.map +1 -0
  279. package/dist/platform/session-configuration.d.ts +15 -0
  280. package/dist/platform/session-configuration.d.ts.map +1 -0
  281. package/dist/platform/session-configuration.js +36 -0
  282. package/dist/platform/session-configuration.js.map +1 -0
  283. package/dist/platform/sessions.d.ts +26 -0
  284. package/dist/platform/sessions.d.ts.map +1 -0
  285. package/dist/platform/sessions.js +121 -0
  286. package/dist/platform/sessions.js.map +1 -0
  287. package/dist/platform/sip-trunks.d.ts +141 -0
  288. package/dist/platform/sip-trunks.d.ts.map +1 -0
  289. package/dist/platform/sip-trunks.js +140 -0
  290. package/dist/platform/sip-trunks.js.map +1 -0
  291. package/dist/platform/types.d.ts +897 -0
  292. package/dist/platform/types.d.ts.map +1 -0
  293. package/dist/platform/types.js +2 -0
  294. package/dist/platform/types.js.map +1 -0
  295. package/dist/raw.d.ts +26 -0
  296. package/dist/raw.d.ts.map +1 -0
  297. package/dist/raw.js +79 -0
  298. package/dist/raw.js.map +1 -0
  299. package/dist/system.d.ts +37 -0
  300. package/dist/system.d.ts.map +1 -0
  301. package/dist/system.js +45 -0
  302. package/dist/system.js.map +1 -0
  303. package/dist/transport/body.d.ts +6 -0
  304. package/dist/transport/body.d.ts.map +1 -0
  305. package/dist/transport/body.js +33 -0
  306. package/dist/transport/body.js.map +1 -0
  307. package/dist/transport/content-disposition.d.ts +9 -0
  308. package/dist/transport/content-disposition.d.ts.map +1 -0
  309. package/dist/transport/content-disposition.js +107 -0
  310. package/dist/transport/content-disposition.js.map +1 -0
  311. package/dist/transport/http.d.ts +35 -0
  312. package/dist/transport/http.d.ts.map +1 -0
  313. package/dist/transport/http.js +660 -0
  314. package/dist/transport/http.js.map +1 -0
  315. package/dist/transport/idempotency.d.ts +10 -0
  316. package/dist/transport/idempotency.d.ts.map +1 -0
  317. package/dist/transport/idempotency.js +13 -0
  318. package/dist/transport/idempotency.js.map +1 -0
  319. package/dist/transport/retry.d.ts +11 -0
  320. package/dist/transport/retry.d.ts.map +1 -0
  321. package/dist/transport/retry.js +45 -0
  322. package/dist/transport/retry.js.map +1 -0
  323. package/dist/transport/types.d.ts +58 -0
  324. package/dist/transport/types.d.ts.map +1 -0
  325. package/dist/transport/types.js +2 -0
  326. package/dist/transport/types.js.map +1 -0
  327. package/dist/version.d.ts +2 -0
  328. package/dist/version.d.ts.map +1 -0
  329. package/dist/version.js +2 -0
  330. package/dist/version.js.map +1 -0
  331. package/dist/webhooks/events.d.ts +741 -0
  332. package/dist/webhooks/events.d.ts.map +1 -0
  333. package/dist/webhooks/events.js +80 -0
  334. package/dist/webhooks/events.js.map +1 -0
  335. package/dist/webhooks/index.d.ts +4 -0
  336. package/dist/webhooks/index.d.ts.map +1 -0
  337. package/dist/webhooks/index.js +4 -0
  338. package/dist/webhooks/index.js.map +1 -0
  339. package/dist/webhooks/utilities.d.ts +33 -0
  340. package/dist/webhooks/utilities.d.ts.map +1 -0
  341. package/dist/webhooks/utilities.js +67 -0
  342. package/dist/webhooks/utilities.js.map +1 -0
  343. package/dist/webhooks/verify.d.ts +9 -0
  344. package/dist/webhooks/verify.d.ts.map +1 -0
  345. package/dist/webhooks/verify.js +77 -0
  346. package/dist/webhooks/verify.js.map +1 -0
  347. 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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"}