hooklatch 0.0.0-stage → 1.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 +438 -2
- package/dist/adapters/cloudflare.d.ts +11 -0
- package/dist/adapters/cloudflare.d.ts.map +1 -0
- package/dist/adapters/cloudflare.js +27 -0
- package/dist/adapters/cloudflare.js.map +1 -0
- package/dist/adapters/express.d.ts +9 -0
- package/dist/adapters/express.d.ts.map +1 -0
- package/dist/adapters/express.js +63 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/hono.d.ts +12 -0
- package/dist/adapters/hono.d.ts.map +1 -0
- package/dist/adapters/hono.js +28 -0
- package/dist/adapters/hono.js.map +1 -0
- package/dist/adapters/nextjs.d.ts +6 -0
- package/dist/adapters/nextjs.d.ts.map +1 -0
- package/dist/adapters/nextjs.js +56 -0
- package/dist/adapters/nextjs.js.map +1 -0
- package/dist/adapters/shared.d.ts +8 -0
- package/dist/adapters/shared.d.ts.map +1 -0
- package/dist/adapters/shared.js +53 -0
- package/dist/adapters/shared.js.map +1 -0
- package/dist/cjs/adapters/cloudflare.cjs +29 -0
- package/dist/cjs/adapters/cloudflare.d.cts +10 -0
- package/dist/cjs/adapters/express.cjs +65 -0
- package/dist/cjs/adapters/express.d.cts +8 -0
- package/dist/cjs/adapters/hono.cjs +30 -0
- package/dist/cjs/adapters/hono.d.cts +11 -0
- package/dist/cjs/adapters/nextjs.cjs +58 -0
- package/dist/cjs/adapters/nextjs.d.cts +5 -0
- package/dist/cjs/adapters/shared.cjs +58 -0
- package/dist/cjs/adapters/shared.d.cts +7 -0
- package/dist/cjs/core.cjs +30 -0
- package/dist/cjs/core.d.cts +5 -0
- package/dist/cjs/diagnostics/catalog.cjs +341 -0
- package/dist/cjs/diagnostics/catalog.d.cts +19 -0
- package/dist/cjs/diagnostics/index.cjs +90 -0
- package/dist/cjs/diagnostics/index.d.cts +5 -0
- package/dist/cjs/diagnostics/types.cjs +2 -0
- package/dist/cjs/diagnostics/types.d.cts +20 -0
- package/dist/cjs/errors.cjs +13 -0
- package/dist/cjs/errors.d.cts +6 -0
- package/dist/cjs/index.cjs +9 -0
- package/dist/cjs/index.d.cts +3 -0
- package/dist/cjs/internal/body.cjs +50 -0
- package/dist/cjs/internal/body.d.cts +2 -0
- package/dist/cjs/internal/bytes.cjs +43 -0
- package/dist/cjs/internal/bytes.d.cts +4 -0
- package/dist/cjs/internal/crypto.cjs +52 -0
- package/dist/cjs/internal/crypto.d.cts +3 -0
- package/dist/cjs/internal/headers.cjs +72 -0
- package/dist/cjs/internal/headers.d.cts +2 -0
- package/dist/cjs/internal/options.cjs +130 -0
- package/dist/cjs/internal/options.d.cts +7 -0
- package/dist/cjs/internal/prepare.cjs +11 -0
- package/dist/cjs/internal/prepare.d.cts +4 -0
- package/dist/cjs/internal/provider-options.cjs +72 -0
- package/dist/cjs/internal/provider-options.d.cts +6 -0
- package/dist/cjs/internal/provider.cjs +2 -0
- package/dist/cjs/internal/provider.d.cts +39 -0
- package/dist/cjs/internal/verification.cjs +71 -0
- package/dist/cjs/internal/verification.d.cts +12 -0
- package/dist/cjs/providers/clerk.cjs +15 -0
- package/dist/cjs/providers/clerk.d.cts +9 -0
- package/dist/cjs/providers/dodo-payments.cjs +26 -0
- package/dist/cjs/providers/dodo-payments.d.cts +20 -0
- package/dist/cjs/providers/doppler.cjs +71 -0
- package/dist/cjs/providers/doppler.d.cts +37 -0
- package/dist/cjs/providers/fal.cjs +80 -0
- package/dist/cjs/providers/fal.d.cts +13 -0
- package/dist/cjs/providers/github.cjs +52 -0
- package/dist/cjs/providers/github.d.cts +7 -0
- package/dist/cjs/providers/gitlab.cjs +26 -0
- package/dist/cjs/providers/gitlab.d.cts +20 -0
- package/dist/cjs/providers/grafana.cjs +180 -0
- package/dist/cjs/providers/grafana.d.cts +35 -0
- package/dist/cjs/providers/index.cjs +110 -0
- package/dist/cjs/providers/index.d.cts +26 -0
- package/dist/cjs/providers/lemon-squeezy.cjs +36 -0
- package/dist/cjs/providers/lemon-squeezy.d.cts +15 -0
- package/dist/cjs/providers/linear.cjs +58 -0
- package/dist/cjs/providers/linear.d.cts +36 -0
- package/dist/cjs/providers/paddle.cjs +105 -0
- package/dist/cjs/providers/paddle.d.cts +14 -0
- package/dist/cjs/providers/polar.cjs +80 -0
- package/dist/cjs/providers/polar.d.cts +25 -0
- package/dist/cjs/providers/razorpay.cjs +43 -0
- package/dist/cjs/providers/razorpay.d.cts +19 -0
- package/dist/cjs/providers/replicate.cjs +25 -0
- package/dist/cjs/providers/replicate.d.cts +19 -0
- package/dist/cjs/providers/sanity.cjs +161 -0
- package/dist/cjs/providers/sanity.d.cts +38 -0
- package/dist/cjs/providers/sentry.cjs +47 -0
- package/dist/cjs/providers/sentry.d.cts +25 -0
- package/dist/cjs/providers/shared.cjs +49 -0
- package/dist/cjs/providers/shared.d.cts +14 -0
- package/dist/cjs/providers/shopify.cjs +40 -0
- package/dist/cjs/providers/shopify.d.cts +8 -0
- package/dist/cjs/providers/standard-webhooks-protocol.cjs +97 -0
- package/dist/cjs/providers/standard-webhooks-protocol.d.cts +14 -0
- package/dist/cjs/providers/standard-webhooks.cjs +15 -0
- package/dist/cjs/providers/standard-webhooks.d.cts +9 -0
- package/dist/cjs/providers/stripe.cjs +81 -0
- package/dist/cjs/providers/stripe.d.cts +7 -0
- package/dist/cjs/providers/svix.cjs +63 -0
- package/dist/cjs/providers/svix.d.cts +9 -0
- package/dist/cjs/providers/vercel.cjs +39 -0
- package/dist/cjs/providers/vercel.d.cts +15 -0
- package/dist/cjs/providers/workos.cjs +120 -0
- package/dist/cjs/providers/workos.d.cts +32 -0
- package/dist/cjs/types.cjs +2 -0
- package/dist/cjs/types.d.cts +68 -0
- package/dist/cli/args.d.ts +86 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +358 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/filesystem.d.ts +15 -0
- package/dist/cli/filesystem.d.ts.map +1 -0
- package/dist/cli/filesystem.js +170 -0
- package/dist/cli/filesystem.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +64 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/templates.d.ts +13 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +297 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/core.d.ts +6 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +26 -0
- package/dist/core.js.map +1 -0
- package/dist/diagnostics/catalog.d.ts +20 -0
- package/dist/diagnostics/catalog.d.ts.map +1 -0
- package/dist/diagnostics/catalog.js +335 -0
- package/dist/diagnostics/catalog.js.map +1 -0
- package/dist/diagnostics/index.d.ts +6 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +88 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/types.d.ts +21 -0
- package/dist/diagnostics/types.d.ts.map +1 -0
- package/dist/diagnostics/types.js +2 -0
- package/dist/diagnostics/types.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +10 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/body.d.ts +3 -0
- package/dist/internal/body.d.ts.map +1 -0
- package/dist/internal/body.js +48 -0
- package/dist/internal/body.js.map +1 -0
- package/dist/internal/bytes.d.ts +5 -0
- package/dist/internal/bytes.d.ts.map +1 -0
- package/dist/internal/bytes.js +38 -0
- package/dist/internal/bytes.js.map +1 -0
- package/dist/internal/crypto.d.ts +4 -0
- package/dist/internal/crypto.d.ts.map +1 -0
- package/dist/internal/crypto.js +49 -0
- package/dist/internal/crypto.js.map +1 -0
- package/dist/internal/headers.d.ts +3 -0
- package/dist/internal/headers.d.ts.map +1 -0
- package/dist/internal/headers.js +70 -0
- package/dist/internal/headers.js.map +1 -0
- package/dist/internal/options.d.ts +8 -0
- package/dist/internal/options.d.ts.map +1 -0
- package/dist/internal/options.js +128 -0
- package/dist/internal/options.js.map +1 -0
- package/dist/internal/prepare.d.ts +5 -0
- package/dist/internal/prepare.d.ts.map +1 -0
- package/dist/internal/prepare.js +9 -0
- package/dist/internal/prepare.js.map +1 -0
- package/dist/internal/provider-options.d.ts +7 -0
- package/dist/internal/provider-options.d.ts.map +1 -0
- package/dist/internal/provider-options.js +69 -0
- package/dist/internal/provider-options.js.map +1 -0
- package/dist/internal/provider.d.ts +40 -0
- package/dist/internal/provider.d.ts.map +1 -0
- package/dist/internal/provider.js +2 -0
- package/dist/internal/provider.js.map +1 -0
- package/dist/internal/verification.d.ts +13 -0
- package/dist/internal/verification.d.ts.map +1 -0
- package/dist/internal/verification.js +66 -0
- package/dist/internal/verification.js.map +1 -0
- package/dist/node/adapters/cloudflare.d.ts +1 -0
- package/dist/node/adapters/cloudflare.js +3 -0
- package/dist/node/adapters/express.d.ts +1 -0
- package/dist/node/adapters/express.js +3 -0
- package/dist/node/adapters/hono.d.ts +1 -0
- package/dist/node/adapters/hono.js +3 -0
- package/dist/node/adapters/nextjs.d.ts +1 -0
- package/dist/node/adapters/nextjs.js +3 -0
- package/dist/node/diagnostics/index.d.ts +1 -0
- package/dist/node/diagnostics/index.js +3 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.js +6 -0
- package/dist/providers/clerk.d.ts +10 -0
- package/dist/providers/clerk.d.ts.map +1 -0
- package/dist/providers/clerk.js +13 -0
- package/dist/providers/clerk.js.map +1 -0
- package/dist/providers/dodo-payments.d.ts +21 -0
- package/dist/providers/dodo-payments.d.ts.map +1 -0
- package/dist/providers/dodo-payments.js +24 -0
- package/dist/providers/dodo-payments.js.map +1 -0
- package/dist/providers/doppler.d.ts +38 -0
- package/dist/providers/doppler.d.ts.map +1 -0
- package/dist/providers/doppler.js +69 -0
- package/dist/providers/doppler.js.map +1 -0
- package/dist/providers/fal.d.ts +14 -0
- package/dist/providers/fal.d.ts.map +1 -0
- package/dist/providers/fal.js +78 -0
- package/dist/providers/fal.js.map +1 -0
- package/dist/providers/github.d.ts +8 -0
- package/dist/providers/github.d.ts.map +1 -0
- package/dist/providers/github.js +50 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/gitlab.d.ts +21 -0
- package/dist/providers/gitlab.d.ts.map +1 -0
- package/dist/providers/gitlab.js +24 -0
- package/dist/providers/gitlab.js.map +1 -0
- package/dist/providers/grafana.d.ts +36 -0
- package/dist/providers/grafana.d.ts.map +1 -0
- package/dist/providers/grafana.js +178 -0
- package/dist/providers/grafana.js.map +1 -0
- package/dist/providers/index.d.ts +27 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +89 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/lemon-squeezy.d.ts +16 -0
- package/dist/providers/lemon-squeezy.d.ts.map +1 -0
- package/dist/providers/lemon-squeezy.js +34 -0
- package/dist/providers/lemon-squeezy.js.map +1 -0
- package/dist/providers/linear.d.ts +37 -0
- package/dist/providers/linear.d.ts.map +1 -0
- package/dist/providers/linear.js +56 -0
- package/dist/providers/linear.js.map +1 -0
- package/dist/providers/paddle.d.ts +15 -0
- package/dist/providers/paddle.d.ts.map +1 -0
- package/dist/providers/paddle.js +103 -0
- package/dist/providers/paddle.js.map +1 -0
- package/dist/providers/polar.d.ts +26 -0
- package/dist/providers/polar.d.ts.map +1 -0
- package/dist/providers/polar.js +78 -0
- package/dist/providers/polar.js.map +1 -0
- package/dist/providers/razorpay.d.ts +20 -0
- package/dist/providers/razorpay.d.ts.map +1 -0
- package/dist/providers/razorpay.js +41 -0
- package/dist/providers/razorpay.js.map +1 -0
- package/dist/providers/replicate.d.ts +20 -0
- package/dist/providers/replicate.d.ts.map +1 -0
- package/dist/providers/replicate.js +23 -0
- package/dist/providers/replicate.js.map +1 -0
- package/dist/providers/sanity.d.ts +39 -0
- package/dist/providers/sanity.d.ts.map +1 -0
- package/dist/providers/sanity.js +159 -0
- package/dist/providers/sanity.js.map +1 -0
- package/dist/providers/sentry.d.ts +26 -0
- package/dist/providers/sentry.d.ts.map +1 -0
- package/dist/providers/sentry.js +45 -0
- package/dist/providers/sentry.js.map +1 -0
- package/dist/providers/shared.d.ts +15 -0
- package/dist/providers/shared.d.ts.map +1 -0
- package/dist/providers/shared.js +40 -0
- package/dist/providers/shared.js.map +1 -0
- package/dist/providers/shopify.d.ts +9 -0
- package/dist/providers/shopify.d.ts.map +1 -0
- package/dist/providers/shopify.js +38 -0
- package/dist/providers/shopify.js.map +1 -0
- package/dist/providers/standard-webhooks-protocol.d.ts +15 -0
- package/dist/providers/standard-webhooks-protocol.d.ts.map +1 -0
- package/dist/providers/standard-webhooks-protocol.js +95 -0
- package/dist/providers/standard-webhooks-protocol.js.map +1 -0
- package/dist/providers/standard-webhooks.d.ts +10 -0
- package/dist/providers/standard-webhooks.d.ts.map +1 -0
- package/dist/providers/standard-webhooks.js +13 -0
- package/dist/providers/standard-webhooks.js.map +1 -0
- package/dist/providers/stripe.d.ts +8 -0
- package/dist/providers/stripe.d.ts.map +1 -0
- package/dist/providers/stripe.js +79 -0
- package/dist/providers/stripe.js.map +1 -0
- package/dist/providers/svix.d.ts +10 -0
- package/dist/providers/svix.d.ts.map +1 -0
- package/dist/providers/svix.js +61 -0
- package/dist/providers/svix.js.map +1 -0
- package/dist/providers/vercel.d.ts +16 -0
- package/dist/providers/vercel.d.ts.map +1 -0
- package/dist/providers/vercel.js +37 -0
- package/dist/providers/vercel.js.map +1 -0
- package/dist/providers/workos.d.ts +33 -0
- package/dist/providers/workos.d.ts.map +1 -0
- package/dist/providers/workos.js +118 -0
- package/dist/providers/workos.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +200 -4
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function utf8(value) { return new TextEncoder().encode(value); }
|
|
2
|
+
export function concatBytes(...chunks) {
|
|
3
|
+
const output = new Uint8Array(chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0));
|
|
4
|
+
let offset = 0;
|
|
5
|
+
for (const chunk of chunks) {
|
|
6
|
+
output.set(chunk, offset);
|
|
7
|
+
offset += chunk.byteLength;
|
|
8
|
+
}
|
|
9
|
+
return output;
|
|
10
|
+
}
|
|
11
|
+
export function decodeHex(value) {
|
|
12
|
+
if (value.length % 2 !== 0 || !/^[\da-f]*$/i.test(value))
|
|
13
|
+
return null;
|
|
14
|
+
const output = new Uint8Array(value.length / 2);
|
|
15
|
+
for (let i = 0; i < output.length; i += 1)
|
|
16
|
+
output[i] = Number.parseInt(value.slice(i * 2, i * 2 + 2), 16);
|
|
17
|
+
return output;
|
|
18
|
+
}
|
|
19
|
+
export function decodeBase64(value) {
|
|
20
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(value))
|
|
21
|
+
return null;
|
|
22
|
+
const unpadded = value.replace(/=+$/, '');
|
|
23
|
+
if (unpadded.length % 4 === 1)
|
|
24
|
+
return null;
|
|
25
|
+
const padded = unpadded + '='.repeat((4 - unpadded.length % 4) % 4);
|
|
26
|
+
if (value.includes('=') && value !== padded)
|
|
27
|
+
return null;
|
|
28
|
+
try {
|
|
29
|
+
const binary = atob(padded);
|
|
30
|
+
if (btoa(binary) !== padded)
|
|
31
|
+
return null;
|
|
32
|
+
return Uint8Array.from(binary, (char) => char.charCodeAt(0));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=bytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/internal/bytes.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,IAAI,CAAC,KAAa,IAAgB,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE3F,MAAM,UAAU,WAAW,CAAC,GAAG,MAAoB;IACjD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAAC,CAAC;IAEtF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAE1G,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEpE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { HmacPolicy } from './provider.js';
|
|
2
|
+
export declare function verifyHmac(keys: readonly Uint8Array[], signatures: readonly Uint8Array[], content: Uint8Array, policy?: HmacPolicy): Promise<boolean>;
|
|
3
|
+
export declare function verifyEd25519(keys: readonly Uint8Array[], signatures: readonly Uint8Array[], content: Uint8Array): Promise<boolean>;
|
|
4
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/internal/crypto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,EACnF,MAAM,GAAE,UAAkE,GACzE,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,SAAS,UAAU,EAAE,EAAE,UAAU,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,UAAU,GAClF,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
function isUnsupported(error) {
|
|
3
|
+
return error !== null && typeof error === 'object' && 'name' in error && error.name === 'NotSupportedError';
|
|
4
|
+
}
|
|
5
|
+
export async function verifyHmac(keys, signatures, content, policy = { kind: 'hmac', hash: 'SHA-256', signatureBytes: 32 }) {
|
|
6
|
+
const subtle = globalThis.crypto?.subtle;
|
|
7
|
+
if (!subtle)
|
|
8
|
+
throw new HooklatchError('crypto-unavailable', 'Web Crypto is unavailable.');
|
|
9
|
+
try {
|
|
10
|
+
for (const bytes of keys) {
|
|
11
|
+
const key = await subtle.importKey('raw', new Uint8Array(bytes), { name: 'HMAC', hash: policy.hash }, false, ['verify']);
|
|
12
|
+
for (const signature of signatures) {
|
|
13
|
+
if (signature.byteLength !== policy.signatureBytes)
|
|
14
|
+
continue;
|
|
15
|
+
if (await subtle.verify('HMAC', key, new Uint8Array(signature), new Uint8Array(content)))
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (isUnsupported(error))
|
|
23
|
+
throw new HooklatchError('crypto-unavailable', 'Web Crypto is unavailable.');
|
|
24
|
+
throw new HooklatchError('internal', 'Cryptographic verification failed.');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function verifyEd25519(keys, signatures, content) {
|
|
28
|
+
const subtle = globalThis.crypto?.subtle;
|
|
29
|
+
if (!subtle)
|
|
30
|
+
throw new HooklatchError('crypto-unavailable', 'Web Crypto is unavailable.');
|
|
31
|
+
try {
|
|
32
|
+
for (const bytes of keys) {
|
|
33
|
+
const key = await subtle.importKey('raw', new Uint8Array(bytes), 'Ed25519', false, ['verify']);
|
|
34
|
+
for (const signature of signatures) {
|
|
35
|
+
if (signature.byteLength !== 64)
|
|
36
|
+
continue;
|
|
37
|
+
if (await subtle.verify('Ed25519', key, new Uint8Array(signature), new Uint8Array(content)))
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (isUnsupported(error))
|
|
45
|
+
throw new HooklatchError('crypto-unavailable', 'Web Crypto is unavailable.');
|
|
46
|
+
throw new HooklatchError('internal', 'Cryptographic verification failed.');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/internal/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,CAAC;AAC9G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAA2B,EAAE,UAAiC,EAAE,OAAmB,EACnF,SAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;IAE1E,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,cAAc,CAAC,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;IAE1F,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAEzH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM,CAAC,cAAc;oBAAE,SAAS;gBAE7D,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;YACxG,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;QAEvG,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAA2B,EAAE,UAAiC,EAAE,OAAmB;IAEnF,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;IAEzC,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,cAAc,CAAC,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;IAE1F,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE/F,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,SAAS,CAAC,UAAU,KAAK,EAAE;oBAAE,SAAS;gBAE1C,IAAI,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;YAC3G,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,cAAc,CAAC,oBAAoB,EAAE,4BAA4B,CAAC,CAAC;QAEvG,MAAM,IAAI,cAAc,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/internal/headers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA4B/C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,UAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA0C9F"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
function isHeaderName(name) {
|
|
3
|
+
return typeof name === 'string' && /^[!#$%&'*+.^_`|~\da-z-]+$/i.test(name);
|
|
4
|
+
}
|
|
5
|
+
function isHeaderValue(value, opaque) {
|
|
6
|
+
return typeof value === 'string' && (opaque || !/[\r\n\0]/.test(value));
|
|
7
|
+
}
|
|
8
|
+
function isHeaderRecord(input) {
|
|
9
|
+
return input !== null && typeof input === 'object';
|
|
10
|
+
}
|
|
11
|
+
function isHeaderValues(value) {
|
|
12
|
+
return Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
/** Opaque values are used only by fal so its signed-field grammar owns rejection. */
|
|
15
|
+
const FAL_HEADER_NAMES = new Set([
|
|
16
|
+
'x-fal-webhook-signature', 'x-fal-webhook-request-id',
|
|
17
|
+
'x-fal-webhook-user-id', 'x-fal-webhook-timestamp',
|
|
18
|
+
]);
|
|
19
|
+
function isFalHeaderName(name) {
|
|
20
|
+
return typeof name === 'string' && FAL_HEADER_NAMES.has(name.toLowerCase());
|
|
21
|
+
}
|
|
22
|
+
export function normalizeHeaders(input, opaqueValues = false) {
|
|
23
|
+
const result = new Map();
|
|
24
|
+
const invalid = () => { throw new HooklatchError('invalid-input', 'Invalid header input.'); };
|
|
25
|
+
const append = (name, value) => {
|
|
26
|
+
if (opaqueValues && !isFalHeaderName(name))
|
|
27
|
+
return;
|
|
28
|
+
if (!isHeaderName(name) || !isHeaderValue(value, opaqueValues))
|
|
29
|
+
invalid();
|
|
30
|
+
const key = name.toLowerCase();
|
|
31
|
+
const previous = result.get(key);
|
|
32
|
+
result.set(key, previous === undefined ? value : `${previous}, ${value}`);
|
|
33
|
+
};
|
|
34
|
+
if (input instanceof Headers) {
|
|
35
|
+
input.forEach((value, key) => append(key, value));
|
|
36
|
+
}
|
|
37
|
+
else if (Array.isArray(input)) {
|
|
38
|
+
for (const entry of input) {
|
|
39
|
+
if (!Array.isArray(entry) || entry.length !== 2)
|
|
40
|
+
invalid();
|
|
41
|
+
append(entry[0], entry[1]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else if (isHeaderRecord(input)) {
|
|
45
|
+
const entries = [];
|
|
46
|
+
if (opaqueValues) {
|
|
47
|
+
for (const key of Object.keys(input)) {
|
|
48
|
+
if (isFalHeaderName(key))
|
|
49
|
+
entries.push([key, input[key]]);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else
|
|
53
|
+
entries.push(...Object.entries(input));
|
|
54
|
+
for (const [key, value] of entries) {
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
continue;
|
|
57
|
+
if (isHeaderValues(value)) {
|
|
58
|
+
for (const item of value)
|
|
59
|
+
append(key, item);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
append(key, value);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
invalid();
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/internal/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,MAAe;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc,CAAC,KAAkB;IACxC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACrD,CAAC;AAED,SAAS,cAAc,CAAC,KAAiC;IACvD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED,qFAAqF;AACrF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,yBAAyB,EAAE,0BAA0B;IACrD,uBAAuB,EAAE,yBAAyB;CACnD,CAAC,CAAC;AAEH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,YAAY,GAAG,KAAK;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,OAAO,GAAG,GAAU,EAAE,GAAG,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;IAErG,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAa,EAAQ,EAAE;QACnD,IAAI,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAAE,OAAO;QAEnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC;YAAE,OAAO,EAAE,CAAC;QAE1E,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,MAAM,OAAO,GAAuD,EAAE,CAAC;QAEvE,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,IAAI,eAAe,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;;YAAM,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAElC,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;oBAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;;QAAM,OAAO,EAAE,CAAC;IAEjB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { VerifyOptions } from '../types.js';
|
|
2
|
+
export type NormalizedOptions = VerifyOptions & {
|
|
3
|
+
readonly toleranceSeconds: number;
|
|
4
|
+
readonly maxBodyBytes: number;
|
|
5
|
+
readonly now: () => number;
|
|
6
|
+
};
|
|
7
|
+
export declare function normalizeOptions(options: VerifyOptions): NormalizedOptions;
|
|
8
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/internal/options.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,aAAa,CAAC;AAInE,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;CAC5B,CAAC;AAuFF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,iBAAiB,CA6D1E"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
import { SUPPORTED_PROVIDERS } from '../providers/index.js';
|
|
3
|
+
import { snapshotGrafanaOptions, snapshotPolarOptions } from './provider-options.js';
|
|
4
|
+
function isOptionsObject(options) {
|
|
5
|
+
return options !== null && typeof options === 'object' && !Array.isArray(options);
|
|
6
|
+
}
|
|
7
|
+
function isNonEmptySecret(secret) {
|
|
8
|
+
return typeof secret === 'string' && secret.length > 0;
|
|
9
|
+
}
|
|
10
|
+
function isClock(now) {
|
|
11
|
+
return typeof now === 'function';
|
|
12
|
+
}
|
|
13
|
+
function invalidOptions() {
|
|
14
|
+
throw new HooklatchError('invalid-options', 'Invalid verification options.');
|
|
15
|
+
}
|
|
16
|
+
function isUserId(value) {
|
|
17
|
+
return typeof value === 'string' && /^[\x21-\x2b\x2d-\x7e]{1,1024}$/.test(value);
|
|
18
|
+
}
|
|
19
|
+
/** Data descriptors avoid invoking credential accessors, including non-enumerable ones. */
|
|
20
|
+
function ownData(options, name) {
|
|
21
|
+
const property = observe(() => Object.getOwnPropertyDescriptor(options, name));
|
|
22
|
+
if (!property || !Object.hasOwn(property, 'value'))
|
|
23
|
+
invalidOptions();
|
|
24
|
+
return property;
|
|
25
|
+
}
|
|
26
|
+
function isKeyArray(value) {
|
|
27
|
+
return Array.isArray(value);
|
|
28
|
+
}
|
|
29
|
+
function snapshotFal(options) {
|
|
30
|
+
for (const field of ['secrets', 'secret', 'providerOptions']) {
|
|
31
|
+
if (observe(() => Object.hasOwn(options, field)))
|
|
32
|
+
invalidOptions();
|
|
33
|
+
}
|
|
34
|
+
const input = ownData(options, 'publicKeys').value;
|
|
35
|
+
const expectedUserId = ownData(options, 'expectedUserId').value;
|
|
36
|
+
if (!isUserId(expectedUserId))
|
|
37
|
+
invalidOptions();
|
|
38
|
+
const values = observe(() => {
|
|
39
|
+
if (!isKeyArray(input))
|
|
40
|
+
invalidOptions();
|
|
41
|
+
return input;
|
|
42
|
+
});
|
|
43
|
+
const length = observe(() => values.length);
|
|
44
|
+
if (!Number.isSafeInteger(length) || length < 1 || length > 16)
|
|
45
|
+
invalidOptions();
|
|
46
|
+
const publicKeys = [];
|
|
47
|
+
for (let index = 0; index < length; index++) {
|
|
48
|
+
const key = ownData(values, String(index)).value;
|
|
49
|
+
publicKeys.push(observe(() => {
|
|
50
|
+
if (!(key instanceof Uint8Array))
|
|
51
|
+
invalidOptions();
|
|
52
|
+
const bytes = new Uint8Array(32);
|
|
53
|
+
let offset = 0;
|
|
54
|
+
// The intrinsic iterator reads real view bytes and rejects proxies/detached views.
|
|
55
|
+
// Stop at byte 33 so malformed configuration cannot allocate an oversized copy.
|
|
56
|
+
for (const byte of Uint8Array.prototype.values.call(key)) {
|
|
57
|
+
if (offset === 32)
|
|
58
|
+
invalidOptions();
|
|
59
|
+
bytes[offset++] = byte;
|
|
60
|
+
}
|
|
61
|
+
if (offset !== 32)
|
|
62
|
+
invalidOptions();
|
|
63
|
+
return bytes;
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
return { publicKeys, expectedUserId };
|
|
67
|
+
}
|
|
68
|
+
/** Only observations of caller-owned data are caught; authored errors retain their codes. */
|
|
69
|
+
function observe(read) {
|
|
70
|
+
try {
|
|
71
|
+
return read();
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return invalidOptions();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function normalizeOptions(options) {
|
|
78
|
+
if (!observe(() => isOptionsObject(options)))
|
|
79
|
+
invalidOptions();
|
|
80
|
+
const provider = observe(() => options.provider);
|
|
81
|
+
if (!SUPPORTED_PROVIDERS.includes(provider)) {
|
|
82
|
+
throw new HooklatchError('unknown-provider', 'Unsupported webhook provider.');
|
|
83
|
+
}
|
|
84
|
+
const fal = provider === 'fal' ? snapshotFal(options) : undefined;
|
|
85
|
+
const secrets = provider === 'fal' ? [] : observe(() => options.secrets);
|
|
86
|
+
if (provider !== 'fal' && (!observe(() => Array.isArray(secrets)) || observe(() => secrets?.length) === 0)) {
|
|
87
|
+
throw new HooklatchError('missing-secrets', 'At least one signing secret is required.');
|
|
88
|
+
}
|
|
89
|
+
const secretSnapshot = observe(() => [...(secrets ?? [])]);
|
|
90
|
+
if (secretSnapshot.some((secret) => !isNonEmptySecret(secret))) {
|
|
91
|
+
throw new HooklatchError('invalid-secret', 'Invalid signing secret.');
|
|
92
|
+
}
|
|
93
|
+
const supplied = observe(() => Object.hasOwn(options, 'providerOptions'));
|
|
94
|
+
const configured = supplied ? observe(() => options.providerOptions) : undefined;
|
|
95
|
+
if (supplied && configured === undefined)
|
|
96
|
+
invalidOptions();
|
|
97
|
+
if (provider !== 'grafana' && provider !== 'polar' && supplied)
|
|
98
|
+
invalidOptions();
|
|
99
|
+
if (provider === 'vercel' && observe(() => Object.hasOwn(options, 'publicKeys') || Object.hasOwn(options, 'expectedUserId')))
|
|
100
|
+
invalidOptions();
|
|
101
|
+
const grafana = provider === 'grafana' ? observe(() => snapshotGrafanaOptions(configured)) : undefined;
|
|
102
|
+
const polar = provider === 'polar' && supplied ? observe(() => snapshotPolarOptions(configured)) : undefined;
|
|
103
|
+
const defaultTolerance = provider === 'paddle' ? 5 : provider === 'workos' ? 180 : 300;
|
|
104
|
+
const toleranceSeconds = observe(() => options.toleranceSeconds) ?? defaultTolerance;
|
|
105
|
+
const maxBodyBytes = observe(() => options.maxBodyBytes) ?? 1048576;
|
|
106
|
+
const now = observe(() => options.now);
|
|
107
|
+
if (!Number.isFinite(toleranceSeconds) || toleranceSeconds < 0
|
|
108
|
+
|| !Number.isSafeInteger(maxBodyBytes) || maxBodyBytes <= 0
|
|
109
|
+
|| (now !== undefined && !isClock(now)))
|
|
110
|
+
invalidOptions();
|
|
111
|
+
const common = { toleranceSeconds, maxBodyBytes,
|
|
112
|
+
now: now ?? (() => (provider === 'workos' || provider === 'sanity') ? Date.now() / 1000 : Math.floor(Date.now() / 1000)) };
|
|
113
|
+
if (provider === 'fal') {
|
|
114
|
+
if (fal === undefined)
|
|
115
|
+
invalidOptions();
|
|
116
|
+
return { ...common, provider, ...fal };
|
|
117
|
+
}
|
|
118
|
+
const hmac = { ...common, secrets: secretSnapshot };
|
|
119
|
+
if (provider === 'grafana') {
|
|
120
|
+
if (grafana === undefined)
|
|
121
|
+
invalidOptions();
|
|
122
|
+
return { ...hmac, provider, providerOptions: grafana };
|
|
123
|
+
}
|
|
124
|
+
if (provider === 'polar')
|
|
125
|
+
return { ...hmac, provider, ...(polar !== undefined && { providerOptions: polar }) };
|
|
126
|
+
return { ...hmac, provider };
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/internal/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { VerifyOptions } from '../types.js';
|
|
2
|
+
import type { PreparedVerifier } from './verification.js';
|
|
3
|
+
/** Shared preparation validates and snapshots trusted options before any request body is read. */
|
|
4
|
+
export declare function prepareVerification(options: VerifyOptions): PreparedVerifier;
|
|
5
|
+
//# sourceMappingURL=prepare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../../src/internal/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAI5E"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getProviderDescriptor } from '../providers/index.js';
|
|
2
|
+
import { normalizeOptions } from './options.js';
|
|
3
|
+
import { prepareVerifier } from './verification.js';
|
|
4
|
+
/** Shared preparation validates and snapshots trusted options before any request body is read. */
|
|
5
|
+
export function prepareVerification(options) {
|
|
6
|
+
const normalized = normalizeOptions(options);
|
|
7
|
+
return prepareVerifier(normalized, getProviderDescriptor(normalized.provider, normalized.providerOptions));
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=prepare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../src/internal/prepare.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,kGAAkG;AAClG,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,OAAO,eAAe,CAAC,UAAU,EAAE,qBAAqB,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;AAC7G,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GrafanaOptions, PolarOptions } from '../types.js';
|
|
2
|
+
type Configuration = GrafanaOptions | PolarOptions;
|
|
3
|
+
/** Read selected own properties exactly once, before validation or asynchronous work. */
|
|
4
|
+
export declare function snapshotGrafanaOptions(value: Configuration | undefined): GrafanaOptions;
|
|
5
|
+
export declare function snapshotPolarOptions(value: Configuration | undefined): PolarOptions;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=provider-options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-options.d.ts","sourceRoot":"","sources":["../../src/internal/provider-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhE,KAAK,aAAa,GAAG,cAAc,GAAG,YAAY,CAAC;AAoBnD,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,cAAc,CAqCvF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,CAYnF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
import { createGrafanaDescriptor } from '../providers/grafana.js';
|
|
3
|
+
function invalidOptions() {
|
|
4
|
+
throw new HooklatchError('invalid-options', 'Invalid provider options.');
|
|
5
|
+
}
|
|
6
|
+
function isConfiguration(value) {
|
|
7
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function isString(value) {
|
|
10
|
+
return typeof value === 'string';
|
|
11
|
+
}
|
|
12
|
+
function rejectUnexpectedKeys(value, allowed) {
|
|
13
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
14
|
+
if (Object.getOwnPropertyDescriptor(value, key)?.enumerable && !allowed.some((name) => name === key))
|
|
15
|
+
invalidOptions();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Read selected own properties exactly once, before validation or asynchronous work. */
|
|
19
|
+
export function snapshotGrafanaOptions(value) {
|
|
20
|
+
if (!isConfiguration(value))
|
|
21
|
+
invalidOptions();
|
|
22
|
+
rejectUnexpectedKeys(value, ['mode', 'signatureHeader', 'timestampHeader']);
|
|
23
|
+
if (!Object.hasOwn(value, 'mode') || !('mode' in value))
|
|
24
|
+
invalidOptions();
|
|
25
|
+
const mode = value.mode;
|
|
26
|
+
const hasSignature = Object.hasOwn(value, 'signatureHeader');
|
|
27
|
+
const signature = hasSignature && 'signatureHeader' in value ? value.signatureHeader : undefined;
|
|
28
|
+
if (hasSignature && !isString(signature))
|
|
29
|
+
invalidOptions();
|
|
30
|
+
const signatureOptions = signature !== undefined ? { signatureHeader: signature } : {};
|
|
31
|
+
let snapshot;
|
|
32
|
+
if (mode === 'body') {
|
|
33
|
+
if (Object.hasOwn(value, 'timestampHeader'))
|
|
34
|
+
invalidOptions();
|
|
35
|
+
snapshot = { mode, ...signatureOptions };
|
|
36
|
+
}
|
|
37
|
+
else if (mode === 'timestamped') {
|
|
38
|
+
if (!Object.hasOwn(value, 'timestampHeader') || !('timestampHeader' in value))
|
|
39
|
+
invalidOptions();
|
|
40
|
+
const timestamp = value.timestampHeader;
|
|
41
|
+
if (!isString(timestamp))
|
|
42
|
+
invalidOptions();
|
|
43
|
+
snapshot = { mode, ...signatureOptions, timestampHeader: timestamp };
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return invalidOptions();
|
|
47
|
+
}
|
|
48
|
+
// The pure factory remains the authority for RFC field names, reservations and collisions.
|
|
49
|
+
createGrafanaDescriptor(snapshot);
|
|
50
|
+
// Validate original code points first: Unicode case conversion can produce ASCII.
|
|
51
|
+
const normalizedSignature = signature !== undefined ? { signatureHeader: signature.toLowerCase() } : {};
|
|
52
|
+
return snapshot.mode === 'body'
|
|
53
|
+
? { mode: snapshot.mode, ...normalizedSignature }
|
|
54
|
+
: { mode: snapshot.mode, ...normalizedSignature, timestampHeader: snapshot.timestampHeader.toLowerCase() };
|
|
55
|
+
}
|
|
56
|
+
export function snapshotPolarOptions(value) {
|
|
57
|
+
if (!isConfiguration(value))
|
|
58
|
+
invalidOptions();
|
|
59
|
+
rejectUnexpectedKeys(value, ['secretMode']);
|
|
60
|
+
if (!Object.hasOwn(value, 'secretMode'))
|
|
61
|
+
return {};
|
|
62
|
+
if (!('secretMode' in value))
|
|
63
|
+
invalidOptions();
|
|
64
|
+
const secretMode = value.secretMode;
|
|
65
|
+
if (secretMode !== 'current' && secretMode !== 'legacy')
|
|
66
|
+
invalidOptions();
|
|
67
|
+
return { secretMode };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=provider-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-options.js","sourceRoot":"","sources":["../../src/internal/provider-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { EventIdentity, FailureDetails, Provider } from '../types.js';
|
|
2
|
+
export type NormalizedHeaders = ReadonlyMap<string, string>;
|
|
3
|
+
export interface ParsedSignature {
|
|
4
|
+
readonly ok: true;
|
|
5
|
+
readonly signatures: readonly Uint8Array[];
|
|
6
|
+
readonly signedContent: Uint8Array;
|
|
7
|
+
/** Untrusted until core signature verification succeeds. */
|
|
8
|
+
readonly identity: EventIdentity;
|
|
9
|
+
}
|
|
10
|
+
export type ParseResult = ParsedSignature | FailureDetails;
|
|
11
|
+
export type HmacPolicy = {
|
|
12
|
+
readonly kind: 'hmac';
|
|
13
|
+
readonly hash: 'SHA-1';
|
|
14
|
+
readonly signatureBytes: 20;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'hmac';
|
|
17
|
+
readonly hash: 'SHA-256';
|
|
18
|
+
readonly signatureBytes: 32;
|
|
19
|
+
};
|
|
20
|
+
export type FalParseResult = FailureDetails | (ParsedSignature & {
|
|
21
|
+
readonly recipient: string;
|
|
22
|
+
});
|
|
23
|
+
export interface FalProviderDescriptor {
|
|
24
|
+
readonly provider: 'fal';
|
|
25
|
+
readonly crypto: {
|
|
26
|
+
readonly kind: 'ed25519';
|
|
27
|
+
readonly signatureBytes: 64;
|
|
28
|
+
};
|
|
29
|
+
parse(headers: NormalizedHeaders, rawBody: Uint8Array): Promise<FalParseResult>;
|
|
30
|
+
}
|
|
31
|
+
export type AnyProviderDescriptor = ProviderDescriptor | FalProviderDescriptor;
|
|
32
|
+
export interface ProviderDescriptor {
|
|
33
|
+
readonly provider: Exclude<Provider, 'fal'>;
|
|
34
|
+
readonly crypto?: HmacPolicy;
|
|
35
|
+
/** Throw HooklatchError('invalid-secret') on invalid configuration. */
|
|
36
|
+
decodeSecret(secret: string): Uint8Array;
|
|
37
|
+
/** Parse and format only. Freshness and HMAC checks belong to core. */
|
|
38
|
+
parse(headers: NormalizedHeaders, rawBody: Uint8Array): ParseResult;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/internal/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE3E,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,SAAS,UAAU,EAAE,CAAC;IAC3C,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC;IACnC,4DAA4D;IAC5D,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC;AAED,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,cAAc,CAAC;AAE3D,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAA;CAAE,GAC9E;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAA;CAAE,CAAC;AAErF,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC,eAAe,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,CAAA;KAAE,CAAC;IAC3E,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACjF;AAED,MAAM,MAAM,qBAAqB,GAAG,kBAAkB,GAAG,qBAAqB,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IAC7B,uEAAuE;IACvE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC;IACzC,uEAAuE;IACvE,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,WAAW,CAAC;CACrE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/internal/provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FailureDetails, VerificationResult, VerifyOptions, WebhookRequest } from '../types.js';
|
|
2
|
+
import type { AnyProviderDescriptor } from './provider.js';
|
|
3
|
+
import type { NormalizedOptions } from './options.js';
|
|
4
|
+
export interface PreparedVerifier {
|
|
5
|
+
readonly options: NormalizedOptions;
|
|
6
|
+
readonly descriptor: AnyProviderDescriptor;
|
|
7
|
+
readonly keys: readonly Uint8Array[];
|
|
8
|
+
}
|
|
9
|
+
export declare function prepareVerifier(options: VerifyOptions, descriptor: AnyProviderDescriptor): PreparedVerifier;
|
|
10
|
+
export declare function readClock(prepared: PreparedVerifier): number;
|
|
11
|
+
export declare function failure(prepared: PreparedVerifier, reason: FailureDetails['reason'], message: string): VerificationResult;
|
|
12
|
+
export declare function verifyPrepared(request: WebhookRequest, prepared: PreparedVerifier, receivedAt?: number): Promise<VerificationResult>;
|
|
13
|
+
//# sourceMappingURL=verification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/internal/verification.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,UAAU,EAAE,CAAC;CACtC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,GAAG,gBAAgB,CAe3G;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAW5D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAEzH;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,SAAsB,GACpF,OAAO,CAAC,kBAAkB,CAAC,CA+B7B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
import { normalizeOptions } from './options.js';
|
|
3
|
+
import { normalizeHeaders } from './headers.js';
|
|
4
|
+
import { verifyHmac, verifyEd25519 } from './crypto.js';
|
|
5
|
+
export function prepareVerifier(options, descriptor) {
|
|
6
|
+
const normalized = normalizeOptions(options);
|
|
7
|
+
let keys;
|
|
8
|
+
if (normalized.provider === 'fal') {
|
|
9
|
+
if (descriptor.provider !== 'fal')
|
|
10
|
+
throw new HooklatchError('internal', 'Invalid provider configuration.');
|
|
11
|
+
keys = normalized.publicKeys;
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
if (descriptor.provider === 'fal')
|
|
15
|
+
throw new HooklatchError('internal', 'Invalid provider configuration.');
|
|
16
|
+
keys = normalized.secrets.map((secret) => new Uint8Array(descriptor.decodeSecret(secret)));
|
|
17
|
+
}
|
|
18
|
+
if (keys.some((key) => key.byteLength === 0))
|
|
19
|
+
throw new HooklatchError('invalid-secret', 'Invalid signing secret.');
|
|
20
|
+
return { options: normalized, descriptor, keys };
|
|
21
|
+
}
|
|
22
|
+
export function readClock(prepared) {
|
|
23
|
+
let now;
|
|
24
|
+
try {
|
|
25
|
+
now = prepared.options.now();
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new HooklatchError('invalid-options', 'Invalid verification clock.');
|
|
29
|
+
}
|
|
30
|
+
if (!Number.isFinite(now) || now < 0 || now > Number.MAX_SAFE_INTEGER) {
|
|
31
|
+
throw new HooklatchError('invalid-options', 'Invalid verification clock.');
|
|
32
|
+
}
|
|
33
|
+
return now;
|
|
34
|
+
}
|
|
35
|
+
export function failure(prepared, reason, message) {
|
|
36
|
+
return { ok: false, provider: prepared.options.provider, reason, message };
|
|
37
|
+
}
|
|
38
|
+
export async function verifyPrepared(request, prepared, receivedAt = readClock(prepared)) {
|
|
39
|
+
if (!request || !(request.rawBody instanceof Uint8Array))
|
|
40
|
+
throw new HooklatchError('invalid-input', 'Raw body must be a Uint8Array.');
|
|
41
|
+
if (request.rawBody.byteLength > prepared.options.maxBodyBytes)
|
|
42
|
+
return failure(prepared, 'body-too-large', 'Request body exceeds the configured limit.');
|
|
43
|
+
const rawBody = new Uint8Array(request.rawBody);
|
|
44
|
+
const headers = normalizeHeaders(request.headers, prepared.options.provider === 'fal');
|
|
45
|
+
const parsed = await prepared.descriptor.parse(headers, rawBody);
|
|
46
|
+
if (!parsed.ok)
|
|
47
|
+
return { ...parsed, provider: prepared.options.provider };
|
|
48
|
+
const valid = prepared.descriptor.provider === 'fal'
|
|
49
|
+
? await verifyEd25519(prepared.keys, parsed.signatures, parsed.signedContent)
|
|
50
|
+
: await verifyHmac(prepared.keys, parsed.signatures, parsed.signedContent, prepared.descriptor.crypto);
|
|
51
|
+
if (!valid || (prepared.options.provider === 'fal'
|
|
52
|
+
&& (!('recipient' in parsed) || parsed.recipient !== prepared.options.expectedUserId))) {
|
|
53
|
+
return failure(prepared, 'invalid-signature', 'Webhook signature is invalid.');
|
|
54
|
+
}
|
|
55
|
+
const timestamp = parsed.identity.timestamp;
|
|
56
|
+
if (timestamp !== null) {
|
|
57
|
+
const age = receivedAt - timestamp;
|
|
58
|
+
if (age > prepared.options.toleranceSeconds)
|
|
59
|
+
return failure(prepared, 'timestamp-expired', 'Webhook timestamp is outside the allowed past window.');
|
|
60
|
+
if (age < -prepared.options.toleranceSeconds)
|
|
61
|
+
return failure(prepared, 'timestamp-future', 'Webhook timestamp is outside the allowed future window.');
|
|
62
|
+
}
|
|
63
|
+
return { ok: true, provider: prepared.options.provider, rawBody,
|
|
64
|
+
identity: { ...parsed.identity, authenticatedFields: [...parsed.identity.authenticatedFields] } };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification.js","sourceRoot":"","sources":["../../src/internal/verification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../cjs/adapters/cloudflare.cjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../cjs/adapters/express.cjs";
|