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,335 @@
|
|
|
1
|
+
const VERIFICATION_GUIDANCE = {
|
|
2
|
+
'missing-signature': {
|
|
3
|
+
summary: 'The provider signature header was not present in the request.',
|
|
4
|
+
possibleCauses: [
|
|
5
|
+
'A proxy, load balancer, or middleware stripped the signature header.',
|
|
6
|
+
'The request was not actually sent by the provider.',
|
|
7
|
+
'The request was modified in transit.',
|
|
8
|
+
],
|
|
9
|
+
suggestions: [
|
|
10
|
+
'Check that no intermediary removes the signature header.',
|
|
11
|
+
'Verify the request originates from the provider documented IP ranges.',
|
|
12
|
+
'Compare expected header names with your middleware configuration.',
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
'malformed-signature': {
|
|
16
|
+
summary: 'Required signing headers were malformed or conflicted.',
|
|
17
|
+
possibleCauses: [
|
|
18
|
+
'The header value was truncated or altered by an intermediary.',
|
|
19
|
+
'The provider changed its header format.',
|
|
20
|
+
'The request was not actually sent by the provider.',
|
|
21
|
+
],
|
|
22
|
+
suggestions: [
|
|
23
|
+
'Compare the raw header value against the provider documentation.',
|
|
24
|
+
'Check for header-combining proxies that may merge or split values.',
|
|
25
|
+
'Use synthetic requests to compare header grammar without recording sensitive values.',
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
'unsupported-scheme': {
|
|
29
|
+
summary: 'Only unsupported or legacy signature schemes were present.',
|
|
30
|
+
possibleCauses: [
|
|
31
|
+
'The provider sent a legacy signature format (e.g. SHA-1).',
|
|
32
|
+
'The signature scheme version is not supported by this release.',
|
|
33
|
+
'The request was not actually sent by the provider.',
|
|
34
|
+
],
|
|
35
|
+
suggestions: [
|
|
36
|
+
'Check the provider documentation for supported signature schemes.',
|
|
37
|
+
'Ensure the provider is configured to send the current scheme version.',
|
|
38
|
+
'Update the SDK when a new scheme is required.',
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
'invalid-signature': {
|
|
42
|
+
summary: 'The signature was well-formed but did not authenticate.',
|
|
43
|
+
possibleCauses: [
|
|
44
|
+
'The configured secret does not match the provider endpoint secret.',
|
|
45
|
+
'A secret rotation is in progress and the old secret is still active at the provider.',
|
|
46
|
+
'The body was modified in transit, compressed, or re-serialized.',
|
|
47
|
+
'The wrong provider was selected for this request.',
|
|
48
|
+
'The request was not actually sent by the provider.',
|
|
49
|
+
],
|
|
50
|
+
suggestions: [
|
|
51
|
+
'Verify the configured secret matches the provider endpoint secret.',
|
|
52
|
+
'Check whether a secret rotation is in progress and include all active secrets.',
|
|
53
|
+
'Ensure the raw body is captured before any JSON parsing or re-serialization.',
|
|
54
|
+
'Confirm the correct provider is selected for this endpoint.',
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
'missing-identity': {
|
|
58
|
+
summary: 'A required identity metadata header was absent.',
|
|
59
|
+
possibleCauses: [
|
|
60
|
+
'The request was not actually sent by the provider.',
|
|
61
|
+
'An intermediary stripped the header.',
|
|
62
|
+
'The provider changed its header format.',
|
|
63
|
+
],
|
|
64
|
+
suggestions: [
|
|
65
|
+
'Compare the incoming headers with the provider documentation.',
|
|
66
|
+
'Check that no proxy or middleware removes the header.',
|
|
67
|
+
'Verify the request originates from the provider.',
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
'missing-timestamp': {
|
|
71
|
+
summary: 'A required signed timestamp header was absent.',
|
|
72
|
+
possibleCauses: [
|
|
73
|
+
'The request was not actually sent by the provider.',
|
|
74
|
+
'An intermediary stripped the header.',
|
|
75
|
+
'The provider changed its header format.',
|
|
76
|
+
],
|
|
77
|
+
suggestions: [
|
|
78
|
+
'Compare the incoming headers with the provider documentation.',
|
|
79
|
+
'Check that no proxy or middleware removes the header.',
|
|
80
|
+
'Verify the request originates from the provider.',
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
'timestamp-expired': {
|
|
84
|
+
summary: 'The signed timestamp is older than the configured tolerance.',
|
|
85
|
+
possibleCauses: [
|
|
86
|
+
'The request is a replay of an older delivery.',
|
|
87
|
+
'Clock skew exists between the provider and this host.',
|
|
88
|
+
'The body was delayed by a queue or retry mechanism.',
|
|
89
|
+
],
|
|
90
|
+
suggestions: [
|
|
91
|
+
'Check clock synchronization between provider and host.',
|
|
92
|
+
'Review provider delivery timing before changing the configured tolerance.',
|
|
93
|
+
'Investigate whether the request is a replay attack.',
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
'timestamp-future': {
|
|
97
|
+
summary: 'The signed timestamp is newer than the configured tolerance.',
|
|
98
|
+
possibleCauses: [
|
|
99
|
+
'Clock skew exists between the provider and this host.',
|
|
100
|
+
'The provider clock is ahead of this host.',
|
|
101
|
+
],
|
|
102
|
+
suggestions: [
|
|
103
|
+
'Check clock synchronization between provider and host.',
|
|
104
|
+
'Review provider clock behavior before changing the configured tolerance.',
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
'body-too-large': {
|
|
108
|
+
summary: 'The request body exceeded the configured size limit.',
|
|
109
|
+
possibleCauses: [
|
|
110
|
+
'The legitimate payload exceeds the configured maxBodyBytes.',
|
|
111
|
+
'The body was inflated by compression middleware.',
|
|
112
|
+
'A malicious or malformed request sent an oversized body.',
|
|
113
|
+
],
|
|
114
|
+
suggestions: [
|
|
115
|
+
'Increase maxBodyBytes if the provider legitimately sends larger payloads.',
|
|
116
|
+
'Check for compression middleware that may inflate the body.',
|
|
117
|
+
'Reject the request if the size is unexpected for this provider.',
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
/** Static guidance for setup/runtime error codes. */
|
|
122
|
+
const SETUP_GUIDANCE = {
|
|
123
|
+
'unknown-provider': {
|
|
124
|
+
summary: 'The specified provider is not supported.',
|
|
125
|
+
possibleCauses: [
|
|
126
|
+
'The provider name contains a typo.',
|
|
127
|
+
'The provider has not been added to the SDK yet.',
|
|
128
|
+
],
|
|
129
|
+
suggestions: [
|
|
130
|
+
'Check the provider name against the supported list.',
|
|
131
|
+
'Update the SDK to a version that supports the provider.',
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
'missing-secrets': {
|
|
135
|
+
summary: 'No signing secrets were configured.',
|
|
136
|
+
possibleCauses: [
|
|
137
|
+
'The secrets option was omitted.',
|
|
138
|
+
'The secrets array was empty.',
|
|
139
|
+
],
|
|
140
|
+
suggestions: [
|
|
141
|
+
'Provide at least one active signing secret.',
|
|
142
|
+
'Load secrets from environment variables or a secrets manager.',
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
'invalid-secret': {
|
|
146
|
+
summary: 'A configured secret failed validation.',
|
|
147
|
+
possibleCauses: [
|
|
148
|
+
'The secret is empty or contains only whitespace.',
|
|
149
|
+
'The secret format does not match the provider requirements.',
|
|
150
|
+
'The secret was copied incorrectly from the provider dashboard.',
|
|
151
|
+
],
|
|
152
|
+
suggestions: [
|
|
153
|
+
'Verify the secret matches the provider documentation format.',
|
|
154
|
+
'Check for trailing whitespace or newline characters.',
|
|
155
|
+
'Regenerate the secret at the provider if necessary.',
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
'invalid-options': {
|
|
159
|
+
summary: 'The verification options were malformed.',
|
|
160
|
+
possibleCauses: [
|
|
161
|
+
'toleranceSeconds is negative or non-finite.',
|
|
162
|
+
'maxBodyBytes is not a positive safe integer.',
|
|
163
|
+
'The now function is not callable.',
|
|
164
|
+
],
|
|
165
|
+
suggestions: [
|
|
166
|
+
'Check toleranceSeconds is a non-negative finite number.',
|
|
167
|
+
'Check maxBodyBytes is a positive safe integer.',
|
|
168
|
+
'Check that now is a function returning epoch seconds.',
|
|
169
|
+
],
|
|
170
|
+
},
|
|
171
|
+
'invalid-input': {
|
|
172
|
+
summary: 'The request or header input was malformed.',
|
|
173
|
+
possibleCauses: [
|
|
174
|
+
'The header input was not a Headers, tuple list, or record.',
|
|
175
|
+
'A header value contained illegal characters.',
|
|
176
|
+
'The input object was null or undefined.',
|
|
177
|
+
],
|
|
178
|
+
suggestions: [
|
|
179
|
+
'Ensure headers are provided as a Headers, tuple list, or plain record.',
|
|
180
|
+
'Check for null or undefined header values.',
|
|
181
|
+
'Validate header input before calling verify.',
|
|
182
|
+
],
|
|
183
|
+
},
|
|
184
|
+
'body-consumed': {
|
|
185
|
+
summary: 'The Request body was already read before verification.',
|
|
186
|
+
possibleCauses: [
|
|
187
|
+
'A middleware or handler read the body before calling verifyRequest.',
|
|
188
|
+
'The same Request object was processed twice.',
|
|
189
|
+
],
|
|
190
|
+
suggestions: [
|
|
191
|
+
'Call verifyRequest before any other body reads.',
|
|
192
|
+
'Use createVerifier with captured raw bytes for multi-stage processing.',
|
|
193
|
+
'Clone the Request if multiple consumers need the body.',
|
|
194
|
+
],
|
|
195
|
+
},
|
|
196
|
+
'body-read-failed': {
|
|
197
|
+
summary: 'The request body stream could not be read.',
|
|
198
|
+
possibleCauses: [
|
|
199
|
+
'The client disconnected mid-body.',
|
|
200
|
+
'A platform streaming error occurred.',
|
|
201
|
+
'The body was locked by another consumer.',
|
|
202
|
+
],
|
|
203
|
+
suggestions: [
|
|
204
|
+
'Check client connection stability.',
|
|
205
|
+
'Retry the request if the failure is transient.',
|
|
206
|
+
'Inspect platform logs for streaming errors.',
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
'crypto-unavailable': {
|
|
210
|
+
summary: 'Web Crypto is not available in this environment.',
|
|
211
|
+
possibleCauses: [
|
|
212
|
+
'The runtime does not provide globalThis.crypto.subtle.',
|
|
213
|
+
'The environment is not Node 22+ or a compatible Workers runtime.',
|
|
214
|
+
],
|
|
215
|
+
suggestions: [
|
|
216
|
+
'Ensure the runtime is Node 22+ or a Workers-compatible environment.',
|
|
217
|
+
'Check that crypto.subtle is available at global scope.',
|
|
218
|
+
'Update the runtime if it is below the minimum supported version.',
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
'internal': {
|
|
222
|
+
summary: 'An unexpected internal error occurred.',
|
|
223
|
+
possibleCauses: [
|
|
224
|
+
'An unhandled exception in the verification pipeline.',
|
|
225
|
+
'A platform-specific failure in cryptographic operations.',
|
|
226
|
+
],
|
|
227
|
+
suggestions: [
|
|
228
|
+
'Report this issue with the SDK version and runtime details.',
|
|
229
|
+
'Retry the request if the failure may be transient.',
|
|
230
|
+
'Check for known issues in the SDK release notes.',
|
|
231
|
+
],
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
const PROVIDER_DETAIL = {
|
|
235
|
+
vercel: {
|
|
236
|
+
expectedHeaders: ['x-vercel-signature'],
|
|
237
|
+
grammar: 'Exactly 40 hexadecimal digits encoding HMAC-SHA1 over exact raw body bytes; no timestamp or identity extraction.',
|
|
238
|
+
},
|
|
239
|
+
fal: {
|
|
240
|
+
expectedHeaders: ['x-fal-webhook-signature', 'x-fal-webhook-request-id', 'x-fal-webhook-user-id', 'x-fal-webhook-timestamp'],
|
|
241
|
+
grammar: 'Exactly 128 hexadecimal signature digits; visible ASCII request and user IDs excluding commas; canonical nonnegative integer seconds. Ed25519 authenticates request ID, user ID, timestamp and the lowercase SHA256 raw-body digest. Static trusted raw public keys and exact expected user ID are required.',
|
|
242
|
+
},
|
|
243
|
+
stripe: {
|
|
244
|
+
expectedHeaders: ['Stripe-Signature'],
|
|
245
|
+
grammar: 'Comma-separated key=value pairs: t=<unix-seconds>,v1=<hex-signature>[,v1=<hex-signature>]',
|
|
246
|
+
},
|
|
247
|
+
github: {
|
|
248
|
+
expectedHeaders: ['X-Hub-Signature-256'],
|
|
249
|
+
grammar: 'sha256=<64 hexadecimal digits; letter case is ignored>',
|
|
250
|
+
},
|
|
251
|
+
shopify: {
|
|
252
|
+
expectedHeaders: ['X-Shopify-Hmac-Sha256'],
|
|
253
|
+
grammar: 'Canonical Base64-encoded HMAC-SHA256 signature',
|
|
254
|
+
},
|
|
255
|
+
'standard-webhooks': {
|
|
256
|
+
expectedHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature'],
|
|
257
|
+
grammar: 'Space-delimited list of v1,<base64-signature> tokens',
|
|
258
|
+
},
|
|
259
|
+
clerk: {
|
|
260
|
+
expectedHeaders: ['svix-id', 'svix-timestamp', 'svix-signature'],
|
|
261
|
+
grammar: 'Space-delimited list of v1,<base64-signature> tokens',
|
|
262
|
+
},
|
|
263
|
+
svix: {
|
|
264
|
+
expectedHeaders: ['svix-id', 'svix-timestamp', 'svix-signature', 'webhook-id', 'webhook-timestamp', 'webhook-signature'],
|
|
265
|
+
grammar: 'Space-delimited list of v1,<base64-signature> tokens (branded or canonical family)',
|
|
266
|
+
},
|
|
267
|
+
razorpay: {
|
|
268
|
+
expectedHeaders: ['X-Razorpay-Signature'],
|
|
269
|
+
grammar: 'A single 64-digit hexadecimal HMAC-SHA256 signature over the raw body',
|
|
270
|
+
},
|
|
271
|
+
paddle: {
|
|
272
|
+
expectedHeaders: ['Paddle-Signature'],
|
|
273
|
+
grammar: 'Semicolon-separated ts=<unix-seconds>;h1=<64 hexadecimal digits>, with repeated h1 allowed',
|
|
274
|
+
},
|
|
275
|
+
'lemon-squeezy': {
|
|
276
|
+
expectedHeaders: ['X-Signature'],
|
|
277
|
+
grammar: 'A single 64-digit hexadecimal HMAC-SHA256 signature over the raw body',
|
|
278
|
+
},
|
|
279
|
+
'dodo-payments': {
|
|
280
|
+
expectedHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature'],
|
|
281
|
+
grammar: 'Space-delimited list of v1,<base64-signature> tokens over id.timestamp.body',
|
|
282
|
+
},
|
|
283
|
+
gitlab: {
|
|
284
|
+
expectedHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature'],
|
|
285
|
+
grammar: 'Signing-token mode: space-delimited v1,<base64-signature> tokens; no X-Gitlab-Token fallback',
|
|
286
|
+
},
|
|
287
|
+
replicate: {
|
|
288
|
+
expectedHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature'],
|
|
289
|
+
grammar: 'Space-delimited list of v1,<base64-signature> tokens over id.timestamp.body',
|
|
290
|
+
},
|
|
291
|
+
workos: {
|
|
292
|
+
expectedHeaders: ['WorkOS-Signature'],
|
|
293
|
+
grammar: 'Comma-separated t=<unix-milliseconds>,v1=<64 hexadecimal digits>; one t, repeated valid v1 allowed',
|
|
294
|
+
},
|
|
295
|
+
sentry: {
|
|
296
|
+
expectedHeaders: ['Sentry-Hook-Signature'],
|
|
297
|
+
grammar: 'Sentry App mode: a single bare 64-digit hexadecimal HMAC-SHA256 signature over the raw body',
|
|
298
|
+
},
|
|
299
|
+
doppler: {
|
|
300
|
+
expectedHeaders: ['X-Doppler-Signature'],
|
|
301
|
+
grammar: 'Signed mode: sha256=<64 hexadecimal digits> over the raw body; no Basic/Bearer fallback',
|
|
302
|
+
},
|
|
303
|
+
linear: {
|
|
304
|
+
expectedHeaders: ['Linear-Signature'],
|
|
305
|
+
grammar: 'A single bare 64-digit hexadecimal HMAC-SHA256 signature over exact raw body bytes. Signature authentication only: body claims are not extracted and unsigned header timestamps do not establish freshness.',
|
|
306
|
+
},
|
|
307
|
+
sanity: {
|
|
308
|
+
expectedHeaders: ['sanity-webhook-signature'],
|
|
309
|
+
grammar: 'Exactly t=<unix-milliseconds>,v1=<43 canonical unpadded Base64url characters>; one of each field, no whitespace',
|
|
310
|
+
},
|
|
311
|
+
grafana: {
|
|
312
|
+
expectedHeaders: [],
|
|
313
|
+
grammar: 'Configured signature header: 64 hexadecimal digits. Body mode signs raw bytes; timestamped mode also requires the configured timestamp header with canonical Unix seconds and signs timestamp:body.',
|
|
314
|
+
},
|
|
315
|
+
polar: {
|
|
316
|
+
expectedHeaders: ['webhook-id', 'webhook-timestamp', 'webhook-signature'],
|
|
317
|
+
grammar: 'Space-delimited v1,<base64-signature> tokens over id.timestamp.body; current or legacy secretMode is trusted application configuration, never detected from a request.',
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
export function getVerificationGuidance(reason) {
|
|
321
|
+
return VERIFICATION_GUIDANCE[reason];
|
|
322
|
+
}
|
|
323
|
+
export function getSetupGuidance(code) {
|
|
324
|
+
return SETUP_GUIDANCE[code];
|
|
325
|
+
}
|
|
326
|
+
export function getProviderDetail(provider) {
|
|
327
|
+
return PROVIDER_DETAIL[provider];
|
|
328
|
+
}
|
|
329
|
+
export function isVerificationCode(code) {
|
|
330
|
+
return typeof code === 'string' && Object.hasOwn(VERIFICATION_GUIDANCE, code);
|
|
331
|
+
}
|
|
332
|
+
export function isSetupCode(code) {
|
|
333
|
+
return typeof code === 'string' && Object.hasOwn(SETUP_GUIDANCE, code);
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/diagnostics/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
import type { VerificationFailure } from '../types.js';
|
|
3
|
+
import type { Diagnostic, DiagnosticOptions } from './types.js';
|
|
4
|
+
export declare function diagnose(input: VerificationFailure | HooklatchError, options?: DiagnosticOptions): Diagnostic;
|
|
5
|
+
export type { Diagnostic, DiagnosticOptions, DiagnosticCode } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diagnostics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAY,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAkB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAsHhF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,mBAAmB,GAAG,cAAc,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAO7G;AAED,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
import { SUPPORTED_PROVIDERS } from '../providers/index.js';
|
|
3
|
+
import { getProviderDetail, getSetupGuidance, getVerificationGuidance, isVerificationCode, isSetupCode, } from './catalog.js';
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
6
|
+
return false;
|
|
7
|
+
const prototype = Object.getPrototypeOf(value);
|
|
8
|
+
return prototype === null || prototype === Object.prototype;
|
|
9
|
+
}
|
|
10
|
+
function isProvider(value) {
|
|
11
|
+
return typeof value === 'string' && SUPPORTED_PROVIDERS.some((provider) => provider === value);
|
|
12
|
+
}
|
|
13
|
+
function isBoolean(value) { return typeof value === 'boolean'; }
|
|
14
|
+
function validateProvider(provider) {
|
|
15
|
+
if (provider === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
if (isProvider(provider)) {
|
|
18
|
+
return provider;
|
|
19
|
+
}
|
|
20
|
+
throw new HooklatchError('invalid-input', 'Invalid provider name.');
|
|
21
|
+
}
|
|
22
|
+
function normalizeOptions(options) {
|
|
23
|
+
if (!isRecord(options) || (options.verbose !== undefined && !isBoolean(options.verbose))) {
|
|
24
|
+
throw new HooklatchError('invalid-input', 'Invalid diagnostic options.');
|
|
25
|
+
}
|
|
26
|
+
const provider = validateProvider(options.provider);
|
|
27
|
+
return provider !== undefined
|
|
28
|
+
? { provider, verbose: options.verbose === true }
|
|
29
|
+
: { verbose: options.verbose === true };
|
|
30
|
+
}
|
|
31
|
+
function buildDiagnostic(code, kind, guidance, provider, detail) {
|
|
32
|
+
const result = {
|
|
33
|
+
code,
|
|
34
|
+
kind,
|
|
35
|
+
summary: guidance.summary,
|
|
36
|
+
possibleCauses: [...guidance.possibleCauses],
|
|
37
|
+
suggestions: [...guidance.suggestions],
|
|
38
|
+
};
|
|
39
|
+
if (provider !== undefined) {
|
|
40
|
+
Object.assign(result, { provider });
|
|
41
|
+
}
|
|
42
|
+
if (detail !== undefined) {
|
|
43
|
+
Object.assign(result, { detail: { expectedHeaders: [...detail.expectedHeaders], grammar: detail.grammar } });
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
function diagnoseValidated(input, options) {
|
|
48
|
+
if (input instanceof HooklatchError) {
|
|
49
|
+
const code = input.code;
|
|
50
|
+
if (!isSetupCode(code))
|
|
51
|
+
throw new HooklatchError('invalid-input', 'Invalid diagnostic input.');
|
|
52
|
+
const normalized = options !== undefined ? normalizeOptions(options) : undefined;
|
|
53
|
+
const provider = normalized?.provider;
|
|
54
|
+
const verbose = normalized?.verbose;
|
|
55
|
+
const guidance = getSetupGuidance(code);
|
|
56
|
+
if (guidance === undefined) {
|
|
57
|
+
throw new HooklatchError('invalid-input', 'Invalid diagnostic input.');
|
|
58
|
+
}
|
|
59
|
+
const detail = provider !== undefined && verbose === true ? getProviderDetail(provider) : undefined;
|
|
60
|
+
return buildDiagnostic(code, 'setup', guidance, provider, detail);
|
|
61
|
+
}
|
|
62
|
+
if (!isRecord(input)) {
|
|
63
|
+
throw new HooklatchError('invalid-input', 'Invalid diagnostic input.');
|
|
64
|
+
}
|
|
65
|
+
const { ok, reason: code, provider: failureProvider } = input;
|
|
66
|
+
if (ok !== false || !isVerificationCode(code) || !isProvider(failureProvider)) {
|
|
67
|
+
throw new HooklatchError('invalid-input', 'Invalid diagnostic input.');
|
|
68
|
+
}
|
|
69
|
+
const normalized = options !== undefined ? normalizeOptions(options) : undefined;
|
|
70
|
+
if (normalized?.provider !== undefined && normalized.provider !== failureProvider) {
|
|
71
|
+
throw new HooklatchError('invalid-input', 'Provider mismatch.');
|
|
72
|
+
}
|
|
73
|
+
const provider = failureProvider ?? normalized?.provider;
|
|
74
|
+
const verbose = normalized?.verbose;
|
|
75
|
+
const guidance = getVerificationGuidance(code);
|
|
76
|
+
const detail = provider !== undefined && verbose === true ? getProviderDetail(provider) : undefined;
|
|
77
|
+
return buildDiagnostic(code, 'verification', guidance, provider, detail);
|
|
78
|
+
}
|
|
79
|
+
export function diagnose(input, options) {
|
|
80
|
+
try {
|
|
81
|
+
return diagnoseValidated(input, options);
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Untrusted accessors/proxies may throw; their messages must not escape.
|
|
85
|
+
throw new HooklatchError('invalid-input', 'Invalid diagnostic input.');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/diagnostics/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { HooklatchErrorCode, Provider, VerificationFailureReason } from '../types.js';
|
|
2
|
+
/** Stable diagnostic codes; guidance text is intended for people. */
|
|
3
|
+
export type DiagnosticCode = VerificationFailureReason | HooklatchErrorCode;
|
|
4
|
+
export interface DiagnosticOptions {
|
|
5
|
+
readonly provider?: Provider;
|
|
6
|
+
readonly verbose?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/** Only allowlisted guidance and validated provider names enter this output. */
|
|
9
|
+
export interface Diagnostic {
|
|
10
|
+
readonly code: DiagnosticCode;
|
|
11
|
+
readonly kind: 'verification' | 'setup';
|
|
12
|
+
readonly provider?: Provider;
|
|
13
|
+
readonly summary: string;
|
|
14
|
+
readonly possibleCauses: readonly string[];
|
|
15
|
+
readonly suggestions: readonly string[];
|
|
16
|
+
readonly detail?: {
|
|
17
|
+
readonly expectedHeaders: readonly string[];
|
|
18
|
+
readonly grammar: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/diagnostics/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE3F,qEAAqE;AACrE,MAAM,MAAM,cAAc,GAAG,yBAAyB,GAAG,kBAAkB,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC;IACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/diagnostics/types.ts"],"names":[],"mappings":""}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HooklatchErrorCode } from './types.js';
|
|
2
|
+
/** Operational error. Messages deliberately exclude request and credential data. */
|
|
3
|
+
export declare class HooklatchError extends Error {
|
|
4
|
+
readonly code: HooklatchErrorCode;
|
|
5
|
+
constructor(code: HooklatchErrorCode, message: string);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,oFAAoF;AACpF,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;gBACtB,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM;CAKtD"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Operational error. Messages deliberately exclude request and credential data. */
|
|
2
|
+
export class HooklatchError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(code, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'HooklatchError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,oFAAoF;AACpF,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,IAAI,CAAqB;IAClC,YAAY,IAAwB,EAAE,OAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { verify, verifyRequest, createVerifier } from './core.js';
|
|
2
|
+
export { HooklatchError } from './errors.js';
|
|
3
|
+
export type { Provider, HeaderInput, WebhookRequest, VerifyOptions, FalVerifyOptions, GrafanaOptions, PolarOptions, IdentityField, EventIdentity, VerificationFailureReason, VerificationSuccess, VerificationFailure, VerificationResult, HooklatchErrorCode, FailureDetails, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,YAAY,EACV,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAClI,yBAAyB,EAAE,mBAAmB,EAAE,mBAAmB,EACnE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,GACvD,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.d.ts","sourceRoot":"","sources":["../../src/internal/body.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA0CjG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { HooklatchError } from '../errors.js';
|
|
2
|
+
/** null means size limit exceeded. Reads actual chunks, not trusted length claims. */
|
|
3
|
+
export async function readBody(request, maxBodyBytes) {
|
|
4
|
+
if (request.bodyUsed || request.body?.locked)
|
|
5
|
+
throw new HooklatchError('body-consumed', 'Request body has already been consumed.');
|
|
6
|
+
if (!request.body)
|
|
7
|
+
return new Uint8Array();
|
|
8
|
+
let reader;
|
|
9
|
+
try {
|
|
10
|
+
reader = request.body.getReader();
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new HooklatchError('body-read-failed', 'Unable to read request body.');
|
|
14
|
+
}
|
|
15
|
+
// Bound bookkeeping as well as byte storage: a chunk array can grow very
|
|
16
|
+
// large even for a tiny body, and spreading it exceeds JS argument limits.
|
|
17
|
+
let output = new Uint8Array(Math.min(maxBodyBytes, 8192));
|
|
18
|
+
let size = 0;
|
|
19
|
+
try {
|
|
20
|
+
while (true) {
|
|
21
|
+
const chunk = await reader.read();
|
|
22
|
+
if (chunk.done)
|
|
23
|
+
break;
|
|
24
|
+
if (!(chunk.value instanceof Uint8Array))
|
|
25
|
+
throw new Error('Invalid byte stream');
|
|
26
|
+
size += chunk.value.byteLength;
|
|
27
|
+
if (size > maxBodyBytes) {
|
|
28
|
+
// Cancellation must not hold the response hostage to a stalled producer.
|
|
29
|
+
void reader.cancel().catch(() => undefined);
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (size > output.byteLength) {
|
|
33
|
+
const grown = new Uint8Array(Math.min(maxBodyBytes, Math.max(size, output.byteLength * 2)));
|
|
34
|
+
grown.set(output);
|
|
35
|
+
output = grown;
|
|
36
|
+
}
|
|
37
|
+
output.set(chunk.value, size - chunk.value.byteLength);
|
|
38
|
+
}
|
|
39
|
+
return output.slice(0, size);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new HooklatchError('body-read-failed', 'Unable to read request body.');
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
reader.releaseLock();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body.js","sourceRoot":"","sources":["../../src/internal/body.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAgB,EAAE,YAAoB;IACnE,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM;QAAE,MAAM,IAAI,cAAc,CAAC,eAAe,EAAE,yCAAyC,CAAC,CAAC;IAEnI,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,IAAI,UAAU,EAAE,CAAC;IAC3C,IAAI,MAA+C,CAAC;IAEpD,IAAI,CAAC;QAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAAC,CAAC;IAC1C,MAAM,CAAC;QAAC,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAC;IAAC,CAAC;IAEvF,yEAAyE;IACzE,2EAA2E;IAC3E,IAAI,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAElC,IAAI,KAAK,CAAC,IAAI;gBAAE,MAAM;YAEtB,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACjF,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;YAE/B,IAAI,IAAI,GAAG,YAAY,EAAE,CAAC;gBACxB,yEAAyE;gBACzE,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAE5C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5F,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAClB,MAAM,GAAG,KAAK,CAAC;YACjB,CAAC;YAED,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,8BAA8B,CAAC,CAAC;IAAC,CAAC;YACjF,CAAC;QAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function utf8(value: string): Uint8Array;
|
|
2
|
+
export declare function concatBytes(...chunks: Uint8Array[]): Uint8Array;
|
|
3
|
+
export declare function decodeHex(value: string): Uint8Array | null;
|
|
4
|
+
export declare function decodeBase64(value: string): Uint8Array | null;
|
|
5
|
+
//# sourceMappingURL=bytes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/internal/bytes.ts"],"names":[],"mappings":"AAAA,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAA4C;AAE3F,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAO/D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAO1D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAgB7D"}
|