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.
Files changed (301) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +438 -2
  3. package/dist/adapters/cloudflare.d.ts +11 -0
  4. package/dist/adapters/cloudflare.d.ts.map +1 -0
  5. package/dist/adapters/cloudflare.js +27 -0
  6. package/dist/adapters/cloudflare.js.map +1 -0
  7. package/dist/adapters/express.d.ts +9 -0
  8. package/dist/adapters/express.d.ts.map +1 -0
  9. package/dist/adapters/express.js +63 -0
  10. package/dist/adapters/express.js.map +1 -0
  11. package/dist/adapters/hono.d.ts +12 -0
  12. package/dist/adapters/hono.d.ts.map +1 -0
  13. package/dist/adapters/hono.js +28 -0
  14. package/dist/adapters/hono.js.map +1 -0
  15. package/dist/adapters/nextjs.d.ts +6 -0
  16. package/dist/adapters/nextjs.d.ts.map +1 -0
  17. package/dist/adapters/nextjs.js +56 -0
  18. package/dist/adapters/nextjs.js.map +1 -0
  19. package/dist/adapters/shared.d.ts +8 -0
  20. package/dist/adapters/shared.d.ts.map +1 -0
  21. package/dist/adapters/shared.js +53 -0
  22. package/dist/adapters/shared.js.map +1 -0
  23. package/dist/cjs/adapters/cloudflare.cjs +29 -0
  24. package/dist/cjs/adapters/cloudflare.d.cts +10 -0
  25. package/dist/cjs/adapters/express.cjs +65 -0
  26. package/dist/cjs/adapters/express.d.cts +8 -0
  27. package/dist/cjs/adapters/hono.cjs +30 -0
  28. package/dist/cjs/adapters/hono.d.cts +11 -0
  29. package/dist/cjs/adapters/nextjs.cjs +58 -0
  30. package/dist/cjs/adapters/nextjs.d.cts +5 -0
  31. package/dist/cjs/adapters/shared.cjs +58 -0
  32. package/dist/cjs/adapters/shared.d.cts +7 -0
  33. package/dist/cjs/core.cjs +30 -0
  34. package/dist/cjs/core.d.cts +5 -0
  35. package/dist/cjs/diagnostics/catalog.cjs +341 -0
  36. package/dist/cjs/diagnostics/catalog.d.cts +19 -0
  37. package/dist/cjs/diagnostics/index.cjs +90 -0
  38. package/dist/cjs/diagnostics/index.d.cts +5 -0
  39. package/dist/cjs/diagnostics/types.cjs +2 -0
  40. package/dist/cjs/diagnostics/types.d.cts +20 -0
  41. package/dist/cjs/errors.cjs +13 -0
  42. package/dist/cjs/errors.d.cts +6 -0
  43. package/dist/cjs/index.cjs +9 -0
  44. package/dist/cjs/index.d.cts +3 -0
  45. package/dist/cjs/internal/body.cjs +50 -0
  46. package/dist/cjs/internal/body.d.cts +2 -0
  47. package/dist/cjs/internal/bytes.cjs +43 -0
  48. package/dist/cjs/internal/bytes.d.cts +4 -0
  49. package/dist/cjs/internal/crypto.cjs +52 -0
  50. package/dist/cjs/internal/crypto.d.cts +3 -0
  51. package/dist/cjs/internal/headers.cjs +72 -0
  52. package/dist/cjs/internal/headers.d.cts +2 -0
  53. package/dist/cjs/internal/options.cjs +130 -0
  54. package/dist/cjs/internal/options.d.cts +7 -0
  55. package/dist/cjs/internal/prepare.cjs +11 -0
  56. package/dist/cjs/internal/prepare.d.cts +4 -0
  57. package/dist/cjs/internal/provider-options.cjs +72 -0
  58. package/dist/cjs/internal/provider-options.d.cts +6 -0
  59. package/dist/cjs/internal/provider.cjs +2 -0
  60. package/dist/cjs/internal/provider.d.cts +39 -0
  61. package/dist/cjs/internal/verification.cjs +71 -0
  62. package/dist/cjs/internal/verification.d.cts +12 -0
  63. package/dist/cjs/providers/clerk.cjs +15 -0
  64. package/dist/cjs/providers/clerk.d.cts +9 -0
  65. package/dist/cjs/providers/dodo-payments.cjs +26 -0
  66. package/dist/cjs/providers/dodo-payments.d.cts +20 -0
  67. package/dist/cjs/providers/doppler.cjs +71 -0
  68. package/dist/cjs/providers/doppler.d.cts +37 -0
  69. package/dist/cjs/providers/fal.cjs +80 -0
  70. package/dist/cjs/providers/fal.d.cts +13 -0
  71. package/dist/cjs/providers/github.cjs +52 -0
  72. package/dist/cjs/providers/github.d.cts +7 -0
  73. package/dist/cjs/providers/gitlab.cjs +26 -0
  74. package/dist/cjs/providers/gitlab.d.cts +20 -0
  75. package/dist/cjs/providers/grafana.cjs +180 -0
  76. package/dist/cjs/providers/grafana.d.cts +35 -0
  77. package/dist/cjs/providers/index.cjs +110 -0
  78. package/dist/cjs/providers/index.d.cts +26 -0
  79. package/dist/cjs/providers/lemon-squeezy.cjs +36 -0
  80. package/dist/cjs/providers/lemon-squeezy.d.cts +15 -0
  81. package/dist/cjs/providers/linear.cjs +58 -0
  82. package/dist/cjs/providers/linear.d.cts +36 -0
  83. package/dist/cjs/providers/paddle.cjs +105 -0
  84. package/dist/cjs/providers/paddle.d.cts +14 -0
  85. package/dist/cjs/providers/polar.cjs +80 -0
  86. package/dist/cjs/providers/polar.d.cts +25 -0
  87. package/dist/cjs/providers/razorpay.cjs +43 -0
  88. package/dist/cjs/providers/razorpay.d.cts +19 -0
  89. package/dist/cjs/providers/replicate.cjs +25 -0
  90. package/dist/cjs/providers/replicate.d.cts +19 -0
  91. package/dist/cjs/providers/sanity.cjs +161 -0
  92. package/dist/cjs/providers/sanity.d.cts +38 -0
  93. package/dist/cjs/providers/sentry.cjs +47 -0
  94. package/dist/cjs/providers/sentry.d.cts +25 -0
  95. package/dist/cjs/providers/shared.cjs +49 -0
  96. package/dist/cjs/providers/shared.d.cts +14 -0
  97. package/dist/cjs/providers/shopify.cjs +40 -0
  98. package/dist/cjs/providers/shopify.d.cts +8 -0
  99. package/dist/cjs/providers/standard-webhooks-protocol.cjs +97 -0
  100. package/dist/cjs/providers/standard-webhooks-protocol.d.cts +14 -0
  101. package/dist/cjs/providers/standard-webhooks.cjs +15 -0
  102. package/dist/cjs/providers/standard-webhooks.d.cts +9 -0
  103. package/dist/cjs/providers/stripe.cjs +81 -0
  104. package/dist/cjs/providers/stripe.d.cts +7 -0
  105. package/dist/cjs/providers/svix.cjs +63 -0
  106. package/dist/cjs/providers/svix.d.cts +9 -0
  107. package/dist/cjs/providers/vercel.cjs +39 -0
  108. package/dist/cjs/providers/vercel.d.cts +15 -0
  109. package/dist/cjs/providers/workos.cjs +120 -0
  110. package/dist/cjs/providers/workos.d.cts +32 -0
  111. package/dist/cjs/types.cjs +2 -0
  112. package/dist/cjs/types.d.cts +68 -0
  113. package/dist/cli/args.d.ts +86 -0
  114. package/dist/cli/args.d.ts.map +1 -0
  115. package/dist/cli/args.js +358 -0
  116. package/dist/cli/args.js.map +1 -0
  117. package/dist/cli/filesystem.d.ts +15 -0
  118. package/dist/cli/filesystem.d.ts.map +1 -0
  119. package/dist/cli/filesystem.js +170 -0
  120. package/dist/cli/filesystem.js.map +1 -0
  121. package/dist/cli/index.d.ts +3 -0
  122. package/dist/cli/index.d.ts.map +1 -0
  123. package/dist/cli/index.js +64 -0
  124. package/dist/cli/index.js.map +1 -0
  125. package/dist/cli/templates.d.ts +13 -0
  126. package/dist/cli/templates.d.ts.map +1 -0
  127. package/dist/cli/templates.js +297 -0
  128. package/dist/cli/templates.js.map +1 -0
  129. package/dist/core.d.ts +6 -0
  130. package/dist/core.d.ts.map +1 -0
  131. package/dist/core.js +26 -0
  132. package/dist/core.js.map +1 -0
  133. package/dist/diagnostics/catalog.d.ts +20 -0
  134. package/dist/diagnostics/catalog.d.ts.map +1 -0
  135. package/dist/diagnostics/catalog.js +335 -0
  136. package/dist/diagnostics/catalog.js.map +1 -0
  137. package/dist/diagnostics/index.d.ts +6 -0
  138. package/dist/diagnostics/index.d.ts.map +1 -0
  139. package/dist/diagnostics/index.js +88 -0
  140. package/dist/diagnostics/index.js.map +1 -0
  141. package/dist/diagnostics/types.d.ts +21 -0
  142. package/dist/diagnostics/types.d.ts.map +1 -0
  143. package/dist/diagnostics/types.js +2 -0
  144. package/dist/diagnostics/types.js.map +1 -0
  145. package/dist/errors.d.ts +7 -0
  146. package/dist/errors.d.ts.map +1 -0
  147. package/dist/errors.js +10 -0
  148. package/dist/errors.js.map +1 -0
  149. package/dist/index.d.ts +4 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +3 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/internal/body.d.ts +3 -0
  154. package/dist/internal/body.d.ts.map +1 -0
  155. package/dist/internal/body.js +48 -0
  156. package/dist/internal/body.js.map +1 -0
  157. package/dist/internal/bytes.d.ts +5 -0
  158. package/dist/internal/bytes.d.ts.map +1 -0
  159. package/dist/internal/bytes.js +38 -0
  160. package/dist/internal/bytes.js.map +1 -0
  161. package/dist/internal/crypto.d.ts +4 -0
  162. package/dist/internal/crypto.d.ts.map +1 -0
  163. package/dist/internal/crypto.js +49 -0
  164. package/dist/internal/crypto.js.map +1 -0
  165. package/dist/internal/headers.d.ts +3 -0
  166. package/dist/internal/headers.d.ts.map +1 -0
  167. package/dist/internal/headers.js +70 -0
  168. package/dist/internal/headers.js.map +1 -0
  169. package/dist/internal/options.d.ts +8 -0
  170. package/dist/internal/options.d.ts.map +1 -0
  171. package/dist/internal/options.js +128 -0
  172. package/dist/internal/options.js.map +1 -0
  173. package/dist/internal/prepare.d.ts +5 -0
  174. package/dist/internal/prepare.d.ts.map +1 -0
  175. package/dist/internal/prepare.js +9 -0
  176. package/dist/internal/prepare.js.map +1 -0
  177. package/dist/internal/provider-options.d.ts +7 -0
  178. package/dist/internal/provider-options.d.ts.map +1 -0
  179. package/dist/internal/provider-options.js +69 -0
  180. package/dist/internal/provider-options.js.map +1 -0
  181. package/dist/internal/provider.d.ts +40 -0
  182. package/dist/internal/provider.d.ts.map +1 -0
  183. package/dist/internal/provider.js +2 -0
  184. package/dist/internal/provider.js.map +1 -0
  185. package/dist/internal/verification.d.ts +13 -0
  186. package/dist/internal/verification.d.ts.map +1 -0
  187. package/dist/internal/verification.js +66 -0
  188. package/dist/internal/verification.js.map +1 -0
  189. package/dist/node/adapters/cloudflare.d.ts +1 -0
  190. package/dist/node/adapters/cloudflare.js +3 -0
  191. package/dist/node/adapters/express.d.ts +1 -0
  192. package/dist/node/adapters/express.js +3 -0
  193. package/dist/node/adapters/hono.d.ts +1 -0
  194. package/dist/node/adapters/hono.js +3 -0
  195. package/dist/node/adapters/nextjs.d.ts +1 -0
  196. package/dist/node/adapters/nextjs.js +3 -0
  197. package/dist/node/diagnostics/index.d.ts +1 -0
  198. package/dist/node/diagnostics/index.js +3 -0
  199. package/dist/node/index.d.ts +1 -0
  200. package/dist/node/index.js +6 -0
  201. package/dist/providers/clerk.d.ts +10 -0
  202. package/dist/providers/clerk.d.ts.map +1 -0
  203. package/dist/providers/clerk.js +13 -0
  204. package/dist/providers/clerk.js.map +1 -0
  205. package/dist/providers/dodo-payments.d.ts +21 -0
  206. package/dist/providers/dodo-payments.d.ts.map +1 -0
  207. package/dist/providers/dodo-payments.js +24 -0
  208. package/dist/providers/dodo-payments.js.map +1 -0
  209. package/dist/providers/doppler.d.ts +38 -0
  210. package/dist/providers/doppler.d.ts.map +1 -0
  211. package/dist/providers/doppler.js +69 -0
  212. package/dist/providers/doppler.js.map +1 -0
  213. package/dist/providers/fal.d.ts +14 -0
  214. package/dist/providers/fal.d.ts.map +1 -0
  215. package/dist/providers/fal.js +78 -0
  216. package/dist/providers/fal.js.map +1 -0
  217. package/dist/providers/github.d.ts +8 -0
  218. package/dist/providers/github.d.ts.map +1 -0
  219. package/dist/providers/github.js +50 -0
  220. package/dist/providers/github.js.map +1 -0
  221. package/dist/providers/gitlab.d.ts +21 -0
  222. package/dist/providers/gitlab.d.ts.map +1 -0
  223. package/dist/providers/gitlab.js +24 -0
  224. package/dist/providers/gitlab.js.map +1 -0
  225. package/dist/providers/grafana.d.ts +36 -0
  226. package/dist/providers/grafana.d.ts.map +1 -0
  227. package/dist/providers/grafana.js +178 -0
  228. package/dist/providers/grafana.js.map +1 -0
  229. package/dist/providers/index.d.ts +27 -0
  230. package/dist/providers/index.d.ts.map +1 -0
  231. package/dist/providers/index.js +89 -0
  232. package/dist/providers/index.js.map +1 -0
  233. package/dist/providers/lemon-squeezy.d.ts +16 -0
  234. package/dist/providers/lemon-squeezy.d.ts.map +1 -0
  235. package/dist/providers/lemon-squeezy.js +34 -0
  236. package/dist/providers/lemon-squeezy.js.map +1 -0
  237. package/dist/providers/linear.d.ts +37 -0
  238. package/dist/providers/linear.d.ts.map +1 -0
  239. package/dist/providers/linear.js +56 -0
  240. package/dist/providers/linear.js.map +1 -0
  241. package/dist/providers/paddle.d.ts +15 -0
  242. package/dist/providers/paddle.d.ts.map +1 -0
  243. package/dist/providers/paddle.js +103 -0
  244. package/dist/providers/paddle.js.map +1 -0
  245. package/dist/providers/polar.d.ts +26 -0
  246. package/dist/providers/polar.d.ts.map +1 -0
  247. package/dist/providers/polar.js +78 -0
  248. package/dist/providers/polar.js.map +1 -0
  249. package/dist/providers/razorpay.d.ts +20 -0
  250. package/dist/providers/razorpay.d.ts.map +1 -0
  251. package/dist/providers/razorpay.js +41 -0
  252. package/dist/providers/razorpay.js.map +1 -0
  253. package/dist/providers/replicate.d.ts +20 -0
  254. package/dist/providers/replicate.d.ts.map +1 -0
  255. package/dist/providers/replicate.js +23 -0
  256. package/dist/providers/replicate.js.map +1 -0
  257. package/dist/providers/sanity.d.ts +39 -0
  258. package/dist/providers/sanity.d.ts.map +1 -0
  259. package/dist/providers/sanity.js +159 -0
  260. package/dist/providers/sanity.js.map +1 -0
  261. package/dist/providers/sentry.d.ts +26 -0
  262. package/dist/providers/sentry.d.ts.map +1 -0
  263. package/dist/providers/sentry.js +45 -0
  264. package/dist/providers/sentry.js.map +1 -0
  265. package/dist/providers/shared.d.ts +15 -0
  266. package/dist/providers/shared.d.ts.map +1 -0
  267. package/dist/providers/shared.js +40 -0
  268. package/dist/providers/shared.js.map +1 -0
  269. package/dist/providers/shopify.d.ts +9 -0
  270. package/dist/providers/shopify.d.ts.map +1 -0
  271. package/dist/providers/shopify.js +38 -0
  272. package/dist/providers/shopify.js.map +1 -0
  273. package/dist/providers/standard-webhooks-protocol.d.ts +15 -0
  274. package/dist/providers/standard-webhooks-protocol.d.ts.map +1 -0
  275. package/dist/providers/standard-webhooks-protocol.js +95 -0
  276. package/dist/providers/standard-webhooks-protocol.js.map +1 -0
  277. package/dist/providers/standard-webhooks.d.ts +10 -0
  278. package/dist/providers/standard-webhooks.d.ts.map +1 -0
  279. package/dist/providers/standard-webhooks.js +13 -0
  280. package/dist/providers/standard-webhooks.js.map +1 -0
  281. package/dist/providers/stripe.d.ts +8 -0
  282. package/dist/providers/stripe.d.ts.map +1 -0
  283. package/dist/providers/stripe.js +79 -0
  284. package/dist/providers/stripe.js.map +1 -0
  285. package/dist/providers/svix.d.ts +10 -0
  286. package/dist/providers/svix.d.ts.map +1 -0
  287. package/dist/providers/svix.js +61 -0
  288. package/dist/providers/svix.js.map +1 -0
  289. package/dist/providers/vercel.d.ts +16 -0
  290. package/dist/providers/vercel.d.ts.map +1 -0
  291. package/dist/providers/vercel.js +37 -0
  292. package/dist/providers/vercel.js.map +1 -0
  293. package/dist/providers/workos.d.ts +33 -0
  294. package/dist/providers/workos.d.ts.map +1 -0
  295. package/dist/providers/workos.js +118 -0
  296. package/dist/providers/workos.js.map +1 -0
  297. package/dist/types.d.ts +69 -0
  298. package/dist/types.d.ts.map +1 -0
  299. package/dist/types.js +2 -0
  300. package/dist/types.js.map +1 -0
  301. package/package.json +200 -4
