@q9labsai/chalk-client 4.0.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 (253) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +173 -0
  3. package/dist/access/base64-url.d.ts +2 -0
  4. package/dist/access/base64-url.d.ts.map +1 -0
  5. package/dist/access/episode-diagnostic-credential.d.ts +11 -0
  6. package/dist/access/episode-diagnostic-credential.d.ts.map +1 -0
  7. package/dist/access/grant.d.ts +53 -0
  8. package/dist/access/grant.d.ts.map +1 -0
  9. package/dist/access/grant.test.helpers.d.ts +10 -0
  10. package/dist/access/grant.test.helpers.d.ts.map +1 -0
  11. package/dist/access/manager.d.ts +36 -0
  12. package/dist/access/manager.d.ts.map +1 -0
  13. package/dist/chat-files/http-transport.d.ts +8 -0
  14. package/dist/chat-files/http-transport.d.ts.map +1 -0
  15. package/dist/chat-files/index.d.ts +3 -0
  16. package/dist/chat-files/index.d.ts.map +1 -0
  17. package/dist/chat-files/types.d.ts +37 -0
  18. package/dist/chat-files/types.d.ts.map +1 -0
  19. package/dist/chunk-5VXGLI3T.js +3385 -0
  20. package/dist/chunk-O22WFBKF.js +5161 -0
  21. package/dist/chunk-PBCGWE2V.js +811 -0
  22. package/dist/chunk-PBSYXPNJ.js +23 -0
  23. package/dist/chunk-QVHR3RMB.js +1229 -0
  24. package/dist/client.d.ts +6785 -0
  25. package/dist/client.d.ts.map +1 -0
  26. package/dist/collaboration/index.d.ts +3 -0
  27. package/dist/collaboration/index.d.ts.map +1 -0
  28. package/dist/collaboration/types.d.ts +94 -0
  29. package/dist/collaboration/types.d.ts.map +1 -0
  30. package/dist/collaboration/wire.d.ts +19 -0
  31. package/dist/collaboration/wire.d.ts.map +1 -0
  32. package/dist/connection/dependencies.d.ts +112 -0
  33. package/dist/connection/dependencies.d.ts.map +1 -0
  34. package/dist/connection/diagnostics.d.ts +52 -0
  35. package/dist/connection/diagnostics.d.ts.map +1 -0
  36. package/dist/connection/index.d.ts +47 -0
  37. package/dist/connection/index.d.ts.map +1 -0
  38. package/dist/connection/lifecycle.d.ts +58 -0
  39. package/dist/connection/lifecycle.d.ts.map +1 -0
  40. package/dist/connection/media-devices.d.ts +6 -0
  41. package/dist/connection/media-devices.d.ts.map +1 -0
  42. package/dist/connection/production.d.ts +13 -0
  43. package/dist/connection/production.d.ts.map +1 -0
  44. package/dist/connection/snapshot.d.ts +23 -0
  45. package/dist/connection/snapshot.d.ts.map +1 -0
  46. package/dist/connection/types.d.ts +128 -0
  47. package/dist/connection/types.d.ts.map +1 -0
  48. package/dist/effect.d.ts +19 -0
  49. package/dist/effect.d.ts.map +1 -0
  50. package/dist/effect.js +7846 -0
  51. package/dist/episode-diagnostic-runtime.test.helpers.d.ts +3 -0
  52. package/dist/episode-diagnostic-runtime.test.helpers.d.ts.map +1 -0
  53. package/dist/generated/http-api.d.ts +6658 -0
  54. package/dist/generated/http-api.d.ts.map +1 -0
  55. package/dist/generated/schemas.d.ts +12076 -0
  56. package/dist/generated/schemas.d.ts.map +1 -0
  57. package/dist/generated/sync.d.ts +3947 -0
  58. package/dist/generated/sync.d.ts.map +1 -0
  59. package/dist/generated/whiteboard-v1.d.ts +334 -0
  60. package/dist/generated/whiteboard-v1.d.ts.map +1 -0
  61. package/dist/index.d.ts +10 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +152 -0
  64. package/dist/media/client.d.ts +18 -0
  65. package/dist/media/client.d.ts.map +1 -0
  66. package/dist/media/cloudflare-sfu.d.ts +5 -0
  67. package/dist/media/cloudflare-sfu.d.ts.map +1 -0
  68. package/dist/media/index.d.ts +3 -0
  69. package/dist/media/index.d.ts.map +1 -0
  70. package/dist/media/index.js +24 -0
  71. package/dist/media/plane.d.ts +24 -0
  72. package/dist/media/plane.d.ts.map +1 -0
  73. package/dist/media/tracks.d.ts +21 -0
  74. package/dist/media/tracks.d.ts.map +1 -0
  75. package/dist/media/transport.d.ts +3 -0
  76. package/dist/media/transport.d.ts.map +1 -0
  77. package/dist/media/types.d.ts +114 -0
  78. package/dist/media/types.d.ts.map +1 -0
  79. package/dist/server/chunk-A6YMG5FM.js +61 -0
  80. package/dist/server/client.d.cts +2 -0
  81. package/dist/server/client.d.ts +3 -0
  82. package/dist/server/client.d.ts.map +1 -0
  83. package/dist/server/errors.d.cts +18 -0
  84. package/dist/server/errors.d.ts +19 -0
  85. package/dist/server/errors.d.ts.map +1 -0
  86. package/dist/server/index.cjs +551 -0
  87. package/dist/server/index.d.cts +3 -0
  88. package/dist/server/index.d.ts +4 -0
  89. package/dist/server/index.d.ts.map +1 -0
  90. package/dist/server/index.js +474 -0
  91. package/dist/server/server-only.cjs +40 -0
  92. package/dist/server/server-only.d.cts +1 -0
  93. package/dist/server/server-only.d.ts +2 -0
  94. package/dist/server/server-only.d.ts.map +1 -0
  95. package/dist/server/server-only.js +9 -0
  96. package/dist/server/transport.d.cts +12 -0
  97. package/dist/server/transport.d.ts +13 -0
  98. package/dist/server/transport.d.ts.map +1 -0
  99. package/dist/server/types.d.cts +201 -0
  100. package/dist/server/types.d.ts +202 -0
  101. package/dist/server/types.d.ts.map +1 -0
  102. package/dist/space-client/chat-controller-helpers.d.ts +15 -0
  103. package/dist/space-client/chat-controller-helpers.d.ts.map +1 -0
  104. package/dist/space-client/chat-controller.d.ts +34 -0
  105. package/dist/space-client/chat-controller.d.ts.map +1 -0
  106. package/dist/space-client/controller-effects.d.ts +45 -0
  107. package/dist/space-client/controller-effects.d.ts.map +1 -0
  108. package/dist/space-client/controller-parity.test.helpers.d.ts +150 -0
  109. package/dist/space-client/controller-parity.test.helpers.d.ts.map +1 -0
  110. package/dist/space-client/core.d.ts +52 -0
  111. package/dist/space-client/core.d.ts.map +1 -0
  112. package/dist/space-client/core.test.helpers.d.ts +14 -0
  113. package/dist/space-client/core.test.helpers.d.ts.map +1 -0
  114. package/dist/space-client/effect.d.ts +44 -0
  115. package/dist/space-client/effect.d.ts.map +1 -0
  116. package/dist/space-client/episode-diagnostic-registry.d.ts +13 -0
  117. package/dist/space-client/episode-diagnostic-registry.d.ts.map +1 -0
  118. package/dist/space-client/episode-diagnostic-render-registry.d.ts +4 -0
  119. package/dist/space-client/episode-diagnostic-render-registry.d.ts.map +1 -0
  120. package/dist/space-client/episode-diagnostic-runtime.d.ts +102 -0
  121. package/dist/space-client/episode-diagnostic-runtime.d.ts.map +1 -0
  122. package/dist/space-client/errors.d.ts +11 -0
  123. package/dist/space-client/errors.d.ts.map +1 -0
  124. package/dist/space-client/index.d.ts +5 -0
  125. package/dist/space-client/index.d.ts.map +1 -0
  126. package/dist/space-client/media-controller.d.ts +30 -0
  127. package/dist/space-client/media-controller.d.ts.map +1 -0
  128. package/dist/space-client/media-controller.test.helpers.d.ts +105 -0
  129. package/dist/space-client/media-controller.test.helpers.d.ts.map +1 -0
  130. package/dist/space-client/media-device-selection.d.ts +13 -0
  131. package/dist/space-client/media-device-selection.d.ts.map +1 -0
  132. package/dist/space-client/participants-controller.d.ts +33 -0
  133. package/dist/space-client/participants-controller.d.ts.map +1 -0
  134. package/dist/space-client/promise-facade.d.ts +12 -0
  135. package/dist/space-client/promise-facade.d.ts.map +1 -0
  136. package/dist/space-client/reactions-controller.d.ts +19 -0
  137. package/dist/space-client/reactions-controller.d.ts.map +1 -0
  138. package/dist/space-client/space-client.d.ts +5 -0
  139. package/dist/space-client/space-client.d.ts.map +1 -0
  140. package/dist/space-client/store.d.ts +29 -0
  141. package/dist/space-client/store.d.ts.map +1 -0
  142. package/dist/space-client/types.d.ts +222 -0
  143. package/dist/space-client/types.d.ts.map +1 -0
  144. package/dist/space-client/whiteboard-controller.d.ts +17 -0
  145. package/dist/space-client/whiteboard-controller.d.ts.map +1 -0
  146. package/dist/sync/browser.d.ts +9 -0
  147. package/dist/sync/browser.d.ts.map +1 -0
  148. package/dist/sync/canonical.d.ts +7 -0
  149. package/dist/sync/canonical.d.ts.map +1 -0
  150. package/dist/sync/errors.d.ts +9 -0
  151. package/dist/sync/errors.d.ts.map +1 -0
  152. package/dist/sync/index.d.ts +13 -0
  153. package/dist/sync/index.d.ts.map +1 -0
  154. package/dist/sync/index.js +51 -0
  155. package/dist/sync/react-native.d.ts +42 -0
  156. package/dist/sync/react-native.d.ts.map +1 -0
  157. package/dist/sync/types.d.ts +28 -0
  158. package/dist/sync/types.d.ts.map +1 -0
  159. package/dist/sync/v1-client.d.ts +59 -0
  160. package/dist/sync/v1-client.d.ts.map +1 -0
  161. package/dist/sync/v1-codec.d.ts +5 -0
  162. package/dist/sync/v1-codec.d.ts.map +1 -0
  163. package/dist/sync/v1-create.d.ts +12 -0
  164. package/dist/sync/v1-create.d.ts.map +1 -0
  165. package/dist/sync/v1-persistence.d.ts +10 -0
  166. package/dist/sync/v1-persistence.d.ts.map +1 -0
  167. package/dist/sync/v1-platform-persistence.d.ts +26 -0
  168. package/dist/sync/v1-platform-persistence.d.ts.map +1 -0
  169. package/dist/sync/v1-reducer.d.ts +17 -0
  170. package/dist/sync/v1-reducer.d.ts.map +1 -0
  171. package/dist/sync/v1-types.d.ts +197 -0
  172. package/dist/sync/v1-types.d.ts.map +1 -0
  173. package/dist/telemetry/attributes.d.ts +7 -0
  174. package/dist/telemetry/attributes.d.ts.map +1 -0
  175. package/dist/telemetry/client.d.ts +44 -0
  176. package/dist/telemetry/client.d.ts.map +1 -0
  177. package/dist/telemetry/delivery.d.ts +107 -0
  178. package/dist/telemetry/delivery.d.ts.map +1 -0
  179. package/dist/telemetry/exporter.d.ts +38 -0
  180. package/dist/telemetry/exporter.d.ts.map +1 -0
  181. package/dist/telemetry/index.d.ts +7 -0
  182. package/dist/telemetry/index.d.ts.map +1 -0
  183. package/dist/telemetry/index.js +48 -0
  184. package/dist/telemetry/journey.d.ts +52 -0
  185. package/dist/telemetry/journey.d.ts.map +1 -0
  186. package/dist/telemetry/random.d.ts +18 -0
  187. package/dist/telemetry/random.d.ts.map +1 -0
  188. package/dist/telemetry/rtc.d.ts +35 -0
  189. package/dist/telemetry/rtc.d.ts.map +1 -0
  190. package/dist/telemetry/storage.d.ts +22 -0
  191. package/dist/telemetry/storage.d.ts.map +1 -0
  192. package/dist/telemetry/sync.d.ts +10 -0
  193. package/dist/telemetry/sync.d.ts.map +1 -0
  194. package/dist/telemetry/test-support.d.ts +51 -0
  195. package/dist/telemetry/test-support.d.ts.map +1 -0
  196. package/dist/telemetry/trace.d.ts +18 -0
  197. package/dist/telemetry/trace.d.ts.map +1 -0
  198. package/dist/telemetry/types.d.ts +109 -0
  199. package/dist/telemetry/types.d.ts.map +1 -0
  200. package/dist/webhooks/chunk-UNMJZNTZ.js +31 -0
  201. package/dist/webhooks/errors.d.cts +8 -0
  202. package/dist/webhooks/errors.d.ts +9 -0
  203. package/dist/webhooks/errors.d.ts.map +1 -0
  204. package/dist/webhooks/generated/event-v1.d.cts +764 -0
  205. package/dist/webhooks/generated/event-v1.d.ts +765 -0
  206. package/dist/webhooks/generated/event-v1.d.ts.map +1 -0
  207. package/dist/webhooks/generated/fixtures-v1.d.cts +46 -0
  208. package/dist/webhooks/generated/fixtures-v1.d.ts +47 -0
  209. package/dist/webhooks/generated/fixtures-v1.d.ts.map +1 -0
  210. package/dist/webhooks/index.cjs +1242 -0
  211. package/dist/webhooks/index.d.cts +5 -0
  212. package/dist/webhooks/index.d.ts +6 -0
  213. package/dist/webhooks/index.d.ts.map +1 -0
  214. package/dist/webhooks/index.js +1197 -0
  215. package/dist/webhooks/processor.d.cts +21 -0
  216. package/dist/webhooks/processor.d.ts +22 -0
  217. package/dist/webhooks/processor.d.ts.map +1 -0
  218. package/dist/webhooks/server-only.cjs +36 -0
  219. package/dist/webhooks/server-only.d.cts +1 -0
  220. package/dist/webhooks/server-only.d.ts +2 -0
  221. package/dist/webhooks/server-only.d.ts.map +1 -0
  222. package/dist/webhooks/server-only.js +9 -0
  223. package/dist/webhooks/test.cjs +160 -0
  224. package/dist/webhooks/test.d.cts +42 -0
  225. package/dist/webhooks/test.d.ts +43 -0
  226. package/dist/webhooks/test.d.ts.map +1 -0
  227. package/dist/webhooks/test.js +137 -0
  228. package/dist/webhooks/types.d.cts +55 -0
  229. package/dist/webhooks/types.d.ts +56 -0
  230. package/dist/webhooks/types.d.ts.map +1 -0
  231. package/dist/webhooks/validate.d.cts +5 -0
  232. package/dist/webhooks/validate.d.ts +6 -0
  233. package/dist/webhooks/validate.d.ts.map +1 -0
  234. package/dist/webhooks/verify.d.cts +10 -0
  235. package/dist/webhooks/verify.d.ts +11 -0
  236. package/dist/webhooks/verify.d.ts.map +1 -0
  237. package/dist/whiteboard/file-http-transport.d.ts +9 -0
  238. package/dist/whiteboard/file-http-transport.d.ts.map +1 -0
  239. package/dist/whiteboard/index.d.ts +7 -0
  240. package/dist/whiteboard/index.d.ts.map +1 -0
  241. package/dist/whiteboard/types.d.ts +139 -0
  242. package/dist/whiteboard/types.d.ts.map +1 -0
  243. package/dist/whiteboard/v1-client.d.ts +18 -0
  244. package/dist/whiteboard/v1-client.d.ts.map +1 -0
  245. package/dist/whiteboard/v1-codec.d.ts +5 -0
  246. package/dist/whiteboard/v1-codec.d.ts.map +1 -0
  247. package/dist/whiteboard/v1-create.d.ts +8 -0
  248. package/dist/whiteboard/v1-create.d.ts.map +1 -0
  249. package/dist/whiteboard/v1-multipart.d.ts +30 -0
  250. package/dist/whiteboard/v1-multipart.d.ts.map +1 -0
  251. package/dist/whiteboard/v1-persistence.d.ts +9 -0
  252. package/dist/whiteboard/v1-persistence.d.ts.map +1 -0
  253. package/package.json +222 -0
