@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.
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/access/base64-url.d.ts +2 -0
- package/dist/access/base64-url.d.ts.map +1 -0
- package/dist/access/episode-diagnostic-credential.d.ts +11 -0
- package/dist/access/episode-diagnostic-credential.d.ts.map +1 -0
- package/dist/access/grant.d.ts +53 -0
- package/dist/access/grant.d.ts.map +1 -0
- package/dist/access/grant.test.helpers.d.ts +10 -0
- package/dist/access/grant.test.helpers.d.ts.map +1 -0
- package/dist/access/manager.d.ts +36 -0
- package/dist/access/manager.d.ts.map +1 -0
- package/dist/chat-files/http-transport.d.ts +8 -0
- package/dist/chat-files/http-transport.d.ts.map +1 -0
- package/dist/chat-files/index.d.ts +3 -0
- package/dist/chat-files/index.d.ts.map +1 -0
- package/dist/chat-files/types.d.ts +37 -0
- package/dist/chat-files/types.d.ts.map +1 -0
- package/dist/chunk-5VXGLI3T.js +3385 -0
- package/dist/chunk-O22WFBKF.js +5161 -0
- package/dist/chunk-PBCGWE2V.js +811 -0
- package/dist/chunk-PBSYXPNJ.js +23 -0
- package/dist/chunk-QVHR3RMB.js +1229 -0
- package/dist/client.d.ts +6785 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/collaboration/index.d.ts +3 -0
- package/dist/collaboration/index.d.ts.map +1 -0
- package/dist/collaboration/types.d.ts +94 -0
- package/dist/collaboration/types.d.ts.map +1 -0
- package/dist/collaboration/wire.d.ts +19 -0
- package/dist/collaboration/wire.d.ts.map +1 -0
- package/dist/connection/dependencies.d.ts +112 -0
- package/dist/connection/dependencies.d.ts.map +1 -0
- package/dist/connection/diagnostics.d.ts +52 -0
- package/dist/connection/diagnostics.d.ts.map +1 -0
- package/dist/connection/index.d.ts +47 -0
- package/dist/connection/index.d.ts.map +1 -0
- package/dist/connection/lifecycle.d.ts +58 -0
- package/dist/connection/lifecycle.d.ts.map +1 -0
- package/dist/connection/media-devices.d.ts +6 -0
- package/dist/connection/media-devices.d.ts.map +1 -0
- package/dist/connection/production.d.ts +13 -0
- package/dist/connection/production.d.ts.map +1 -0
- package/dist/connection/snapshot.d.ts +23 -0
- package/dist/connection/snapshot.d.ts.map +1 -0
- package/dist/connection/types.d.ts +128 -0
- package/dist/connection/types.d.ts.map +1 -0
- package/dist/effect.d.ts +19 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +7846 -0
- package/dist/episode-diagnostic-runtime.test.helpers.d.ts +3 -0
- package/dist/episode-diagnostic-runtime.test.helpers.d.ts.map +1 -0
- package/dist/generated/http-api.d.ts +6658 -0
- package/dist/generated/http-api.d.ts.map +1 -0
- package/dist/generated/schemas.d.ts +12076 -0
- package/dist/generated/schemas.d.ts.map +1 -0
- package/dist/generated/sync.d.ts +3947 -0
- package/dist/generated/sync.d.ts.map +1 -0
- package/dist/generated/whiteboard-v1.d.ts +334 -0
- package/dist/generated/whiteboard-v1.d.ts.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/media/client.d.ts +18 -0
- package/dist/media/client.d.ts.map +1 -0
- package/dist/media/cloudflare-sfu.d.ts +5 -0
- package/dist/media/cloudflare-sfu.d.ts.map +1 -0
- package/dist/media/index.d.ts +3 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +24 -0
- package/dist/media/plane.d.ts +24 -0
- package/dist/media/plane.d.ts.map +1 -0
- package/dist/media/tracks.d.ts +21 -0
- package/dist/media/tracks.d.ts.map +1 -0
- package/dist/media/transport.d.ts +3 -0
- package/dist/media/transport.d.ts.map +1 -0
- package/dist/media/types.d.ts +114 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/server/chunk-A6YMG5FM.js +61 -0
- package/dist/server/client.d.cts +2 -0
- package/dist/server/client.d.ts +3 -0
- package/dist/server/client.d.ts.map +1 -0
- package/dist/server/errors.d.cts +18 -0
- package/dist/server/errors.d.ts +19 -0
- package/dist/server/errors.d.ts.map +1 -0
- package/dist/server/index.cjs +551 -0
- package/dist/server/index.d.cts +3 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +474 -0
- package/dist/server/server-only.cjs +40 -0
- package/dist/server/server-only.d.cts +1 -0
- package/dist/server/server-only.d.ts +2 -0
- package/dist/server/server-only.d.ts.map +1 -0
- package/dist/server/server-only.js +9 -0
- package/dist/server/transport.d.cts +12 -0
- package/dist/server/transport.d.ts +13 -0
- package/dist/server/transport.d.ts.map +1 -0
- package/dist/server/types.d.cts +201 -0
- package/dist/server/types.d.ts +202 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/space-client/chat-controller-helpers.d.ts +15 -0
- package/dist/space-client/chat-controller-helpers.d.ts.map +1 -0
- package/dist/space-client/chat-controller.d.ts +34 -0
- package/dist/space-client/chat-controller.d.ts.map +1 -0
- package/dist/space-client/controller-effects.d.ts +45 -0
- package/dist/space-client/controller-effects.d.ts.map +1 -0
- package/dist/space-client/controller-parity.test.helpers.d.ts +150 -0
- package/dist/space-client/controller-parity.test.helpers.d.ts.map +1 -0
- package/dist/space-client/core.d.ts +52 -0
- package/dist/space-client/core.d.ts.map +1 -0
- package/dist/space-client/core.test.helpers.d.ts +14 -0
- package/dist/space-client/core.test.helpers.d.ts.map +1 -0
- package/dist/space-client/effect.d.ts +44 -0
- package/dist/space-client/effect.d.ts.map +1 -0
- package/dist/space-client/episode-diagnostic-registry.d.ts +13 -0
- package/dist/space-client/episode-diagnostic-registry.d.ts.map +1 -0
- package/dist/space-client/episode-diagnostic-render-registry.d.ts +4 -0
- package/dist/space-client/episode-diagnostic-render-registry.d.ts.map +1 -0
- package/dist/space-client/episode-diagnostic-runtime.d.ts +102 -0
- package/dist/space-client/episode-diagnostic-runtime.d.ts.map +1 -0
- package/dist/space-client/errors.d.ts +11 -0
- package/dist/space-client/errors.d.ts.map +1 -0
- package/dist/space-client/index.d.ts +5 -0
- package/dist/space-client/index.d.ts.map +1 -0
- package/dist/space-client/media-controller.d.ts +30 -0
- package/dist/space-client/media-controller.d.ts.map +1 -0
- package/dist/space-client/media-controller.test.helpers.d.ts +105 -0
- package/dist/space-client/media-controller.test.helpers.d.ts.map +1 -0
- package/dist/space-client/media-device-selection.d.ts +13 -0
- package/dist/space-client/media-device-selection.d.ts.map +1 -0
- package/dist/space-client/participants-controller.d.ts +33 -0
- package/dist/space-client/participants-controller.d.ts.map +1 -0
- package/dist/space-client/promise-facade.d.ts +12 -0
- package/dist/space-client/promise-facade.d.ts.map +1 -0
- package/dist/space-client/reactions-controller.d.ts +19 -0
- package/dist/space-client/reactions-controller.d.ts.map +1 -0
- package/dist/space-client/space-client.d.ts +5 -0
- package/dist/space-client/space-client.d.ts.map +1 -0
- package/dist/space-client/store.d.ts +29 -0
- package/dist/space-client/store.d.ts.map +1 -0
- package/dist/space-client/types.d.ts +222 -0
- package/dist/space-client/types.d.ts.map +1 -0
- package/dist/space-client/whiteboard-controller.d.ts +17 -0
- package/dist/space-client/whiteboard-controller.d.ts.map +1 -0
- package/dist/sync/browser.d.ts +9 -0
- package/dist/sync/browser.d.ts.map +1 -0
- package/dist/sync/canonical.d.ts +7 -0
- package/dist/sync/canonical.d.ts.map +1 -0
- package/dist/sync/errors.d.ts +9 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/index.d.ts +13 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +51 -0
- package/dist/sync/react-native.d.ts +42 -0
- package/dist/sync/react-native.d.ts.map +1 -0
- package/dist/sync/types.d.ts +28 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/v1-client.d.ts +59 -0
- package/dist/sync/v1-client.d.ts.map +1 -0
- package/dist/sync/v1-codec.d.ts +5 -0
- package/dist/sync/v1-codec.d.ts.map +1 -0
- package/dist/sync/v1-create.d.ts +12 -0
- package/dist/sync/v1-create.d.ts.map +1 -0
- package/dist/sync/v1-persistence.d.ts +10 -0
- package/dist/sync/v1-persistence.d.ts.map +1 -0
- package/dist/sync/v1-platform-persistence.d.ts +26 -0
- package/dist/sync/v1-platform-persistence.d.ts.map +1 -0
- package/dist/sync/v1-reducer.d.ts +17 -0
- package/dist/sync/v1-reducer.d.ts.map +1 -0
- package/dist/sync/v1-types.d.ts +197 -0
- package/dist/sync/v1-types.d.ts.map +1 -0
- package/dist/telemetry/attributes.d.ts +7 -0
- package/dist/telemetry/attributes.d.ts.map +1 -0
- package/dist/telemetry/client.d.ts +44 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/delivery.d.ts +107 -0
- package/dist/telemetry/delivery.d.ts.map +1 -0
- package/dist/telemetry/exporter.d.ts +38 -0
- package/dist/telemetry/exporter.d.ts.map +1 -0
- package/dist/telemetry/index.d.ts +7 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +48 -0
- package/dist/telemetry/journey.d.ts +52 -0
- package/dist/telemetry/journey.d.ts.map +1 -0
- package/dist/telemetry/random.d.ts +18 -0
- package/dist/telemetry/random.d.ts.map +1 -0
- package/dist/telemetry/rtc.d.ts +35 -0
- package/dist/telemetry/rtc.d.ts.map +1 -0
- package/dist/telemetry/storage.d.ts +22 -0
- package/dist/telemetry/storage.d.ts.map +1 -0
- package/dist/telemetry/sync.d.ts +10 -0
- package/dist/telemetry/sync.d.ts.map +1 -0
- package/dist/telemetry/test-support.d.ts +51 -0
- package/dist/telemetry/test-support.d.ts.map +1 -0
- package/dist/telemetry/trace.d.ts +18 -0
- package/dist/telemetry/trace.d.ts.map +1 -0
- package/dist/telemetry/types.d.ts +109 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/webhooks/chunk-UNMJZNTZ.js +31 -0
- package/dist/webhooks/errors.d.cts +8 -0
- package/dist/webhooks/errors.d.ts +9 -0
- package/dist/webhooks/errors.d.ts.map +1 -0
- package/dist/webhooks/generated/event-v1.d.cts +764 -0
- package/dist/webhooks/generated/event-v1.d.ts +765 -0
- package/dist/webhooks/generated/event-v1.d.ts.map +1 -0
- package/dist/webhooks/generated/fixtures-v1.d.cts +46 -0
- package/dist/webhooks/generated/fixtures-v1.d.ts +47 -0
- package/dist/webhooks/generated/fixtures-v1.d.ts.map +1 -0
- package/dist/webhooks/index.cjs +1242 -0
- package/dist/webhooks/index.d.cts +5 -0
- package/dist/webhooks/index.d.ts +6 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +1197 -0
- package/dist/webhooks/processor.d.cts +21 -0
- package/dist/webhooks/processor.d.ts +22 -0
- package/dist/webhooks/processor.d.ts.map +1 -0
- package/dist/webhooks/server-only.cjs +36 -0
- package/dist/webhooks/server-only.d.cts +1 -0
- package/dist/webhooks/server-only.d.ts +2 -0
- package/dist/webhooks/server-only.d.ts.map +1 -0
- package/dist/webhooks/server-only.js +9 -0
- package/dist/webhooks/test.cjs +160 -0
- package/dist/webhooks/test.d.cts +42 -0
- package/dist/webhooks/test.d.ts +43 -0
- package/dist/webhooks/test.d.ts.map +1 -0
- package/dist/webhooks/test.js +137 -0
- package/dist/webhooks/types.d.cts +55 -0
- package/dist/webhooks/types.d.ts +56 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/validate.d.cts +5 -0
- package/dist/webhooks/validate.d.ts +6 -0
- package/dist/webhooks/validate.d.ts.map +1 -0
- package/dist/webhooks/verify.d.cts +10 -0
- package/dist/webhooks/verify.d.ts +11 -0
- package/dist/webhooks/verify.d.ts.map +1 -0
- package/dist/whiteboard/file-http-transport.d.ts +9 -0
- package/dist/whiteboard/file-http-transport.d.ts.map +1 -0
- package/dist/whiteboard/index.d.ts +7 -0
- package/dist/whiteboard/index.d.ts.map +1 -0
- package/dist/whiteboard/types.d.ts +139 -0
- package/dist/whiteboard/types.d.ts.map +1 -0
- package/dist/whiteboard/v1-client.d.ts +18 -0
- package/dist/whiteboard/v1-client.d.ts.map +1 -0
- package/dist/whiteboard/v1-codec.d.ts +5 -0
- package/dist/whiteboard/v1-codec.d.ts.map +1 -0
- package/dist/whiteboard/v1-create.d.ts +8 -0
- package/dist/whiteboard/v1-create.d.ts.map +1 -0
- package/dist/whiteboard/v1-multipart.d.ts +30 -0
- package/dist/whiteboard/v1-multipart.d.ts.map +1 -0
- package/dist/whiteboard/v1-persistence.d.ts +9 -0
- package/dist/whiteboard/v1-persistence.d.ts.map +1 -0
- 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 @@
|
|
|
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,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"}
|