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 @@
|
|
|
1
|
+
export * from "../../cjs/adapters/hono.cjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../cjs/adapters/nextjs.cjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../../cjs/diagnostics/index.cjs";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "../cjs/index.cjs";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import implementation from "../cjs/index.cjs";
|
|
2
|
+
|
|
3
|
+
export const HooklatchError = implementation.HooklatchError;
|
|
4
|
+
export const createVerifier = implementation.createVerifier;
|
|
5
|
+
export const verify = implementation.verify;
|
|
6
|
+
export const verifyRequest = implementation.verifyRequest;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clerk delivers Standard Webhooks payloads through Svix and its official
|
|
3
|
+
* helper reads only the branded `svix-*` headers. Canonical `webhook-*`
|
|
4
|
+
* headers are deliberately ignored and never repair a missing or invalid
|
|
5
|
+
* branded field.
|
|
6
|
+
*/
|
|
7
|
+
export declare const clerkDescriptor: {
|
|
8
|
+
readonly provider: "clerk";
|
|
9
|
+
} & Pick<import("../internal/provider.js").ProviderDescriptor, "decodeSecret" | "parse">;
|
|
10
|
+
//# sourceMappingURL=clerk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clerk.d.ts","sourceRoot":"","sources":["../../src/providers/clerk.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;wFAQ3B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createStandardWebhooksProtocol } from './standard-webhooks-protocol.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clerk delivers Standard Webhooks payloads through Svix and its official
|
|
4
|
+
* helper reads only the branded `svix-*` headers. Canonical `webhook-*`
|
|
5
|
+
* headers are deliberately ignored and never repair a missing or invalid
|
|
6
|
+
* branded field.
|
|
7
|
+
*/
|
|
8
|
+
export const clerkDescriptor = createStandardWebhooksProtocol('clerk', 'Clerk', {
|
|
9
|
+
id: 'svix-id',
|
|
10
|
+
timestamp: 'svix-timestamp',
|
|
11
|
+
signature: 'svix-signature',
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=clerk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clerk.js","sourceRoot":"","sources":["../../src/providers/clerk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAEjF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,8BAA8B,CAC3D,OAAO,EACP,OAAO,EACP;IACE,EAAE,EAAE,SAAS;IACb,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;CAC5B,CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dodo Payments delivers Standard Webhooks payloads with the canonical
|
|
3
|
+
* `webhook-id`, `webhook-timestamp` and `webhook-signature` headers. The
|
|
4
|
+
* secret is Base64-decoded (an optional `whsec_` prefix is stripped) and must
|
|
5
|
+
* decode to 24-64 bytes; the signature covers the exact
|
|
6
|
+
* `${webhook-id}.${webhook-timestamp}.` bytes followed by the raw body.
|
|
7
|
+
*
|
|
8
|
+
* These headers authenticate protocol bytes, not a unique Dodo identity: a
|
|
9
|
+
* signature minted by any other canonical alias verifies here when the same
|
|
10
|
+
* secret is configured. Use endpoint-specific secrets and route configuration
|
|
11
|
+
* to prevent cross-endpoint replay. No event payload is parsed and no
|
|
12
|
+
* resource id is inferred.
|
|
13
|
+
*
|
|
14
|
+
* No Dodo Payments-published signature vector is claimed; the direct tests use
|
|
15
|
+
* synthetic anchors. Source:
|
|
16
|
+
* https://docs.dodopayments.com/developer-resources/webhooks
|
|
17
|
+
*/
|
|
18
|
+
export declare const dodoPaymentsDescriptor: {
|
|
19
|
+
readonly provider: "dodo-payments";
|
|
20
|
+
} & Pick<import("../internal/provider.js").ProviderDescriptor, "decodeSecret" | "parse">;
|
|
21
|
+
//# sourceMappingURL=dodo-payments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dodo-payments.d.ts","sourceRoot":"","sources":["../../src/providers/dodo-payments.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,sBAAsB;;wFAQlC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createStandardWebhooksProtocol } from './standard-webhooks-protocol.js';
|
|
2
|
+
/**
|
|
3
|
+
* Dodo Payments delivers Standard Webhooks payloads with the canonical
|
|
4
|
+
* `webhook-id`, `webhook-timestamp` and `webhook-signature` headers. The
|
|
5
|
+
* secret is Base64-decoded (an optional `whsec_` prefix is stripped) and must
|
|
6
|
+
* decode to 24-64 bytes; the signature covers the exact
|
|
7
|
+
* `${webhook-id}.${webhook-timestamp}.` bytes followed by the raw body.
|
|
8
|
+
*
|
|
9
|
+
* These headers authenticate protocol bytes, not a unique Dodo identity: a
|
|
10
|
+
* signature minted by any other canonical alias verifies here when the same
|
|
11
|
+
* secret is configured. Use endpoint-specific secrets and route configuration
|
|
12
|
+
* to prevent cross-endpoint replay. No event payload is parsed and no
|
|
13
|
+
* resource id is inferred.
|
|
14
|
+
*
|
|
15
|
+
* No Dodo Payments-published signature vector is claimed; the direct tests use
|
|
16
|
+
* synthetic anchors. Source:
|
|
17
|
+
* https://docs.dodopayments.com/developer-resources/webhooks
|
|
18
|
+
*/
|
|
19
|
+
export const dodoPaymentsDescriptor = createStandardWebhooksProtocol('dodo-payments', 'Dodo Payments', {
|
|
20
|
+
id: 'webhook-id',
|
|
21
|
+
timestamp: 'webhook-timestamp',
|
|
22
|
+
signature: 'webhook-signature',
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=dodo-payments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dodo-payments.js","sourceRoot":"","sources":["../../src/providers/dodo-payments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,8BAA8B,CAClE,eAAe,EACf,eAAe,EACf;IACE,EAAE,EAAE,YAAY;IAChB,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;CAC/B,CACF,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { NormalizedHeaders, ParseResult } from '../internal/provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* Doppler `X-Doppler-Signature: sha256=<hex HMAC-SHA256(raw request body)>`.
|
|
4
|
+
*
|
|
5
|
+
* Doppler documents exactly one `<scheme>=<64 hex>` value; there is no list and
|
|
6
|
+
* no unknown-field tolerance. The complete value is validated before the scheme
|
|
7
|
+
* decision, so a well-formed digest under another scheme token (`sha1=<64 hex>`)
|
|
8
|
+
* fails as `unsupported-scheme`, while any nonconforming syntax — wrong length,
|
|
9
|
+
* non-hex, bare hex, commas, extra equals, empty digest, or outer whitespace —
|
|
10
|
+
* fails as `malformed-signature`. `sha256=` is case-sensitive; `SHA256=<64 hex>`
|
|
11
|
+
* is a different scheme and therefore unsupported.
|
|
12
|
+
*
|
|
13
|
+
* The secret is the literal, untrimmed UTF-8 text of the webhook `Secret`. It is
|
|
14
|
+
* never Base64-decoded and no `whsec_`-style prefix is inferred, so an empty
|
|
15
|
+
* secret is an invalid configuration rather than an encoded empty key.
|
|
16
|
+
*
|
|
17
|
+
* The HMAC covers the exact raw body only; no timestamp or identifier is
|
|
18
|
+
* included in the MAC, so every identity field is null and
|
|
19
|
+
* `authenticatedFields` is empty: this descriptor never establishes freshness and
|
|
20
|
+
* offers no replay protection. Signing is optional on the Doppler side, so a
|
|
21
|
+
* delivery without a configured secret carries no signature and cannot be
|
|
22
|
+
* verified; there is no Basic/Bearer or unsigned fallback path here.
|
|
23
|
+
*
|
|
24
|
+
* The Doppler docs' Node example re-serializes with `JSON.stringify(req.body)`.
|
|
25
|
+
* This descriptor authenticates the received bytes instead, so a caller that has
|
|
26
|
+
* already parsed the body cannot reliably reconstruct the signed content and
|
|
27
|
+
* should pass the original bytes.
|
|
28
|
+
*
|
|
29
|
+
* Source: https://docs.doppler.com/docs/webhooks
|
|
30
|
+
*
|
|
31
|
+
* No Doppler-published signature tuple was located; test anchors are synthetic.
|
|
32
|
+
*/
|
|
33
|
+
export declare const dopplerDescriptor: {
|
|
34
|
+
provider: "doppler";
|
|
35
|
+
decodeSecret(secret: string): Uint8Array;
|
|
36
|
+
parse(headers: NormalizedHeaders, rawBody: Uint8Array): ParseResult;
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=doppler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doppler.d.ts","sourceRoot":"","sources":["../../src/providers/doppler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAsB,MAAM,yBAAyB,CAAC;AAOlG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,iBAAiB;;yBAGP,MAAM,GAAG,UAAU;mBAIzB,iBAAiB,WAAW,UAAU,GAAG,WAAW;CAoC4B,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { decodeHexSignature, decodeLiteralSecret, failure, isSchemeToken } from './shared.js';
|
|
2
|
+
const SIGNATURE_HEADER = 'x-doppler-signature';
|
|
3
|
+
const SIGNATURE_SCHEME = 'sha256';
|
|
4
|
+
/**
|
|
5
|
+
* Doppler `X-Doppler-Signature: sha256=<hex HMAC-SHA256(raw request body)>`.
|
|
6
|
+
*
|
|
7
|
+
* Doppler documents exactly one `<scheme>=<64 hex>` value; there is no list and
|
|
8
|
+
* no unknown-field tolerance. The complete value is validated before the scheme
|
|
9
|
+
* decision, so a well-formed digest under another scheme token (`sha1=<64 hex>`)
|
|
10
|
+
* fails as `unsupported-scheme`, while any nonconforming syntax — wrong length,
|
|
11
|
+
* non-hex, bare hex, commas, extra equals, empty digest, or outer whitespace —
|
|
12
|
+
* fails as `malformed-signature`. `sha256=` is case-sensitive; `SHA256=<64 hex>`
|
|
13
|
+
* is a different scheme and therefore unsupported.
|
|
14
|
+
*
|
|
15
|
+
* The secret is the literal, untrimmed UTF-8 text of the webhook `Secret`. It is
|
|
16
|
+
* never Base64-decoded and no `whsec_`-style prefix is inferred, so an empty
|
|
17
|
+
* secret is an invalid configuration rather than an encoded empty key.
|
|
18
|
+
*
|
|
19
|
+
* The HMAC covers the exact raw body only; no timestamp or identifier is
|
|
20
|
+
* included in the MAC, so every identity field is null and
|
|
21
|
+
* `authenticatedFields` is empty: this descriptor never establishes freshness and
|
|
22
|
+
* offers no replay protection. Signing is optional on the Doppler side, so a
|
|
23
|
+
* delivery without a configured secret carries no signature and cannot be
|
|
24
|
+
* verified; there is no Basic/Bearer or unsigned fallback path here.
|
|
25
|
+
*
|
|
26
|
+
* The Doppler docs' Node example re-serializes with `JSON.stringify(req.body)`.
|
|
27
|
+
* This descriptor authenticates the received bytes instead, so a caller that has
|
|
28
|
+
* already parsed the body cannot reliably reconstruct the signed content and
|
|
29
|
+
* should pass the original bytes.
|
|
30
|
+
*
|
|
31
|
+
* Source: https://docs.doppler.com/docs/webhooks
|
|
32
|
+
*
|
|
33
|
+
* No Doppler-published signature tuple was located; test anchors are synthetic.
|
|
34
|
+
*/
|
|
35
|
+
export const dopplerDescriptor = {
|
|
36
|
+
provider: 'doppler',
|
|
37
|
+
decodeSecret(secret) {
|
|
38
|
+
return decodeLiteralSecret(secret, 'Doppler');
|
|
39
|
+
},
|
|
40
|
+
parse(headers, rawBody) {
|
|
41
|
+
const raw = headers.get(SIGNATURE_HEADER);
|
|
42
|
+
if (raw === undefined || raw.trim() === '') {
|
|
43
|
+
return failure('missing-signature', 'No Doppler signature header was provided.');
|
|
44
|
+
}
|
|
45
|
+
// Validate the whole value first: exactly one `=`, a nonempty scheme token,
|
|
46
|
+
// and a nonempty digest. `decodeHexSignature` accepts either hex case but
|
|
47
|
+
// requires exactly 64 hex characters (32 bytes).
|
|
48
|
+
const separator = raw.indexOf('=');
|
|
49
|
+
if (separator <= 0 || separator === raw.length - 1 || raw.indexOf('=', separator + 1) !== -1) {
|
|
50
|
+
return failure('malformed-signature', 'The Doppler signature header is malformed.');
|
|
51
|
+
}
|
|
52
|
+
const scheme = raw.slice(0, separator);
|
|
53
|
+
const signature = decodeHexSignature(raw.slice(separator + 1));
|
|
54
|
+
if (!isSchemeToken(scheme) || signature === null) {
|
|
55
|
+
return failure('malformed-signature', 'The Doppler signature header is malformed.');
|
|
56
|
+
}
|
|
57
|
+
if (scheme !== SIGNATURE_SCHEME) {
|
|
58
|
+
return failure('unsupported-scheme', 'The Doppler signature scheme is not supported.');
|
|
59
|
+
}
|
|
60
|
+
const identity = {
|
|
61
|
+
deliveryId: null,
|
|
62
|
+
eventId: null,
|
|
63
|
+
timestamp: null,
|
|
64
|
+
authenticatedFields: [],
|
|
65
|
+
};
|
|
66
|
+
return { ok: true, signatures: [signature], signedContent: rawBody, identity };
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=doppler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doppler.js","sourceRoot":"","sources":["../../src/providers/doppler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9F,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAC/C,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,SAAS;IAEnB,YAAY,CAAC,MAAc;QACzB,OAAO,mBAAmB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAA0B,EAAE,OAAmB;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE1C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3C,OAAO,OAAO,CAAC,mBAAmB,EAAE,2CAA2C,CAAC,CAAC;QACnF,CAAC;QAED,4EAA4E;QAC5E,0EAA0E;QAC1E,iDAAiD;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7F,OAAO,OAAO,CAAC,qBAAqB,EAAE,4CAA4C,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO,OAAO,CAAC,qBAAqB,EAAE,4CAA4C,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,oBAAoB,EAAE,gDAAgD,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,QAAQ,GAAkB;YAC9B,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,mBAAmB,EAAE,EAAE;SACxB,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACjF,CAAC;CAC8F,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FalParseResult, NormalizedHeaders } from '../internal/provider.js';
|
|
2
|
+
/** Static-key fal webhook formatting only; key authentication belongs to core.
|
|
3
|
+
* https://fal.ai/docs/documentation/model-apis/inference/webhooks
|
|
4
|
+
* Strict ID and hex grammars are Hooklatch receiver policy, not vendor parity.
|
|
5
|
+
*/
|
|
6
|
+
export declare const falDescriptor: {
|
|
7
|
+
provider: "fal";
|
|
8
|
+
crypto: {
|
|
9
|
+
kind: "ed25519";
|
|
10
|
+
signatureBytes: 64;
|
|
11
|
+
};
|
|
12
|
+
parse(headers: NormalizedHeaders, rawBody: Uint8Array): Promise<FalParseResult>;
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=fal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fal.d.ts","sourceRoot":"","sources":["../../src/providers/fal.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAyB,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAIxG;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;mBAIH,iBAAiB,WAAW,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;CAwDtD,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
import { utf8 } from '../internal/bytes.js';
|
|
3
|
+
import { failure, isCanonicalTimestamp } from './shared.js';
|
|
4
|
+
/** Static-key fal webhook formatting only; key authentication belongs to core.
|
|
5
|
+
* https://fal.ai/docs/documentation/model-apis/inference/webhooks
|
|
6
|
+
* Strict ID and hex grammars are Hooklatch receiver policy, not vendor parity.
|
|
7
|
+
*/
|
|
8
|
+
export const falDescriptor = {
|
|
9
|
+
provider: 'fal',
|
|
10
|
+
crypto: { kind: 'ed25519', signatureBytes: 64 },
|
|
11
|
+
async parse(headers, rawBody) {
|
|
12
|
+
const signatureRaw = headers.get('x-fal-webhook-signature');
|
|
13
|
+
const requestId = headers.get('x-fal-webhook-request-id');
|
|
14
|
+
const userId = headers.get('x-fal-webhook-user-id');
|
|
15
|
+
const timestamp = headers.get('x-fal-webhook-timestamp');
|
|
16
|
+
if (signatureRaw === undefined || signatureRaw.trim() === '') {
|
|
17
|
+
return failure('missing-signature', 'No fal signature header was provided.');
|
|
18
|
+
}
|
|
19
|
+
const signature = decodeSignature(signatureRaw);
|
|
20
|
+
if (signature === null)
|
|
21
|
+
return malformed();
|
|
22
|
+
// Presence of both IDs takes precedence over grammar of either ID.
|
|
23
|
+
if (requestId === undefined || requestId.trim() === '') {
|
|
24
|
+
return failure('missing-identity', 'No fal request identity was provided.');
|
|
25
|
+
}
|
|
26
|
+
if (userId === undefined || userId.trim() === '') {
|
|
27
|
+
return failure('missing-identity', 'No fal user identity was provided.');
|
|
28
|
+
}
|
|
29
|
+
if (!isIdentity(requestId) || !isIdentity(userId))
|
|
30
|
+
return malformed();
|
|
31
|
+
if (timestamp === undefined || timestamp.trim() === '') {
|
|
32
|
+
return failure('missing-timestamp', 'No fal timestamp was provided.');
|
|
33
|
+
}
|
|
34
|
+
if (!isCanonicalTimestamp(timestamp))
|
|
35
|
+
return malformed();
|
|
36
|
+
const body = new Uint8Array(rawBody);
|
|
37
|
+
const subtle = globalThis.crypto?.subtle;
|
|
38
|
+
if (!subtle)
|
|
39
|
+
throw new HooklatchError('crypto-unavailable', 'Web Crypto is unavailable.');
|
|
40
|
+
let digest;
|
|
41
|
+
try {
|
|
42
|
+
digest = await subtle.digest('SHA-256', body);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (isUnsupported(error)) {
|
|
46
|
+
throw new HooklatchError('crypto-unavailable', 'Web Crypto is unavailable.');
|
|
47
|
+
}
|
|
48
|
+
throw new HooklatchError('internal', 'Cryptographic verification failed.');
|
|
49
|
+
}
|
|
50
|
+
const hex = Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, '0')).join('');
|
|
51
|
+
return {
|
|
52
|
+
ok: true, signatures: [signature],
|
|
53
|
+
signedContent: utf8(`${requestId}\n${userId}\n${timestamp}\n${hex}`),
|
|
54
|
+
recipient: userId,
|
|
55
|
+
identity: { deliveryId: null, eventId: null, timestamp: Number(timestamp), authenticatedFields: ['timestamp'] },
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
function malformed() {
|
|
60
|
+
return failure('malformed-signature', 'The fal signature headers are malformed.');
|
|
61
|
+
}
|
|
62
|
+
/** DOM exceptions may originate outside this realm. */
|
|
63
|
+
function isUnsupported(error) {
|
|
64
|
+
return error !== null && typeof error === 'object' && 'name' in error && error.name === 'NotSupportedError';
|
|
65
|
+
}
|
|
66
|
+
function isIdentity(value) {
|
|
67
|
+
return /^[\x21-\x7e]{1,1024}$/.test(value) && !value.includes(',');
|
|
68
|
+
}
|
|
69
|
+
function decodeSignature(value) {
|
|
70
|
+
if (!/^[a-fA-F0-9]{128}$/.test(value))
|
|
71
|
+
return null;
|
|
72
|
+
const bytes = new Uint8Array(64);
|
|
73
|
+
for (let index = 0; index < bytes.length; index++) {
|
|
74
|
+
bytes[index] = Number.parseInt(value.slice(index * 2, index * 2 + 2), 16);
|
|
75
|
+
}
|
|
76
|
+
return bytes;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=fal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fal.js","sourceRoot":"","sources":["../../src/providers/fal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProviderDescriptor } from '../internal/provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* GitHub `X-Hub-Signature-256: sha256=<hex>` over the raw body only. The legacy
|
|
4
|
+
* `X-Hub-Signature: sha1=<hex>` is recognized but never treated as SHA-256.
|
|
5
|
+
* `X-GitHub-Delivery` is unsigned metadata and never proves authenticity.
|
|
6
|
+
*/
|
|
7
|
+
export declare const githubDescriptor: ProviderDescriptor;
|
|
8
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/providers/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAelG;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBA+C9B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { decodeHexSignature, decodeLiteralSecret, failure } from './shared.js';
|
|
2
|
+
const SIGNATURE_HEADER = 'x-hub-signature-256';
|
|
3
|
+
const LEGACY_SIGNATURE_HEADER = 'x-hub-signature';
|
|
4
|
+
const SCHEME = 'sha256';
|
|
5
|
+
const DELIVERY_HEADER = 'x-github-delivery';
|
|
6
|
+
function optionalHeader(headers, name) {
|
|
7
|
+
const value = headers.get(name);
|
|
8
|
+
return value === undefined || value === '' ? null : value;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* GitHub `X-Hub-Signature-256: sha256=<hex>` over the raw body only. The legacy
|
|
12
|
+
* `X-Hub-Signature: sha1=<hex>` is recognized but never treated as SHA-256.
|
|
13
|
+
* `X-GitHub-Delivery` is unsigned metadata and never proves authenticity.
|
|
14
|
+
*/
|
|
15
|
+
export const githubDescriptor = {
|
|
16
|
+
provider: 'github',
|
|
17
|
+
decodeSecret(secret) {
|
|
18
|
+
return decodeLiteralSecret(secret, 'GitHub');
|
|
19
|
+
},
|
|
20
|
+
parse(headers, rawBody) {
|
|
21
|
+
const raw = headers.get(SIGNATURE_HEADER);
|
|
22
|
+
if (raw === undefined || raw.trim() === '') {
|
|
23
|
+
const legacy = headers.get(LEGACY_SIGNATURE_HEADER);
|
|
24
|
+
if (legacy !== undefined && legacy.trim() !== '') {
|
|
25
|
+
return failure('unsupported-scheme', 'Only the legacy SHA-1 GitHub signature was provided.');
|
|
26
|
+
}
|
|
27
|
+
return failure('missing-signature', 'No GitHub signature header was provided.');
|
|
28
|
+
}
|
|
29
|
+
const separator = raw.indexOf('=');
|
|
30
|
+
if (separator <= 0 || separator === raw.length - 1) {
|
|
31
|
+
return failure('malformed-signature', 'The GitHub signature header is malformed.');
|
|
32
|
+
}
|
|
33
|
+
const scheme = raw.slice(0, separator);
|
|
34
|
+
if (scheme.toLowerCase() !== SCHEME) {
|
|
35
|
+
return failure('unsupported-scheme', 'No supported GitHub signature scheme was provided.');
|
|
36
|
+
}
|
|
37
|
+
const signature = decodeHexSignature(raw.slice(separator + 1));
|
|
38
|
+
if (signature === null) {
|
|
39
|
+
return failure('malformed-signature', 'The GitHub signature header is malformed.');
|
|
40
|
+
}
|
|
41
|
+
const identity = {
|
|
42
|
+
deliveryId: optionalHeader(headers, DELIVERY_HEADER),
|
|
43
|
+
eventId: null,
|
|
44
|
+
timestamp: null,
|
|
45
|
+
authenticatedFields: [],
|
|
46
|
+
};
|
|
47
|
+
return { ok: true, signatures: [signature], signedContent: rawBody, identity };
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/providers/github.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE/E,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAC/C,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAClD,MAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAE5C,SAAS,cAAc,CAAC,OAA0B,EAAE,IAAY;IAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAuB;IAClD,QAAQ,EAAE,QAAQ;IAElB,YAAY,CAAC,MAAc;QACzB,OAAO,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAA0B,EAAE,OAAmB;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAE1C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAEpD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;gBACjD,OAAO,OAAO,CAAC,oBAAoB,EAAE,sDAAsD,CAAC,CAAC;YAC/F,CAAC;YAED,OAAO,OAAO,CAAC,mBAAmB,EAAE,0CAA0C,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,SAAS,IAAI,CAAC,IAAI,SAAS,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,OAAO,CAAC,qBAAqB,EAAE,2CAA2C,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEvC,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,OAAO,CAAC,oBAAoB,EAAE,oDAAoD,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAE/D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,qBAAqB,EAAE,2CAA2C,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,QAAQ,GAAkB;YAC9B,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,eAAe,CAAC;YACpD,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI;YACf,mBAAmB,EAAE,EAAE;SACxB,CAAC;QAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACjF,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab signing-token mode (introduced in 19.0 behind a default-enabled flag
|
|
3
|
+
* and generally available in 19.1) sends the canonical Standard Webhooks
|
|
4
|
+
* `webhook-id`, `webhook-timestamp` and `webhook-signature` headers. The
|
|
5
|
+
* secret is Base64-decoded (an optional `whsec_` prefix is stripped) and must
|
|
6
|
+
* decode to 24-64 bytes; the signature covers the exact
|
|
7
|
+
* `${webhook-id}.${webhook-timestamp}.` bytes followed by the raw body.
|
|
8
|
+
*
|
|
9
|
+
* The legacy `X-Gitlab-Token` header is a shared string comparison, not an
|
|
10
|
+
* authenticated body signature. It is deliberately ignored: a legacy-token-only
|
|
11
|
+
* request fails closed, and adding that header can neither repair a canonical
|
|
12
|
+
* defect nor change which bytes were authenticated.
|
|
13
|
+
*
|
|
14
|
+
* No GitLab-published signing-token vector is claimed; the direct tests use
|
|
15
|
+
* synthetic anchors. Source:
|
|
16
|
+
* https://docs.gitlab.com/user/project/integrations/webhooks/#signing-tokens
|
|
17
|
+
*/
|
|
18
|
+
export declare const gitlabDescriptor: {
|
|
19
|
+
readonly provider: "gitlab";
|
|
20
|
+
} & Pick<import("../internal/provider.js").ProviderDescriptor, "decodeSecret" | "parse">;
|
|
21
|
+
//# sourceMappingURL=gitlab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../src/providers/gitlab.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,gBAAgB;;wFAQ5B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createStandardWebhooksProtocol } from './standard-webhooks-protocol.js';
|
|
2
|
+
/**
|
|
3
|
+
* GitLab signing-token mode (introduced in 19.0 behind a default-enabled flag
|
|
4
|
+
* and generally available in 19.1) sends the canonical Standard Webhooks
|
|
5
|
+
* `webhook-id`, `webhook-timestamp` and `webhook-signature` headers. The
|
|
6
|
+
* secret is Base64-decoded (an optional `whsec_` prefix is stripped) and must
|
|
7
|
+
* decode to 24-64 bytes; the signature covers the exact
|
|
8
|
+
* `${webhook-id}.${webhook-timestamp}.` bytes followed by the raw body.
|
|
9
|
+
*
|
|
10
|
+
* The legacy `X-Gitlab-Token` header is a shared string comparison, not an
|
|
11
|
+
* authenticated body signature. It is deliberately ignored: a legacy-token-only
|
|
12
|
+
* request fails closed, and adding that header can neither repair a canonical
|
|
13
|
+
* defect nor change which bytes were authenticated.
|
|
14
|
+
*
|
|
15
|
+
* No GitLab-published signing-token vector is claimed; the direct tests use
|
|
16
|
+
* synthetic anchors. Source:
|
|
17
|
+
* https://docs.gitlab.com/user/project/integrations/webhooks/#signing-tokens
|
|
18
|
+
*/
|
|
19
|
+
export const gitlabDescriptor = createStandardWebhooksProtocol('gitlab', 'GitLab', {
|
|
20
|
+
id: 'webhook-id',
|
|
21
|
+
timestamp: 'webhook-timestamp',
|
|
22
|
+
signature: 'webhook-signature',
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=gitlab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/providers/gitlab.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AAEjF;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAC5D,QAAQ,EACR,QAAQ,EACR;IACE,EAAE,EAAE,YAAY;IAChB,SAAS,EAAE,mBAAmB;IAC9B,SAAS,EAAE,mBAAmB;CAC/B,CACF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ProviderDescriptor } from '../internal/provider.js';
|
|
2
|
+
/**
|
|
3
|
+
* Receiver configuration for the Grafana alerting webhook HMAC.
|
|
4
|
+
*
|
|
5
|
+
* `mode` selects the signed layout. `body` signs the exact raw body.
|
|
6
|
+
* `timestamped` signs `${timestamp}:` followed by the exact raw body, where
|
|
7
|
+
* the timestamp is read from the configured timestamp header. The mode is
|
|
8
|
+
* always explicit: nothing is inferred from the request, and a missing
|
|
9
|
+
* timestamp never downgrades to the body-only layout.
|
|
10
|
+
*/
|
|
11
|
+
export type GrafanaDescriptorOptions = {
|
|
12
|
+
readonly mode: 'body';
|
|
13
|
+
readonly signatureHeader?: string;
|
|
14
|
+
readonly timestampHeader?: never;
|
|
15
|
+
} | {
|
|
16
|
+
readonly mode: 'timestamped';
|
|
17
|
+
readonly signatureHeader?: string;
|
|
18
|
+
readonly timestampHeader: string;
|
|
19
|
+
};
|
|
20
|
+
type GrafanaDescriptor = {
|
|
21
|
+
readonly provider: 'grafana';
|
|
22
|
+
} & Pick<ProviderDescriptor, 'decodeSecret' | 'parse'>;
|
|
23
|
+
/**
|
|
24
|
+
* Create a Grafana descriptor for the given receiver configuration.
|
|
25
|
+
*
|
|
26
|
+
* The configuration is trusted application input, never derived from a
|
|
27
|
+
* request. Header names select which header is read; they are lookup
|
|
28
|
+
* configuration and are not part of the signed bytes, so the same secret,
|
|
29
|
+
* body and timestamp produce the same MAC under any configured header name.
|
|
30
|
+
*
|
|
31
|
+
* The returned descriptor is not registered with the public provider
|
|
32
|
+
* registry; the coordinator owns that integration.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createGrafanaDescriptor(options: GrafanaDescriptorOptions): GrafanaDescriptor;
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=grafana.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grafana.d.ts","sourceRoot":"","sources":["../../src/providers/grafana.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkC,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAGlG;;;;;;;;GAQG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,CAAA;CAAE,GAC9F;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1G,KAAK,iBAAiB,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,GACrD,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC;AAyMvD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAc5F"}
|