telnyx 6.41.0 → 6.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/client.d.mts +2 -2
  3. package/client.d.mts.map +1 -1
  4. package/client.d.ts +2 -2
  5. package/client.d.ts.map +1 -1
  6. package/client.js +11 -0
  7. package/client.js.map +1 -1
  8. package/client.mjs +11 -0
  9. package/client.mjs.map +1 -1
  10. package/core/EventEmitter.d.mts +11 -0
  11. package/core/EventEmitter.d.mts.map +1 -1
  12. package/core/EventEmitter.d.ts +11 -0
  13. package/core/EventEmitter.d.ts.map +1 -1
  14. package/core/EventEmitter.js +15 -1
  15. package/core/EventEmitter.js.map +1 -1
  16. package/core/EventEmitter.mjs +13 -0
  17. package/core/EventEmitter.mjs.map +1 -1
  18. package/core/pagination.d.mts.map +1 -1
  19. package/core/pagination.d.ts.map +1 -1
  20. package/internal/detect-platform.js +1 -1
  21. package/internal/detect-platform.js.map +1 -1
  22. package/internal/detect-platform.mjs +1 -1
  23. package/internal/detect-platform.mjs.map +1 -1
  24. package/internal/types.d.mts +6 -6
  25. package/internal/types.d.mts.map +1 -1
  26. package/internal/types.d.ts +6 -6
  27. package/internal/types.d.ts.map +1 -1
  28. package/internal/utils/env.js +2 -2
  29. package/internal/utils/env.js.map +1 -1
  30. package/internal/utils/env.mjs +2 -2
  31. package/internal/utils/env.mjs.map +1 -1
  32. package/internal/ws-adapter-browser.d.mts +34 -0
  33. package/internal/ws-adapter-browser.d.mts.map +1 -0
  34. package/internal/ws-adapter-browser.d.ts +34 -0
  35. package/internal/ws-adapter-browser.d.ts.map +1 -0
  36. package/internal/ws-adapter-browser.js +88 -0
  37. package/internal/ws-adapter-browser.js.map +1 -0
  38. package/internal/ws-adapter-browser.mjs +84 -0
  39. package/internal/ws-adapter-browser.mjs.map +1 -0
  40. package/internal/ws-adapter-node.d.mts +27 -0
  41. package/internal/ws-adapter-node.d.mts.map +1 -0
  42. package/internal/ws-adapter-node.d.ts +27 -0
  43. package/internal/ws-adapter-node.d.ts.map +1 -0
  44. package/internal/ws-adapter-node.js +90 -0
  45. package/internal/ws-adapter-node.js.map +1 -0
  46. package/internal/ws-adapter-node.mjs +86 -0
  47. package/internal/ws-adapter-node.mjs.map +1 -0
  48. package/internal/ws-adapter.d.mts +24 -0
  49. package/internal/ws-adapter.d.mts.map +1 -0
  50. package/internal/ws-adapter.d.ts +24 -0
  51. package/internal/ws-adapter.d.ts.map +1 -0
  52. package/internal/ws-adapter.js +11 -0
  53. package/internal/ws-adapter.js.map +1 -0
  54. package/internal/ws-adapter.mjs +8 -0
  55. package/internal/ws-adapter.mjs.map +1 -0
  56. package/internal/ws.d.mts +80 -0
  57. package/internal/ws.d.mts.map +1 -0
  58. package/internal/ws.d.ts +80 -0
  59. package/internal/ws.d.ts.map +1 -0
  60. package/internal/ws.js +153 -0
  61. package/internal/ws.js.map +1 -0
  62. package/internal/ws.mjs +147 -0
  63. package/internal/ws.mjs.map +1 -0
  64. package/lib/text-to-speech-ws-base.d.mts +106 -0
  65. package/lib/text-to-speech-ws-base.d.mts.map +1 -0
  66. package/lib/text-to-speech-ws-base.d.ts +106 -0
  67. package/lib/text-to-speech-ws-base.d.ts.map +1 -0
  68. package/lib/text-to-speech-ws-base.js +475 -0
  69. package/lib/text-to-speech-ws-base.js.map +1 -0
  70. package/lib/text-to-speech-ws-base.mjs +471 -0
  71. package/lib/text-to-speech-ws-base.mjs.map +1 -0
  72. package/lib/text-to-speech-ws-internal.d.mts +71 -0
  73. package/lib/text-to-speech-ws-internal.d.mts.map +1 -0
  74. package/lib/text-to-speech-ws-internal.d.ts +71 -0
  75. package/lib/text-to-speech-ws-internal.d.ts.map +1 -0
  76. package/lib/text-to-speech-ws-internal.js +47 -0
  77. package/lib/text-to-speech-ws-internal.js.map +1 -0
  78. package/lib/text-to-speech-ws-internal.mjs +41 -0
  79. package/lib/text-to-speech-ws-internal.mjs.map +1 -0
  80. package/lib/text-to-speech-ws.d.mts +13 -0
  81. package/lib/text-to-speech-ws.d.mts.map +1 -0
  82. package/lib/text-to-speech-ws.d.ts +13 -0
  83. package/lib/text-to-speech-ws.d.ts.map +1 -0
  84. package/lib/text-to-speech-ws.js +30 -0
  85. package/lib/text-to-speech-ws.js.map +1 -0
  86. package/lib/text-to-speech-ws.mjs +25 -0
  87. package/lib/text-to-speech-ws.mjs.map +1 -0
  88. package/lib/webhooks.d.mts +6 -0
  89. package/lib/webhooks.d.mts.map +1 -1
  90. package/lib/webhooks.d.ts +6 -0
  91. package/lib/webhooks.d.ts.map +1 -1
  92. package/lib/webhooks.js +16 -0
  93. package/lib/webhooks.js.map +1 -1
  94. package/lib/webhooks.mjs +14 -0
  95. package/lib/webhooks.mjs.map +1 -1
  96. package/package.json +1 -1
  97. package/resources/ai/assistants/assistants.d.mts +901 -51
  98. package/resources/ai/assistants/assistants.d.mts.map +1 -1
  99. package/resources/ai/assistants/assistants.d.ts +901 -51
  100. package/resources/ai/assistants/assistants.d.ts.map +1 -1
  101. package/resources/ai/assistants/assistants.js +0 -1
  102. package/resources/ai/assistants/assistants.js.map +1 -1
  103. package/resources/ai/assistants/assistants.mjs +0 -1
  104. package/resources/ai/assistants/assistants.mjs.map +1 -1
  105. package/resources/ai/assistants/versions.d.mts +563 -25
  106. package/resources/ai/assistants/versions.d.mts.map +1 -1
  107. package/resources/ai/assistants/versions.d.ts +563 -25
  108. package/resources/ai/assistants/versions.d.ts.map +1 -1
  109. package/resources/ai/conversations/conversations.d.mts +2 -2
  110. package/resources/ai/conversations/conversations.d.mts.map +1 -1
  111. package/resources/ai/conversations/conversations.d.ts +2 -2
  112. package/resources/ai/conversations/conversations.d.ts.map +1 -1
  113. package/resources/ai/conversations/conversations.js.map +1 -1
  114. package/resources/ai/conversations/conversations.mjs +1 -1
  115. package/resources/ai/conversations/conversations.mjs.map +1 -1
  116. package/resources/ai/conversations/index.d.mts +1 -1
  117. package/resources/ai/conversations/index.d.mts.map +1 -1
  118. package/resources/ai/conversations/index.d.ts +1 -1
  119. package/resources/ai/conversations/index.d.ts.map +1 -1
  120. package/resources/ai/conversations/index.js.map +1 -1
  121. package/resources/ai/conversations/index.mjs +1 -1
  122. package/resources/ai/conversations/index.mjs.map +1 -1
  123. package/resources/ai/conversations/messages.d.mts +46 -48
  124. package/resources/ai/conversations/messages.d.mts.map +1 -1
  125. package/resources/ai/conversations/messages.d.ts +46 -48
  126. package/resources/ai/conversations/messages.d.ts.map +1 -1
  127. package/resources/ai/conversations/messages.js +9 -6
  128. package/resources/ai/conversations/messages.js.map +1 -1
  129. package/resources/ai/conversations/messages.mjs +9 -6
  130. package/resources/ai/conversations/messages.mjs.map +1 -1
  131. package/resources/calls/actions.d.mts +114 -6
  132. package/resources/calls/actions.d.mts.map +1 -1
  133. package/resources/calls/actions.d.ts +114 -6
  134. package/resources/calls/actions.d.ts.map +1 -1
  135. package/resources/calls/actions.js +4 -0
  136. package/resources/calls/actions.js.map +1 -1
  137. package/resources/calls/actions.mjs +4 -0
  138. package/resources/calls/actions.mjs.map +1 -1
  139. package/resources/calls/calls.d.mts +168 -8
  140. package/resources/calls/calls.d.mts.map +1 -1
  141. package/resources/calls/calls.d.ts +168 -8
  142. package/resources/calls/calls.d.ts.map +1 -1
  143. package/resources/calls/calls.js +4 -0
  144. package/resources/calls/calls.js.map +1 -1
  145. package/resources/calls/calls.mjs +4 -0
  146. package/resources/calls/calls.mjs.map +1 -1
  147. package/resources/index.d.mts +2 -3
  148. package/resources/index.d.mts.map +1 -1
  149. package/resources/index.d.ts +2 -3
  150. package/resources/index.d.ts.map +1 -1
  151. package/resources/index.js +2 -7
  152. package/resources/index.js.map +1 -1
  153. package/resources/index.mjs +1 -2
  154. package/resources/index.mjs.map +1 -1
  155. package/resources/inexplicit-number-orders.d.mts.map +1 -1
  156. package/resources/inexplicit-number-orders.d.ts.map +1 -1
  157. package/resources/messages/messages.d.mts +4 -0
  158. package/resources/messages/messages.d.mts.map +1 -1
  159. package/resources/messages/messages.d.ts +4 -0
  160. package/resources/messages/messages.d.ts.map +1 -1
  161. package/resources/messages/messages.js.map +1 -1
  162. package/resources/messages/messages.mjs.map +1 -1
  163. package/resources/networks/networks.d.mts.map +1 -1
  164. package/resources/networks/networks.d.ts.map +1 -1
  165. package/resources/networks/networks.js.map +1 -1
  166. package/resources/networks/networks.mjs.map +1 -1
  167. package/resources/session-analysis/session-analysis.d.mts +3 -13
  168. package/resources/session-analysis/session-analysis.d.mts.map +1 -1
  169. package/resources/session-analysis/session-analysis.d.ts +3 -13
  170. package/resources/session-analysis/session-analysis.d.ts.map +1 -1
  171. package/resources/session-analysis/session-analysis.js.map +1 -1
  172. package/resources/session-analysis/session-analysis.mjs.map +1 -1
  173. package/resources/texml/accounts/calls/calls.d.mts +45 -0
  174. package/resources/texml/accounts/calls/calls.d.mts.map +1 -1
  175. package/resources/texml/accounts/calls/calls.d.ts +45 -0
  176. package/resources/texml/accounts/calls/calls.d.ts.map +1 -1
  177. package/resources/texml/accounts/calls/calls.js.map +1 -1
  178. package/resources/texml/accounts/calls/calls.mjs.map +1 -1
  179. package/resources/text-to-speech/index.d.mts +2 -1
  180. package/resources/text-to-speech/index.d.mts.map +1 -1
  181. package/resources/text-to-speech/index.d.ts +2 -1
  182. package/resources/text-to-speech/index.d.ts.map +1 -1
  183. package/resources/text-to-speech/index.js.map +1 -1
  184. package/resources/text-to-speech/index.mjs.map +1 -1
  185. package/resources/text-to-speech/internal-base.d.mts +1 -48
  186. package/resources/text-to-speech/internal-base.d.mts.map +1 -1
  187. package/resources/text-to-speech/internal-base.d.ts +1 -48
  188. package/resources/text-to-speech/internal-base.d.ts.map +1 -1
  189. package/resources/text-to-speech/internal-base.js +5 -48
  190. package/resources/text-to-speech/internal-base.js.map +1 -1
  191. package/resources/text-to-speech/internal-base.mjs +1 -44
  192. package/resources/text-to-speech/internal-base.mjs.map +1 -1
  193. package/resources/text-to-speech/text-to-speech.d.mts +28 -3
  194. package/resources/text-to-speech/text-to-speech.d.mts.map +1 -1
  195. package/resources/text-to-speech/text-to-speech.d.ts +28 -3
  196. package/resources/text-to-speech/text-to-speech.d.ts.map +1 -1
  197. package/resources/text-to-speech/text-to-speech.js +1 -1
  198. package/resources/text-to-speech/text-to-speech.mjs +1 -1
  199. package/resources/text-to-speech/ws-base.d.mts +2 -0
  200. package/resources/text-to-speech/ws-base.d.mts.map +1 -0
  201. package/resources/text-to-speech/ws-base.d.ts +2 -0
  202. package/resources/text-to-speech/ws-base.d.ts.map +1 -0
  203. package/resources/text-to-speech/ws-base.js +7 -0
  204. package/resources/text-to-speech/ws-base.js.map +1 -0
  205. package/resources/text-to-speech/ws-base.mjs +3 -0
  206. package/resources/text-to-speech/ws-base.mjs.map +1 -0
  207. package/resources/text-to-speech/ws.d.mts +2 -41
  208. package/resources/text-to-speech/ws.d.mts.map +1 -1
  209. package/resources/text-to-speech/ws.d.ts +2 -41
  210. package/resources/text-to-speech/ws.d.ts.map +1 -1
  211. package/resources/text-to-speech/ws.js +2 -182
  212. package/resources/text-to-speech/ws.js.map +1 -1
  213. package/resources/text-to-speech/ws.mjs +1 -180
  214. package/resources/text-to-speech/ws.mjs.map +1 -1
  215. package/resources/verify-profiles.d.mts +97 -121
  216. package/resources/verify-profiles.d.mts.map +1 -1
  217. package/resources/verify-profiles.d.ts +97 -121
  218. package/resources/verify-profiles.d.ts.map +1 -1
  219. package/resources/virtual-cross-connects.d.mts.map +1 -1
  220. package/resources/virtual-cross-connects.d.ts.map +1 -1
  221. package/resources/webhooks.d.mts +642 -7
  222. package/resources/webhooks.d.mts.map +1 -1
  223. package/resources/webhooks.d.ts +642 -7
  224. package/resources/webhooks.d.ts.map +1 -1
  225. package/resources/webhooks.js +4 -10
  226. package/resources/webhooks.js.map +1 -1
  227. package/resources/webhooks.mjs +5 -11
  228. package/resources/webhooks.mjs.map +1 -1
  229. package/resources/whatsapp/phone-numbers/profile/profile.d.mts +5 -0
  230. package/resources/whatsapp/phone-numbers/profile/profile.d.mts.map +1 -1
  231. package/resources/whatsapp/phone-numbers/profile/profile.d.ts +5 -0
  232. package/resources/whatsapp/phone-numbers/profile/profile.d.ts.map +1 -1
  233. package/resources/whatsapp/phone-numbers/profile/profile.js.map +1 -1
  234. package/resources/whatsapp/phone-numbers/profile/profile.mjs.map +1 -1
  235. package/resources/wireguard-interfaces.d.mts.map +1 -1
  236. package/resources/wireguard-interfaces.d.ts.map +1 -1
  237. package/src/client.ts +22 -0
  238. package/src/core/EventEmitter.ts +16 -0
  239. package/src/core/pagination.ts +3 -3
  240. package/src/internal/detect-platform.ts +1 -1
  241. package/src/internal/types.ts +6 -8
  242. package/src/internal/utils/env.ts +2 -2
  243. package/src/internal/ws-adapter-browser.ts +123 -0
  244. package/src/internal/ws-adapter-node.ts +105 -0
  245. package/src/internal/ws-adapter.ts +30 -0
  246. package/src/internal/ws.ts +193 -0
  247. package/src/lib/text-to-speech-ws-base.ts +618 -0
  248. package/src/lib/text-to-speech-ws-internal.ts +111 -0
  249. package/src/lib/text-to-speech-ws.ts +40 -0
  250. package/src/lib/webhooks.ts +27 -0
  251. package/src/resources/ai/assistants/assistants.ts +1025 -51
  252. package/src/resources/ai/assistants/versions.ts +639 -25
  253. package/src/resources/ai/conversations/conversations.ts +12 -2
  254. package/src/resources/ai/conversations/index.ts +6 -1
  255. package/src/resources/ai/conversations/messages.ts +67 -54
  256. package/src/resources/calls/actions.ts +184 -4
  257. package/src/resources/calls/calls.ts +191 -4
  258. package/src/resources/index.ts +6 -12
  259. package/src/resources/inexplicit-number-orders.ts +2 -1
  260. package/src/resources/messages/messages.ts +5 -0
  261. package/src/resources/networks/networks.ts +2 -1
  262. package/src/resources/session-analysis/session-analysis.ts +3 -16
  263. package/src/resources/texml/accounts/calls/calls.ts +54 -0
  264. package/src/resources/text-to-speech/index.ts +2 -1
  265. package/src/resources/text-to-speech/internal-base.ts +6 -95
  266. package/src/resources/text-to-speech/text-to-speech.ts +33 -3
  267. package/src/resources/text-to-speech/ws-base.ts +7 -0
  268. package/src/resources/text-to-speech/ws.ts +2 -201
  269. package/src/resources/verify-profiles.ts +109 -142
  270. package/src/resources/virtual-cross-connects.ts +2 -1
  271. package/src/resources/webhooks.ts +886 -45
  272. package/src/resources/whatsapp/phone-numbers/profile/profile.ts +7 -0
  273. package/src/resources/wireguard-interfaces.ts +2 -1
  274. package/src/version.ts +1 -1
  275. package/version.d.mts +1 -1
  276. package/version.d.ts +1 -1
  277. package/version.js +1 -1
  278. package/version.mjs +1 -1