@@ -0,0 +1,21 @@
1
+ import type { UnknownWebhookEvent, WebhookDiagnosticEvent, WebhookHandlerMap, WebhookInbox, WebhookProcessResult } from "./types.cjs";
2
+ export type WebhookProcessorInput = {
3
+ rawBody: Uint8Array;
4
+ headers: Headers | Record<string, string | string[] | undefined>;
5
+ };
6
+ export type WebhookProcessor = {
7
+ process(input: WebhookProcessorInput): Promise<WebhookProcessResult>;
8
+ };
9
+ export type CreateWebhookProcessorOptions = {
10
+ secrets: readonly string[] | (() => Promise<readonly string[]>);
11
+ inbox: WebhookInbox;
12
+ handlers: Partial<WebhookHandlerMap>;
13
+ /** Observes authenticated Event names unknown to this SDK. Its result is not awaited and failures are ignored. */
14
+ onUnknownEvent?: (event: UnknownWebhookEvent) => Promise<void> | void;
15
+ /** Observes bounded processing metadata. Its result is not awaited and failures are ignored. */
16
+ onDiagnostic?: (event: WebhookDiagnosticEvent) => Promise<void> | void;
17
+ toleranceSeconds?: number;
18
+ leaseMilliseconds?: number;
19
+ };
20
+ export declare const createWebhookProcessor: (options: CreateWebhookProcessorOptions) => WebhookProcessor;
21
+ export declare const toWebhookResponse: (processResult: WebhookProcessResult) => Response;
@@ -0,0 +1,22 @@
1
+ import type { UnknownWebhookEvent, WebhookDiagnosticEvent, WebhookHandlerMap, WebhookInbox, WebhookProcessResult } from "./types.js";
2
+ export type WebhookProcessorInput = {
3
+ rawBody: Uint8Array;
4
+ headers: Headers | Record<string, string | string[] | undefined>;
5
+ };
6
+ export type WebhookProcessor = {
7
+ process(input: WebhookProcessorInput): Promise<WebhookProcessResult>;
8
+ };
9
+ export type CreateWebhookProcessorOptions = {
10
+ secrets: readonly string[] | (() => Promise<readonly string[]>);
11
+ inbox: WebhookInbox;
12
+ handlers: Partial<WebhookHandlerMap>;
13
+ /** Observes authenticated Event names unknown to this SDK. Its result is not awaited and failures are ignored. */
14
+ onUnknownEvent?: (event: UnknownWebhookEvent) => Promise<void> | void;
15
+ /** Observes bounded processing metadata. Its result is not awaited and failures are ignored. */
16
+ onDiagnostic?: (event: WebhookDiagnosticEvent) => Promise<void> | void;
17
+ toleranceSeconds?: number;
18
+ leaseMilliseconds?: number;
19
+ };
20
+ export declare const createWebhookProcessor: (options: CreateWebhookProcessorOptions) => WebhookProcessor;
21
+ export declare const toWebhookResponse: (processResult: WebhookProcessResult) => Response;
22
+ //# sourceMappingURL=processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../../src/webhooks/processor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMrI,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAClE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;CAAE,CAAC;AAExG,MAAM,MAAM,6BAA6B,GAAG;IAC1C,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;IAChE,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrC,kHAAkH;IAClH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtE,gGAAgG;IAChG,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAqKF,eAAO,MAAM,sBAAsB,YAAa,6BAA6B,KAAG,gBAQ/E,CAAC;AAIF,eAAO,MAAM,iBAAiB,kBAAmB,oBAAoB,KAAG,QAIvE,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/webhooks/server-only.ts
21
+ var server_only_exports = {};
22
+ __export(server_only_exports, {
23
+ WebhookServerOnlyError: () => WebhookServerOnlyError
24
+ });
25
+ module.exports = __toCommonJS(server_only_exports);
26
+
27
+ // src/webhooks/errors.ts
28
+ var WebhookServerOnlyError = class extends Error {
29
+ constructor() {
30
+ super("Chalk webhook receivers are available only in server and edge runtimes.");
31
+ this.name = "WebhookServerOnlyError";
32
+ }
33
+ };
34
+
35
+ // src/webhooks/server-only.ts
36
+ throw new WebhookServerOnlyError();
@@ -0,0 +1 @@
1
+ export { WebhookServerOnlyError } from "./errors.cjs";
@@ -0,0 +1,2 @@
1
+ export { WebhookServerOnlyError } from "./errors.js";
2
+ //# sourceMappingURL=server-only.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-only.d.ts","sourceRoot":"","sources":["../../src/webhooks/server-only.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import {
2
+ WebhookServerOnlyError
3
+ } from "./chunk-UNMJZNTZ.js";
4
+
5
+ // src/webhooks/server-only.ts
6
+ throw new WebhookServerOnlyError();
7
+ export {
8
+ WebhookServerOnlyError
9
+ };
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/webhooks/test.ts
21
+ var test_exports = {};
22
+ __export(test_exports, {
23
+ TestOnlyInMemoryWebhookInbox: () => TestOnlyInMemoryWebhookInbox,
24
+ getTestOnlyWebhookFixture: () => getTestOnlyWebhookFixture,
25
+ signTestOnlyWebhook: () => signTestOnlyWebhook
26
+ });
27
+ module.exports = __toCommonJS(test_exports);
28
+
29
+ // src/webhooks/generated/fixtures-v1.ts
30
+ var webhookFixturesV1 = [
31
+ {
32
+ event: "space.created",
33
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000001","event":"space.created","api_version":1,"occurred_at":"2026-07-12T18:00:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Weekly design review","slug":"weekly-design-review","media_plane":"cf_rtk","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:00:00.000Z"}}}'
34
+ },
35
+ {
36
+ event: "space.updated",
37
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000002","event":"space.updated","api_version":1,"occurred_at":"2026-07-12T18:01:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Design review \u2013 \u6771\u4EAC","slug":"weekly-design-review","media_plane":"cf_rtk","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:01:00.000Z"},"changed_fields":["metadata","name"]}}'
38
+ },
39
+ {
40
+ event: "space.archived",
41
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000003","event":"space.archived","api_version":1,"occurred_at":"2026-07-12T18:02:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Design review \u2013 \u6771\u4EAC","slug":"weekly-design-review","media_plane":"cf_rtk","archived_at":"2026-07-12T18:02:00.000Z","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:02:00.000Z"}}}'
42
+ },
43
+ {
44
+ event: "space.restored",
45
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000004","event":"space.restored","api_version":1,"occurred_at":"2026-07-12T18:03:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Design review \u2013 \u6771\u4EAC","slug":"weekly-design-review","media_plane":"cf_rtk","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:03:00.000Z"}}}'
46
+ },
47
+ {
48
+ event: "episode.started",
49
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000005","event":"episode.started","api_version":1,"occurred_at":"2026-07-12T18:04:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"30000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","status":"active","started_at":"2026-07-12T18:04:00.000Z","ended_at":null,"created_at":"2026-07-12T18:04:00.000Z","updated_at":"2026-07-12T18:04:00.000Z"}}}'
50
+ },
51
+ {
52
+ event: "episode.ended",
53
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000006","event":"episode.ended","api_version":1,"occurred_at":"2026-07-12T19:04:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"30000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","status":"ended","started_at":"2026-07-12T18:04:00.000Z","ended_at":"2026-07-12T19:04:00.000Z","created_at":"2026-07-12T18:04:00.000Z","updated_at":"2026-07-12T19:04:00.000Z"}}}'
54
+ },
55
+ {
56
+ event: "participant.joined",
57
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000007","event":"participant.joined","api_version":1,"occurred_at":"2026-07-12T18:05:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"40000000-0000-4000-8000-000000000001","identity_id":"50000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","name":"Ada \u2013 <&> \\"\u6771\u4EAC\\" \\\\","status":"active","joined_at":"2026-07-12T18:05:00.000Z","left_at":null}}}'
58
+ },
59
+ {
60
+ event: "participant.left",
61
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000008","event":"participant.left","api_version":1,"occurred_at":"2026-07-12T19:00:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"40000000-0000-4000-8000-000000000001","identity_id":"50000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","name":"Ada \u2013 \u6771\u4EAC","status":"left","joined_at":"2026-07-12T18:05:00.000Z","left_at":"2026-07-12T19:00:00.000Z"}}}'
62
+ },
63
+ {
64
+ event: "recording.started",
65
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000009","event":"recording.started","api_version":1,"occurred_at":"2026-07-12T18:06:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"started","started_at":"2026-07-12T18:06:00.000Z","completed_at":null,"failed_at":null,"failure":null,"created_at":"2026-07-12T18:06:00.000Z","updated_at":"2026-07-12T18:06:00.000Z"}}}'
66
+ },
67
+ {
68
+ event: "recording.completed",
69
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000010","event":"recording.completed","api_version":1,"occurred_at":"2026-07-12T19:06:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"completed","started_at":"2026-07-12T18:06:00.000Z","completed_at":"2026-07-12T19:06:00.000Z","failed_at":null,"failure":null,"created_at":"2026-07-12T18:06:00.000Z","updated_at":"2026-07-12T19:06:00.000Z"}}}'
70
+ },
71
+ {
72
+ event: "recording.failed",
73
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000011","event":"recording.failed","api_version":1,"occurred_at":"2026-07-12T19:06:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"failed","started_at":"2026-07-12T18:06:00.000Z","completed_at":null,"failed_at":"2026-07-12T19:06:00.000Z","failure":{"code":"recording_processing_failed"},"created_at":"2026-07-12T18:06:00.000Z","updated_at":"2026-07-12T19:06:00.000Z"}}}'
74
+ },
75
+ {
76
+ event: "transcript.started",
77
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000012","event":"transcript.started","api_version":1,"occurred_at":"2026-07-12T19:07:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"70000000-0000-4000-8000-000000000001","recording_id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"started","languages":[],"started_at":"2026-07-12T19:07:00.000Z","completed_at":null,"failed_at":null,"failure":null,"created_at":"2026-07-12T19:07:00.000Z","updated_at":"2026-07-12T19:07:00.000Z"}}}'
78
+ },
79
+ {
80
+ event: "transcript.completed",
81
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000013","event":"transcript.completed","api_version":1,"occurred_at":"2026-07-12T19:12:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"70000000-0000-4000-8000-000000000001","recording_id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"completed","languages":["en"],"started_at":"2026-07-12T19:07:00.000Z","completed_at":"2026-07-12T19:12:00.000Z","failed_at":null,"failure":null,"created_at":"2026-07-12T19:07:00.000Z","updated_at":"2026-07-12T19:12:00.000Z"}}}'
82
+ },
83
+ {
84
+ event: "transcript.failed",
85
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000014","event":"transcript.failed","api_version":1,"occurred_at":"2026-07-12T19:12:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"70000000-0000-4000-8000-000000000001","recording_id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"failed","languages":[],"started_at":"2026-07-12T19:07:00.000Z","completed_at":null,"failed_at":"2026-07-12T19:12:00.000Z","failure":{"code":"transcription_failed"},"created_at":"2026-07-12T19:07:00.000Z","updated_at":"2026-07-12T19:12:00.000Z"}}}'
86
+ },
87
+ {
88
+ event: "endpoint.test",
89
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000015","event":"endpoint.test","api_version":1,"occurred_at":"2026-07-12T19:13:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"endpoint_id":"80000000-0000-4000-8000-000000000001"}}}'
90
+ }
91
+ ];
92
+
93
+ // src/webhooks/test.ts
94
+ var encoder = new TextEncoder();
95
+ var decodeSecret = (secret) => {
96
+ if (!secret.startsWith("whsec_")) throw new Error("Test signer received an invalid secret.");
97
+ const binary = atob(secret.slice(6));
98
+ return Uint8Array.from(binary, (character) => character.charCodeAt(0));
99
+ };
100
+ var encodeBase64 = (value) => {
101
+ let binary = "";
102
+ for (const byte of value) binary += String.fromCharCode(byte);
103
+ return btoa(binary);
104
+ };
105
+ var getTestOnlyWebhookFixture = (eventName) => {
106
+ const fixture = webhookFixturesV1.find((entry) => entry.event === eventName);
107
+ if (!fixture) throw new Error("The requested webhook fixture does not exist.");
108
+ return Object.freeze({ event: fixture.event, rawBody: encoder.encode(fixture.body_utf8) });
109
+ };
110
+ var signTestOnlyWebhook = async (input) => {
111
+ const prefix = encoder.encode(`${input.webhookId}.${input.timestamp}.`);
112
+ const payload = new Uint8Array(prefix.length + input.rawBody.length);
113
+ payload.set(prefix);
114
+ payload.set(input.rawBody, prefix.length);
115
+ const signatures = [];
116
+ for (const secret of input.secrets) {
117
+ const key = await crypto.subtle.importKey("raw", new Uint8Array(decodeSecret(secret)), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
118
+ signatures.push(`v1,${encodeBase64(new Uint8Array(await crypto.subtle.sign("HMAC", key, new Uint8Array(payload))))}`);
119
+ }
120
+ return new Headers({
121
+ "webhook-id": input.webhookId,
122
+ "webhook-timestamp": String(input.timestamp),
123
+ "webhook-signature": signatures.join(" ")
124
+ });
125
+ };
126
+ var isRetainedCompletion = (entry, now, retentionMilliseconds) => entry?.state === "completed" && entry.completedAt + retentionMilliseconds > now;
127
+ var isActiveLease = (entry, now) => entry?.state === "leased" && entry.expiresAt > now;
128
+ var TestOnlyInMemoryWebhookInbox = class {
129
+ #entries = /* @__PURE__ */ new Map();
130
+ #now;
131
+ #retentionMilliseconds;
132
+ #nextToken = 1;
133
+ constructor(options = {}) {
134
+ this.#now = options.now ?? Date.now;
135
+ this.#retentionMilliseconds = options.retentionMilliseconds ?? 30 * 24 * 60 * 60 * 1e3;
136
+ }
137
+ async acquire(input) {
138
+ const now = this.#now();
139
+ const current = this.#entries.get(input.eventId);
140
+ if (isRetainedCompletion(current, now, this.#retentionMilliseconds)) {
141
+ return { state: "completed" };
142
+ }
143
+ if (isActiveLease(current, now)) {
144
+ return { state: "busy", retryAfterSeconds: Math.max(1, Math.ceil((current.expiresAt - now) / 1e3)) };
145
+ }
146
+ const token = `test-lease-${this.#nextToken}`;
147
+ this.#nextToken += 1;
148
+ this.#entries.set(input.eventId, { state: "leased", token, expiresAt: now + input.leaseMilliseconds });
149
+ return { state: "acquired", token };
150
+ }
151
+ async complete(input) {
152
+ const current = this.#entries.get(input.eventId);
153
+ if (current?.state !== "leased" || current.token !== input.token) throw new Error("The test inbox lease is not owned.");
154
+ this.#entries.set(input.eventId, { state: "completed", completedAt: this.#now() });
155
+ }
156
+ async release(input) {
157
+ const current = this.#entries.get(input.eventId);
158
+ if (current?.state === "leased" && current.token === input.token) this.#entries.delete(input.eventId);
159
+ }
160
+ };
@@ -0,0 +1,42 @@
1
+ import type { WebhookInbox } from "./types.cjs";
2
+ export declare const getTestOnlyWebhookFixture: (eventName: string) => Readonly<{
3
+ event: "endpoint.test" | "episode.ended" | "episode.started" | "participant.joined" | "participant.left" | "recording.completed" | "recording.failed" | "recording.started" | "space.archived" | "space.created" | "space.restored" | "space.updated" | "transcript.completed" | "transcript.failed" | "transcript.started";
4
+ rawBody: Uint8Array<ArrayBuffer>;
5
+ }>;
6
+ export declare const signTestOnlyWebhook: (input: {
7
+ rawBody: Uint8Array;
8
+ webhookId: string;
9
+ timestamp: number;
10
+ secrets: readonly string[];
11
+ }) => Promise<Headers>;
12
+ export declare class TestOnlyInMemoryWebhookInbox implements WebhookInbox {
13
+ #private;
14
+ constructor(options?: {
15
+ now?: () => number;
16
+ retentionMilliseconds?: number;
17
+ });
18
+ acquire(input: {
19
+ eventId: string;
20
+ leaseMilliseconds: number;
21
+ }): Promise<{
22
+ readonly state: "completed";
23
+ readonly retryAfterSeconds?: undefined;
24
+ readonly token?: undefined;
25
+ } | {
26
+ readonly state: "busy";
27
+ readonly retryAfterSeconds: number;
28
+ readonly token?: undefined;
29
+ } | {
30
+ readonly retryAfterSeconds?: undefined;
31
+ readonly state: "acquired";
32
+ readonly token: string;
33
+ }>;
34
+ complete(input: {
35
+ eventId: string;
36
+ token: string;
37
+ }): Promise<void>;
38
+ release(input: {
39
+ eventId: string;
40
+ token: string;
41
+ }): Promise<void>;
42
+ }
@@ -0,0 +1,43 @@
1
+ import type { WebhookInbox } from "./types.js";
2
+ export declare const getTestOnlyWebhookFixture: (eventName: string) => Readonly<{
3
+ event: "endpoint.test" | "episode.ended" | "episode.started" | "participant.joined" | "participant.left" | "recording.completed" | "recording.failed" | "recording.started" | "space.archived" | "space.created" | "space.restored" | "space.updated" | "transcript.completed" | "transcript.failed" | "transcript.started";
4
+ rawBody: Uint8Array<ArrayBuffer>;
5
+ }>;
6
+ export declare const signTestOnlyWebhook: (input: {
7
+ rawBody: Uint8Array;
8
+ webhookId: string;
9
+ timestamp: number;
10
+ secrets: readonly string[];
11
+ }) => Promise<Headers>;
12
+ export declare class TestOnlyInMemoryWebhookInbox implements WebhookInbox {
13
+ #private;
14
+ constructor(options?: {
15
+ now?: () => number;
16
+ retentionMilliseconds?: number;
17
+ });
18
+ acquire(input: {
19
+ eventId: string;
20
+ leaseMilliseconds: number;
21
+ }): Promise<{
22
+ readonly state: "completed";
23
+ readonly retryAfterSeconds?: undefined;
24
+ readonly token?: undefined;
25
+ } | {
26
+ readonly state: "busy";
27
+ readonly retryAfterSeconds: number;
28
+ readonly token?: undefined;
29
+ } | {
30
+ readonly retryAfterSeconds?: undefined;
31
+ readonly state: "acquired";
32
+ readonly token: string;
33
+ }>;
34
+ complete(input: {
35
+ eventId: string;
36
+ token: string;
37
+ }): Promise<void>;
38
+ release(input: {
39
+ eventId: string;
40
+ token: string;
41
+ }): Promise<void>;
42
+ }
43
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/webhooks/test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB/C,eAAO,MAAM,yBAAyB,cAAe,MAAM;;;EAI1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAAiB;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KAAG,OAAO,CAAC,OAAO,CAe3J,CAAC;AAQF,qBAAa,4BAA6B,YAAW,YAAY;;IAM/D,YAAY,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;KAAO,EAG/E;IAEK,OAAO,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE;wBAI/C,WAAW;;;;wBAGX,MAAM;;;;;wBAKR,UAAU;;OAC3B;IAEK,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,iBAIvD;IAEK,OAAO,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,iBAGtD;CACF"}
@@ -0,0 +1,137 @@
1
+ // src/webhooks/generated/fixtures-v1.ts
2
+ var webhookFixturesV1 = [
3
+ {
4
+ event: "space.created",
5
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000001","event":"space.created","api_version":1,"occurred_at":"2026-07-12T18:00:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Weekly design review","slug":"weekly-design-review","media_plane":"cf_rtk","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:00:00.000Z"}}}'
6
+ },
7
+ {
8
+ event: "space.updated",
9
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000002","event":"space.updated","api_version":1,"occurred_at":"2026-07-12T18:01:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Design review \u2013 \u6771\u4EAC","slug":"weekly-design-review","media_plane":"cf_rtk","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:01:00.000Z"},"changed_fields":["metadata","name"]}}'
10
+ },
11
+ {
12
+ event: "space.archived",
13
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000003","event":"space.archived","api_version":1,"occurred_at":"2026-07-12T18:02:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Design review \u2013 \u6771\u4EAC","slug":"weekly-design-review","media_plane":"cf_rtk","archived_at":"2026-07-12T18:02:00.000Z","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:02:00.000Z"}}}'
14
+ },
15
+ {
16
+ event: "space.restored",
17
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000004","event":"space.restored","api_version":1,"occurred_at":"2026-07-12T18:03:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"20000000-0000-4000-8000-000000000001","name":"Design review \u2013 \u6771\u4EAC","slug":"weekly-design-review","media_plane":"cf_rtk","created_at":"2026-07-01T08:00:00.000Z","updated_at":"2026-07-12T18:03:00.000Z"}}}'
18
+ },
19
+ {
20
+ event: "episode.started",
21
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000005","event":"episode.started","api_version":1,"occurred_at":"2026-07-12T18:04:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"30000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","status":"active","started_at":"2026-07-12T18:04:00.000Z","ended_at":null,"created_at":"2026-07-12T18:04:00.000Z","updated_at":"2026-07-12T18:04:00.000Z"}}}'
22
+ },
23
+ {
24
+ event: "episode.ended",
25
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000006","event":"episode.ended","api_version":1,"occurred_at":"2026-07-12T19:04:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"30000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","status":"ended","started_at":"2026-07-12T18:04:00.000Z","ended_at":"2026-07-12T19:04:00.000Z","created_at":"2026-07-12T18:04:00.000Z","updated_at":"2026-07-12T19:04:00.000Z"}}}'
26
+ },
27
+ {
28
+ event: "participant.joined",
29
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000007","event":"participant.joined","api_version":1,"occurred_at":"2026-07-12T18:05:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"40000000-0000-4000-8000-000000000001","identity_id":"50000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","name":"Ada \u2013 <&> \\"\u6771\u4EAC\\" \\\\","status":"active","joined_at":"2026-07-12T18:05:00.000Z","left_at":null}}}'
30
+ },
31
+ {
32
+ event: "participant.left",
33
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000008","event":"participant.left","api_version":1,"occurred_at":"2026-07-12T19:00:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"40000000-0000-4000-8000-000000000001","identity_id":"50000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","name":"Ada \u2013 \u6771\u4EAC","status":"left","joined_at":"2026-07-12T18:05:00.000Z","left_at":"2026-07-12T19:00:00.000Z"}}}'
34
+ },
35
+ {
36
+ event: "recording.started",
37
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000009","event":"recording.started","api_version":1,"occurred_at":"2026-07-12T18:06:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"started","started_at":"2026-07-12T18:06:00.000Z","completed_at":null,"failed_at":null,"failure":null,"created_at":"2026-07-12T18:06:00.000Z","updated_at":"2026-07-12T18:06:00.000Z"}}}'
38
+ },
39
+ {
40
+ event: "recording.completed",
41
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000010","event":"recording.completed","api_version":1,"occurred_at":"2026-07-12T19:06:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"completed","started_at":"2026-07-12T18:06:00.000Z","completed_at":"2026-07-12T19:06:00.000Z","failed_at":null,"failure":null,"created_at":"2026-07-12T18:06:00.000Z","updated_at":"2026-07-12T19:06:00.000Z"}}}'
42
+ },
43
+ {
44
+ event: "recording.failed",
45
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000011","event":"recording.failed","api_version":1,"occurred_at":"2026-07-12T19:06:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"failed","started_at":"2026-07-12T18:06:00.000Z","completed_at":null,"failed_at":"2026-07-12T19:06:00.000Z","failure":{"code":"recording_processing_failed"},"created_at":"2026-07-12T18:06:00.000Z","updated_at":"2026-07-12T19:06:00.000Z"}}}'
46
+ },
47
+ {
48
+ event: "transcript.started",
49
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000012","event":"transcript.started","api_version":1,"occurred_at":"2026-07-12T19:07:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"70000000-0000-4000-8000-000000000001","recording_id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"started","languages":[],"started_at":"2026-07-12T19:07:00.000Z","completed_at":null,"failed_at":null,"failure":null,"created_at":"2026-07-12T19:07:00.000Z","updated_at":"2026-07-12T19:07:00.000Z"}}}'
50
+ },
51
+ {
52
+ event: "transcript.completed",
53
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000013","event":"transcript.completed","api_version":1,"occurred_at":"2026-07-12T19:12:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"70000000-0000-4000-8000-000000000001","recording_id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"completed","languages":["en"],"started_at":"2026-07-12T19:07:00.000Z","completed_at":"2026-07-12T19:12:00.000Z","failed_at":null,"failure":null,"created_at":"2026-07-12T19:07:00.000Z","updated_at":"2026-07-12T19:12:00.000Z"}}}'
54
+ },
55
+ {
56
+ event: "transcript.failed",
57
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000014","event":"transcript.failed","api_version":1,"occurred_at":"2026-07-12T19:12:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"id":"70000000-0000-4000-8000-000000000001","recording_id":"60000000-0000-4000-8000-000000000001","space_id":"20000000-0000-4000-8000-000000000001","episode_id":"30000000-0000-4000-8000-000000000001","status":"failed","languages":[],"started_at":"2026-07-12T19:07:00.000Z","completed_at":null,"failed_at":"2026-07-12T19:12:00.000Z","failure":{"code":"transcription_failed"},"created_at":"2026-07-12T19:07:00.000Z","updated_at":"2026-07-12T19:12:00.000Z"}}}'
58
+ },
59
+ {
60
+ event: "endpoint.test",
61
+ body_utf8: '{"id":"00000000-0000-4000-8000-000000000015","event":"endpoint.test","api_version":1,"occurred_at":"2026-07-12T19:13:00.000Z","tenant_id":"10000000-0000-4000-8000-000000000001","data":{"object":{"endpoint_id":"80000000-0000-4000-8000-000000000001"}}}'
62
+ }
63
+ ];
64
+
65
+ // src/webhooks/test.ts
66
+ var encoder = new TextEncoder();
67
+ var decodeSecret = (secret) => {
68
+ if (!secret.startsWith("whsec_")) throw new Error("Test signer received an invalid secret.");
69
+ const binary = atob(secret.slice(6));
70
+ return Uint8Array.from(binary, (character) => character.charCodeAt(0));
71
+ };
72
+ var encodeBase64 = (value) => {
73
+ let binary = "";
74
+ for (const byte of value) binary += String.fromCharCode(byte);
75
+ return btoa(binary);
76
+ };
77
+ var getTestOnlyWebhookFixture = (eventName) => {
78
+ const fixture = webhookFixturesV1.find((entry) => entry.event === eventName);
79
+ if (!fixture) throw new Error("The requested webhook fixture does not exist.");
80
+ return Object.freeze({ event: fixture.event, rawBody: encoder.encode(fixture.body_utf8) });
81
+ };
82
+ var signTestOnlyWebhook = async (input) => {
83
+ const prefix = encoder.encode(`${input.webhookId}.${input.timestamp}.`);
84
+ const payload = new Uint8Array(prefix.length + input.rawBody.length);
85
+ payload.set(prefix);
86
+ payload.set(input.rawBody, prefix.length);
87
+ const signatures = [];
88
+ for (const secret of input.secrets) {
89
+ const key = await crypto.subtle.importKey("raw", new Uint8Array(decodeSecret(secret)), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
90
+ signatures.push(`v1,${encodeBase64(new Uint8Array(await crypto.subtle.sign("HMAC", key, new Uint8Array(payload))))}`);
91
+ }
92
+ return new Headers({
93
+ "webhook-id": input.webhookId,
94
+ "webhook-timestamp": String(input.timestamp),
95
+ "webhook-signature": signatures.join(" ")
96
+ });
97
+ };
98
+ var isRetainedCompletion = (entry, now, retentionMilliseconds) => entry?.state === "completed" && entry.completedAt + retentionMilliseconds > now;
99
+ var isActiveLease = (entry, now) => entry?.state === "leased" && entry.expiresAt > now;
100
+ var TestOnlyInMemoryWebhookInbox = class {
101
+ #entries = /* @__PURE__ */ new Map();
102
+ #now;
103
+ #retentionMilliseconds;
104
+ #nextToken = 1;
105
+ constructor(options = {}) {
106
+ this.#now = options.now ?? Date.now;
107
+ this.#retentionMilliseconds = options.retentionMilliseconds ?? 30 * 24 * 60 * 60 * 1e3;
108
+ }
109
+ async acquire(input) {
110
+ const now = this.#now();
111
+ const current = this.#entries.get(input.eventId);
112
+ if (isRetainedCompletion(current, now, this.#retentionMilliseconds)) {
113
+ return { state: "completed" };
114
+ }
115
+ if (isActiveLease(current, now)) {
116
+ return { state: "busy", retryAfterSeconds: Math.max(1, Math.ceil((current.expiresAt - now) / 1e3)) };
117
+ }
118
+ const token = `test-lease-${this.#nextToken}`;
119
+ this.#nextToken += 1;
120
+ this.#entries.set(input.eventId, { state: "leased", token, expiresAt: now + input.leaseMilliseconds });
121
+ return { state: "acquired", token };
122
+ }
123
+ async complete(input) {
124
+ const current = this.#entries.get(input.eventId);
125
+ if (current?.state !== "leased" || current.token !== input.token) throw new Error("The test inbox lease is not owned.");
126
+ this.#entries.set(input.eventId, { state: "completed", completedAt: this.#now() });
127
+ }
128
+ async release(input) {
129
+ const current = this.#entries.get(input.eventId);
130
+ if (current?.state === "leased" && current.token === input.token) this.#entries.delete(input.eventId);
131
+ }
132
+ };
133
+ export {
134
+ TestOnlyInMemoryWebhookInbox,
135
+ getTestOnlyWebhookFixture,
136
+ signTestOnlyWebhook
137
+ };
@@ -0,0 +1,55 @@
1
+ import type { KnownWebhookEventNameV1, KnownWebhookEventV1 } from "./generated/event-v1.cjs";
2
+ export type UnknownWebhookEvent = Readonly<{
3
+ id: string;
4
+ event: string;
5
+ api_version: 1;
6
+ occurred_at: string;
7
+ tenant_id: string;
8
+ data: Readonly<Record<string, unknown>>;
9
+ }>;
10
+ export type ChalkWebhookEvent = KnownWebhookEventV1 | UnknownWebhookEvent;
11
+ export interface WebhookInbox {
12
+ acquire(input: {
13
+ eventId: string;
14
+ leaseMilliseconds: number;
15
+ }): Promise<{
16
+ state: "acquired";
17
+ token: string;
18
+ } | {
19
+ state: "completed";
20
+ } | {
21
+ state: "busy";
22
+ retryAfterSeconds: number;
23
+ }>;
24
+ complete(input: {
25
+ eventId: string;
26
+ token: string;
27
+ }): Promise<void>;
28
+ release(input: {
29
+ eventId: string;
30
+ token: string;
31
+ }): Promise<void>;
32
+ }
33
+ export type WebhookHandlerMap = {
34
+ [Name in KnownWebhookEventNameV1]: (event: Extract<KnownWebhookEventV1, {
35
+ readonly event: Name;
36
+ }>) => Promise<void> | void;
37
+ };
38
+ export type WebhookProcessOutcome = "processed" | "duplicate" | "busy" | "ignored" | "rejected" | "failed";
39
+ export type WebhookProcessResult = Readonly<{
40
+ status: 200 | 400 | 401 | 500 | 503;
41
+ outcome: WebhookProcessOutcome;
42
+ retryAfterSeconds?: number;
43
+ eventId?: string;
44
+ eventName?: string;
45
+ apiVersion?: number;
46
+ errorCode?: string;
47
+ }>;
48
+ export type WebhookDiagnosticEvent = Readonly<{
49
+ phase: "verified" | "acquired" | "handled" | "completed" | "rejected" | "failed";
50
+ outcome: WebhookProcessOutcome;
51
+ durationMilliseconds: number;
52
+ eventId?: string;
53
+ eventName?: string;
54
+ apiVersion?: number;
55
+ }>;
@@ -0,0 +1,56 @@
1
+ import type { KnownWebhookEventNameV1, KnownWebhookEventV1 } from "./generated/event-v1.js";
2
+ export type UnknownWebhookEvent = Readonly<{
3
+ id: string;
4
+ event: string;
5
+ api_version: 1;
6
+ occurred_at: string;
7
+ tenant_id: string;
8
+ data: Readonly<Record<string, unknown>>;
9
+ }>;
10
+ export type ChalkWebhookEvent = KnownWebhookEventV1 | UnknownWebhookEvent;
11
+ export interface WebhookInbox {
12
+ acquire(input: {
13
+ eventId: string;
14
+ leaseMilliseconds: number;
15
+ }): Promise<{
16
+ state: "acquired";
17
+ token: string;
18
+ } | {
19
+ state: "completed";
20
+ } | {
21
+ state: "busy";
22
+ retryAfterSeconds: number;
23
+ }>;
24
+ complete(input: {
25
+ eventId: string;
26
+ token: string;
27
+ }): Promise<void>;
28
+ release(input: {
29
+ eventId: string;
30
+ token: string;
31
+ }): Promise<void>;
32
+ }
33
+ export type WebhookHandlerMap = {
34
+ [Name in KnownWebhookEventNameV1]: (event: Extract<KnownWebhookEventV1, {
35
+ readonly event: Name;
36
+ }>) => Promise<void> | void;
37
+ };
38
+ export type WebhookProcessOutcome = "processed" | "duplicate" | "busy" | "ignored" | "rejected" | "failed";
39
+ export type WebhookProcessResult = Readonly<{
40
+ status: 200 | 400 | 401 | 500 | 503;
41
+ outcome: WebhookProcessOutcome;
42
+ retryAfterSeconds?: number;
43
+ eventId?: string;
44
+ eventName?: string;
45
+ apiVersion?: number;
46
+ errorCode?: string;
47
+ }>;
48
+ export type WebhookDiagnosticEvent = Readonly<{
49
+ phase: "verified" | "acquired" | "handled" | "completed" | "rejected" | "failed";
50
+ outcome: WebhookProcessOutcome;
51
+ durationMilliseconds: number;
52
+ eventId?: string;
53
+ eventName?: string;
54
+ apiVersion?: number;
55
+ }>;
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/webhooks/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE5F,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,CAAC,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACzC,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,WAAW,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtL,QAAQ,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED,MAAM,MAAM,iBAAiB,GAAG;KAC7B,IAAI,IAAI,uBAAuB,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;KAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAC3H,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;AAE3G,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACpC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjF,OAAO,EAAE,qBAAqB,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC,CAAC"}