@@ -0,0 +1,56 @@
1
+ import { HooklatchError } from '../errors.js';
2
+ import { verifyRequest } from '../index.js';
3
+ export function createWebhookHandler(options) {
4
+ try {
5
+ // Observe credential descriptors before object-rest can invoke an accessor
6
+ // that replaces itself. Existing HMAC top-level getter snapshots stay intact.
7
+ const credentials = ['publicKeys', 'expectedUserId', 'secrets', 'secret'].map((name) => ({
8
+ name, property: Object.getOwnPropertyDescriptor(options, name),
9
+ }));
10
+ const { handler, ...verifyOptions } = options;
11
+ for (const { name, property } of credentials) {
12
+ const preserve = verifyOptions.provider === 'fal'
13
+ || (verifyOptions.provider === 'vercel' && (name === 'publicKeys' || name === 'expectedUserId'));
14
+ if (preserve && property !== undefined)
15
+ Object.defineProperty(verifyOptions, name, property);
16
+ }
17
+ // Object rest omits non-enumerable fields; own configuration presence is meaningful.
18
+ if (Object.hasOwn(options, 'providerOptions') && !Object.hasOwn(verifyOptions, 'providerOptions')) {
19
+ Object.defineProperty(verifyOptions, 'providerOptions', {
20
+ value: options.providerOptions, enumerable: true, configurable: true, writable: true,
21
+ });
22
+ }
23
+ return requestHandler(verifyOptions, handler);
24
+ }
25
+ catch {
26
+ // Contain caller-owned accessors without exposing their thrown values.
27
+ return async () => new Response('Internal Server Error', { status: 500 });
28
+ }
29
+ }
30
+ function requestHandler(verifyOptions, handler) {
31
+ return async (request) => {
32
+ const encoding = request.headers.get('content-encoding');
33
+ if (encoding && encoding.toLowerCase() !== 'identity') {
34
+ return new Response('Bad Request', { status: 400 });
35
+ }
36
+ let verification;
37
+ try {
38
+ const result = await verifyRequest(request, verifyOptions);
39
+ if (!result.ok) {
40
+ if (result.reason === 'body-too-large') {
41
+ return new Response('Payload Too Large', { status: 413 });
42
+ }
43
+ return new Response('Bad Request', { status: 400 });
44
+ }
45
+ verification = result;
46
+ }
47
+ catch (err) {
48
+ if (err instanceof HooklatchError) {
49
+ return new Response('Internal Server Error', { status: 500 });
50
+ }
51
+ throw err;
52
+ }
53
+ return await handler(request, verification);
54
+ };
55
+ }
56
+ //# sourceMappingURL=nextjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/adapters/nextjs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Shared helpers for framework adapters. Node/Web runtime agnostic except where noted. */
2
+ export declare class HttpError extends Error {
3
+ readonly status: number;
4
+ constructor(status: number, message: string);
5
+ }
6
+ export declare function toUint8Array(value: Uint8Array | ArrayBuffer | string): Uint8Array;
7
+ export declare function readNodeStream(stream: AsyncIterable<unknown>, maxBytes: number): Promise<Uint8Array>;
8
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK5C;AAMD,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,CAOjF;AAED,wBAAsB,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAgC1G"}
@@ -0,0 +1,53 @@
1
+ /** Shared helpers for framework adapters. Node/Web runtime agnostic except where noted. */
2
+ export class HttpError extends Error {
3
+ status;
4
+ constructor(status, message) {
5
+ super(message);
6
+ this.name = 'HttpError';
7
+ this.status = status;
8
+ }
9
+ }
10
+ function isText(value) {
11
+ return typeof value === 'string';
12
+ }
13
+ export function toUint8Array(value) {
14
+ if (value instanceof Uint8Array)
15
+ return new Uint8Array(value);
16
+ if (value instanceof ArrayBuffer)
17
+ return new Uint8Array(value);
18
+ if (isText(value))
19
+ return new TextEncoder().encode(value);
20
+ throw new HttpError(500, 'Internal Server Error');
21
+ }
22
+ export async function readNodeStream(stream, maxBytes) {
23
+ const chunks = [];
24
+ let size = 0;
25
+ try {
26
+ for await (const chunk of stream) {
27
+ const bytes = chunk instanceof Uint8Array
28
+ ? chunk
29
+ : chunk instanceof ArrayBuffer
30
+ ? new Uint8Array(chunk)
31
+ : null;
32
+ if (!bytes)
33
+ throw new HttpError(500, 'Internal Server Error');
34
+ size += bytes.byteLength;
35
+ if (size > maxBytes)
36
+ throw new HttpError(413, 'Payload Too Large');
37
+ chunks.push(new Uint8Array(bytes));
38
+ }
39
+ }
40
+ catch (err) {
41
+ if (err instanceof HttpError)
42
+ throw err;
43
+ throw new HttpError(500, 'Internal Server Error');
44
+ }
45
+ const output = new Uint8Array(size);
46
+ let offset = 0;
47
+ for (const chunk of chunks) {
48
+ output.set(chunk, offset);
49
+ offset += chunk.byteLength;
50
+ }
51
+ return output;
52
+ }
53
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/adapters/shared.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAE3F,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IACxB,YAAY,MAAc,EAAE,OAAe;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,SAAS,MAAM,CAAC,KAAwC;IACtD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAwC;IACnE,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAE9D,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAA8B,EAAE,QAAgB;IACnF,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,YAAY,UAAU;gBACvC,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,KAAK,YAAY,WAAW;oBAC5B,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC;oBACvB,CAAC,CAAC,IAAI,CAAC;YAEX,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YAC9D,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC;YAEzB,IAAI,IAAI,GAAG,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS;YAAE,MAAM,GAAG,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWebhookHandler = createWebhookHandler;
4
+ const index_js_1 = require("../index.cjs");
5
+ function createWebhookHandler(options) {
6
+ return async (request, env, ctx) => {
7
+ const encoding = request.headers.get('content-encoding');
8
+ if (encoding && encoding.toLowerCase() !== 'identity') {
9
+ return new Response('Bad Request', { status: 400 });
10
+ }
11
+ let verification;
12
+ try {
13
+ const verifyOptions = options.options(env);
14
+ const result = await (0, index_js_1.verifyRequest)(request, verifyOptions);
15
+ if (!result.ok) {
16
+ if (result.reason === 'body-too-large') {
17
+ return new Response('Payload Too Large', { status: 413 });
18
+ }
19
+ return new Response('Bad Request', { status: 400 });
20
+ }
21
+ verification = result;
22
+ }
23
+ catch {
24
+ // This boundary contains setup/verification only, never the user handler.
25
+ return new Response('Internal Server Error', { status: 500 });
26
+ }
27
+ return await options.handler(request, env, ctx, verification);
28
+ };
29
+ }
@@ -0,0 +1,10 @@
1
+ import type { VerificationSuccess, VerifyOptions } from '../types.cjs';
2
+ export interface ExecutionContextLike {
3
+ waitUntil?(promise: Promise<unknown>): void;
4
+ passThroughOnException?(): void;
5
+ }
6
+ export interface WorkerWebhookHandlerOptions<Env = unknown> {
7
+ readonly options: (env: Env) => VerifyOptions;
8
+ readonly handler: (request: Request, env: Env, ctx: ExecutionContextLike, success: VerificationSuccess) => Response | Promise<Response>;
9
+ }
10
+ export declare function createWebhookHandler<Env = unknown>(options: WorkerWebhookHandlerOptions<Env>): (request: Request, env: Env, ctx: ExecutionContextLike) => Promise<Response>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWebhookMiddleware = createWebhookMiddleware;
4
+ const shared_js_1 = require("./shared.cjs");
5
+ const errors_js_1 = require("../errors.cjs");
6
+ const prepare_js_1 = require("../internal/prepare.cjs");
7
+ const verification_js_1 = require("../internal/verification.cjs");
8
+ const headers_js_1 = require("../internal/headers.cjs");
9
+ function createWebhookMiddleware(options) {
10
+ return async (req, res, next) => {
11
+ try {
12
+ const prepared = (0, prepare_js_1.prepareVerification)(options);
13
+ const normalized = prepared.options;
14
+ const receivedAt = (0, verification_js_1.readClock)(prepared);
15
+ const headers = [...(0, headers_js_1.normalizeHeaders)(req.headers)];
16
+ const maxBytes = normalized.maxBodyBytes;
17
+ const encodingHeader = req.headers['content-encoding'];
18
+ const encoding = Array.isArray(encodingHeader) ? encodingHeader.join(',') : encodingHeader;
19
+ if (encoding && encoding.toLowerCase() !== 'identity') {
20
+ res.status(400).send('Bad Request');
21
+ return;
22
+ }
23
+ const body = req.body;
24
+ let rawBody;
25
+ if (body instanceof Uint8Array) {
26
+ if (body.byteLength > maxBytes) {
27
+ res.status(413).send('Payload Too Large');
28
+ return;
29
+ }
30
+ rawBody = new Uint8Array(body);
31
+ }
32
+ else if (body !== undefined && body !== null) {
33
+ res.status(500).send('Internal Server Error');
34
+ return;
35
+ }
36
+ else {
37
+ if (req.readableEnded || req.readableDidRead || req.destroyed || req.readable === false) {
38
+ res.status(500).send('Internal Server Error');
39
+ return;
40
+ }
41
+ rawBody = await (0, shared_js_1.readNodeStream)(req, maxBytes);
42
+ }
43
+ const result = await (0, verification_js_1.verifyPrepared)({ rawBody, headers }, prepared, receivedAt);
44
+ if (!result.ok) {
45
+ const status = result.reason === 'body-too-large' ? 413 : 400;
46
+ res.status(status).send(status === 413 ? 'Payload Too Large' : 'Bad Request');
47
+ return;
48
+ }
49
+ req.webhook = result;
50
+ }
51
+ catch (err) {
52
+ if (err instanceof shared_js_1.HttpError) {
53
+ res.status(err.status).send(err.message);
54
+ return;
55
+ }
56
+ if (err instanceof errors_js_1.HooklatchError) {
57
+ res.status(500).send('Internal Server Error');
58
+ return;
59
+ }
60
+ next(err);
61
+ return;
62
+ }
63
+ next();
64
+ };
65
+ }
@@ -0,0 +1,8 @@
1
+ import type { RequestHandler } from 'express';
2
+ import type { VerificationSuccess, VerifyOptions } from '../types.cjs';
3
+ declare module 'express-serve-static-core' {
4
+ interface Request {
5
+ webhook?: VerificationSuccess;
6
+ }
7
+ }
8
+ export declare function createWebhookMiddleware(options: VerifyOptions): RequestHandler;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWebhookMiddleware = createWebhookMiddleware;
4
+ const errors_js_1 = require("../errors.cjs");
5
+ const index_js_1 = require("../index.cjs");
6
+ function createWebhookMiddleware(options) {
7
+ return async (c, next) => {
8
+ try {
9
+ const encoding = c.req.raw.headers.get('content-encoding');
10
+ if (encoding && encoding.toLowerCase() !== 'identity') {
11
+ return c.text('Bad Request', 400);
12
+ }
13
+ const result = await (0, index_js_1.verifyRequest)(c.req.raw, options);
14
+ if (!result.ok) {
15
+ if (result.reason === 'body-too-large') {
16
+ return c.text('Payload Too Large', 413);
17
+ }
18
+ return c.text('Bad Request', 400);
19
+ }
20
+ c.set('webhook', result);
21
+ }
22
+ catch (err) {
23
+ if (err instanceof errors_js_1.HooklatchError) {
24
+ return c.text('Internal Server Error', 500);
25
+ }
26
+ throw err;
27
+ }
28
+ await next();
29
+ };
30
+ }
@@ -0,0 +1,11 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ import type { VerificationSuccess, VerifyOptions } from '../types.cjs';
3
+ declare module 'hono' {
4
+ interface ContextVariableMap {
5
+ webhook?: VerificationSuccess;
6
+ }
7
+ }
8
+ export type WebhookVariables = {
9
+ webhook: VerificationSuccess;
10
+ };
11
+ export declare function createWebhookMiddleware(options: VerifyOptions): MiddlewareHandler;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWebhookHandler = createWebhookHandler;
4
+ const errors_js_1 = require("../errors.cjs");
5
+ const index_js_1 = require("../index.cjs");
6
+ function createWebhookHandler(options) {
7
+ try {
8
+ // Observe credential descriptors before object-rest can invoke an accessor
9
+ // that replaces itself. Existing HMAC top-level getter snapshots stay intact.
10
+ const credentials = ['publicKeys', 'expectedUserId', 'secrets', 'secret'].map((name) => ({
11
+ name, property: Object.getOwnPropertyDescriptor(options, name),
12
+ }));
13
+ const { handler, ...verifyOptions } = options;
14
+ for (const { name, property } of credentials) {
15
+ const preserve = verifyOptions.provider === 'fal'
16
+ || (verifyOptions.provider === 'vercel' && (name === 'publicKeys' || name === 'expectedUserId'));
17
+ if (preserve && property !== undefined)
18
+ Object.defineProperty(verifyOptions, name, property);
19
+ }
20
+ // Object rest omits non-enumerable fields; own configuration presence is meaningful.
21
+ if (Object.hasOwn(options, 'providerOptions') && !Object.hasOwn(verifyOptions, 'providerOptions')) {
22
+ Object.defineProperty(verifyOptions, 'providerOptions', {
23
+ value: options.providerOptions, enumerable: true, configurable: true, writable: true,
24
+ });
25
+ }
26
+ return requestHandler(verifyOptions, handler);
27
+ }
28
+ catch {
29
+ // Contain caller-owned accessors without exposing their thrown values.
30
+ return async () => new Response('Internal Server Error', { status: 500 });
31
+ }
32
+ }
33
+ function requestHandler(verifyOptions, handler) {
34
+ return async (request) => {
35
+ const encoding = request.headers.get('content-encoding');
36
+ if (encoding && encoding.toLowerCase() !== 'identity') {
37
+ return new Response('Bad Request', { status: 400 });
38
+ }
39
+ let verification;
40
+ try {
41
+ const result = await (0, index_js_1.verifyRequest)(request, verifyOptions);
42
+ if (!result.ok) {
43
+ if (result.reason === 'body-too-large') {
44
+ return new Response('Payload Too Large', { status: 413 });
45
+ }
46
+ return new Response('Bad Request', { status: 400 });
47
+ }
48
+ verification = result;
49
+ }
50
+ catch (err) {
51
+ if (err instanceof errors_js_1.HooklatchError) {
52
+ return new Response('Internal Server Error', { status: 500 });
53
+ }
54
+ throw err;
55
+ }
56
+ return await handler(request, verification);
57
+ };
58
+ }
@@ -0,0 +1,5 @@
1
+ import type { VerificationSuccess, VerifyOptions } from '../types.cjs';
2
+ export type NextWebhookHandlerOptions = VerifyOptions & {
3
+ readonly handler: (request: Request, success: VerificationSuccess) => Response | Promise<Response>;
4
+ };
5
+ export declare function createWebhookHandler(options: NextWebhookHandlerOptions): (request: Request) => Promise<Response>;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /** Shared helpers for framework adapters. Node/Web runtime agnostic except where noted. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.HttpError = void 0;
5
+ exports.toUint8Array = toUint8Array;
6
+ exports.readNodeStream = readNodeStream;
7
+ class HttpError extends Error {
8
+ status;
9
+ constructor(status, message) {
10
+ super(message);
11
+ this.name = 'HttpError';
12
+ this.status = status;
13
+ }
14
+ }
15
+ exports.HttpError = HttpError;
16
+ function isText(value) {
17
+ return typeof value === 'string';
18
+ }
19
+ function toUint8Array(value) {
20
+ if (value instanceof Uint8Array)
21
+ return new Uint8Array(value);
22
+ if (value instanceof ArrayBuffer)
23
+ return new Uint8Array(value);
24
+ if (isText(value))
25
+ return new TextEncoder().encode(value);
26
+ throw new HttpError(500, 'Internal Server Error');
27
+ }
28
+ async function readNodeStream(stream, maxBytes) {
29
+ const chunks = [];
30
+ let size = 0;
31
+ try {
32
+ for await (const chunk of stream) {
33
+ const bytes = chunk instanceof Uint8Array
34
+ ? chunk
35
+ : chunk instanceof ArrayBuffer
36
+ ? new Uint8Array(chunk)
37
+ : null;
38
+ if (!bytes)
39
+ throw new HttpError(500, 'Internal Server Error');
40
+ size += bytes.byteLength;
41
+ if (size > maxBytes)
42
+ throw new HttpError(413, 'Payload Too Large');
43
+ chunks.push(new Uint8Array(bytes));
44
+ }
45
+ }
46
+ catch (err) {
47
+ if (err instanceof HttpError)
48
+ throw err;
49
+ throw new HttpError(500, 'Internal Server Error');
50
+ }
51
+ const output = new Uint8Array(size);
52
+ let offset = 0;
53
+ for (const chunk of chunks) {
54
+ output.set(chunk, offset);
55
+ offset += chunk.byteLength;
56
+ }
57
+ return output;
58
+ }
@@ -0,0 +1,7 @@
1
+ /** Shared helpers for framework adapters. Node/Web runtime agnostic except where noted. */
2
+ export declare class HttpError extends Error {
3
+ readonly status: number;
4
+ constructor(status: number, message: string);
5
+ }
6
+ export declare function toUint8Array(value: Uint8Array | ArrayBuffer | string): Uint8Array;
7
+ export declare function readNodeStream(stream: AsyncIterable<unknown>, maxBytes: number): Promise<Uint8Array>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.verify = verify;
4
+ exports.createVerifier = createVerifier;
5
+ exports.verifyRequest = verifyRequest;
6
+ const errors_js_1 = require("./errors.cjs");
7
+ const prepare_js_1 = require("./internal/prepare.cjs");
8
+ const headers_js_1 = require("./internal/headers.cjs");
9
+ const body_js_1 = require("./internal/body.cjs");
10
+ const verification_js_1 = require("./internal/verification.cjs");
11
+ async function verify(request, options) {
12
+ return (0, verification_js_1.verifyPrepared)(request, (0, prepare_js_1.prepareVerification)(options));
13
+ }
14
+ function createVerifier(options) {
15
+ const prepared = (0, prepare_js_1.prepareVerification)(options);
16
+ return (request) => (0, verification_js_1.verifyPrepared)(request, prepared);
17
+ }
18
+ /** Consumes the original Request once. Successful callers use result.rawBody. */
19
+ async function verifyRequest(request, options) {
20
+ const prepared = (0, prepare_js_1.prepareVerification)(options);
21
+ const receivedAt = (0, verification_js_1.readClock)(prepared);
22
+ if (!(request instanceof Request))
23
+ throw new errors_js_1.HooklatchError('invalid-input', 'A Web Request is required.');
24
+ const headers = (0, headers_js_1.normalizeHeaders)(request.headers);
25
+ const rawBody = await (0, body_js_1.readBody)(request, prepared.options.maxBodyBytes);
26
+ if (rawBody === null)
27
+ return (0, verification_js_1.failure)(prepared, 'body-too-large', 'Request body exceeds the configured limit.');
28
+ // Normalize to tuples so byte and header snapshots share the raw-input path.
29
+ return (0, verification_js_1.verifyPrepared)({ rawBody, headers: [...headers] }, prepared, receivedAt);
30
+ }
@@ -0,0 +1,5 @@
1
+ import type { VerificationResult, VerifyOptions, WebhookRequest } from './types.cjs';
2
+ export declare function verify(request: WebhookRequest, options: VerifyOptions): Promise<VerificationResult>;
3
+ export declare function createVerifier(options: VerifyOptions): (request: WebhookRequest) => Promise<VerificationResult>;
4
+ /** Consumes the original Request once. Successful callers use result.rawBody. */
5
+ export declare function verifyRequest(request: Request, options: VerifyOptions): Promise<VerificationResult>;