@polymorfa/sdk 0.1.0-dev.20260926234600 → 0.1.0-dev.20260926235309

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/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # `@polymorfa/sdk`
2
2
 
3
- The handwritten Polymorfa server SDK for TypeScript and Node.js.
3
+ The handwritten Polymorfa server SDK for TypeScript, Node.js, and server-side
4
+ edge runtimes.
4
5
 
5
6
  Install the development prerelease from npm:
6
7
 
@@ -33,8 +34,11 @@ import {
33
34
  ```
34
35
 
35
36
  See the repository README for the complete development contract and current
36
- typed-resource coverage. This package has no runtime dependencies and requires
37
- Node.js 20 or newer.
37
+ typed-resource coverage. This package has no runtime dependencies. On Node.js,
38
+ it requires version 20 or newer. The package root also runs in Cloudflare
39
+ Workers, Deno, and Bun with native `fetch` and `crypto.subtle`; keep server
40
+ credentials in the runtime's secret store. Import `@polymorfa/sdk/node` only in
41
+ Node.js applications that need its file helpers.
38
42
 
39
43
  ## Management client and project views
40
44
 
@@ -4,7 +4,7 @@
4
4
  * codes are sent: no phone numbers, names, audio, video or device labels.
5
5
  */
6
6
  /** Package version sent with reports from `@polymorfa/sdk/calls`. */
7
- export declare const CALLS_SDK_VERSION = "0.1.0-dev.20260926234600";
7
+ export declare const CALLS_SDK_VERSION = "0.1.0-dev.20260926235309";
8
8
  export type CallErrorCode = "media_permission_denied" | "device_not_found" | "device_in_use" | "ice_failed" | "negotiation_failed" | "media_timeout" | "reconnect_exhausted" | "token_refresh_failed" | "unsupported_browser" | "other";
9
9
  /** Figures measured for one connection. Omit what was not measured. */
10
10
  export interface CallQualityFigures {
@@ -4,7 +4,7 @@
4
4
  * codes are sent: no phone numbers, names, audio, video or device labels.
5
5
  */
6
6
  /** Package version sent with reports from `@polymorfa/sdk/calls`. */
7
- export const CALLS_SDK_VERSION = "0.1.0-dev.20260926234600";
7
+ export const CALLS_SDK_VERSION = "0.1.0-dev.20260926235309";
8
8
  /** Platform limits per connection, applied locally to avoid refusals. */
9
9
  const QUALITY_INTERVAL_MS = 5_000;
10
10
  const ERRORS_PER_MINUTE = 20;
@@ -43,6 +43,13 @@ export declare function validateOrganizationApiKey(value: string): string;
43
43
  export declare function assertServerRuntime(runtime?: {
44
44
  readonly window?: unknown;
45
45
  readonly importScripts?: unknown;
46
+ readonly navigator?: {
47
+ readonly userAgent?: string;
48
+ };
49
+ readonly WebSocketPair?: unknown;
50
+ readonly registration?: unknown;
51
+ readonly clients?: unknown;
52
+ readonly skipWaiting?: unknown;
46
53
  readonly constructor?: {
47
54
  readonly name?: string;
48
55
  };
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;CAC1C;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,GACvB,yBAAyB,GAAG,0BAA0B,CAAC;AAEzD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,mBAAmB,GAC9B,mBAAmB,CA0BrB;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,gBAAgB,GAC3B,gBAAgB,CAalB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhE;AA8BD,wBAAgB,mBAAmB,CACjC,OAAO,GAAE;IACP,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACtC,GACb,IAAI,CAeN"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CAC/B;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,QAAQ,CAAC,UAAU,EAAE,mBAAmB,CAAC;CAC1C;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzD;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;CAC5B;AAED,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,aAAa,GACvB,yBAAyB,GAAG,0BAA0B,CAAC;AAEzD,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,mBAAmB,GAC9B,mBAAmB,CA0BrB;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,gBAAgB,GAC3B,gBAAgB,CAalB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhE;AA8BD,wBAAgB,mBAAmB,CACjC,OAAO,GAAE;IACP,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACtC,GACb,IAAI,CAyBN"}
@@ -55,10 +55,19 @@ function rejectNonOrganizationCredential(value) {
55
55
  }
56
56
  export function assertServerRuntime(runtime = globalThis) {
57
57
  const globalName = runtime.constructor?.name ?? "";
58
+ // Cloudflare Workers use ServiceWorkerGlobalScope as their global name.
59
+ // Its documented navigator.userAgent distinguishes it from a browser
60
+ // service worker, which must never receive server credentials.
61
+ const isCloudflareWorker = globalName === "ServiceWorkerGlobalScope" &&
62
+ runtime.navigator?.userAgent === "Cloudflare-Workers" &&
63
+ typeof runtime.WebSocketPair === "function" &&
64
+ runtime.registration === undefined &&
65
+ runtime.clients === undefined &&
66
+ runtime.skipWaiting === undefined;
58
67
  const isBrowserWorker = typeof runtime.importScripts === "function" ||
59
68
  globalName === "DedicatedWorkerGlobalScope" ||
60
69
  globalName === "SharedWorkerGlobalScope" ||
61
- globalName === "ServiceWorkerGlobalScope" ||
70
+ (globalName === "ServiceWorkerGlobalScope" && !isCloudflareWorker) ||
62
71
  globalName.endsWith("WorkletGlobalScope");
63
72
  if (typeof runtime.window !== "undefined" || isBrowserWorker) {
64
73
  throw new PolymorfaConfigurationError("Polymorfa server credentials cannot be used in browser runtimes.", "runtime");
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export declare const SDK_VERSION = "0.1.0-dev.20260926234600";
1
+ export declare const SDK_VERSION = "0.1.0-dev.20260926235309";
2
2
  export declare const NATIVE_API_VERSION = "2026-09-22";
3
3
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
- export const SDK_VERSION = "0.1.0-dev.20260926234600";
1
+ export const SDK_VERSION = "0.1.0-dev.20260926235309";
2
2
  export const NATIVE_API_VERSION = "2026-09-22";
3
3
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,7 @@
1
+ export type WebhookBody = string | ArrayBuffer | ArrayBufferView;
2
+ export declare function webhookBodyBytes(body: WebhookBody): Uint8Array<ArrayBuffer>;
3
+ export declare function hexBytes(value: string): Uint8Array<ArrayBuffer>;
4
+ export declare function bytesHex(bytes: Uint8Array): string;
5
+ export declare function signWebhookHmac(body: Uint8Array<ArrayBuffer>, secret: string | Uint8Array): Promise<Uint8Array<ArrayBuffer>>;
6
+ export declare function verifyWebhookHmac(body: Uint8Array<ArrayBuffer>, signature: Uint8Array<ArrayBuffer>, secret: string | Uint8Array): Promise<boolean>;
7
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/webhooks/crypto.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,eAAe,CAAC;AAEjE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CAM3E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAM/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIlD;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,EAC7B,MAAM,EAAE,MAAM,GAAG,UAAU,GAC1B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAUlC;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,EAC7B,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,EAClC,MAAM,EAAE,MAAM,GAAG,UAAU,GAC1B,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -0,0 +1,44 @@
1
+ import { PolymorfaConfigurationError } from "../errors.js";
2
+ export function webhookBodyBytes(body) {
3
+ if (typeof body === "string")
4
+ return new TextEncoder().encode(body);
5
+ if (body instanceof ArrayBuffer)
6
+ return new Uint8Array(body);
7
+ return new Uint8Array(new Uint8Array(body.buffer, body.byteOffset, body.byteLength));
8
+ }
9
+ export function hexBytes(value) {
10
+ const bytes = new Uint8Array(value.length / 2);
11
+ for (let index = 0; index < bytes.length; index += 1) {
12
+ bytes[index] = Number.parseInt(value.slice(index * 2, index * 2 + 2), 16);
13
+ }
14
+ return bytes;
15
+ }
16
+ export function bytesHex(bytes) {
17
+ return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
18
+ }
19
+ export async function signWebhookHmac(body, secret) {
20
+ const subtle = webhookSubtle();
21
+ const key = await subtle.importKey("raw", hmacKeyBytes(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
22
+ return new Uint8Array(await subtle.sign("HMAC", key, body));
23
+ }
24
+ export async function verifyWebhookHmac(body, signature, secret) {
25
+ const subtle = webhookSubtle();
26
+ const key = await subtle.importKey("raw", hmacKeyBytes(secret), { name: "HMAC", hash: "SHA-256" }, false, ["verify"]);
27
+ return subtle.verify("HMAC", key, signature, body);
28
+ }
29
+ function webhookSubtle() {
30
+ const subtle = globalThis.crypto?.subtle;
31
+ if (subtle === undefined) {
32
+ throw new PolymorfaConfigurationError("Webhook verification requires WebCrypto (crypto.subtle).", "crypto");
33
+ }
34
+ return subtle;
35
+ }
36
+ function hmacKeyBytes(secret) {
37
+ const bytes = typeof secret === "string"
38
+ ? new TextEncoder().encode(secret)
39
+ : new Uint8Array(secret);
40
+ // HMAC pads an empty SHA-256 key with zeroes to its 64-byte block size.
41
+ // WebCrypto rejects an empty imported key, while Node's createHmac accepts it.
42
+ return bytes.length === 0 ? new Uint8Array(64) : bytes;
43
+ }
44
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/webhooks/crypto.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/webhooks/utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,2BAA2B,GAAG,kBAAkB,CAAC;AAC7D,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AACD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;QAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACxC,CAAC,CAAC;CACJ;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,eAAe,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,WAAW,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnE,aAAa,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,QAAQ,EAAE,gBA6BrB,CAAC"}
1
+ {"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../../src/webhooks/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQhD,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,MAAM,2BAA2B,GAAG,kBAAkB,CAAC;AAC7D,MAAM,WAAW,uBAAwB,SAAQ,kBAAkB;IACjE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AACD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;QACzB,QAAQ,CAAC,cAAc,EAAE,kBAAkB,CAAC;QAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;KACxC,CAAC,CAAC;CACJ;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,eAAe,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,WAAW,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnE,aAAa,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1E;AAED,eAAO,MAAM,QAAQ,EAAE,gBA0BrB,CAAC"}
@@ -1,23 +1,19 @@
1
- import { createHmac, timingSafeEqual } from "node:crypto";
2
- import { WebhookSignatureError, constructWebhookEvent, verifyWebhookSignature, } from "./verify.js";
1
+ import { bytesHex, hexBytes, signWebhookHmac, verifyWebhookHmac, webhookBodyBytes, } from "./crypto.js";
2
+ import { WebhookSignatureError, constructWebhookEvent, parseVerifiedWebhookEvent, verifyWebhookSignature, } from "./verify.js";
3
3
  export const webhooks = Object.freeze({
4
4
  verify: (input) => constructWebhookEvent(input.body, input.signature, input.secret),
5
5
  verifySignature: (input) => verifyWebhookSignature(input.body, input.signature, input.secret),
6
6
  async verifyLocal(input) {
7
7
  const secret = decodeLocalSecret(input.secret);
8
- if (!verifyLocalSignature(input, secret))
8
+ if (!(await verifyLocalSignature(input, secret))) {
9
9
  throw new WebhookSignatureError();
10
- const verificationSecret = "local-verification-complete";
11
- const body = toBytes(input.body);
12
- const signature = createHmac("sha256", verificationSecret)
13
- .update(body)
14
- .digest("hex");
15
- return constructWebhookEvent(body, signature, verificationSecret);
10
+ }
11
+ return parseVerifiedWebhookEvent(input.body);
16
12
  },
17
13
  async createFixture(input) {
18
14
  const body = new TextEncoder().encode(JSON.stringify(input.event));
19
15
  const secret = input.secret;
20
- const signature = createHmac("sha256", secret).update(body).digest("hex");
16
+ const signature = bytesHex(await signWebhookHmac(body, secret));
21
17
  return Object.freeze({
22
18
  body,
23
19
  contentType: "application/json",
@@ -29,7 +25,7 @@ export const webhooks = Object.freeze({
29
25
  });
30
26
  },
31
27
  });
32
- function verifyLocalSignature(input, secret) {
28
+ async function verifyLocalSignature(input, secret) {
33
29
  const match = /^t=(\d+),v1=([a-f0-9]{64})$/.exec(input.signature);
34
30
  if (match === null)
35
31
  return false;
@@ -42,26 +38,26 @@ function verifyLocalSignature(input, secret) {
42
38
  return false;
43
39
  if (Math.abs(now - timestamp) > tolerance)
44
40
  return false;
45
- const expected = createHmac("sha256", secret)
46
- .update(new TextEncoder().encode(`${timestamp}.`))
47
- .update(toBytes(input.body))
48
- .digest();
49
- const actual = Buffer.from(match[2] ?? "", "hex");
50
- return actual.length === expected.length && timingSafeEqual(actual, expected);
41
+ const prefix = new TextEncoder().encode(`${timestamp}.`);
42
+ const body = webhookBodyBytes(input.body);
43
+ const signed = new Uint8Array(prefix.length + body.length);
44
+ signed.set(prefix);
45
+ signed.set(body, prefix.length);
46
+ return verifyWebhookHmac(signed, hexBytes(match[2] ?? ""), secret);
51
47
  }
52
48
  function decodeLocalSecret(value) {
53
49
  if (!/^[A-Za-z0-9_-]{43}$/.test(value))
54
50
  throw new WebhookSignatureError();
55
- const bytes = Buffer.from(value, "base64url");
51
+ let decoded;
52
+ try {
53
+ decoded = atob(value.replace(/-/g, "+").replace(/_/g, "/") + "=");
54
+ }
55
+ catch {
56
+ throw new WebhookSignatureError();
57
+ }
58
+ const bytes = Uint8Array.from(decoded, (character) => character.charCodeAt(0));
56
59
  if (bytes.length !== 32)
57
60
  throw new WebhookSignatureError();
58
61
  return bytes;
59
62
  }
60
- function toBytes(body) {
61
- if (typeof body === "string")
62
- return new TextEncoder().encode(body);
63
- if (body instanceof ArrayBuffer)
64
- return new Uint8Array(body);
65
- return new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
66
- }
67
63
  //# sourceMappingURL=utilities.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/webhooks/utilities.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/webhooks/utilities.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  import { PolymorfaError } from "../errors.js";
2
+ import { type WebhookBody } from "./crypto.js";
2
3
  import { type WebhookEvent } from "./events.js";
3
- export type WebhookBody = string | ArrayBuffer | ArrayBufferView;
4
+ export type { WebhookBody } from "./crypto.js";
4
5
  export declare class WebhookSignatureError extends PolymorfaError {
5
6
  constructor();
6
7
  }
7
8
  export declare function verifyWebhookSignature(rawBody: WebhookBody, signatureHeader: string, secret: string): Promise<boolean>;
8
9
  export declare function constructWebhookEvent(rawBody: WebhookBody, signatureHeader: string, secret: string): Promise<WebhookEvent>;
10
+ export declare function parseVerifiedWebhookEvent(rawBody: WebhookBody): WebhookEvent;
9
11
  //# sourceMappingURL=verify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAA4B,MAAM,cAAc,CAAC;AACxE,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,eAAe,CAAC;AAEjE,qBAAa,qBAAsB,SAAQ,cAAc;;CAMxD;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CA0CvB"}
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4B,MAAM,cAAc,CAAC;AACxE,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,qBAAa,qBAAsB,SAAQ,cAAc;;CAMxD;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,YAAY,CAAC,CAMvB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,YAAY,CAwC5E"}
@@ -1,5 +1,5 @@
1
- import { createHmac, timingSafeEqual } from "node:crypto";
2
1
  import { PolymorfaError, PolymorfaValidationError } from "../errors.js";
2
+ import { hexBytes, verifyWebhookHmac, webhookBodyBytes, } from "./crypto.js";
3
3
  import { KNOWN_WEBHOOK_EVENT_TYPES, } from "./events.js";
4
4
  export class WebhookSignatureError extends PolymorfaError {
5
5
  constructor() {
@@ -14,19 +14,18 @@ export async function verifyWebhookSignature(rawBody, signatureHeader, secret) {
14
14
  : signatureHeader;
15
15
  if (!/^[a-fA-F0-9]{64}$/.test(normalized) || secret.length === 0)
16
16
  return false;
17
- const expected = createHmac("sha256", secret)
18
- .update(toBuffer(rawBody))
19
- .digest();
20
- const actual = Buffer.from(normalized, "hex");
21
- return actual.length === expected.length && timingSafeEqual(actual, expected);
17
+ return verifyWebhookHmac(webhookBodyBytes(rawBody), hexBytes(normalized), secret);
22
18
  }
23
19
  export async function constructWebhookEvent(rawBody, signatureHeader, secret) {
24
20
  if (!(await verifyWebhookSignature(rawBody, signatureHeader, secret))) {
25
21
  throw new WebhookSignatureError();
26
22
  }
23
+ return parseVerifiedWebhookEvent(rawBody);
24
+ }
25
+ export function parseVerifiedWebhookEvent(rawBody) {
27
26
  let text;
28
27
  try {
29
- text = new TextDecoder("utf-8", { fatal: true }).decode(toBuffer(rawBody));
28
+ text = new TextDecoder("utf-8", { fatal: true }).decode(webhookBodyBytes(rawBody));
30
29
  }
31
30
  catch (cause) {
32
31
  throw new PolymorfaValidationError("Webhook body must contain valid UTF-8.", {
@@ -68,11 +67,4 @@ function isEventEnvelope(value) {
68
67
  function isNonEmptyString(value) {
69
68
  return typeof value === "string" && value.length > 0;
70
69
  }
71
- function toBuffer(body) {
72
- if (typeof body === "string")
73
- return Buffer.from(body, "utf8");
74
- if (body instanceof ArrayBuffer)
75
- return Buffer.from(body);
76
- return Buffer.from(body.buffer, body.byteOffset, body.byteLength);
77
- }
78
70
  //# sourceMappingURL=verify.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/webhooks/verify.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@polymorfa/sdk",
3
- "version": "0.1.0-dev.20260926234600",
4
- "description": "Handwritten Polymorfa server SDK for TypeScript and Node.js",
3
+ "version": "0.1.0-dev.20260926235309",
4
+ "description": "Handwritten Polymorfa server SDK for TypeScript, Node.js, and edge runtimes",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {