{"_id":"@eidos.space/graft-remote-cloudflare","_rev":"6-5fd381c51d46a13c8dd6d77e974086f7","name":"@eidos.space/graft-remote-cloudflare","dist-tags":{"latest":"0.2.4"},"versions":{"0.1.0":{"name":"@eidos.space/graft-remote-cloudflare","version":"0.1.0","license":"MIT","_id":"@eidos.space/graft-remote-cloudflare@0.1.0","maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"homepage":"https://github.com/eidos-space/graft","bugs":{"url":"https://github.com/eidos-space/graft/issues"},"dist":{"shasum":"734c52416c6a03c84f5dc2c451278f4f128f94f3","tarball":"https://registry.npmjs.org/@eidos.space/graft-remote-cloudflare/-/graft-remote-cloudflare-0.1.0.tgz","fileCount":19,"integrity":"sha512-G6NlxSCD5OqYIQ5SZmNynW1F+B+A9oajQGY0R5N97M3ck7vyyMfRSNBlsWUwSOWF4jfZX0888s+twZveUZTmUA==","signatures":[{"sig":"MEYCIQCLfED2jBdytc47cNFCjerZRPQUrDYS0GuUFN4X5DzBFAIhALX/hx/H+vOpb0k4s6vAc2lYvYhuXH0vfnIvg90svqm3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eidos.space%2fgraft-remote-cloudflare@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":29806},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.1.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"agodrich","email":"dreama9ain@gmail.com"},"_resolved":"/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.1.0.tgz","_integrity":"sha512-G6NlxSCD5OqYIQ5SZmNynW1F+B+A9oajQGY0R5N97M3ck7vyyMfRSNBlsWUwSOWF4jfZX0888s+twZveUZTmUA==","repository":{"url":"git+https://github.com/eidos-space/graft.git","type":"git","directory":"packages/graft-remote-cloudflare"},"_npmVersion":"11.16.0","description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@eidos.space/graft-remote":"^0.1.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2","@cloudflare/workers-types":"5.20260722.1"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260722.1"},"_npmOperationalInternal":{"tmp":"tmp/graft-remote-cloudflare_0.1.0_1785353166484_0.2293542524938501","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@eidos.space/graft-remote-cloudflare","version":"0.2.0","license":"MIT","_id":"@eidos.space/graft-remote-cloudflare@0.2.0","maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"homepage":"https://github.com/eidos-space/graft","bugs":{"url":"https://github.com/eidos-space/graft/issues"},"dist":{"shasum":"b4669ce5a2003cce67d1c888d6f122ddf68d7997","tarball":"https://registry.npmjs.org/@eidos.space/graft-remote-cloudflare/-/graft-remote-cloudflare-0.2.0.tgz","fileCount":19,"integrity":"sha512-70LNqBlTXLWFGv0mD0tVa6HY207yR/XQYHmunp3R5dvfKYPAyFX/RWMFhc/aFDhj3ombpX9VBj5P58uOwp2vCw==","signatures":[{"sig":"MEUCIBpwfmSKxGEvRiebc+b/QwbuwxBYUJlQm+qgisb2FS7+AiEAl1W7uM5TyHAE48QvlkDVZDCkN6PGdE1XLTT4Y+KJ4lo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eidos.space%2fgraft-remote-cloudflare@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":29806},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.0.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"agodrich","email":"dreama9ain@gmail.com"},"_resolved":"/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.0.tgz","_integrity":"sha512-70LNqBlTXLWFGv0mD0tVa6HY207yR/XQYHmunp3R5dvfKYPAyFX/RWMFhc/aFDhj3ombpX9VBj5P58uOwp2vCw==","repository":{"url":"git+https://github.com/eidos-space/graft.git","type":"git","directory":"packages/graft-remote-cloudflare"},"_npmVersion":"11.16.0","description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@eidos.space/graft-remote":"^0.2.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2","@cloudflare/workers-types":"5.20260722.1"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260722.1"},"_npmOperationalInternal":{"tmp":"tmp/graft-remote-cloudflare_0.2.0_1785411193577_0.43739264360539587","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@eidos.space/graft-remote-cloudflare","version":"0.2.1","license":"MIT","_id":"@eidos.space/graft-remote-cloudflare@0.2.1","maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"homepage":"https://github.com/eidos-space/graft","bugs":{"url":"https://github.com/eidos-space/graft/issues"},"dist":{"shasum":"e07bbf097cd0a521db7d23281093f22a539a49d3","tarball":"https://registry.npmjs.org/@eidos.space/graft-remote-cloudflare/-/graft-remote-cloudflare-0.2.1.tgz","fileCount":19,"integrity":"sha512-E75UEtONJo2buQlDb3r4Ae3trp4qUMlE5GlJI2Bb8Da0mzf8jpYaTvWpdZWMPgZvGOENuDXz/ZPdSrIguj+pcg==","signatures":[{"sig":"MEYCIQCWMR5Epa3eq1Xsa0EsSTgqXmXKy1x2G2T2Pe+APGDbpAIhAPyY8hqB7bVajIi6EQGwfNXYumqu8cNbBaiYDWD1W7c+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eidos.space%2fgraft-remote-cloudflare@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":50477},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.1.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"agodrich","email":"dreama9ain@gmail.com"},"_resolved":"/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.1.tgz","_integrity":"sha512-E75UEtONJo2buQlDb3r4Ae3trp4qUMlE5GlJI2Bb8Da0mzf8jpYaTvWpdZWMPgZvGOENuDXz/ZPdSrIguj+pcg==","repository":{"url":"git+https://github.com/eidos-space/graft.git","type":"git","directory":"packages/graft-remote-cloudflare"},"_npmVersion":"11.16.0","description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@eidos.space/graft-remote":"^0.2.1"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2","@cloudflare/workers-types":"5.20260722.1"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260722.1"},"_npmOperationalInternal":{"tmp":"tmp/graft-remote-cloudflare_0.2.1_1785655012696_0.08595804368518722","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@eidos.space/graft-remote-cloudflare","version":"0.2.2","license":"MIT","_id":"@eidos.space/graft-remote-cloudflare@0.2.2","maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"homepage":"https://github.com/eidos-space/graft","bugs":{"url":"https://github.com/eidos-space/graft/issues"},"dist":{"shasum":"5ed1c98a5f4df0fd571745a439517b31b98e07a3","tarball":"https://registry.npmjs.org/@eidos.space/graft-remote-cloudflare/-/graft-remote-cloudflare-0.2.2.tgz","fileCount":19,"integrity":"sha512-V0UwkeVsgG+nABY8Zw7Vx8pzuY/EtbabpiQquNGj13T/nC0Pvp7o+mapKNgW5mEnd9dZDbb+yBIUWGOZ1e+F9g==","signatures":[{"sig":"MEUCIGAYwnbx+aWIioV6/CjFDKtSUys3+2mMwJNKcGFYiACEAiEAj4EBWM2pTCQZ/fAqzCp0yrLSovS9N0poehddUfbAna8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eidos.space%2fgraft-remote-cloudflare@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":51630},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.2.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4780f6c6-6457-42db-9e83-19e000fe3938"}},"_resolved":"/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.2.tgz","_integrity":"sha512-V0UwkeVsgG+nABY8Zw7Vx8pzuY/EtbabpiQquNGj13T/nC0Pvp7o+mapKNgW5mEnd9dZDbb+yBIUWGOZ1e+F9g==","repository":{"url":"git+https://github.com/eidos-space/graft.git","type":"git","directory":"packages/graft-remote-cloudflare"},"_npmVersion":"11.16.0","description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","directories":{},"sideEffects":false,"_nodeVersion":"24.18.0","dependencies":{"@eidos.space/graft-remote":"^0.2.2"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2","@cloudflare/workers-types":"5.20260722.1"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260722.1"},"_npmOperationalInternal":{"tmp":"tmp/graft-remote-cloudflare_0.2.2_1786631497373_0.3860932116212379","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@eidos.space/graft-remote-cloudflare","version":"0.2.3","license":"MIT","_id":"@eidos.space/graft-remote-cloudflare@0.2.3","maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"homepage":"https://github.com/eidos-space/graft","bugs":{"url":"https://github.com/eidos-space/graft/issues"},"dist":{"shasum":"b0111669a2b2898c1499001664cb83d3292fdb8a","tarball":"https://registry.npmjs.org/@eidos.space/graft-remote-cloudflare/-/graft-remote-cloudflare-0.2.3.tgz","fileCount":19,"integrity":"sha512-aBgGSnXtBDq1C0ITHpZmRY83GLQZww1PNsCgot/6YJIg0nkDdkizWlCkfq8c/pUKzmm2QGalk561G+Id0KSxlw==","signatures":[{"sig":"MEUCIQD66UaX8+CNMsPInttde+KmUBZjLoZGk5hbTpxdX9baMwIgCd0cfwZnyagL2JwqE0hknFXk6cpi7zlXyb2Lyy1dT5A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eidos.space%2fgraft-remote-cloudflare@0.2.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":51630},"main":"./dist/index.js","type":"module","_from":"file:/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.3.tgz","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4780f6c6-6457-42db-9e83-19e000fe3938"}},"_resolved":"/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.3.tgz","_integrity":"sha512-aBgGSnXtBDq1C0ITHpZmRY83GLQZww1PNsCgot/6YJIg0nkDdkizWlCkfq8c/pUKzmm2QGalk561G+Id0KSxlw==","repository":{"url":"git+https://github.com/eidos-space/graft.git","type":"git","directory":"packages/graft-remote-cloudflare"},"_npmVersion":"11.16.0","description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","directories":{},"sideEffects":false,"_nodeVersion":"24.19.0","dependencies":{"@eidos.space/graft-remote":"^0.2.3"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"typescript":"7.0.2","@cloudflare/workers-types":"5.20260722.1"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260722.1"},"_npmOperationalInternal":{"tmp":"tmp/graft-remote-cloudflare_0.2.3_1786935955281_0.49163236959042345","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@eidos.space/graft-remote-cloudflare","version":"0.2.4","description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","type":"module","license":"MIT","repository":{"type":"git","url":"git+https://github.com/eidos-space/graft.git","directory":"packages/graft-remote-cloudflare"},"homepage":"https://github.com/eidos-space/graft","sideEffects":false,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"main":"./dist/index.js","types":"./dist/index.d.ts","dependencies":{"@eidos.space/graft-remote":"^0.2.4"},"peerDependencies":{"@cloudflare/workers-types":"^5.20260722.1"},"devDependencies":{"@cloudflare/workers-types":"5.20260722.1","typescript":"7.0.2"},"engines":{"node":">=20"},"publishConfig":{"access":"public","provenance":true},"scripts":{"build":"node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json","check":"tsc -p tsconfig.json --noEmit"},"_id":"@eidos.space/graft-remote-cloudflare@0.2.4","bugs":{"url":"https://github.com/eidos-space/graft/issues"},"_integrity":"sha512-RJ99kykyuwDgA76BLYvvM1gzevQ3UP6h771BLNGOYPns8XAr6nrvGFT5nAbqtrgqtEVHR/k47uUioOksw3g5Ww==","_resolved":"/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.4.tgz","_from":"file:/home/runner/work/graft/graft/release-assets/graft-remote/eidos.space-graft-remote-cloudflare-0.2.4.tgz","_nodeVersion":"24.20.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-RJ99kykyuwDgA76BLYvvM1gzevQ3UP6h771BLNGOYPns8XAr6nrvGFT5nAbqtrgqtEVHR/k47uUioOksw3g5Ww==","shasum":"2f702744ab9912030a617311131d1ed9fb23b2ae","tarball":"https://registry.npmjs.org/@eidos.space/graft-remote-cloudflare/-/graft-remote-cloudflare-0.2.4.tgz","fileCount":19,"unpackedSize":51630,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@eidos.space%2fgraft-remote-cloudflare@0.2.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDhesHMPr0f1wqN186ZVIYIlTzuMlxE8UZowG+h9spY8AiBw+I3/dk95d8E6ND2/UrWD+lXdBvJ6hLFBDrbtvuSlvg=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4780f6c6-6457-42db-9e83-19e000fe3938"}},"directories":{},"maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/graft-remote-cloudflare_0.2.4_1788862784062_0.9771971720123065"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-29T19:26:06.317Z","modified":"2026-09-08T10:19:44.487Z","0.1.0":"2026-07-29T19:26:06.640Z","0.2.0":"2026-07-30T11:33:13.737Z","0.2.1":"2026-08-02T07:16:52.838Z","0.2.2":"2026-08-13T14:31:37.532Z","0.2.3":"2026-08-17T03:05:55.420Z","0.2.4":"2026-09-08T10:19:44.202Z"},"bugs":{"url":"https://github.com/eidos-space/graft/issues"},"license":"MIT","homepage":"https://github.com/eidos-space/graft","repository":{"type":"git","url":"git+https://github.com/eidos-space/graft.git","directory":"packages/graft-remote-cloudflare"},"description":"Cloudflare storage and authentication adapters for @eidos.space/graft-remote","maintainers":[{"name":"agodrich","email":"dreama9ain@gmail.com"}],"readme":"# `@eidos.space/graft-remote-cloudflare`\n\nCloudflare storage and authentication adapters for\n`@eidos.space/graft-remote`.\n\nThis package contains the reusable Cloudflare-specific layer:\n\n- `CloudflareRepositoryBackend` stores immutable objects in R2 and\n  transactional metadata in a SQLite Durable Object;\n- `RepositoryDurableObject` implements atomic create, CAS, CAD, and listing;\n- `requireBearerToken` performs timing-safe bearer-token verification.\n\nIt does not create routes or export a Worker application. Use\n`@eidos.space/graft-remote-hono` for Hono routing, or connect the backend to\nanother adapter.\n\n## Install\n\n```bash\nnpm install \\\n  @eidos.space/graft-remote-cloudflare \\\n  @eidos.space/graft-remote-hono \\\n  hono\n```\n\n## Compose a Worker\n\nGenerate the Worker `Env` from `wrangler.jsonc` with `wrangler types`, then pass\nthe generated bindings explicitly:\n\n```ts\nimport { createGraftRemote } from \"@eidos.space/graft-remote-hono\";\nimport {\n  CloudflareRepositoryBackend,\n  GraftProtocolError,\n  RepositoryDurableObject,\n  requireBearerToken,\n} from \"@eidos.space/graft-remote-cloudflare\";\n\nexport { RepositoryDurableObject };\n\ntype AppEnv = { Bindings: Env };\n\nexport default createGraftRemote<AppEnv>({\n  async authenticate({ request, adapterContext }) {\n    const token = adapterContext.env.GRAFT_REMOTE_TOKEN;\n    if (!token) {\n      throw new GraftProtocolError(503, \"service_not_configured\", \"Token is not configured\");\n    }\n    await requireBearerToken(request, token);\n    return undefined;\n  },\n\n  backend({ adapterContext, repository }) {\n    return new CloudflareRepositoryBackend(\n      {\n        objects: adapterContext.env.OBJECTS,\n        repositories: adapterContext.env.REPOSITORIES,\n      },\n      repository.id,\n    );\n  },\n});\n```\n\nThe host Worker owns binding names, secrets, authentication policy, and routing.\nThe package never calls the Cloudflare REST API; it uses R2 and Durable Object\nbindings directly and streams immutable request and response bodies.\n\nSee `services/graft-remote-cloudflare` for a deployable verification service,\nWrangler configuration, and end-to-end Workers runtime tests.\n","readmeFilename":"README.md"}