{"_id":"@anyhook/cloudflare","_rev":"3-d2675fe28aebac36bcce45bf6728ac29","name":"@anyhook/cloudflare","dist-tags":{"latest":"0.2.2"},"versions":{"0.2.0":{"name":"@anyhook/cloudflare","version":"0.2.0","keywords":["anyhook","cloudflare","workers","durable-objects","webhooks"],"author":{"name":"Shantanu Sharma"},"license":"MIT","_id":"@anyhook/cloudflare@0.2.0","maintainers":[{"name":"sns45","email":"notifyshantanu@gmail.com"}],"dist":{"shasum":"0367d8485ad6e6f46a1adc7999bc1c68503eb85e","tarball":"https://registry.npmjs.org/@anyhook/cloudflare/-/cloudflare-0.2.0.tgz","fileCount":23,"integrity":"sha512-tWj8wDZT441kA/khiy4MFPBsptaHnHtH5R3+jP2GOtm44wGDpacho7jvxLWVrOlPTfwvu5bvzJbCGKDOYDqvEA==","signatures":[{"sig":"MEQCIATCXckBZ0HBU1yu7zQVpMuQqH9qbcx1m89Dy+oKD8ycAiABiReARFlKbWZ2myyw5xQMO6EK7/iZtXBNJ8hEYBYTqw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75089},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"b52f20c74ba626bcc43682bc8e746a9ca4b40b69","scripts":{"test":"for f in test/*.test.ts; do bun test \"$f\" || exit 1; done","build":"bun build ./src/index.ts --outdir ./dist --target bun --external cloudflare:workers && bun run build:types","clean":"rm -rf dist coverage","typecheck":"tsc --noEmit","build:types":"tsc --emitDeclarationOnly --outDir dist"},"_npmUser":{"name":"sns45","email":"notifyshantanu@gmail.com"},"_npmVersion":"10.9.2","description":"Cloudflare adapter for anyhook: Cloudflare Queues transport + per-endpoint Durable Object state + Alarms scheduler","directories":{},"_nodeVersion":"22.17.0","dependencies":{"@anyhook/core":"0.2.0","@anyhook/signing":"0.2.0","@anyq/cloudflare-queues":"^0.3.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"miniflare":"^4.0.0","@types/bun":"^1.1.0","typescript":"^5.3.0","@anyhook/testing":"workspace:*","@cloudflare/workers-types":"^5.0.0"},"peerDependencies":{"@anyhook/core":"0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/cloudflare_0.2.0_1784916194592_0.4931151444299964","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@anyhook/cloudflare","version":"0.2.1","keywords":["anyhook","cloudflare","workers","durable-objects","webhooks"],"author":{"name":"Shantanu Sharma"},"license":"MIT","_id":"@anyhook/cloudflare@0.2.1","maintainers":[{"name":"sns45","email":"notifyshantanu@gmail.com"}],"dist":{"shasum":"04bcc82b7f63b9f3d320e3cc6051f0204c6565de","tarball":"https://registry.npmjs.org/@anyhook/cloudflare/-/cloudflare-0.2.1.tgz","fileCount":23,"integrity":"sha512-apFRiP6rxNoxvGgBogT3m1ec9e4u40RzCr5Owj478IXlDWgQDSMeGYjYeqOkMM92TFSoGFD0T+uuwP3UjpfGEA==","signatures":[{"sig":"MEQCIHTioG7SkPz37q2+nZq5Gs53D7YmgIPvo8v5PlW3/UJaAiBz+w44CINzIFrDQAXtV/IBhgBOQBXMQAYHAe0ZM2a7Pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75083},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"b52f20c74ba626bcc43682bc8e746a9ca4b40b69","scripts":{"test":"for f in test/*.test.ts; do bun test \"$f\" || exit 1; done","build":"bun build ./src/index.ts --outdir ./dist --target bun --external cloudflare:workers && bun run build:types","clean":"rm -rf dist coverage","typecheck":"tsc --noEmit","build:types":"tsc --emitDeclarationOnly --outDir dist"},"_npmUser":{"name":"sns45","email":"notifyshantanu@gmail.com"},"_npmVersion":"10.9.2","description":"Cloudflare adapter for anyhook: Cloudflare Queues transport + per-endpoint Durable Object state + Alarms scheduler","directories":{},"_nodeVersion":"22.17.0","dependencies":{"@anyhook/core":"0.2.1","@anyhook/signing":"0.2.1","@anyq/cloudflare-queues":"^0.3.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"miniflare":"^4.0.0","@types/bun":"^1.1.0","typescript":"^5.3.0","@anyhook/testing":"0.2.1","@cloudflare/workers-types":"^5.0.0"},"peerDependencies":{"@anyhook/core":"0.2.1"},"_npmOperationalInternal":{"tmp":"tmp/cloudflare_0.2.1_1784916766528_0.20895362645778426","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@anyhook/cloudflare","version":"0.2.2","description":"Cloudflare adapter for anyhook: Cloudflare Queues transport + per-endpoint Durable Object state + Alarms scheduler","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"bun build ./src/index.ts --outdir ./dist --target bun --external cloudflare:workers && bun run build:types","build:types":"tsc --emitDeclarationOnly --outDir dist","test":"for f in test/*.test.ts; do bun test \"$f\" || exit 1; done","typecheck":"tsc --noEmit","clean":"rm -rf dist coverage"},"dependencies":{"@anyhook/core":"0.2.2","@anyhook/signing":"0.2.2","@anyq/cloudflare-queues":"^0.3.2"},"peerDependencies":{"@anyhook/core":"0.2.2"},"devDependencies":{"@anyhook/testing":"0.2.2","@cloudflare/workers-types":"^5.0.0","@types/bun":"^1.1.0","miniflare":"^4.0.0","typescript":"^5.3.0"},"keywords":["anyhook","cloudflare","workers","durable-objects","webhooks"],"license":"MIT","author":"Shantanu Sharma","publishConfig":{"access":"public"},"_id":"@anyhook/cloudflare@0.2.2","_integrity":"sha512-x4l20Ojw5RqTASWeZ4JZKzi8i26mlgKfvtW6HOg4/sDwudYjyHr1wcR9l+4Kyj8LV5b/w8vRgwfgjzNnKHd7Rw==","_nodeVersion":"26.3.0","_npmVersion":"10.8.3","shasum":"7a0223849af2ab71937bb3bcd2c2dc10f9e8ac14","dist":{"integrity":"sha512-x4l20Ojw5RqTASWeZ4JZKzi8i26mlgKfvtW6HOg4/sDwudYjyHr1wcR9l+4Kyj8LV5b/w8vRgwfgjzNnKHd7Rw==","shasum":"7a0223849af2ab71937bb3bcd2c2dc10f9e8ac14","tarball":"https://registry.npmjs.org/@anyhook/cloudflare/-/cloudflare-0.2.2.tgz","fileCount":23,"unpackedSize":75049,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDlvd+ofIi150touXVh8AThO4iTDPoBdFNWOkj5++RfzgIgd9DmW471Q9AugcYmBtwCD3m7x16gvib3lcmpV6NtKTY="}]},"_npmUser":{"name":"sns45","email":"notifyshantanu@gmail.com"},"directories":{},"maintainers":[{"name":"sns45","email":"notifyshantanu@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cloudflare_0.2.2_1788790451756_0.46742175807323827"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-24T18:03:14.413Z","modified":"2026-09-07T14:14:12.030Z","0.2.0":"2026-07-24T18:03:14.749Z","0.2.1":"2026-07-24T18:12:46.640Z","0.2.2":"2026-09-07T14:14:11.872Z"},"author":"Shantanu Sharma","license":"MIT","keywords":["anyhook","cloudflare","workers","durable-objects","webhooks"],"description":"Cloudflare adapter for anyhook: Cloudflare Queues transport + per-endpoint Durable Object state + Alarms scheduler","maintainers":[{"name":"sns45","email":"notifyshantanu@gmail.com"}],"readme":"# @anyhook/cloudflare\n\nCloudflare adapter for [anyhook](https://github.com/sns45/anyhook): deploy the outbound webhook engine as a Worker with **no server and no database**.\n\n- **Transport:** [`@anyq/cloudflare-queues`](https://www.npmjs.com/package/@anyq/cloudflare-queues) over a Cloudflare Queue.\n- **State:** one **Durable Object per endpoint** (circuit + messages + attempts + DLQ) and one index DO per tenant (endpoints + idempotency).\n- **Scheduler:** Durable Object **Alarms** (the state store is the schedule).\n- Ships a **deployable Worker template** + `wrangler.toml`.\n\n## Install\n\n```bash\nnpm i @anyhook/core @anyhook/cloudflare\n```\n\n## Overview\n\n```ts\nimport { WebhookEngine, createPortalRouter } from '@anyhook/core';\nimport { createSigner } from '@anyhook/signing';\nimport { createAdapter, TenantIndexDurableObject, EndpointDurableObject } from '@anyhook/cloudflare';\n\nexport { TenantIndexDurableObject, EndpointDurableObject };\n\nexport default {\n  async fetch(req, env) {\n    const engine = new WebhookEngine({ ...createAdapter(env), signer: createSigner() });\n    return createPortalRouter(engine)(req);\n  },\n  async queue(batch, env) {\n    const { transport, ...ports } = createAdapter(env);\n    const engine = new WebhookEngine({ transport, ...ports, signer: createSigner() });\n    await transport.subscribe((m) => engine.processMessage(m));\n    await transport.dispatchBatch(batch);\n  },\n};\n```\n\nThe Worker `queue()` export drives delivery; retries are re-enqueued by DO Alarms. Enable `nodejs_compat` (signing uses `node:crypto`). Mount behind your own auth (see the root `docs/composition-auth.md`). MIT.\n","readmeFilename":"README.md"}