@@ -0,0 +1,111 @@
1
+ import * as TextToSpeechAPI from '../resources/text-to-speech/text-to-speech';
2
+ import { Telnyx } from '../client';
3
+ import { EventEmitter } from '../core/EventEmitter';
4
+ import { TelnyxError } from '../core/error';
5
+
6
+ import type { RawWebSocketData, ReconnectingEvent, UnsentMessage } from '../internal/ws';
7
+
8
+ export type TextToSpeechStreamMessage =
9
+ | { type: 'connecting' | 'open' | 'closing' }
10
+ | {
11
+ type: 'close';
12
+ code: number;
13
+ reason: string;
14
+ unsent: UnsentMessage<TextToSpeechAPI.StreamClientEvent>[];
15
+ }
16
+ | { type: 'reconnecting'; reconnect: ReconnectingEvent }
17
+ | { type: 'reconnected' }
18
+ | { type: 'message'; message: TextToSpeechAPI.StreamServerEvent }
19
+ | { type: 'raw'; data: RawWebSocketData }
20
+ | { type: 'error'; error: WebSocketError };
21
+
22
+ export class WebSocketError extends TelnyxError {
23
+ /**
24
+ * The error data that the API sent back in an error event.
25
+ */
26
+ error?: TextToSpeechAPI.StreamServerEvent.ErrorFrame | undefined;
27
+
28
+ constructor(message: string, event: TextToSpeechAPI.StreamServerEvent.ErrorFrame | null) {
29
+ super(message);
30
+
31
+ this.error = event ?? undefined;
32
+ }
33
+ }
34
+
35
+ type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
36
+
37
+ type WebSocketEvents = Simplify<
38
+ {
39
+ event: (event: TextToSpeechAPI.StreamServerEvent) => void;
40
+ raw: (data: RawWebSocketData) => void;
41
+ error: (error: WebSocketError) => void;
42
+ close: (code: number, reason: string, unsent: UnsentMessage<TextToSpeechAPI.StreamClientEvent>[]) => void;
43
+ reconnecting: (event: ReconnectingEvent) => void;
44
+ reconnected: () => void;
45
+ } & {
46
+ [EventType in Exclude<NonNullable<TextToSpeechAPI.StreamServerEvent['type']>, 'error'>]: (
47
+ event: Extract<TextToSpeechAPI.StreamServerEvent, { type?: EventType }>,
48
+ ) => unknown;
49
+ }
50
+ >;
51
+
52
+ export abstract class TextToSpeechEmitter extends EventEmitter<WebSocketEvents> {
53
+ /**
54
+ * Send an event to the API.
55
+ */
56
+ abstract send(event: TextToSpeechAPI.StreamClientEvent): void;
57
+
58
+ /**
59
+ * Send raw data over the WebSocket without JSON serialization.
60
+ */
61
+ abstract sendRaw(data: RawWebSocketData): void;
62
+
63
+ /**
64
+ * Close the WebSocket connection.
65
+ */
66
+ abstract close(props?: { code: number; reason: string }): void;
67
+
68
+ protected _onError(event: null, message: string, cause: any): void;
69
+ protected _onError(event: TextToSpeechAPI.StreamServerEvent.ErrorFrame, message?: string | undefined): void;
70
+ protected _onError(
71
+ event: TextToSpeechAPI.StreamServerEvent.ErrorFrame | null,
72
+ message?: string | undefined,
73
+ cause?: any,
74
+ ): void {
75
+ message = message ?? safeJSONStringify(event) ?? 'unknown error';
76
+
77
+ if (!this._hasListener('error')) {
78
+ const error = new WebSocketError(
79
+ message +
80
+ `\n\nTo resolve these unhandled rejection errors you should bind an \`error\` callback, e.g. \`ws.on('error', (error) => ...)\` `,
81
+ event,
82
+ );
83
+ // @ts-ignore
84
+ error.cause = cause;
85
+ Promise.reject(error);
86
+ return;
87
+ }
88
+
89
+ const error = new WebSocketError(message, event);
90
+ // @ts-ignore
91
+ error.cause = cause;
92
+
93
+ this._emit('error', error);
94
+ }
95
+ }
96
+
97
+ export function buildURL(client: Telnyx, parameters: Record<string, unknown>): URL {
98
+ const { ...query } = parameters;
99
+ const endpoint = '/text-to-speech/speech';
100
+ const url = new URL(client.buildURL(endpoint, query, undefined));
101
+ url.protocol = url.protocol === 'http:' || url.protocol === 'ws:' ? 'ws:' : 'wss:';
102
+ return url;
103
+ }
104
+
105
+ function safeJSONStringify(value: unknown): string | null {
106
+ try {
107
+ return JSON.stringify(value);
108
+ } catch {
109
+ return null;
110
+ }
111
+ }
@@ -0,0 +1,40 @@
1
+ import * as WS from 'ws';
2
+ import { NodeWebSocket } from '../internal/ws-adapter-node';
3
+ import { TextToSpeechWSBase, type TextToSpeechWSBaseOptions } from './text-to-speech-ws-base';
4
+ import { Telnyx } from '../client';
5
+
6
+ export type { TextToSpeechWSReconnectOptions } from './text-to-speech-ws-base';
7
+
8
+ export interface TextToSpeechWSClientOptions extends WS.ClientOptions, TextToSpeechWSBaseOptions {}
9
+
10
+ export class TextToSpeechWS extends TextToSpeechWSBase<NodeWebSocket> {
11
+ private _wsOptions: WS.ClientOptions | null | undefined;
12
+
13
+ constructor(
14
+ client: Telnyx,
15
+ parameters?: Record<string, unknown> | undefined,
16
+ options?: TextToSpeechWSClientOptions | null | undefined,
17
+ ) {
18
+ if (!WS?.WebSocket) {
19
+ throw new Error(
20
+ 'TextToSpeechWS from "telnyx/resources/text-to-speech/ws" requires the "ws" package but it could not be loaded.',
21
+ );
22
+ }
23
+
24
+ const { reconnect, maxQueueSize, ...wsOptions } = options ?? {};
25
+ super(client, parameters, { reconnect, maxQueueSize });
26
+ this._wsOptions = wsOptions;
27
+ this._connectInitial();
28
+ }
29
+
30
+ protected _createSocket(url: URL, authHeaders: Record<string, string>): NodeWebSocket {
31
+ const ws = new WS.WebSocket(url, {
32
+ ...this._wsOptions,
33
+ headers: {
34
+ ...authHeaders,
35
+ ...this._wsOptions?.headers,
36
+ },
37
+ });
38
+ return new NodeWebSocket(ws);
39
+ }
40
+ }
@@ -30,6 +30,33 @@ export class TelnyxWebhookVerificationError extends TelnyxError {
30
30
  }
31
31
  }
32
32
 
33
+ export interface WebhookUnwrapOptions {
34
+ headers?: Record<string, string>;
35
+ key?: string | Uint8Array;
36
+ }
37
+
38
+ export function unsafeUnwrapWebhook<T>(body: string): T {
39
+ return JSON.parse(body) as T;
40
+ }
41
+
42
+ export async function unwrapWebhook<T>(
43
+ body: string,
44
+ options: WebhookUnwrapOptions | undefined,
45
+ clientPublicKey: string | null,
46
+ ): Promise<T> {
47
+ if (options?.headers) {
48
+ const key = options.key || clientPublicKey;
49
+ if (!key) {
50
+ throw new TelnyxWebhookVerificationError('No public key provided for webhook verification');
51
+ }
52
+
53
+ const webhook = new TelnyxWebhook(key);
54
+ await webhook.verify(body, options.headers);
55
+ }
56
+
57
+ return unsafeUnwrapWebhook<T>(body);
58
+ }
59
+
33
60
  // Type for the SubtleCrypto interface we need
34
61
  // Using unknown for key type to avoid CryptoKey dependency
35
62
  interface SubtleCryptoLike {