@statewalker/cellb 0.1.1 → 0.3.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/README.md +51 -25
- package/dist/adapters/wasm-sqlite.d.ts +11 -0
- package/dist/adapters/wasm-sqlite.js +26 -3
- package/dist/adapters/wasm-sqlite.js.map +1 -1
- package/dist/bindings/assets.js +2 -2
- package/dist/bindings/assets.js.map +1 -1
- package/dist/bindings/r2.js +2 -2
- package/dist/bindings/r2.js.map +1 -1
- package/dist/browser.d.ts +0 -1
- package/dist/browser.js +0 -1
- package/dist/browser.js.map +1 -1
- package/dist/bucket/celld-cells.js +1 -1
- package/dist/bucket/celld-cells.js.map +1 -1
- package/dist/bucket/s3-object-store.js +1 -1
- package/dist/bucket/s3-object-store.js.map +1 -1
- package/dist/core/handles.d.ts +5 -2
- package/dist/core/handles.js +12 -1
- package/dist/core/handles.js.map +1 -1
- package/dist/core/id.js +3 -3
- package/dist/core/id.js.map +1 -1
- package/dist/core/namespace.d.ts +1 -1
- package/dist/core/namespace.js +2 -1
- package/dist/core/namespace.js.map +1 -1
- package/dist/core/object-host.d.ts +23 -0
- package/dist/core/object-host.js +87 -6
- package/dist/core/object-host.js.map +1 -1
- package/dist/core/runtime.d.ts +10 -0
- package/dist/core/runtime.js +43 -2
- package/dist/core/runtime.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/isolate/browser.js +1 -1
- package/dist/isolate/browser.js.map +1 -1
- package/dist/isolate/host.d.ts +5 -1
- package/dist/isolate/host.js +29 -2
- package/dist/isolate/host.js.map +1 -1
- package/dist/isolate/isolate-worker.js +11 -1
- package/dist/isolate/isolate-worker.js.map +1 -1
- package/dist/isolate/isolate.js +20 -0
- package/dist/isolate/isolate.js.map +1 -1
- package/dist/isolate/node-entry.js +11 -0
- package/dist/isolate/node-entry.js.map +1 -1
- package/dist/isolate/protocol.d.ts +5 -0
- package/dist/isolate/protocol.js +114 -2
- package/dist/isolate/protocol.js.map +1 -1
- package/dist/node-compat/crypto.js +3 -3
- package/dist/node-compat/crypto.js.map +1 -1
- package/dist/peer/celld-peer.d.ts +17 -0
- package/dist/peer/celld-peer.js +49 -7
- package/dist/peer/celld-peer.js.map +1 -1
- package/dist/project/browser-host.js +3 -2
- package/dist/project/browser-host.js.map +1 -1
- package/dist/project/node-project.js +2 -1
- package/dist/project/node-project.js.map +1 -1
- package/dist/project/site-loader.d.ts +45 -0
- package/dist/project/site-loader.js +97 -0
- package/dist/project/site-loader.js.map +1 -0
- package/dist/project/site.d.ts +0 -36
- package/dist/project/site.js +11 -99
- package/dist/project/site.js.map +1 -1
- package/dist/project/wrangler.js +10 -0
- package/dist/project/wrangler.js.map +1 -1
- package/dist/router/cell-router.js +1 -1
- package/dist/router/cell-router.js.map +1 -1
- package/dist/site.d.ts +1 -0
- package/dist/site.js +6 -0
- package/dist/site.js.map +1 -0
- package/dist/transport/port.d.ts +3 -4
- package/dist/transport/port.js +21 -79
- package/dist/transport/port.js.map +1 -1
- package/dist/ws/client.d.ts +23 -8
- package/dist/ws/client.js +50 -189
- package/dist/ws/client.js.map +1 -1
- package/dist/ws/frames.d.ts +31 -8
- package/dist/ws/frames.js +54 -7
- package/dist/ws/frames.js.map +1 -1
- package/dist/ws/server.d.ts +4 -0
- package/dist/ws/server.js +29 -5
- package/dist/ws/server.js.map +1 -1
- package/package.json +29 -10
package/dist/bindings/r2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/bindings/r2.ts"],"names":[],"mappings":"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","sourcesContent":["import { md5 } from \"@noble/hashes/legacy\";\nimport { bytesToHex } from \"@noble/hashes/utils\";\nimport type { FilesApi } from \"@statewalker/webrun-files\";\n\n/**\n * The R2 binding (`env.BUCKET.get/put/head/delete/list`, conditional requests, multipart\n * uploads) on an R2Backend: a webrun-files FilesApi here, or celld's fleet bucket layout\n * (r2-celld.ts). Like celld — whose R2 bindings read and write objects directly in the fleet\n * bucket, not through a cell — the FilesApi backend keeps objects as files:\n * {root}/objects/<encoded key> the bytes\n * {root}/meta/<encoded key>.json key, size, etag (MD5; a multipart object has none), version,\n * uploaded, metadata\n * {root}/multipart/<uploadId>/ an open upload's description and parts, until complete or abort\n */\nexport interface R2HTTPMetadata {\n contentType?: string;\n contentLanguage?: string;\n contentDisposition?: string;\n contentEncoding?: string;\n cacheControl?: string;\n cacheExpiry?: Date;\n}\n\nexport interface StoredMeta {\n /** Hex MD5 of the bytes when the etag is something else (a store's own etag); \"\" for none. */\n md5?: string;\n key: string;\n size: number;\n etag: string;\n version: string;\n uploaded: number;\n httpMetadata: R2HTTPMetadata;\n customMetadata: Record<string, string>;\n}\n\nexport class R2Object {\n readonly key: string;\n readonly version: string;\n readonly size: number;\n readonly etag: string;\n readonly httpEtag: string;\n readonly uploaded: Date;\n readonly httpMetadata: R2HTTPMetadata;\n readonly customMetadata: Record<string, string>;\n readonly checksums: { md5?: ArrayBuffer };\n readonly storageClass = \"Standard\";\n readonly range?: { offset: number; length: number };\n constructor(m: StoredMeta, range?: { offset: number; length: number }) {\n this.key = m.key;\n this.version = m.version;\n this.size = m.size;\n this.etag = m.etag;\n this.httpEtag = `\"${m.etag}\"`;\n this.uploaded = new Date(m.uploaded);\n this.httpMetadata = { ...m.httpMetadata };\n this.customMetadata = { ...m.customMetadata };\n // The MD5 of the bytes: recorded separately when the etag is not it (celld's bucket), and\n // \"\" when the object has none (a multipart object).\n const bytes = (m.md5 ?? m.etag).match(/../g)?.map((h) => Number.parseInt(h, 16)) ?? [];\n this.checksums = bytes.length ? { md5: new Uint8Array(bytes).buffer } : {};\n if (range) this.range = range;\n }\n /** The JSON form celld gives an R2Object (r2-details project): checksums as hex. */\n toJSON() {\n const md5 = this.checksums.md5\n ? [...new Uint8Array(this.checksums.md5)].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n : undefined;\n return {\n key: this.key,\n version: this.version,\n size: this.size,\n etag: this.etag,\n httpEtag: this.httpEtag,\n uploaded: this.uploaded.toISOString(),\n httpMetadata: this.httpMetadata,\n customMetadata: this.customMetadata,\n ...(this.range ? { range: this.range } : {}),\n checksums: md5 ? { md5 } : {},\n storageClass: this.storageClass,\n };\n }\n writeHttpMetadata(headers: Headers): void {\n const h = this.httpMetadata;\n if (h.contentType) headers.set(\"content-type\", h.contentType);\n if (h.contentLanguage) headers.set(\"content-language\", h.contentLanguage);\n if (h.contentDisposition) headers.set(\"content-disposition\", h.contentDisposition);\n if (h.contentEncoding) headers.set(\"content-encoding\", h.contentEncoding);\n if (h.cacheControl) headers.set(\"cache-control\", h.cacheControl);\n if (h.cacheExpiry) headers.set(\"expires\", new Date(h.cacheExpiry).toUTCString());\n }\n}\n\nexport class R2ObjectBody extends R2Object {\n readonly #bytes: Uint8Array;\n #used = false;\n constructor(m: StoredMeta, bytes: Uint8Array, range?: { offset: number; length: number }) {\n super(m, range);\n this.#bytes = bytes;\n }\n get bodyUsed(): boolean {\n return this.#used;\n }\n get body(): ReadableStream<Uint8Array> {\n this.#used = true;\n const bytes = this.#bytes;\n return new ReadableStream({\n start(c) {\n c.enqueue(bytes.slice());\n c.close();\n },\n });\n }\n #take(): Uint8Array {\n if (this.#used) throw new TypeError(\"Body has already been used\");\n this.#used = true;\n return this.#bytes;\n }\n async arrayBuffer(): Promise<ArrayBuffer> {\n const b = this.#take();\n return b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength) as ArrayBuffer;\n }\n async bytes(): Promise<Uint8Array> {\n return this.#take().slice();\n }\n async text(): Promise<string> {\n return new TextDecoder().decode(this.#take());\n }\n async json<T = unknown>(): Promise<T> {\n return JSON.parse(await this.text()) as T;\n }\n async blob(): Promise<Blob> {\n return new Blob([this.#take() as BlobPart], { type: this.httpMetadata.contentType ?? \"\" });\n }\n}\n\nexport type R2PutValue = ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob | null;\n\nexport interface R2ListOptions {\n limit?: number;\n prefix?: string;\n cursor?: string;\n delimiter?: string;\n startAfter?: string;\n include?: (\"httpMetadata\" | \"customMetadata\")[];\n}\n\nconst enc = (key: string) => encodeURIComponent(key);\n\nasync function readAll(files: FilesApi, path: string): Promise<Uint8Array | undefined> {\n if (!(await files.exists(path))) return undefined;\n const chunks: Uint8Array[] = [];\n for await (const c of files.read(path)) chunks.push(c);\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0));\n let o = 0;\n for (const c of chunks) {\n out.set(c, o);\n o += c.byteLength;\n }\n return out;\n}\n\nasync function toBytes(value: R2PutValue): Promise<Uint8Array> {\n if (value === null) return new Uint8Array();\n if (typeof value === \"string\") return new TextEncoder().encode(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value.slice(0));\n if (ArrayBuffer.isView(value))\n return new Uint8Array(\n value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength),\n );\n return new Uint8Array(await new Response(value as BodyInit).arrayBuffer());\n}\n\nfunction httpMetadataOf(input: R2HTTPMetadata | Headers | undefined): R2HTTPMetadata {\n if (!input) return {};\n if (input instanceof Headers) {\n const m: R2HTTPMetadata = {};\n const map: [keyof R2HTTPMetadata, string][] = [\n [\"contentType\", \"content-type\"],\n [\"contentLanguage\", \"content-language\"],\n [\"contentDisposition\", \"content-disposition\"],\n [\"contentEncoding\", \"content-encoding\"],\n [\"cacheControl\", \"cache-control\"],\n ];\n for (const [k, h] of map) {\n const v = input.get(h);\n if (v !== null) (m as Record<string, string>)[k] = v;\n }\n const expires = input.get(\"expires\");\n if (expires) m.cacheExpiry = new Date(expires);\n return m;\n }\n return { ...input };\n}\n\n/** R2 conditional request: an object or the equivalent HTTP headers. */\nexport interface R2Conditional {\n etagMatches?: string;\n etagDoesNotMatch?: string;\n uploadedBefore?: Date;\n uploadedAfter?: Date;\n secondsGranularity?: boolean;\n}\n\nfunction conditionOf(onlyIf: R2Conditional | Headers | undefined): R2Conditional | undefined {\n if (!(onlyIf instanceof Headers)) return onlyIf;\n const unquote = (v: string | null) =>\n v?.replace(/^W\\//, \"\").replace(/^\"(.*)\"$/, \"$1\") ?? undefined;\n const date = (v: string | null) => (v ? new Date(v) : undefined);\n return {\n etagMatches: unquote(onlyIf.get(\"if-match\")),\n etagDoesNotMatch: unquote(onlyIf.get(\"if-none-match\")),\n uploadedBefore: date(onlyIf.get(\"if-unmodified-since\")),\n uploadedAfter: date(onlyIf.get(\"if-modified-since\")),\n secondsGranularity: true,\n };\n}\n\n/** Evaluates a conditional against a stored object (no object: only etagMatches fails). */\nfunction conditionHolds(c: R2Conditional | undefined, m: StoredMeta | undefined): boolean {\n if (!c) return true;\n const etagIn = (list: string) => list.split(\",\").map((e) => e.trim().replace(/^\"(.*)\"$/, \"$1\"));\n if (\n c.etagMatches !== undefined &&\n (!m || !(c.etagMatches === \"*\" || etagIn(c.etagMatches).includes(m.etag)))\n )\n return false;\n if (\n c.etagDoesNotMatch !== undefined &&\n m &&\n (c.etagDoesNotMatch === \"*\" || etagIn(c.etagDoesNotMatch).includes(m.etag))\n )\n return false;\n if (m) {\n const t = c.secondsGranularity ? Math.floor(m.uploaded / 1000) * 1000 : m.uploaded;\n if (c.uploadedBefore && !(t < new Date(c.uploadedBefore).getTime())) return false;\n if (c.uploadedAfter && !(t > new Date(c.uploadedAfter).getTime())) return false;\n }\n return true;\n}\n\n/**\n * Where an R2 binding keeps objects: a FilesApi (cellb's own layout) or a celld bucket\n * (`r2/<bucket>/<key>` with celld's `celld-r2` record — r2-celld.ts).\n */\nexport interface R2Backend {\n meta(key: string): Promise<StoredMeta | undefined>;\n body(key: string): Promise<Uint8Array | undefined>;\n /** Stores the object; the backend decides etag, version and upload time. No md5: multipart. */\n write(\n key: string,\n bytes: Uint8Array,\n m: { httpMetadata: R2HTTPMetadata; customMetadata: Record<string, string>; md5?: string },\n ): Promise<StoredMeta>;\n remove(key: string): Promise<void>;\n keys(): Promise<string[]>;\n /** Scratch space for multipart uploads. */\n scratch: {\n write(path: string, bytes: Uint8Array): Promise<void>;\n read(path: string): Promise<Uint8Array | undefined>;\n removeDir(path: string): Promise<void>;\n };\n}\n\nexport function filesR2Backend(files: FilesApi, root: string): R2Backend {\n const objectPath = (key: string) => `${root}/objects/${enc(key)}`;\n const metaPath = (key: string) => `${root}/meta/${enc(key)}.json`;\n return {\n async meta(key) {\n const raw = await readAll(files, metaPath(key));\n return raw ? (JSON.parse(new TextDecoder().decode(raw)) as StoredMeta) : undefined;\n },\n body: (key) => readAll(files, objectPath(key)),\n async write(key, bytes, m) {\n const version = crypto.randomUUID().replace(/-/g, \"\");\n const meta: StoredMeta = {\n ...(m.md5 === undefined && { md5: \"\" }),\n key,\n size: bytes.byteLength,\n etag: m.md5 ?? version,\n version,\n uploaded: Date.now(),\n httpMetadata: m.httpMetadata,\n customMetadata: m.customMetadata,\n };\n await files.write(objectPath(key), [bytes]);\n await files.write(metaPath(key), [new TextEncoder().encode(JSON.stringify(meta))]);\n return meta;\n },\n async remove(key) {\n await files.remove(metaPath(key));\n await files.remove(objectPath(key));\n },\n async keys() {\n const keys: string[] = [];\n if (await files.exists(`${root}/meta`))\n for await (const f of files.list(`${root}/meta`)) {\n const name = f.path.split(\"/\").pop() ?? \"\";\n if (f.kind === \"file\" && name.endsWith(\".json\"))\n keys.push(decodeURIComponent(name.slice(0, -5)));\n }\n return keys;\n },\n scratch: {\n write: (path, bytes) => files.write(`${root}/multipart/${path}`, [bytes]).then(() => {}),\n read: (path) => readAll(files, `${root}/multipart/${path}`),\n removeDir: (path) => files.remove(`${root}/multipart/${path}`).then(() => {}),\n },\n };\n}\n\nexport function r2Bucket(files: FilesApi, root: string, binding = \"BUCKET\") {\n return r2BucketOn(filesR2Backend(files, root), binding);\n}\n\nexport function r2BucketOn(backend: R2Backend, binding = \"BUCKET\") {\n const readMeta = (key: string) => backend.meta(key);\n // celld's messages: \"R2 <op> (binding <name>): a key is 1 to 1024 bytes, not <n>\".\n const checkKey = (key: string, op = \"get\") => {\n const n = new TextEncoder().encode(String(key)).byteLength;\n if (n < 1 || n > 1024)\n throw new Error(`R2 ${op} (binding ${binding}): a key is 1 to 1024 bytes, not ${n}`);\n };\n\n return {\n async head(key: string): Promise<R2Object | null> {\n checkKey(key, \"head\");\n const m = await readMeta(key);\n return m ? new R2Object(m) : null;\n },\n\n async get(\n key: string,\n options: {\n range?: { offset?: number; length?: number; suffix?: number } | Headers;\n onlyIf?: R2Conditional | Headers;\n } = {},\n ): Promise<R2ObjectBody | R2Object | null> {\n checkKey(key, \"get\");\n const m = await readMeta(key);\n if (!m) return null;\n // A failed condition returns the object's metadata without a body.\n if (!conditionHolds(conditionOf(options.onlyIf), m)) return new R2Object(m);\n const bytes = (await backend.body(key)) ?? new Uint8Array();\n let r = options.range;\n if (r instanceof Headers) {\n const h = /^bytes=(\\d*)-(\\d*)$/.exec(r.get(\"range\") ?? \"\");\n r = h\n ? h[1] === \"\"\n ? { suffix: Number(h[2]) }\n : {\n offset: Number(h[1]),\n length: h[2] === \"\" ? undefined : Number(h[2]) - Number(h[1]) + 1,\n }\n : undefined;\n }\n // A full read reports the whole object as its range (workerd/celld behaviour).\n if (!r) return new R2ObjectBody(m, bytes, { offset: 0, length: bytes.byteLength });\n const offset =\n r.suffix !== undefined ? Math.max(0, bytes.byteLength - r.suffix) : (r.offset ?? 0);\n const length =\n r.suffix !== undefined\n ? bytes.byteLength - offset\n : (r.length ?? bytes.byteLength - offset);\n return new R2ObjectBody(m, bytes.slice(offset, offset + length), { offset, length });\n },\n\n async put(\n key: string,\n value: R2PutValue,\n options: {\n httpMetadata?: R2HTTPMetadata | Headers;\n customMetadata?: Record<string, string>;\n md5?: string | ArrayBuffer;\n onlyIf?: R2Conditional | Headers;\n } = {},\n ): Promise<R2Object | null> {\n checkKey(key, \"put\");\n // A refused condition stores nothing and returns null.\n if (options.onlyIf && !conditionHolds(conditionOf(options.onlyIf), await readMeta(key)))\n return null;\n const bytes = await toBytes(value);\n const etag = bytesToHex(md5(bytes));\n if (options.md5 !== undefined) {\n const expected =\n typeof options.md5 === \"string\" ? options.md5 : bytesToHex(new Uint8Array(options.md5));\n if (expected.toLowerCase() !== etag)\n throw new Error(\n `R2 put: the md5 checksum of the body is ${etag}, not the ${expected} the caller asserted`,\n );\n }\n const meta = await backend.write(key, bytes, {\n httpMetadata: httpMetadataOf(options.httpMetadata),\n customMetadata: { ...options.customMetadata },\n md5: etag,\n });\n return new R2Object(meta);\n },\n\n async createMultipartUpload(\n key: string,\n options: {\n httpMetadata?: R2HTTPMetadata | Headers;\n customMetadata?: Record<string, string>;\n } = {},\n ) {\n checkKey(key, \"createMultipartUpload\");\n const uploadId = crypto.randomUUID().replace(/-/g, \"\");\n await backend.scratch.write(\n `${uploadId}/upload.json`,\n new TextEncoder().encode(\n JSON.stringify({\n key,\n httpMetadata: httpMetadataOf(options.httpMetadata),\n customMetadata: options.customMetadata ?? {},\n }),\n ),\n );\n return this.resumeMultipartUpload(key, uploadId);\n },\n\n /** A handle on an open upload; parts live under {root}/multipart/{uploadId}/ until complete or abort. */\n resumeMultipartUpload(key: string, uploadId: string) {\n const dir = uploadId;\n const info = async () => {\n const raw = await backend.scratch.read(`${dir}/upload.json`);\n if (!raw)\n throw new Error(\n \"completeMultipartUpload: The specified multipart upload does not exist. (10024)\",\n );\n return JSON.parse(new TextDecoder().decode(raw)) as {\n key: string;\n httpMetadata: R2HTTPMetadata;\n customMetadata: Record<string, string>;\n };\n };\n return {\n key,\n uploadId,\n async uploadPart(partNumber: number, value: R2PutValue) {\n if (!Number.isInteger(partNumber) || partNumber < 1 || partNumber > 10_000)\n throw new Error(\"uploadPart: part number must be between 1 and 10000\");\n await info();\n const bytes = await toBytes(value);\n const etag = bytesToHex(md5(bytes));\n await backend.scratch.write(`${dir}/${String(partNumber).padStart(5, \"0\")}.part`, bytes);\n return { partNumber, etag };\n },\n async abort() {\n await backend.scratch.removeDir(dir);\n },\n async complete(parts: { partNumber: number; etag: string }[]) {\n const u = await info();\n const chunks: Uint8Array[] = [];\n for (const p of parts) {\n const bytes = await backend.scratch.read(\n `${dir}/${String(p.partNumber).padStart(5, \"0\")}.part`,\n );\n if (!bytes || bytesToHex(md5(bytes)) !== p.etag)\n throw new Error(\n `completeMultipartUpload: There was a problem with the multipart upload. (10025)`,\n );\n chunks.push(bytes);\n }\n const total = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0));\n let o = 0;\n for (const c of chunks) {\n total.set(c, o);\n o += c.byteLength;\n }\n // A multipart object has no MD5 checksum (celld, Cloudflare).\n const meta = await backend.write(u.key, total, {\n httpMetadata: u.httpMetadata,\n customMetadata: u.customMetadata,\n });\n await backend.scratch.removeDir(dir);\n return new R2Object(meta);\n },\n };\n },\n\n async delete(keys: string | string[]): Promise<void> {\n const list = Array.isArray(keys) ? keys : [keys];\n if (list.length > 1000)\n throw new Error(\n `R2 delete (binding ${binding}) takes at most 1000 keys, not ${list.length}`,\n );\n for (const key of list) {\n checkKey(key, \"delete\");\n await backend.remove(key);\n }\n },\n\n async list(options: R2ListOptions = {}) {\n // celld: a limit above 1000 is clamped, and 0 (or less) means the default 1000.\n const limit = !options.limit || options.limit < 1 ? 1000 : Math.min(options.limit, 1000);\n const keys = (await backend.keys()).sort();\n const after = options.cursor ?? options.startAfter;\n const prefixes = new Set<string>();\n const objects: R2Object[] = [];\n let last: string | undefined;\n let truncated = false;\n for (const key of keys) {\n if (options.prefix && !key.startsWith(options.prefix)) continue;\n if (after !== undefined && key <= after) continue;\n if (options.delimiter) {\n const rest = key.slice(options.prefix?.length ?? 0);\n const i = rest.indexOf(options.delimiter);\n if (i >= 0) {\n prefixes.add((options.prefix ?? \"\") + rest.slice(0, i + options.delimiter.length));\n continue;\n }\n }\n if (objects.length === limit) {\n truncated = true;\n break;\n }\n const m = await readMeta(key);\n if (!m) continue;\n const include = options.include ?? [];\n if (!include.includes(\"httpMetadata\")) m.httpMetadata = {};\n if (!include.includes(\"customMetadata\")) m.customMetadata = {};\n objects.push(new R2Object(m));\n last = key;\n }\n return {\n objects,\n truncated,\n cursor: truncated ? last : undefined,\n delimitedPrefixes: [...prefixes].sort(),\n };\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../../src/bindings/r2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAkCpD,MAAM,OAAO,QAAQ;IACV,GAAG,CAAS;IACZ,OAAO,CAAS;IAChB,IAAI,CAAS;IACb,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,QAAQ,CAAO;IACf,YAAY,CAAiB;IAC7B,cAAc,CAAyB;IACvC,SAAS,CAAwB;IACjC,YAAY,GAAG,UAAU,CAAC;IAC1B,KAAK,CAAsC;IACpD,YAAY,CAAa,EAAE,KAA0C;QACnE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,cAAc,GAAG,EAAE,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;QAC9C,0FAA0F;QAC1F,oDAAoD;QACpD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,IAAI,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IAChC,CAAC;IACD,oFAAoF;IACpF,MAAM;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG;YAC5B,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9F,CAAC,CAAC,SAAS,CAAC;QACd,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC;IACJ,CAAC;IACD,iBAAiB,CAAC,OAAgB;QAChC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QAC5B,IAAI,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QAC9D,IAAI,CAAC,CAAC,eAAe;YAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC,kBAAkB;YAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACnF,IAAI,CAAC,CAAC,eAAe;YAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAC1E,IAAI,CAAC,CAAC,YAAY;YAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QACjE,IAAI,CAAC,CAAC,WAAW;YAAE,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACnF,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,QAAQ;IAC/B,MAAM,CAAa;IAC5B,KAAK,GAAG,KAAK,CAAC;IACd,YAAY,CAAa,EAAE,KAAiB,EAAE,KAA0C;QACtF,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,IAAI,IAAI;QACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,OAAO,IAAI,cAAc,CAAC;YACxB,KAAK,CAAC,CAAC;gBACL,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACzB,CAAC,CAAC,KAAK,EAAE,CAAC;YACZ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IACD,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,KAAK,CAAC,WAAW;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAgB,CAAC;IAClF,CAAC;IACD,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAM,CAAC;IAC5C,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,EAAc,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7F,CAAC;CACF;AAaD,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;AAErD,KAAK,UAAU,OAAO,CAAC,KAAe,EAAE,IAAY;IAClD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACd,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,KAAiB;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,UAAU,EAAE,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtE,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,OAAO,IAAI,UAAU,CACnB,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAC1E,CAAC;IACJ,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAiB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,cAAc,CAAC,KAA2C;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAmB,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAqC;YAC5C,CAAC,aAAa,EAAE,cAAc,CAAC;YAC/B,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;YACvC,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;YAC7C,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;YACvC,CAAC,cAAc,EAAE,eAAe,CAAC;SAClC,CAAC;QACF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,KAAK,IAAI;gBAAG,CAA4B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,OAAO;YAAE,CAAC,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC;AACtB,CAAC;AAWD,SAAS,WAAW,CAAC,MAA2C;IAC9D,IAAI,CAAC,CAAC,MAAM,YAAY,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,CAAgB,EAAE,EAAE,CACnC,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,SAAS,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACjE,OAAO;QACL,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACtD,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACvD,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACpD,kBAAkB,EAAE,IAAI;KACzB,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,SAAS,cAAc,CAAC,CAA4B,EAAE,CAAyB;IAC7E,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAChG,IACE,CAAC,CAAC,WAAW,KAAK,SAAS;QAC3B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1E,OAAO,KAAK,CAAC;IACf,IACE,CAAC,CAAC,gBAAgB,KAAK,SAAS;QAChC,CAAC;QACD,CAAC,CAAC,CAAC,gBAAgB,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAE3E,OAAO,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,CAAC;QACN,MAAM,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACnF,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAClF,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;IAClF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAyBD,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,IAAY;IAC1D,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,IAAI,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,IAAI,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;IAClE,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAG;YACZ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAChD,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9C,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,IAAI,GAAe;gBACvB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;gBACvC,GAAG;gBACH,IAAI,EAAE,KAAK,CAAC,UAAU;gBACtB,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,OAAO;gBACtB,OAAO;gBACP,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;gBACpB,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,cAAc,EAAE,CAAC,CAAC,cAAc;aACjC,CAAC;YACF,MAAM,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,GAAG;YACd,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,KAAK,CAAC,IAAI;YACR,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC;gBACpC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,CAAC;oBACjD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;oBAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAC7C,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE;YACP,KAAK,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,cAAc,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YACxF,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,cAAc,IAAI,EAAE,CAAC;YAC3D,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SAC9E;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAe,EAAE,IAAY,EAAE,OAAO,GAAG,QAAQ;IACxE,OAAO,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAkB,EAAE,OAAO,GAAG,QAAQ;IAC/D,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,mFAAmF;IACnF,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE;QAC3C,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI;YACnB,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO,oCAAoC,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,IAAI,CAAC,GAAW;YACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,CAAC;QAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,OAAO,GAGH,EAAE;YAEN,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpB,mEAAmE;YACnE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAAE,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5E,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC;YAC5D,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3D,CAAC,GAAG,CAAC;oBACH,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;wBACX,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;wBAC1B,CAAC,CAAC;4BACE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACpB,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;yBAClE;oBACL,CAAC,CAAC,SAAS,CAAC;YAChB,CAAC;YACD,+EAA+E;YAC/E,IAAI,CAAC,CAAC;gBAAE,OAAO,IAAI,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;YACnF,MAAM,MAAM,GACV,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YACtF,MAAM,MAAM,GACV,CAAC,CAAC,MAAM,KAAK,SAAS;gBACpB,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;gBAC3B,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;YAC9C,OAAO,IAAI,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,KAAiB,EACjB,OAAO,GAKH,EAAE;YAEN,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACrB,uDAAuD;YACvD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACrF,OAAO,IAAI,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;YACpC,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GACZ,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1F,IAAI,QAAQ,CAAC,WAAW,EAAE,KAAK,IAAI;oBACjC,MAAM,IAAI,KAAK,CACb,2CAA2C,IAAI,aAAa,QAAQ,sBAAsB,CAC3F,CAAC;YACN,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE;gBAC3C,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;gBAClD,cAAc,EAAE,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE;gBAC7C,GAAG,EAAE,IAAI;aACV,CAAC,CAAC;YACH,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,qBAAqB,CACzB,GAAW,EACX,OAAO,GAGH,EAAE;YAEN,QAAQ,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CACzB,GAAG,QAAQ,cAAc,EACzB,IAAI,WAAW,EAAE,CAAC,MAAM,CACtB,IAAI,CAAC,SAAS,CAAC;gBACb,GAAG;gBACH,YAAY,EAAE,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;gBAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;aAC7C,CAAC,CACH,CACF,CAAC;YACF,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,yGAAyG;QACzG,qBAAqB,CAAC,GAAW,EAAE,QAAgB;YACjD,MAAM,GAAG,GAAG,QAAQ,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;gBACtB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,CAAC;gBAC7D,IAAI,CAAC,GAAG;oBACN,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;gBACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAI9C,CAAC;YACJ,CAAC,CAAC;YACF,OAAO;gBACL,GAAG;gBACH,QAAQ;gBACR,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,KAAiB;oBACpD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,MAAM;wBACxE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;oBACzE,MAAM,IAAI,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;oBACnC,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACzF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;gBAC9B,CAAC;gBACD,KAAK,CAAC,KAAK;oBACT,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACvC,CAAC;gBACD,KAAK,CAAC,QAAQ,CAAC,KAA6C;oBAC1D,MAAM,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC;oBACvB,MAAM,MAAM,GAAiB,EAAE,CAAC;oBAChC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;wBACtB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CACtC,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CACvD,CAAC;wBACF,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI;4BAC7C,MAAM,IAAI,KAAK,CACb,iFAAiF,CAClF,CAAC;wBACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrB,CAAC;oBACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3E,IAAI,CAAC,GAAG,CAAC,CAAC;oBACV,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;wBACvB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAChB,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;oBACpB,CAAC;oBACD,8DAA8D;oBAC9D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE;wBAC7C,YAAY,EAAE,CAAC,CAAC,YAAY;wBAC5B,cAAc,EAAE,CAAC,CAAC,cAAc;qBACjC,CAAC,CAAC;oBACH,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;aACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,IAAuB;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI;gBACpB,MAAM,IAAI,KAAK,CACb,sBAAsB,OAAO,kCAAkC,IAAI,CAAC,MAAM,EAAE,CAC7E,CAAC;YACJ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACxB,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,GAAkB,EAAE;YACpC,gFAAgF;YAChF,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACzF,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC;YACnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;YACnC,MAAM,OAAO,GAAe,EAAE,CAAC;YAC/B,IAAI,IAAwB,CAAC;YAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,SAAS;gBAChE,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,IAAI,KAAK;oBAAE,SAAS;gBAClD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;oBACpD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACX,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;wBACnF,SAAS;oBACX,CAAC;gBACH,CAAC;gBACD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBAC7B,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,CAAC;oBAAE,SAAS;gBACjB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAAE,CAAC,CAAC,YAAY,GAAG,EAAE,CAAC;gBAC3D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;oBAAE,CAAC,CAAC,cAAc,GAAG,EAAE,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,GAAG,GAAG,CAAC;YACb,CAAC;YACD,OAAO;gBACL,OAAO;gBACP,SAAS;gBACT,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACpC,iBAAiB,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE;aACxC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { md5 } from \"@noble/hashes/legacy.js\";\nimport { bytesToHex } from \"@noble/hashes/utils.js\";\nimport type { FilesApi } from \"@statewalker/webrun-files\";\n\n/**\n * The R2 binding (`env.BUCKET.get/put/head/delete/list`, conditional requests, multipart\n * uploads) on an R2Backend: a webrun-files FilesApi here, or celld's fleet bucket layout\n * (r2-celld.ts). Like celld — whose R2 bindings read and write objects directly in the fleet\n * bucket, not through a cell — the FilesApi backend keeps objects as files:\n * {root}/objects/<encoded key> the bytes\n * {root}/meta/<encoded key>.json key, size, etag (MD5; a multipart object has none), version,\n * uploaded, metadata\n * {root}/multipart/<uploadId>/ an open upload's description and parts, until complete or abort\n */\nexport interface R2HTTPMetadata {\n contentType?: string;\n contentLanguage?: string;\n contentDisposition?: string;\n contentEncoding?: string;\n cacheControl?: string;\n cacheExpiry?: Date;\n}\n\nexport interface StoredMeta {\n /** Hex MD5 of the bytes when the etag is something else (a store's own etag); \"\" for none. */\n md5?: string;\n key: string;\n size: number;\n etag: string;\n version: string;\n uploaded: number;\n httpMetadata: R2HTTPMetadata;\n customMetadata: Record<string, string>;\n}\n\nexport class R2Object {\n readonly key: string;\n readonly version: string;\n readonly size: number;\n readonly etag: string;\n readonly httpEtag: string;\n readonly uploaded: Date;\n readonly httpMetadata: R2HTTPMetadata;\n readonly customMetadata: Record<string, string>;\n readonly checksums: { md5?: ArrayBuffer };\n readonly storageClass = \"Standard\";\n readonly range?: { offset: number; length: number };\n constructor(m: StoredMeta, range?: { offset: number; length: number }) {\n this.key = m.key;\n this.version = m.version;\n this.size = m.size;\n this.etag = m.etag;\n this.httpEtag = `\"${m.etag}\"`;\n this.uploaded = new Date(m.uploaded);\n this.httpMetadata = { ...m.httpMetadata };\n this.customMetadata = { ...m.customMetadata };\n // The MD5 of the bytes: recorded separately when the etag is not it (celld's bucket), and\n // \"\" when the object has none (a multipart object).\n const bytes = (m.md5 ?? m.etag).match(/../g)?.map((h) => Number.parseInt(h, 16)) ?? [];\n this.checksums = bytes.length ? { md5: new Uint8Array(bytes).buffer } : {};\n if (range) this.range = range;\n }\n /** The JSON form celld gives an R2Object (r2-details project): checksums as hex. */\n toJSON() {\n const md5 = this.checksums.md5\n ? [...new Uint8Array(this.checksums.md5)].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\")\n : undefined;\n return {\n key: this.key,\n version: this.version,\n size: this.size,\n etag: this.etag,\n httpEtag: this.httpEtag,\n uploaded: this.uploaded.toISOString(),\n httpMetadata: this.httpMetadata,\n customMetadata: this.customMetadata,\n ...(this.range ? { range: this.range } : {}),\n checksums: md5 ? { md5 } : {},\n storageClass: this.storageClass,\n };\n }\n writeHttpMetadata(headers: Headers): void {\n const h = this.httpMetadata;\n if (h.contentType) headers.set(\"content-type\", h.contentType);\n if (h.contentLanguage) headers.set(\"content-language\", h.contentLanguage);\n if (h.contentDisposition) headers.set(\"content-disposition\", h.contentDisposition);\n if (h.contentEncoding) headers.set(\"content-encoding\", h.contentEncoding);\n if (h.cacheControl) headers.set(\"cache-control\", h.cacheControl);\n if (h.cacheExpiry) headers.set(\"expires\", new Date(h.cacheExpiry).toUTCString());\n }\n}\n\nexport class R2ObjectBody extends R2Object {\n readonly #bytes: Uint8Array;\n #used = false;\n constructor(m: StoredMeta, bytes: Uint8Array, range?: { offset: number; length: number }) {\n super(m, range);\n this.#bytes = bytes;\n }\n get bodyUsed(): boolean {\n return this.#used;\n }\n get body(): ReadableStream<Uint8Array> {\n this.#used = true;\n const bytes = this.#bytes;\n return new ReadableStream({\n start(c) {\n c.enqueue(bytes.slice());\n c.close();\n },\n });\n }\n #take(): Uint8Array {\n if (this.#used) throw new TypeError(\"Body has already been used\");\n this.#used = true;\n return this.#bytes;\n }\n async arrayBuffer(): Promise<ArrayBuffer> {\n const b = this.#take();\n return b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength) as ArrayBuffer;\n }\n async bytes(): Promise<Uint8Array> {\n return this.#take().slice();\n }\n async text(): Promise<string> {\n return new TextDecoder().decode(this.#take());\n }\n async json<T = unknown>(): Promise<T> {\n return JSON.parse(await this.text()) as T;\n }\n async blob(): Promise<Blob> {\n return new Blob([this.#take() as BlobPart], { type: this.httpMetadata.contentType ?? \"\" });\n }\n}\n\nexport type R2PutValue = ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob | null;\n\nexport interface R2ListOptions {\n limit?: number;\n prefix?: string;\n cursor?: string;\n delimiter?: string;\n startAfter?: string;\n include?: (\"httpMetadata\" | \"customMetadata\")[];\n}\n\nconst enc = (key: string) => encodeURIComponent(key);\n\nasync function readAll(files: FilesApi, path: string): Promise<Uint8Array | undefined> {\n if (!(await files.exists(path))) return undefined;\n const chunks: Uint8Array[] = [];\n for await (const c of files.read(path)) chunks.push(c);\n const out = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0));\n let o = 0;\n for (const c of chunks) {\n out.set(c, o);\n o += c.byteLength;\n }\n return out;\n}\n\nasync function toBytes(value: R2PutValue): Promise<Uint8Array> {\n if (value === null) return new Uint8Array();\n if (typeof value === \"string\") return new TextEncoder().encode(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value.slice(0));\n if (ArrayBuffer.isView(value))\n return new Uint8Array(\n value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength),\n );\n return new Uint8Array(await new Response(value as BodyInit).arrayBuffer());\n}\n\nfunction httpMetadataOf(input: R2HTTPMetadata | Headers | undefined): R2HTTPMetadata {\n if (!input) return {};\n if (input instanceof Headers) {\n const m: R2HTTPMetadata = {};\n const map: [keyof R2HTTPMetadata, string][] = [\n [\"contentType\", \"content-type\"],\n [\"contentLanguage\", \"content-language\"],\n [\"contentDisposition\", \"content-disposition\"],\n [\"contentEncoding\", \"content-encoding\"],\n [\"cacheControl\", \"cache-control\"],\n ];\n for (const [k, h] of map) {\n const v = input.get(h);\n if (v !== null) (m as Record<string, string>)[k] = v;\n }\n const expires = input.get(\"expires\");\n if (expires) m.cacheExpiry = new Date(expires);\n return m;\n }\n return { ...input };\n}\n\n/** R2 conditional request: an object or the equivalent HTTP headers. */\nexport interface R2Conditional {\n etagMatches?: string;\n etagDoesNotMatch?: string;\n uploadedBefore?: Date;\n uploadedAfter?: Date;\n secondsGranularity?: boolean;\n}\n\nfunction conditionOf(onlyIf: R2Conditional | Headers | undefined): R2Conditional | undefined {\n if (!(onlyIf instanceof Headers)) return onlyIf;\n const unquote = (v: string | null) =>\n v?.replace(/^W\\//, \"\").replace(/^\"(.*)\"$/, \"$1\") ?? undefined;\n const date = (v: string | null) => (v ? new Date(v) : undefined);\n return {\n etagMatches: unquote(onlyIf.get(\"if-match\")),\n etagDoesNotMatch: unquote(onlyIf.get(\"if-none-match\")),\n uploadedBefore: date(onlyIf.get(\"if-unmodified-since\")),\n uploadedAfter: date(onlyIf.get(\"if-modified-since\")),\n secondsGranularity: true,\n };\n}\n\n/** Evaluates a conditional against a stored object (no object: only etagMatches fails). */\nfunction conditionHolds(c: R2Conditional | undefined, m: StoredMeta | undefined): boolean {\n if (!c) return true;\n const etagIn = (list: string) => list.split(\",\").map((e) => e.trim().replace(/^\"(.*)\"$/, \"$1\"));\n if (\n c.etagMatches !== undefined &&\n (!m || !(c.etagMatches === \"*\" || etagIn(c.etagMatches).includes(m.etag)))\n )\n return false;\n if (\n c.etagDoesNotMatch !== undefined &&\n m &&\n (c.etagDoesNotMatch === \"*\" || etagIn(c.etagDoesNotMatch).includes(m.etag))\n )\n return false;\n if (m) {\n const t = c.secondsGranularity ? Math.floor(m.uploaded / 1000) * 1000 : m.uploaded;\n if (c.uploadedBefore && !(t < new Date(c.uploadedBefore).getTime())) return false;\n if (c.uploadedAfter && !(t > new Date(c.uploadedAfter).getTime())) return false;\n }\n return true;\n}\n\n/**\n * Where an R2 binding keeps objects: a FilesApi (cellb's own layout) or a celld bucket\n * (`r2/<bucket>/<key>` with celld's `celld-r2` record — r2-celld.ts).\n */\nexport interface R2Backend {\n meta(key: string): Promise<StoredMeta | undefined>;\n body(key: string): Promise<Uint8Array | undefined>;\n /** Stores the object; the backend decides etag, version and upload time. No md5: multipart. */\n write(\n key: string,\n bytes: Uint8Array,\n m: { httpMetadata: R2HTTPMetadata; customMetadata: Record<string, string>; md5?: string },\n ): Promise<StoredMeta>;\n remove(key: string): Promise<void>;\n keys(): Promise<string[]>;\n /** Scratch space for multipart uploads. */\n scratch: {\n write(path: string, bytes: Uint8Array): Promise<void>;\n read(path: string): Promise<Uint8Array | undefined>;\n removeDir(path: string): Promise<void>;\n };\n}\n\nexport function filesR2Backend(files: FilesApi, root: string): R2Backend {\n const objectPath = (key: string) => `${root}/objects/${enc(key)}`;\n const metaPath = (key: string) => `${root}/meta/${enc(key)}.json`;\n return {\n async meta(key) {\n const raw = await readAll(files, metaPath(key));\n return raw ? (JSON.parse(new TextDecoder().decode(raw)) as StoredMeta) : undefined;\n },\n body: (key) => readAll(files, objectPath(key)),\n async write(key, bytes, m) {\n const version = crypto.randomUUID().replace(/-/g, \"\");\n const meta: StoredMeta = {\n ...(m.md5 === undefined && { md5: \"\" }),\n key,\n size: bytes.byteLength,\n etag: m.md5 ?? version,\n version,\n uploaded: Date.now(),\n httpMetadata: m.httpMetadata,\n customMetadata: m.customMetadata,\n };\n await files.write(objectPath(key), [bytes]);\n await files.write(metaPath(key), [new TextEncoder().encode(JSON.stringify(meta))]);\n return meta;\n },\n async remove(key) {\n await files.remove(metaPath(key));\n await files.remove(objectPath(key));\n },\n async keys() {\n const keys: string[] = [];\n if (await files.exists(`${root}/meta`))\n for await (const f of files.list(`${root}/meta`)) {\n const name = f.path.split(\"/\").pop() ?? \"\";\n if (f.kind === \"file\" && name.endsWith(\".json\"))\n keys.push(decodeURIComponent(name.slice(0, -5)));\n }\n return keys;\n },\n scratch: {\n write: (path, bytes) => files.write(`${root}/multipart/${path}`, [bytes]).then(() => {}),\n read: (path) => readAll(files, `${root}/multipart/${path}`),\n removeDir: (path) => files.remove(`${root}/multipart/${path}`).then(() => {}),\n },\n };\n}\n\nexport function r2Bucket(files: FilesApi, root: string, binding = \"BUCKET\") {\n return r2BucketOn(filesR2Backend(files, root), binding);\n}\n\nexport function r2BucketOn(backend: R2Backend, binding = \"BUCKET\") {\n const readMeta = (key: string) => backend.meta(key);\n // celld's messages: \"R2 <op> (binding <name>): a key is 1 to 1024 bytes, not <n>\".\n const checkKey = (key: string, op = \"get\") => {\n const n = new TextEncoder().encode(String(key)).byteLength;\n if (n < 1 || n > 1024)\n throw new Error(`R2 ${op} (binding ${binding}): a key is 1 to 1024 bytes, not ${n}`);\n };\n\n return {\n async head(key: string): Promise<R2Object | null> {\n checkKey(key, \"head\");\n const m = await readMeta(key);\n return m ? new R2Object(m) : null;\n },\n\n async get(\n key: string,\n options: {\n range?: { offset?: number; length?: number; suffix?: number } | Headers;\n onlyIf?: R2Conditional | Headers;\n } = {},\n ): Promise<R2ObjectBody | R2Object | null> {\n checkKey(key, \"get\");\n const m = await readMeta(key);\n if (!m) return null;\n // A failed condition returns the object's metadata without a body.\n if (!conditionHolds(conditionOf(options.onlyIf), m)) return new R2Object(m);\n const bytes = (await backend.body(key)) ?? new Uint8Array();\n let r = options.range;\n if (r instanceof Headers) {\n const h = /^bytes=(\\d*)-(\\d*)$/.exec(r.get(\"range\") ?? \"\");\n r = h\n ? h[1] === \"\"\n ? { suffix: Number(h[2]) }\n : {\n offset: Number(h[1]),\n length: h[2] === \"\" ? undefined : Number(h[2]) - Number(h[1]) + 1,\n }\n : undefined;\n }\n // A full read reports the whole object as its range (workerd/celld behaviour).\n if (!r) return new R2ObjectBody(m, bytes, { offset: 0, length: bytes.byteLength });\n const offset =\n r.suffix !== undefined ? Math.max(0, bytes.byteLength - r.suffix) : (r.offset ?? 0);\n const length =\n r.suffix !== undefined\n ? bytes.byteLength - offset\n : (r.length ?? bytes.byteLength - offset);\n return new R2ObjectBody(m, bytes.slice(offset, offset + length), { offset, length });\n },\n\n async put(\n key: string,\n value: R2PutValue,\n options: {\n httpMetadata?: R2HTTPMetadata | Headers;\n customMetadata?: Record<string, string>;\n md5?: string | ArrayBuffer;\n onlyIf?: R2Conditional | Headers;\n } = {},\n ): Promise<R2Object | null> {\n checkKey(key, \"put\");\n // A refused condition stores nothing and returns null.\n if (options.onlyIf && !conditionHolds(conditionOf(options.onlyIf), await readMeta(key)))\n return null;\n const bytes = await toBytes(value);\n const etag = bytesToHex(md5(bytes));\n if (options.md5 !== undefined) {\n const expected =\n typeof options.md5 === \"string\" ? options.md5 : bytesToHex(new Uint8Array(options.md5));\n if (expected.toLowerCase() !== etag)\n throw new Error(\n `R2 put: the md5 checksum of the body is ${etag}, not the ${expected} the caller asserted`,\n );\n }\n const meta = await backend.write(key, bytes, {\n httpMetadata: httpMetadataOf(options.httpMetadata),\n customMetadata: { ...options.customMetadata },\n md5: etag,\n });\n return new R2Object(meta);\n },\n\n async createMultipartUpload(\n key: string,\n options: {\n httpMetadata?: R2HTTPMetadata | Headers;\n customMetadata?: Record<string, string>;\n } = {},\n ) {\n checkKey(key, \"createMultipartUpload\");\n const uploadId = crypto.randomUUID().replace(/-/g, \"\");\n await backend.scratch.write(\n `${uploadId}/upload.json`,\n new TextEncoder().encode(\n JSON.stringify({\n key,\n httpMetadata: httpMetadataOf(options.httpMetadata),\n customMetadata: options.customMetadata ?? {},\n }),\n ),\n );\n return this.resumeMultipartUpload(key, uploadId);\n },\n\n /** A handle on an open upload; parts live under {root}/multipart/{uploadId}/ until complete or abort. */\n resumeMultipartUpload(key: string, uploadId: string) {\n const dir = uploadId;\n const info = async () => {\n const raw = await backend.scratch.read(`${dir}/upload.json`);\n if (!raw)\n throw new Error(\n \"completeMultipartUpload: The specified multipart upload does not exist. (10024)\",\n );\n return JSON.parse(new TextDecoder().decode(raw)) as {\n key: string;\n httpMetadata: R2HTTPMetadata;\n customMetadata: Record<string, string>;\n };\n };\n return {\n key,\n uploadId,\n async uploadPart(partNumber: number, value: R2PutValue) {\n if (!Number.isInteger(partNumber) || partNumber < 1 || partNumber > 10_000)\n throw new Error(\"uploadPart: part number must be between 1 and 10000\");\n await info();\n const bytes = await toBytes(value);\n const etag = bytesToHex(md5(bytes));\n await backend.scratch.write(`${dir}/${String(partNumber).padStart(5, \"0\")}.part`, bytes);\n return { partNumber, etag };\n },\n async abort() {\n await backend.scratch.removeDir(dir);\n },\n async complete(parts: { partNumber: number; etag: string }[]) {\n const u = await info();\n const chunks: Uint8Array[] = [];\n for (const p of parts) {\n const bytes = await backend.scratch.read(\n `${dir}/${String(p.partNumber).padStart(5, \"0\")}.part`,\n );\n if (!bytes || bytesToHex(md5(bytes)) !== p.etag)\n throw new Error(\n `completeMultipartUpload: There was a problem with the multipart upload. (10025)`,\n );\n chunks.push(bytes);\n }\n const total = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0));\n let o = 0;\n for (const c of chunks) {\n total.set(c, o);\n o += c.byteLength;\n }\n // A multipart object has no MD5 checksum (celld, Cloudflare).\n const meta = await backend.write(u.key, total, {\n httpMetadata: u.httpMetadata,\n customMetadata: u.customMetadata,\n });\n await backend.scratch.removeDir(dir);\n return new R2Object(meta);\n },\n };\n },\n\n async delete(keys: string | string[]): Promise<void> {\n const list = Array.isArray(keys) ? keys : [keys];\n if (list.length > 1000)\n throw new Error(\n `R2 delete (binding ${binding}) takes at most 1000 keys, not ${list.length}`,\n );\n for (const key of list) {\n checkKey(key, \"delete\");\n await backend.remove(key);\n }\n },\n\n async list(options: R2ListOptions = {}) {\n // celld: a limit above 1000 is clamped, and 0 (or less) means the default 1000.\n const limit = !options.limit || options.limit < 1 ? 1000 : Math.min(options.limit, 1000);\n const keys = (await backend.keys()).sort();\n const after = options.cursor ?? options.startAfter;\n const prefixes = new Set<string>();\n const objects: R2Object[] = [];\n let last: string | undefined;\n let truncated = false;\n for (const key of keys) {\n if (options.prefix && !key.startsWith(options.prefix)) continue;\n if (after !== undefined && key <= after) continue;\n if (options.delimiter) {\n const rest = key.slice(options.prefix?.length ?? 0);\n const i = rest.indexOf(options.delimiter);\n if (i >= 0) {\n prefixes.add((options.prefix ?? \"\") + rest.slice(0, i + options.delimiter.length));\n continue;\n }\n }\n if (objects.length === limit) {\n truncated = true;\n break;\n }\n const m = await readMeta(key);\n if (!m) continue;\n const include = options.include ?? [];\n if (!include.includes(\"httpMetadata\")) m.httpMetadata = {};\n if (!include.includes(\"customMetadata\")) m.customMetadata = {};\n objects.push(new R2Object(m));\n last = key;\n }\n return {\n objects,\n truncated,\n cursor: truncated ? last : undefined,\n delimitedPrefixes: [...prefixes].sort(),\n };\n },\n };\n}\n"]}
|
package/dist/browser.d.ts
CHANGED
|
@@ -3,5 +3,4 @@ export { idbObjectStore } from "./bucket/idb-object-store.js";
|
|
|
3
3
|
export { type BrowserBucket, type BrowserProjectOptions, browserProjectRuntime, } from "./project/browser-host.js";
|
|
4
4
|
export { type ProjectShards, serveProjectShard, startProjectShards, } from "./project/browser-shards.js";
|
|
5
5
|
export { installProjectRouter, joinProjectShards, type ProjectTabs, type ProjectTabsOptions, type ServiceWorkerScope, shardOwner, } from "./project/browser-tabs.js";
|
|
6
|
-
export { createProjectSite } from "./project/site.js";
|
|
7
6
|
export { serviceWorkerConnector } from "./ws/sw-connector.js";
|
package/dist/browser.js
CHANGED
|
@@ -3,6 +3,5 @@ export { idbObjectStore } from "./bucket/idb-object-store.js";
|
|
|
3
3
|
export { browserProjectRuntime, } from "./project/browser-host.js";
|
|
4
4
|
export { serveProjectShard, startProjectShards, } from "./project/browser-shards.js";
|
|
5
5
|
export { installProjectRouter, joinProjectShards, shardOwner, } from "./project/browser-tabs.js";
|
|
6
|
-
export { createProjectSite } from "./project/site.js";
|
|
7
6
|
export { serviceWorkerConnector } from "./ws/sw-connector.js";
|
|
8
7
|
//# sourceMappingURL=browser.js.map
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAGL,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EAIjB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAGL,qBAAqB,GACtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EAIjB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC","sourcesContent":["export { sahpoolOpener } from \"./adapters/wasm-sqlite.js\";\nexport { idbObjectStore } from \"./bucket/idb-object-store.js\";\nexport {\n type BrowserBucket,\n type BrowserProjectOptions,\n browserProjectRuntime,\n} from \"./project/browser-host.js\";\nexport {\n type ProjectShards,\n serveProjectShard,\n startProjectShards,\n} from \"./project/browser-shards.js\";\nexport {\n installProjectRouter,\n joinProjectShards,\n type ProjectTabs,\n type ProjectTabsOptions,\n type ServiceWorkerScope,\n shardOwner,\n} from \"./project/browser-tabs.js\";\nexport { serviceWorkerConnector } from \"./ws/sw-connector.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"celld-cells.js","sourceRoot":"","sources":["../../src/bucket/celld-cells.ts"],"names":[],"mappings":"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","sourcesContent":["import { bytesToHex } from \"@noble/hashes/utils\";\nimport { scopeOf } from \"../core/celld-schema.js\";\nimport { decodeLtx, encodeLtx, ltxFileName } from \"../ltx/ltx.js\";\nimport type { BackupInfo, CellBackup, CellDurability } from \"../ports.js\";\nimport { equal, pad16, pageSizeOf, toRollback } from \"./celld-format.js\";\nimport { ltxLog } from \"./ltx-log.js\";\nimport { type ObjectStore, PreconditionFailedError } from \"./object-store.js\";\n\n/**\n * Cells stored the way celld stores them (docs/guarantees.md, and the keys celld dev writes\n * in `.celld/dev/objects.sqlite3`), on any ObjectStore:\n *\n * cells/<Class>:<idHex>/own.json {\"node\",\"epoch\"}: ownership record\n * cells/<Class>:<idHex>/ltx/e<epoch>/0000/<min>-<max>.ltx LTX v3, legacy LZ4 frames\n * nodes/<node>.json {\"node\",\"expires_ms\",\"addr\",…}: node lease\n *\n * Ownership: an activation creates the record (If-None-Match) or advances its epoch with a\n * compare-and-swap (If-Match), taking over only from a node whose lease expired. Durability:\n * each committed transaction becomes an LTX file in the cell's current epoch prefix — the\n * first one a snapshot (TXID 1), then the changed pages — and the output gate waits for the\n * PUT. Restore: the newest epoch that starts with a snapshot, its files in TXID order.\n */\nexport interface CelldBucketOptions {\n /** This node's name (celld: `dev-…` / the fleet node name). */\n node: string;\n addr?: string;\n leaseTtlMs?: number;\n now?: () => number;\n /** The waker-role lease (celld: 3 × its due-scan tick); match 3 × the runtime's wakePollMs. */\n wakerTtlMs?: number;\n}\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** celld 0.6.3: how long a node refuses a cell whose ownership record it found lost. */\nexport const LOST_RECORD_RECHECK_MS = 10_000;\nconst lostRecordError = (scope: string) =>\n Object.assign(\n new Error(\n `ownership record lost: cells/${scope}/own.json is missing, but the bucket holds LTX under ` +\n `cells/${scope}/ltx/; refusing to claim ${scope} as a new cell (celld docs/guarantees.md: ` +\n `write a released record {\"node\": \"\", \"epoch\": <newest epoch>} to restore it)`,\n ),\n { name: \"OwnershipRecordLostError\" },\n );\n\n/** The bucket's `close()` also closes `store` (when it has a `close`): pass a store of its own. */\nexport function celldBucket(store: ObjectStore & { close?(): void }, opts: CelldBucketOptions) {\n const now = opts.now ?? (() => Date.now());\n const ttl = opts.leaseTtlMs ?? 10_000;\n const lost = new AbortController();\n let renew: ReturnType<typeof setTimeout> | undefined;\n let deadline: ReturnType<typeof setTimeout> | undefined;\n let leaseWritten: Promise<void> | undefined;\n\n /** nodes/<node>.json, renewed every ttl/3; a failed renewal stops every cell (self-fencing). */\n // celld decodes every node record (ownership_store.rs NodeLeaseWire / NodeLoadWire): a record\n // missing a required load field breaks its fleet posture repair. This one is complete. It\n // reports pressure and zero placement weight, so celld never offers this node a cell — it\n // takes cells only when a request arrives.\n //\n // The address must not be empty: celld treats a live owner WITHOUT an address as dead and\n // takes its cells over (logic/lib.rs apply_node_lease_result) — a split brain. With an\n // address celld routes a request for our cell to it; a node that does not accept celld's\n // peer protocol (a browser) gets an unroutable placeholder, so the request fails instead.\n let addr = opts.addr || `${opts.node}.cellb.invalid:9`;\n // celld's per-process generation is its signed-probe public key (Ed25519, peer_probe.rs):\n // `probe_public_key` = `ownership_index_generation`. A real key lets `celld diagnose --peer`\n // verify that a probe reached this node.\n let generation = bytesToHex(crypto.getRandomValues(new Uint8Array(32)));\n let probeKey: CryptoKey | undefined;\n const probeKeyReady = (async () => {\n try {\n const pair = (await crypto.subtle.generateKey({ name: \"Ed25519\" }, true, [\n \"sign\",\n \"verify\",\n ])) as CryptoKeyPair;\n probeKey = pair.privateKey;\n generation = bytesToHex(new Uint8Array(await crypto.subtle.exportKey(\"raw\", pair.publicKey)));\n } catch {\n // no Ed25519 in this WebCrypto: the record keeps a random generation (probes then fail)\n }\n })();\n let validUntil = 0;\n const writeLease = async () => {\n const t = now();\n const body = {\n node: opts.node,\n expires_ms: t + ttl,\n addr,\n probe_public_key: generation,\n peer_protocol: 5,\n paced_handoff: false,\n ownership_index_generation: generation,\n load: {\n sampled_ms: t,\n owned_cells: owned.size,\n placement_weight: 0,\n bucket_format: 2,\n resident_cells: owned.size,\n host_websockets: 0,\n rss_bytes: 0,\n in_use_bytes: 0,\n cpu_percent_x100: 0,\n open_fds: 0,\n fd_limit: 0,\n pressured: true,\n memory_headroom: false,\n shed_cells: 0,\n restoring: 0,\n rebalance_paused: false,\n draining: false,\n },\n };\n await store.put(`nodes/${opts.node}.json`, enc.encode(JSON.stringify(body)));\n // Our authority lasts until the record we just wrote expires — minus a margin, so a node\n // that stalls (a paused process, a frozen tab) stops acknowledging before celld may take\n // over: celld waits for expires_ms; we stop at expires_ms - margin.\n validUntil = t + ttl - Math.min(1_000, ttl / 4);\n };\n const owned = new Set<string>();\n /** Cells whose ownership record was found lost, with the time their refusal ends. */\n const lostRecords = new Map<string, number>();\n const ensureLease = () => {\n leaseWritten ??= probeKeyReady.then(writeLease).then(() => {\n const tick = () => {\n renew = setTimeout(() => {\n writeLease().then(tick, (e) => lost.abort(e));\n }, ttl / 3);\n // If renewals stop arriving (a stalled process, an unreachable bucket), every cell\n // stops at the local deadline — before celld may take it over.\n if (deadline) clearTimeout(deadline);\n deadline = setTimeout(\n () => {\n if (now() >= validUntil)\n lost.abort(new Error(`node ${opts.node}: lease deadline passed`));\n },\n Math.max(0, validUntil - now()),\n );\n (deadline as { unref?: () => void }).unref?.();\n (renew as { unref?: () => void }).unref?.();\n };\n tick();\n });\n return leaseWritten;\n };\n\n const readJson = async <T>(key: string) => {\n const o = await store.get(key);\n return o ? { value: JSON.parse(dec.decode(o.body)) as T, etag: o.etag } : undefined;\n };\n\n // One LTX writer (ltx-log.ts) holds each cell's epoch, TXID and page mirror.\n // A write is acknowledged only while our node lease is still ours (self-fencing).\n const log = ltxLog(store, { now, authorized: () => now() < validUntil });\n\n const ownership = {\n async tryAcquire(cellKey: string) {\n await ensureLease();\n const scope = scopeOf(cellKey);\n const key = `cells/${scope}/own.json`;\n const t0 = now();\n if ((lostRecords.get(scope) ?? 0) > t0) throw lostRecordError(scope); // still refused\n let cur = await readJson<{ node: string; epoch: number }>(key);\n // celld 0.6.3 (actor.rs read_owner_for_claim): a missing record next to LTX means the\n // record was LOST (e.g. a lifecycle rule) — claiming epoch 1 would start the cell empty.\n // Read once more, then refuse the cell for 10 s without asking the bucket again.\n if (!cur && (await store.list(`cells/${scope}/ltx`)).length > 0) {\n cur = await readJson<{ node: string; epoch: number }>(key);\n if (!cur) {\n lostRecords.set(scope, t0 + LOST_RECORD_RECHECK_MS);\n throw lostRecordError(scope);\n }\n }\n let epoch: number;\n try {\n if (!cur) {\n epoch = 1;\n await store.put(key, enc.encode(JSON.stringify({ node: opts.node, epoch })), {\n ifNoneMatch: \"*\",\n });\n } else {\n const holder = cur.value.node;\n if (holder && holder !== opts.node) {\n const lease = await readJson<{ expires_ms: number }>(`nodes/${holder}.json`);\n if (lease && lease.value.expires_ms > now()) return undefined; // a live owner\n }\n epoch = cur.value.epoch + 1; // every activation advances the epoch\n await store.put(key, enc.encode(JSON.stringify({ node: opts.node, epoch })), {\n ifMatch: cur.etag,\n });\n }\n } catch (e) {\n if (e instanceof PreconditionFailedError) return undefined; // another node won the race\n throw e;\n }\n log.begin(cellKey, epoch); // a new owner epoch starts a new generation\n owned.add(cellKey);\n return {\n name: cellKey,\n epoch,\n lost: lost.signal,\n release: async () => {\n const now2 = await readJson<{ node: string; epoch: number }>(key);\n if (now2?.value.node === opts.node && now2.value.epoch === epoch)\n await store\n .put(key, enc.encode(JSON.stringify({ node: \"\", epoch })), { ifMatch: now2.etag })\n .catch(() => {});\n log.forget(cellKey);\n owned.delete(cellKey);\n },\n };\n },\n };\n\n // celld's waker role (wake.rs try_hold_waker): one node per fleet wakes alarms of cells that\n // nobody owns or whose owner is dead — an advisory CAS lease in wake/waker.json; every node\n // wakes its own cells; a live owner's cells are never hinted.\n const holdWaker = async (ttlMs: number) => {\n const key = \"wake/waker.json\";\n const cur = await readJson<{ node: string; expires_ms: number }>(key);\n const t = now();\n if (cur && cur.value.node !== opts.node && cur.value.expires_ms > t) return false;\n try {\n await store.put(\n key,\n enc.encode(JSON.stringify({ node: opts.node, expires_ms: t + ttlMs })),\n cur ? { ifMatch: cur.etag } : { ifNoneMatch: \"*\" },\n );\n return true;\n } catch (e) {\n if (!(e instanceof PreconditionFailedError)) return false;\n const again = await readJson<{ node: string; expires_ms: number }>(key);\n return again?.value.node === opts.node && again.value.expires_ms > t;\n }\n };\n const allWakes = log.wakes!.bind(log);\n const durability = Object.assign(log, {\n async wakes() {\n const due = await allWakes();\n let elected: boolean | undefined;\n const out: typeof due = [];\n for (const w of due) {\n const own = await readJson<{ node: string }>(`cells/${scopeOf(w.cellKey)}/own.json`);\n const owner = own?.value.node;\n if (owner === opts.node) {\n out.push(w); // our own cell: always\n continue;\n }\n let ownerExpires = 0;\n if (owner) {\n const lease = await readJson<{ expires_ms: number }>(`nodes/${owner}.json`);\n ownerExpires = lease?.value.expires_ms ?? 0;\n }\n elected ??= await holdWaker(opts.wakerTtlMs ?? 90_000);\n if (!elected) continue; // unowned or dead owners are the elected waker's job\n // A live owner fires its own alarms; the waker looks again when that owner's lease\n // would have run out (a stopped owner's cells are then due here).\n out.push(ownerExpires > now() ? { ...w, at: Math.max(w.at, ownerExpires + 1) } : w);\n }\n return out;\n },\n });\n\n return {\n ownership,\n durability,\n backup: durability,\n /** The fleet bucket itself (R2 objects live directly in it, under `r2/<bucket>/`). */\n objects: store,\n /**\n * The address celld nodes reach this node at (its celld peer server): published in the\n * node record now, so celld routes requests for our cells here instead of refusing them.\n */\n /**\n * Answers celld's signed peer probe (peer_probe.rs): an Ed25519 signature over\n * \"cells-peer-probe-v1\\n<node>\\n<advertised addr>\\n<challenge>\" by this node's probe key.\n */\n async probe(challenge: string) {\n await probeKeyReady;\n if (!probeKey || !/^[0-9a-f]{64}$/.test(challenge))\n throw new Error(\"cannot answer the probe\");\n const payload = `cells-peer-probe-v1\\n${opts.node}\\n${addr}\\n${challenge}`;\n const signature = new Uint8Array(\n await crypto.subtle.sign(\"Ed25519\", probeKey, new TextEncoder().encode(payload)),\n );\n return {\n version: 1,\n node: opts.node,\n advertise: addr,\n challenge,\n signature: bytesToHex(signature),\n };\n },\n async advertise(address: string) {\n addr = address;\n if (leaseWritten) await writeLease();\n },\n /** Clean shutdown: stop renewing, remove this node's lease record, close the store. */\n async close() {\n if (renew) clearTimeout(renew);\n if (deadline) clearTimeout(deadline);\n if (leaseWritten) await store.delete(`nodes/${opts.node}.json`).catch(() => {});\n store.close?.();\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"celld-cells.js","sourceRoot":"","sources":["../../src/bucket/celld-cells.ts"],"names":[],"mappings":"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","sourcesContent":["import { bytesToHex } from \"@noble/hashes/utils.js\";\nimport { scopeOf } from \"../core/celld-schema.js\";\nimport { decodeLtx, encodeLtx, ltxFileName } from \"../ltx/ltx.js\";\nimport type { BackupInfo, CellBackup, CellDurability } from \"../ports.js\";\nimport { equal, pad16, pageSizeOf, toRollback } from \"./celld-format.js\";\nimport { ltxLog } from \"./ltx-log.js\";\nimport { type ObjectStore, PreconditionFailedError } from \"./object-store.js\";\n\n/**\n * Cells stored the way celld stores them (docs/guarantees.md, and the keys celld dev writes\n * in `.celld/dev/objects.sqlite3`), on any ObjectStore:\n *\n * cells/<Class>:<idHex>/own.json {\"node\",\"epoch\"}: ownership record\n * cells/<Class>:<idHex>/ltx/e<epoch>/0000/<min>-<max>.ltx LTX v3, legacy LZ4 frames\n * nodes/<node>.json {\"node\",\"expires_ms\",\"addr\",…}: node lease\n *\n * Ownership: an activation creates the record (If-None-Match) or advances its epoch with a\n * compare-and-swap (If-Match), taking over only from a node whose lease expired. Durability:\n * each committed transaction becomes an LTX file in the cell's current epoch prefix — the\n * first one a snapshot (TXID 1), then the changed pages — and the output gate waits for the\n * PUT. Restore: the newest epoch that starts with a snapshot, its files in TXID order.\n */\nexport interface CelldBucketOptions {\n /** This node's name (celld: `dev-…` / the fleet node name). */\n node: string;\n addr?: string;\n leaseTtlMs?: number;\n now?: () => number;\n /** The waker-role lease (celld: 3 × its due-scan tick); match 3 × the runtime's wakePollMs. */\n wakerTtlMs?: number;\n}\n\nconst enc = new TextEncoder();\nconst dec = new TextDecoder();\n\n/** celld 0.6.3: how long a node refuses a cell whose ownership record it found lost. */\nexport const LOST_RECORD_RECHECK_MS = 10_000;\nconst lostRecordError = (scope: string) =>\n Object.assign(\n new Error(\n `ownership record lost: cells/${scope}/own.json is missing, but the bucket holds LTX under ` +\n `cells/${scope}/ltx/; refusing to claim ${scope} as a new cell (celld docs/guarantees.md: ` +\n `write a released record {\"node\": \"\", \"epoch\": <newest epoch>} to restore it)`,\n ),\n { name: \"OwnershipRecordLostError\" },\n );\n\n/** The bucket's `close()` also closes `store` (when it has a `close`): pass a store of its own. */\nexport function celldBucket(store: ObjectStore & { close?(): void }, opts: CelldBucketOptions) {\n const now = opts.now ?? (() => Date.now());\n const ttl = opts.leaseTtlMs ?? 10_000;\n const lost = new AbortController();\n let renew: ReturnType<typeof setTimeout> | undefined;\n let deadline: ReturnType<typeof setTimeout> | undefined;\n let leaseWritten: Promise<void> | undefined;\n\n /** nodes/<node>.json, renewed every ttl/3; a failed renewal stops every cell (self-fencing). */\n // celld decodes every node record (ownership_store.rs NodeLeaseWire / NodeLoadWire): a record\n // missing a required load field breaks its fleet posture repair. This one is complete. It\n // reports pressure and zero placement weight, so celld never offers this node a cell — it\n // takes cells only when a request arrives.\n //\n // The address must not be empty: celld treats a live owner WITHOUT an address as dead and\n // takes its cells over (logic/lib.rs apply_node_lease_result) — a split brain. With an\n // address celld routes a request for our cell to it; a node that does not accept celld's\n // peer protocol (a browser) gets an unroutable placeholder, so the request fails instead.\n let addr = opts.addr || `${opts.node}.cellb.invalid:9`;\n // celld's per-process generation is its signed-probe public key (Ed25519, peer_probe.rs):\n // `probe_public_key` = `ownership_index_generation`. A real key lets `celld diagnose --peer`\n // verify that a probe reached this node.\n let generation = bytesToHex(crypto.getRandomValues(new Uint8Array(32)));\n let probeKey: CryptoKey | undefined;\n const probeKeyReady = (async () => {\n try {\n const pair = (await crypto.subtle.generateKey({ name: \"Ed25519\" }, true, [\n \"sign\",\n \"verify\",\n ])) as CryptoKeyPair;\n probeKey = pair.privateKey;\n generation = bytesToHex(new Uint8Array(await crypto.subtle.exportKey(\"raw\", pair.publicKey)));\n } catch {\n // no Ed25519 in this WebCrypto: the record keeps a random generation (probes then fail)\n }\n })();\n let validUntil = 0;\n const writeLease = async () => {\n const t = now();\n const body = {\n node: opts.node,\n expires_ms: t + ttl,\n addr,\n probe_public_key: generation,\n peer_protocol: 5,\n paced_handoff: false,\n ownership_index_generation: generation,\n load: {\n sampled_ms: t,\n owned_cells: owned.size,\n placement_weight: 0,\n bucket_format: 2,\n resident_cells: owned.size,\n host_websockets: 0,\n rss_bytes: 0,\n in_use_bytes: 0,\n cpu_percent_x100: 0,\n open_fds: 0,\n fd_limit: 0,\n pressured: true,\n memory_headroom: false,\n shed_cells: 0,\n restoring: 0,\n rebalance_paused: false,\n draining: false,\n },\n };\n await store.put(`nodes/${opts.node}.json`, enc.encode(JSON.stringify(body)));\n // Our authority lasts until the record we just wrote expires — minus a margin, so a node\n // that stalls (a paused process, a frozen tab) stops acknowledging before celld may take\n // over: celld waits for expires_ms; we stop at expires_ms - margin.\n validUntil = t + ttl - Math.min(1_000, ttl / 4);\n };\n const owned = new Set<string>();\n /** Cells whose ownership record was found lost, with the time their refusal ends. */\n const lostRecords = new Map<string, number>();\n const ensureLease = () => {\n leaseWritten ??= probeKeyReady.then(writeLease).then(() => {\n const tick = () => {\n renew = setTimeout(() => {\n writeLease().then(tick, (e) => lost.abort(e));\n }, ttl / 3);\n // If renewals stop arriving (a stalled process, an unreachable bucket), every cell\n // stops at the local deadline — before celld may take it over.\n if (deadline) clearTimeout(deadline);\n deadline = setTimeout(\n () => {\n if (now() >= validUntil)\n lost.abort(new Error(`node ${opts.node}: lease deadline passed`));\n },\n Math.max(0, validUntil - now()),\n );\n (deadline as { unref?: () => void }).unref?.();\n (renew as { unref?: () => void }).unref?.();\n };\n tick();\n });\n return leaseWritten;\n };\n\n const readJson = async <T>(key: string) => {\n const o = await store.get(key);\n return o ? { value: JSON.parse(dec.decode(o.body)) as T, etag: o.etag } : undefined;\n };\n\n // One LTX writer (ltx-log.ts) holds each cell's epoch, TXID and page mirror.\n // A write is acknowledged only while our node lease is still ours (self-fencing).\n const log = ltxLog(store, { now, authorized: () => now() < validUntil });\n\n const ownership = {\n async tryAcquire(cellKey: string) {\n await ensureLease();\n const scope = scopeOf(cellKey);\n const key = `cells/${scope}/own.json`;\n const t0 = now();\n if ((lostRecords.get(scope) ?? 0) > t0) throw lostRecordError(scope); // still refused\n let cur = await readJson<{ node: string; epoch: number }>(key);\n // celld 0.6.3 (actor.rs read_owner_for_claim): a missing record next to LTX means the\n // record was LOST (e.g. a lifecycle rule) — claiming epoch 1 would start the cell empty.\n // Read once more, then refuse the cell for 10 s without asking the bucket again.\n if (!cur && (await store.list(`cells/${scope}/ltx`)).length > 0) {\n cur = await readJson<{ node: string; epoch: number }>(key);\n if (!cur) {\n lostRecords.set(scope, t0 + LOST_RECORD_RECHECK_MS);\n throw lostRecordError(scope);\n }\n }\n let epoch: number;\n try {\n if (!cur) {\n epoch = 1;\n await store.put(key, enc.encode(JSON.stringify({ node: opts.node, epoch })), {\n ifNoneMatch: \"*\",\n });\n } else {\n const holder = cur.value.node;\n if (holder && holder !== opts.node) {\n const lease = await readJson<{ expires_ms: number }>(`nodes/${holder}.json`);\n if (lease && lease.value.expires_ms > now()) return undefined; // a live owner\n }\n epoch = cur.value.epoch + 1; // every activation advances the epoch\n await store.put(key, enc.encode(JSON.stringify({ node: opts.node, epoch })), {\n ifMatch: cur.etag,\n });\n }\n } catch (e) {\n if (e instanceof PreconditionFailedError) return undefined; // another node won the race\n throw e;\n }\n log.begin(cellKey, epoch); // a new owner epoch starts a new generation\n owned.add(cellKey);\n return {\n name: cellKey,\n epoch,\n lost: lost.signal,\n release: async () => {\n const now2 = await readJson<{ node: string; epoch: number }>(key);\n if (now2?.value.node === opts.node && now2.value.epoch === epoch)\n await store\n .put(key, enc.encode(JSON.stringify({ node: \"\", epoch })), { ifMatch: now2.etag })\n .catch(() => {});\n log.forget(cellKey);\n owned.delete(cellKey);\n },\n };\n },\n };\n\n // celld's waker role (wake.rs try_hold_waker): one node per fleet wakes alarms of cells that\n // nobody owns or whose owner is dead — an advisory CAS lease in wake/waker.json; every node\n // wakes its own cells; a live owner's cells are never hinted.\n const holdWaker = async (ttlMs: number) => {\n const key = \"wake/waker.json\";\n const cur = await readJson<{ node: string; expires_ms: number }>(key);\n const t = now();\n if (cur && cur.value.node !== opts.node && cur.value.expires_ms > t) return false;\n try {\n await store.put(\n key,\n enc.encode(JSON.stringify({ node: opts.node, expires_ms: t + ttlMs })),\n cur ? { ifMatch: cur.etag } : { ifNoneMatch: \"*\" },\n );\n return true;\n } catch (e) {\n if (!(e instanceof PreconditionFailedError)) return false;\n const again = await readJson<{ node: string; expires_ms: number }>(key);\n return again?.value.node === opts.node && again.value.expires_ms > t;\n }\n };\n const allWakes = log.wakes!.bind(log);\n const durability = Object.assign(log, {\n async wakes() {\n const due = await allWakes();\n let elected: boolean | undefined;\n const out: typeof due = [];\n for (const w of due) {\n const own = await readJson<{ node: string }>(`cells/${scopeOf(w.cellKey)}/own.json`);\n const owner = own?.value.node;\n if (owner === opts.node) {\n out.push(w); // our own cell: always\n continue;\n }\n let ownerExpires = 0;\n if (owner) {\n const lease = await readJson<{ expires_ms: number }>(`nodes/${owner}.json`);\n ownerExpires = lease?.value.expires_ms ?? 0;\n }\n elected ??= await holdWaker(opts.wakerTtlMs ?? 90_000);\n if (!elected) continue; // unowned or dead owners are the elected waker's job\n // A live owner fires its own alarms; the waker looks again when that owner's lease\n // would have run out (a stopped owner's cells are then due here).\n out.push(ownerExpires > now() ? { ...w, at: Math.max(w.at, ownerExpires + 1) } : w);\n }\n return out;\n },\n });\n\n return {\n ownership,\n durability,\n backup: durability,\n /** The fleet bucket itself (R2 objects live directly in it, under `r2/<bucket>/`). */\n objects: store,\n /**\n * The address celld nodes reach this node at (its celld peer server): published in the\n * node record now, so celld routes requests for our cells here instead of refusing them.\n */\n /**\n * Answers celld's signed peer probe (peer_probe.rs): an Ed25519 signature over\n * \"cells-peer-probe-v1\\n<node>\\n<advertised addr>\\n<challenge>\" by this node's probe key.\n */\n async probe(challenge: string) {\n await probeKeyReady;\n if (!probeKey || !/^[0-9a-f]{64}$/.test(challenge))\n throw new Error(\"cannot answer the probe\");\n const payload = `cells-peer-probe-v1\\n${opts.node}\\n${addr}\\n${challenge}`;\n const signature = new Uint8Array(\n await crypto.subtle.sign(\"Ed25519\", probeKey, new TextEncoder().encode(payload)),\n );\n return {\n version: 1,\n node: opts.node,\n advertise: addr,\n challenge,\n signature: bytesToHex(signature),\n };\n },\n async advertise(address: string) {\n addr = address;\n if (leaseWritten) await writeLease();\n },\n /** Clean shutdown: stop renewing, remove this node's lease record, close the store. */\n async close() {\n if (renew) clearTimeout(renew);\n if (deadline) clearTimeout(deadline);\n if (leaseWritten) await store.delete(`nodes/${opts.node}.json`).catch(() => {});\n store.close?.();\n },\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { bytesToHex } from "@noble/hashes/utils";
|
|
1
|
+
import { bytesToHex } from "@noble/hashes/utils.js";
|
|
2
2
|
import { PreconditionFailedError } from "./object-store.js";
|
|
3
3
|
const enc = new TextEncoder();
|
|
4
4
|
const sha256 = async (data) => bytesToHex(new Uint8Array(await crypto.subtle.digest("SHA-256", typeof data === "string" ? enc.encode(data) : data)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-object-store.js","sourceRoot":"","sources":["../../src/bucket/s3-object-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { bytesToHex } from \"@noble/hashes/utils\";\nimport type { ObjectStore } from \"./object-store.js\";\nimport { type ObjectAttributes, PreconditionFailedError } from \"./object-store.js\";\n\n/**\n * An S3-compatible bucket over fetch with AWS Signature V4 (WebCrypto): Amazon S3, R2,\n * Tigris, MinIO… — the stores celld qualifies. Runs in browsers (the bucket needs a CORS\n * rule exposing ETag and allowing If-Match / If-None-Match) and on Node. Path-style URLs:\n * `${endpoint}/${bucket}/${key}`.\n */\nexport interface S3Options {\n endpoint: string;\n bucket: string;\n region?: string;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n /** Key prefix inside the bucket (celld's `CELLD_BUCKET` path part). */\n prefix?: string;\n /**\n * The S3 endpoint the requests are signed for, when `endpoint` is a proxy in front of it\n * (a browser page reaching a local S3 through its dev server): SigV4 covers host and path.\n */\n signAs?: string;\n fetch?: typeof fetch;\n}\n\nconst enc = new TextEncoder();\nconst sha256 = async (data: Uint8Array | string) =>\n bytesToHex(\n new Uint8Array(\n await crypto.subtle.digest(\n \"SHA-256\",\n typeof data === \"string\" ? enc.encode(data) : (data as BufferSource),\n ),\n ),\n );\nconst hmac = async (key: Uint8Array | ArrayBuffer, data: string) => {\n const k = await crypto.subtle.importKey(\n \"raw\",\n key as BufferSource,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n return new Uint8Array(await crypto.subtle.sign(\"HMAC\", k, enc.encode(data)));\n};\nconst uriEncode = (s: string, slash = true) =>\n encodeURIComponent(s)\n .replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n .replace(slash ? /%2F/g : /$^/, \"/\");\n\nexport async function signV4(\n method: string,\n url: URL,\n headers: Record<string, string>,\n body: Uint8Array | undefined,\n o: Pick<S3Options, \"region\" | \"accessKeyId\" | \"secretAccessKey\" | \"sessionToken\">,\n now = new Date(),\n): Promise<Record<string, string>> {\n const region = o.region ?? \"auto\";\n const amzDate = now.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n const day = amzDate.slice(0, 8);\n const payloadHash = await sha256(body ?? new Uint8Array());\n const h: Record<string, string> = {\n ...Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v])),\n host: url.host,\n \"x-amz-date\": amzDate,\n \"x-amz-content-sha256\": payloadHash,\n };\n if (o.sessionToken) h[\"x-amz-security-token\"] = o.sessionToken;\n const names = Object.keys(h).sort();\n const query = [...url.searchParams]\n .map(([k, v]) => [uriEncode(k, false), uriEncode(v, false)])\n .sort(([a, b], [c, d]) => (a === c ? (b < d ? -1 : 1) : a < c ? -1 : 1))\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n const canonical = [\n method,\n uriEncode(decodeURIComponent(url.pathname)),\n query,\n ...names.map((n) => `${n}:${h[n].trim()}`),\n \"\",\n names.join(\";\"),\n payloadHash,\n ].join(\"\\n\");\n const scope = `${day}/${region}/s3/aws4_request`;\n const toSign = [\"AWS4-HMAC-SHA256\", amzDate, scope, await sha256(canonical)].join(\"\\n\");\n let key: Uint8Array = await hmac(enc.encode(`AWS4${o.secretAccessKey}`), day);\n for (const part of [region, \"s3\", \"aws4_request\"]) key = await hmac(key, part);\n const signature = bytesToHex(await hmac(key, toSign));\n h.authorization = `AWS4-HMAC-SHA256 Credential=${o.accessKeyId}/${scope}, SignedHeaders=${names.join(\";\")}, Signature=${signature}`;\n delete h.host; // set by fetch\n return h;\n}\n\nexport function s3ObjectStore(o: S3Options): ObjectStore {\n const f = o.fetch ?? fetch;\n const base = `${o.endpoint.replace(/\\/$/, \"\")}/${o.bucket}`;\n const signBase = `${(o.signAs ?? o.endpoint).replace(/\\/$/, \"\")}/${o.bucket}`;\n const signed = (url: URL) => (o.signAs ? new URL(signBase + url.href.slice(base.length)) : url);\n // celld's `s3://BUCKET/PREFIX` puts keys under \"PREFIX/\": a prefix is a directory.\n const root = o.prefix ? (o.prefix.endsWith(\"/\") ? o.prefix : `${o.prefix}/`) : \"\";\n const full = (key: string) => `${root}${key}`;\n const call = async (\n method: string,\n url: URL,\n headers: Record<string, string> = {},\n body?: Uint8Array,\n ) =>\n f(url, {\n method,\n headers: await signV4(method, signed(url), headers, body, o),\n body: body as BodyInit | undefined,\n });\n return {\n async get(key) {\n const r = await call(\"GET\", new URL(`${base}/${uriEncode(full(key))}`));\n if (r.status === 404) return undefined;\n if (!r.ok) throw new Error(`S3 GET ${key}: ${r.status} ${await r.text()}`);\n const attrs: ObjectAttributes = {};\n for (const [field, header] of S3_HEADERS) {\n const v = r.headers.get(header);\n if (v !== null) attrs[field] = v;\n }\n for (const [h, v] of r.headers)\n if (h.startsWith(\"x-amz-meta-\")) {\n attrs.metadata = attrs.metadata ?? {};\n attrs.metadata[h.slice(\"x-amz-meta-\".length)] = v;\n }\n const modified = r.headers.get(\"last-modified\");\n return {\n body: new Uint8Array(await r.arrayBuffer()),\n etag: r.headers.get(\"etag\") ?? \"\",\n attrs,\n modifiedMs: modified ? Date.parse(modified) : undefined,\n };\n },\n async put(key, body, cond, attrs) {\n const headers: Record<string, string> = {};\n // Content headers as headers, user metadata as x-amz-meta-* (celld's R2 record is\n // the ASCII-escaped JSON under x-amz-meta-celld-r2).\n for (const [field, header] of S3_HEADERS)\n if (attrs?.[field]) headers[header] = attrs[field] as string;\n for (const [name, value] of Object.entries(attrs?.metadata ?? {}))\n headers[`x-amz-meta-${name.toLowerCase()}`] = value;\n if (cond?.ifNoneMatch) headers[\"if-none-match\"] = \"*\";\n if (cond?.ifMatch !== undefined) headers[\"if-match\"] = cond.ifMatch;\n const r = await call(\"PUT\", new URL(`${base}/${uriEncode(full(key))}`), headers, body);\n // 409: a concurrent conditional write on some stores (R2, S3) — also a lost race.\n if (r.status === 412 || r.status === 409) throw new PreconditionFailedError(key);\n if (!r.ok) throw new Error(`S3 PUT ${key}: ${r.status} ${await r.text()}`);\n return r.headers.get(\"etag\") ?? \"\";\n },\n async list(prefix) {\n const keys: string[] = [];\n let token: string | undefined;\n do {\n const url = new URL(`${base}/`);\n url.searchParams.set(\"list-type\", \"2\");\n url.searchParams.set(\"prefix\", full(prefix));\n if (token) url.searchParams.set(\"continuation-token\", token);\n const r = await call(\"GET\", url);\n if (!r.ok) throw new Error(`S3 LIST ${prefix}: ${r.status} ${await r.text()}`);\n const xml = await r.text();\n for (const m of xml.matchAll(/<Key>([^<]*)<\\/Key>/g))\n keys.push(unxml(m[1]).slice(root.length));\n token = /<IsTruncated>true<\\/IsTruncated>/.test(xml)\n ? unxml(/<NextContinuationToken>([^<]*)<\\/NextContinuationToken>/.exec(xml)?.[1] ?? \"\")\n : undefined;\n } while (token);\n return keys.sort();\n },\n async delete(key) {\n const r = await call(\"DELETE\", new URL(`${base}/${uriEncode(full(key))}`));\n if (!r.ok && r.status !== 404) throw new Error(`S3 DELETE ${key}: ${r.status}`);\n },\n };\n}\n\nconst unxml = (s: string) =>\n s\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n\nconst S3_HEADERS: [\n \"contentType\" | \"contentLanguage\" | \"contentDisposition\" | \"contentEncoding\" | \"cacheControl\",\n string,\n][] = [\n [\"contentType\", \"content-type\"],\n [\"contentLanguage\", \"content-language\"],\n [\"contentDisposition\", \"content-disposition\"],\n [\"contentEncoding\", \"content-encoding\"],\n [\"cacheControl\", \"cache-control\"],\n];\n"]}
|
|
1
|
+
{"version":3,"file":"s3-object-store.js","sourceRoot":"","sources":["../../src/bucket/s3-object-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { bytesToHex } from \"@noble/hashes/utils.js\";\nimport type { ObjectStore } from \"./object-store.js\";\nimport { type ObjectAttributes, PreconditionFailedError } from \"./object-store.js\";\n\n/**\n * An S3-compatible bucket over fetch with AWS Signature V4 (WebCrypto): Amazon S3, R2,\n * Tigris, MinIO… — the stores celld qualifies. Runs in browsers (the bucket needs a CORS\n * rule exposing ETag and allowing If-Match / If-None-Match) and on Node. Path-style URLs:\n * `${endpoint}/${bucket}/${key}`.\n */\nexport interface S3Options {\n endpoint: string;\n bucket: string;\n region?: string;\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string;\n /** Key prefix inside the bucket (celld's `CELLD_BUCKET` path part). */\n prefix?: string;\n /**\n * The S3 endpoint the requests are signed for, when `endpoint` is a proxy in front of it\n * (a browser page reaching a local S3 through its dev server): SigV4 covers host and path.\n */\n signAs?: string;\n fetch?: typeof fetch;\n}\n\nconst enc = new TextEncoder();\nconst sha256 = async (data: Uint8Array | string) =>\n bytesToHex(\n new Uint8Array(\n await crypto.subtle.digest(\n \"SHA-256\",\n typeof data === \"string\" ? enc.encode(data) : (data as BufferSource),\n ),\n ),\n );\nconst hmac = async (key: Uint8Array | ArrayBuffer, data: string) => {\n const k = await crypto.subtle.importKey(\n \"raw\",\n key as BufferSource,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n return new Uint8Array(await crypto.subtle.sign(\"HMAC\", k, enc.encode(data)));\n};\nconst uriEncode = (s: string, slash = true) =>\n encodeURIComponent(s)\n .replace(/[!'()*]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`)\n .replace(slash ? /%2F/g : /$^/, \"/\");\n\nexport async function signV4(\n method: string,\n url: URL,\n headers: Record<string, string>,\n body: Uint8Array | undefined,\n o: Pick<S3Options, \"region\" | \"accessKeyId\" | \"secretAccessKey\" | \"sessionToken\">,\n now = new Date(),\n): Promise<Record<string, string>> {\n const region = o.region ?? \"auto\";\n const amzDate = now.toISOString().replace(/[:-]|\\.\\d{3}/g, \"\");\n const day = amzDate.slice(0, 8);\n const payloadHash = await sha256(body ?? new Uint8Array());\n const h: Record<string, string> = {\n ...Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v])),\n host: url.host,\n \"x-amz-date\": amzDate,\n \"x-amz-content-sha256\": payloadHash,\n };\n if (o.sessionToken) h[\"x-amz-security-token\"] = o.sessionToken;\n const names = Object.keys(h).sort();\n const query = [...url.searchParams]\n .map(([k, v]) => [uriEncode(k, false), uriEncode(v, false)])\n .sort(([a, b], [c, d]) => (a === c ? (b < d ? -1 : 1) : a < c ? -1 : 1))\n .map(([k, v]) => `${k}=${v}`)\n .join(\"&\");\n const canonical = [\n method,\n uriEncode(decodeURIComponent(url.pathname)),\n query,\n ...names.map((n) => `${n}:${h[n].trim()}`),\n \"\",\n names.join(\";\"),\n payloadHash,\n ].join(\"\\n\");\n const scope = `${day}/${region}/s3/aws4_request`;\n const toSign = [\"AWS4-HMAC-SHA256\", amzDate, scope, await sha256(canonical)].join(\"\\n\");\n let key: Uint8Array = await hmac(enc.encode(`AWS4${o.secretAccessKey}`), day);\n for (const part of [region, \"s3\", \"aws4_request\"]) key = await hmac(key, part);\n const signature = bytesToHex(await hmac(key, toSign));\n h.authorization = `AWS4-HMAC-SHA256 Credential=${o.accessKeyId}/${scope}, SignedHeaders=${names.join(\";\")}, Signature=${signature}`;\n delete h.host; // set by fetch\n return h;\n}\n\nexport function s3ObjectStore(o: S3Options): ObjectStore {\n const f = o.fetch ?? fetch;\n const base = `${o.endpoint.replace(/\\/$/, \"\")}/${o.bucket}`;\n const signBase = `${(o.signAs ?? o.endpoint).replace(/\\/$/, \"\")}/${o.bucket}`;\n const signed = (url: URL) => (o.signAs ? new URL(signBase + url.href.slice(base.length)) : url);\n // celld's `s3://BUCKET/PREFIX` puts keys under \"PREFIX/\": a prefix is a directory.\n const root = o.prefix ? (o.prefix.endsWith(\"/\") ? o.prefix : `${o.prefix}/`) : \"\";\n const full = (key: string) => `${root}${key}`;\n const call = async (\n method: string,\n url: URL,\n headers: Record<string, string> = {},\n body?: Uint8Array,\n ) =>\n f(url, {\n method,\n headers: await signV4(method, signed(url), headers, body, o),\n body: body as BodyInit | undefined,\n });\n return {\n async get(key) {\n const r = await call(\"GET\", new URL(`${base}/${uriEncode(full(key))}`));\n if (r.status === 404) return undefined;\n if (!r.ok) throw new Error(`S3 GET ${key}: ${r.status} ${await r.text()}`);\n const attrs: ObjectAttributes = {};\n for (const [field, header] of S3_HEADERS) {\n const v = r.headers.get(header);\n if (v !== null) attrs[field] = v;\n }\n for (const [h, v] of r.headers)\n if (h.startsWith(\"x-amz-meta-\")) {\n attrs.metadata = attrs.metadata ?? {};\n attrs.metadata[h.slice(\"x-amz-meta-\".length)] = v;\n }\n const modified = r.headers.get(\"last-modified\");\n return {\n body: new Uint8Array(await r.arrayBuffer()),\n etag: r.headers.get(\"etag\") ?? \"\",\n attrs,\n modifiedMs: modified ? Date.parse(modified) : undefined,\n };\n },\n async put(key, body, cond, attrs) {\n const headers: Record<string, string> = {};\n // Content headers as headers, user metadata as x-amz-meta-* (celld's R2 record is\n // the ASCII-escaped JSON under x-amz-meta-celld-r2).\n for (const [field, header] of S3_HEADERS)\n if (attrs?.[field]) headers[header] = attrs[field] as string;\n for (const [name, value] of Object.entries(attrs?.metadata ?? {}))\n headers[`x-amz-meta-${name.toLowerCase()}`] = value;\n if (cond?.ifNoneMatch) headers[\"if-none-match\"] = \"*\";\n if (cond?.ifMatch !== undefined) headers[\"if-match\"] = cond.ifMatch;\n const r = await call(\"PUT\", new URL(`${base}/${uriEncode(full(key))}`), headers, body);\n // 409: a concurrent conditional write on some stores (R2, S3) — also a lost race.\n if (r.status === 412 || r.status === 409) throw new PreconditionFailedError(key);\n if (!r.ok) throw new Error(`S3 PUT ${key}: ${r.status} ${await r.text()}`);\n return r.headers.get(\"etag\") ?? \"\";\n },\n async list(prefix) {\n const keys: string[] = [];\n let token: string | undefined;\n do {\n const url = new URL(`${base}/`);\n url.searchParams.set(\"list-type\", \"2\");\n url.searchParams.set(\"prefix\", full(prefix));\n if (token) url.searchParams.set(\"continuation-token\", token);\n const r = await call(\"GET\", url);\n if (!r.ok) throw new Error(`S3 LIST ${prefix}: ${r.status} ${await r.text()}`);\n const xml = await r.text();\n for (const m of xml.matchAll(/<Key>([^<]*)<\\/Key>/g))\n keys.push(unxml(m[1]).slice(root.length));\n token = /<IsTruncated>true<\\/IsTruncated>/.test(xml)\n ? unxml(/<NextContinuationToken>([^<]*)<\\/NextContinuationToken>/.exec(xml)?.[1] ?? \"\")\n : undefined;\n } while (token);\n return keys.sort();\n },\n async delete(key) {\n const r = await call(\"DELETE\", new URL(`${base}/${uriEncode(full(key))}`));\n if (!r.ok && r.status !== 404) throw new Error(`S3 DELETE ${key}: ${r.status}`);\n },\n };\n}\n\nconst unxml = (s: string) =>\n s\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n\nconst S3_HEADERS: [\n \"contentType\" | \"contentLanguage\" | \"contentDisposition\" | \"contentEncoding\" | \"cacheControl\",\n string,\n][] = [\n [\"contentType\", \"content-type\"],\n [\"contentLanguage\", \"content-language\"],\n [\"contentDisposition\", \"content-disposition\"],\n [\"contentEncoding\", \"content-encoding\"],\n [\"cacheControl\", \"cache-control\"],\n];\n"]}
|
package/dist/core/handles.d.ts
CHANGED
|
@@ -24,8 +24,11 @@ export interface IsolatedClass {
|
|
|
24
24
|
call(cellKey: string, method: string, args: unknown[]): Promise<unknown>;
|
|
25
25
|
restart(cellKey: string): Promise<void>;
|
|
26
26
|
delete(cellKey: string): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Tells the isolate which root epoch the facet's log is written under, and the name of the
|
|
29
|
+
* `id` given to `ctx.facets.get` (the facet's `ctx.id.name`; none: the facet's cell key).
|
|
30
|
+
*/
|
|
31
|
+
attach?(cellKey: string, epoch?: number, idName?: string): Promise<void>;
|
|
29
32
|
}
|
|
30
33
|
export declare function classHandle(resolve: ClassHandle["resolve"]): ClassHandle;
|
|
31
34
|
export declare function isClassHandle(v: unknown): v is ClassHandle;
|
package/dist/core/handles.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { deserialize, serialize } from "../v8/serialize.js";
|
|
2
|
+
import { carryWebSocketHeaders } from "../ws/upgrade.js";
|
|
2
3
|
import { isRpcTarget, isWorkerEntrypoint } from "./durable-object.js";
|
|
3
4
|
/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */
|
|
4
5
|
export const ISOLATED = Symbol.for("cellb.isolated-classes");
|
|
@@ -123,7 +124,17 @@ export function asyncStub(call, fetch) {
|
|
|
123
124
|
if (prop === "then" || typeof prop === "symbol")
|
|
124
125
|
return undefined;
|
|
125
126
|
if (prop === "fetch")
|
|
126
|
-
return (input, init) =>
|
|
127
|
+
return (input, init) => {
|
|
128
|
+
const req = new Request(input, init);
|
|
129
|
+
// A browser drops `Upgrade` and `Sec-WebSocket-*` from the copy: carried over, so a
|
|
130
|
+
// WebSocket reaches a facet (partyserver forwards its upgrade request as it is).
|
|
131
|
+
const from = init?.headers !== undefined
|
|
132
|
+
? new Headers(init.headers)
|
|
133
|
+
: input instanceof Request
|
|
134
|
+
? input.headers
|
|
135
|
+
: undefined;
|
|
136
|
+
return fetch(from ? carryWebSocketHeaders(from, req) : req);
|
|
137
|
+
};
|
|
127
138
|
return (...args) => rpcCall(() => call(String(prop), cross(args)), cross);
|
|
128
139
|
},
|
|
129
140
|
});
|
package/dist/core/handles.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"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","sourcesContent":["import { deserialize, type HostObjects, serialize } from \"../v8/serialize.js\";\nimport { isRpcTarget, isWorkerEntrypoint } from \"./durable-object.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\nexport type DurableObjectClass = new (ctx: DurableObjectState, env: any) => any;\n\n/**\n * A class handle — what `worker.getDurableObjectClass(name)` (Worker Loader) and\n * `ctx.exports.App` return, and what `ctx.facets.get(name, () => ({ class }))` accepts.\n * Resolution may be asynchronous (loaded code is compiled on first use).\n */\nexport interface ClassHandle {\n readonly __cellsClassHandle: true;\n resolve(): Promise<\n { cls: DurableObjectClass; env: unknown; props?: unknown } | { isolated: IsolatedClass }\n >;\n}\n\n/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */\nexport const ISOLATED = Symbol.for(\"cellb.isolated-classes\");\n\n/** A Durable Object class that runs in an isolate: its instances and storage live there. */\nexport interface IsolatedClass {\n fetch(cellKey: string, req: Request): Promise<Response>;\n call(cellKey: string, method: string, args: unknown[]): Promise<unknown>;\n restart(cellKey: string): Promise<void>;\n delete(cellKey: string): Promise<void>;\n /** Tells the isolate which root epoch the facet's log is written under. */\n attach?(cellKey: string, epoch?: number): Promise<void>;\n}\n\nexport function classHandle(resolve: ClassHandle[\"resolve\"]): ClassHandle {\n return { __cellsClassHandle: true, resolve };\n}\n\nexport function isClassHandle(v: unknown): v is ClassHandle {\n return (\n !!v &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n (v as ClassHandle).__cellsClassHandle === true\n );\n}\n\n/** Answered `true` by cellb's stubs: they cross by reference. */\nexport const STUB = Symbol.for(\"cellb.stub\");\n/** Answered by a value that may not cross, with workerd's reason. */\nexport const REFUSE = Symbol.for(\"cellb.refuse\");\n/** Answered by a `ctx.exports.X({ props })` stub or class handle: `{ name, props }` (storable). */\nexport const EXPORT = Symbol.for(\"cellb.export\");\n\n/**\n * What crosses a stub, as in workerd: functions, `RpcTarget`s, stubs and class handles by\n * reference (`ref` says what stands for one on the far side; in one realm, the value itself),\n * arrays and plain objects walked, anything else structured-cloned (`copy`).\n */\nexport function cross<T>(\n v: T,\n ref: (v: object) => unknown = (x) => x,\n copy: (v: unknown) => unknown = structuredClone,\n): T {\n if (v === undefined || v === null || (typeof v !== \"object\" && typeof v !== \"function\"))\n return copy(v) as T;\n const refused = (v as Record<symbol, unknown>)[REFUSE];\n if (typeof refused === \"string\") throw new DOMException(refused, \"DataCloneError\");\n if (\n typeof v === \"function\" ||\n isRpcTarget(v) ||\n (v as Record<symbol, unknown>)[STUB] === true ||\n isClassHandle(v)\n )\n return ref(v) as T;\n if (Array.isArray(v)) return v.map((x) => cross(x, ref, copy)) as T;\n if (Object.getPrototypeOf(v) === Object.prototype) {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v)) out[k] = cross(x, ref, copy);\n return out as T;\n }\n return copy(v) as T;\n}\n\n/**\n * A value sent to an object on another node (cells-http, celld's tunnel), checked first: only\n * copies travel between nodes, so a function, `RpcTarget` or stub is refused, not sent as `{}`.\n */\nexport function toAnotherNode<T>(v: T): T {\n cross(\n v,\n () => {\n const e = new DOMException(\n \"Functions, RpcTargets and stubs cannot be sent to another node: they pass by reference only within one runtime.\",\n \"DataCloneError\",\n );\n // An own `name`, so it survives the error's trip back over the link.\n throw Object.defineProperty(e, \"name\", { value: e.name, enumerable: true });\n },\n (x) => x,\n );\n return v;\n}\n\n/** Where a call on an RpcPromise goes: the property path from its result, and the arguments. */\nexport type Pipe = (path: string[], args: unknown[]) => unknown;\n\nconst RPC_PROMISE = Symbol(\"cellb.rpc-promise\");\n\n/**\n * workerd's RpcPromise: what a call on a stub returns. It is awaited as a promise, and used\n * before it settles (promise pipelining): a property read gives the RpcPromise of that path,\n * and a call on a path goes through `pipe` at once, without waiting for `result`.\n */\nexport function rpcPromise(result: Promise<unknown>, pipe: Pipe): any {\n const at = (path: string[]): any => {\n let value: Promise<unknown> | undefined;\n // The result itself is a Promise-like object, not callable (node:assert calls a function\n // given to `rejects`); a property path is callable.\n return new Proxy(path.length ? () => {} : Object.create(Promise.prototype), {\n apply: (_t, _this, args) => rpcCall(() => pipe(path, args)),\n get(_t, prop) {\n if (prop === RPC_PROMISE) return true;\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n value ??= result.then((v) => path.reduce((o: any, k) => o[k], v));\n return value[prop].bind(value);\n }\n if (typeof prop === \"symbol\") return undefined;\n return at([...path, prop]);\n },\n });\n };\n return at([]);\n}\n\n/**\n * Runs a call and returns its result as an RpcPromise (`map` applies to the settled value);\n * calls on it go to the result: at once if the result is an RpcPromise itself, else once it\n * settles.\n */\nexport function rpcCall(call: () => unknown, map?: (v: unknown) => unknown): any {\n let r: unknown;\n try {\n r = call();\n } catch (e) {\n r = Promise.reject(e);\n }\n const result = Promise.resolve(r);\n return rpcPromise(map ? result.then(map) : result, (path, args) => pipeTo(r, path, args));\n}\n\n/** Calls `path` of `r` (a value, a promise of one, or an RpcPromise) with `args`. */\nexport function pipeTo(r: unknown, path: string[], args: unknown[]): unknown {\n const callAt = (v: any) => {\n if (!path.length) return v(...args);\n const receiver = path.slice(0, -1).reduce((o, k) => o[k], v);\n return receiver[path[path.length - 1]](...args);\n };\n return (r as Record<symbol, unknown>)?.[RPC_PROMISE]\n ? callAt(r)\n : Promise.resolve(r).then(callAt);\n}\n\n/**\n * A stub over an asynchronously obtained target: `fetch` and JS-RPC methods, arguments\n * and results crossing as between isolates. A method's result is an RpcPromise over what\n * `call` returns.\n */\nexport function asyncStub(\n call: (method: string, args: unknown[]) => unknown,\n fetch: (req: Request) => Promise<Response>,\n): Record<string, any> {\n return new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === STUB) return true;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n if (prop === \"fetch\")\n return (input: RequestInfo | URL, init?: RequestInit) =>\n fetch(new Request(input as RequestInfo, init));\n return (...args: unknown[]) => rpcCall(() => call(String(prop), cross(args)), cross);\n },\n },\n );\n}\n\n/**\n * A stub of a WorkerEntrypoint (or a default export object): a fresh instance per call,\n * as workerd creates one per request; `ctx.props` carries copied startup properties. Methods\n * of a plain object receive `(…args, env, ctx)`, as its `fetch` receives `(request, env, ctx)`.\n */\nexport function entrypointStub(\n target: unknown,\n env: unknown,\n props: unknown,\n exports?: unknown,\n): Record<string, any> {\n const objectCtx = () => ({\n waitUntil() {},\n passThroughOnException() {},\n props: cross(props ?? {}),\n });\n const make = () => {\n if (typeof target === \"function\") {\n const ctx = {\n props: cross(props ?? {}),\n exports,\n waitUntil() {},\n passThroughOnException() {},\n };\n return new (target as new (c: unknown, e: unknown) => any)(ctx, env);\n }\n return target as any;\n };\n return asyncStub(\n (method, args) => {\n const instance = make();\n const fn = instance?.[method];\n if (typeof fn !== \"function\")\n throw new TypeError(`The RPC receiver does not implement the method \"${method}\".`);\n return fn.apply(instance, typeof target === \"function\" ? args : [...args, env, objectCtx()]);\n },\n async (req) => {\n const instance = make();\n if (typeof instance?.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n return typeof target === \"function\"\n ? instance.fetch(req)\n : instance.fetch(req, env, objectCtx());\n },\n );\n}\n\n/** workerd's refusal of `ctx.exports.<Entrypoint>` passed on without `({ props })`. */\nconst LOOPBACK =\n 'Could not serialize object of type \"LoopbackServiceStub\". This type does not support serialization.';\n\n/**\n * `ctx.exports`: loopback handles of a Worker's named exports. An entrypoint's (a\n * WorkerEntrypoint class, or an object with methods) is a stub (`ctx.exports.Greeter.greet()`),\n * and called with `{ props }` gives one with props; a Durable Object class's is a facet class\n * handle, also callable with `{ props }`.\n */\nexport function ctxExports(worker: Record<string, unknown>, env: unknown): Record<string, unknown> {\n const exports: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(worker)) {\n if (name === \"default\" || !value || (typeof value !== \"function\" && typeof value !== \"object\"))\n continue;\n if (typeof value === \"object\" || isWorkerEntrypoint(value)) {\n const withProps = (o: { props?: unknown } = {}) => {\n const stub = entrypointStub(value, env, o.props, exports);\n return new Proxy(stub, {\n get: (t, prop) => (prop === EXPORT ? { name, props: o.props } : t[prop as string]),\n });\n };\n const stub = withProps();\n exports[name] = new Proxy(withProps, {\n get: (_t, prop) => (prop === REFUSE ? LOOPBACK : stub[prop as string]),\n });\n } else {\n const handle = (o: { props?: unknown } = {}) =>\n Object.assign(\n classHandle(async () => ({ cls: value as DurableObjectClass, env, props: o.props })),\n { [EXPORT]: { name, props: o.props } },\n );\n exports[name] = Object.assign(\n handle,\n classHandle(async () => ({ cls: value as DurableObjectClass, env })),\n );\n }\n }\n return exports;\n}\n\n/**\n * Stubs in Durable Object storage (workerd's `allow_irrevocable_stub_storage`), as V8 host\n * objects: a `ctx.exports.X({ props })` stub or class handle is stored as `[name, props]` and\n * read back as `ctx.exports[name]({ props })`. Other stubs and `RpcTarget`s are refused rather\n * than stored as `{}`.\n */\nexport function storedExports(exports: Record<string, unknown>): HostObjects {\n const host: HostObjects = {\n encode(v) {\n const e = (v as Record<symbol, { name: string; props: unknown } | undefined>)[EXPORT];\n if (e) return serialize([e.name, e.props], host);\n if ((v as Record<symbol, unknown>)[STUB] === true || isRpcTarget(v))\n throw new DOMException(\n \"Only ctx.exports.<name>({ props }) stubs and class handles can be stored.\",\n \"DataCloneError\",\n );\n return undefined;\n },\n decode(bytes) {\n const [name, props] = deserialize(bytes, host) as [string, unknown];\n return (exports[name] as (o: { props: unknown }) => unknown)({ props });\n },\n };\n return host;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/core/handles.ts"],"names":[],"mappings":"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","sourcesContent":["import { deserialize, type HostObjects, serialize } from \"../v8/serialize.js\";\nimport { carryWebSocketHeaders } from \"../ws/upgrade.js\";\nimport { isRpcTarget, isWorkerEntrypoint } from \"./durable-object.js\";\nimport type { DurableObjectState } from \"./state.js\";\n\nexport type DurableObjectClass = new (ctx: DurableObjectState, env: any) => any;\n\n/**\n * A class handle — what `worker.getDurableObjectClass(name)` (Worker Loader) and\n * `ctx.exports.App` return, and what `ctx.facets.get(name, () => ({ class }))` accepts.\n * Resolution may be asynchronous (loaded code is compiled on first use).\n */\nexport interface ClassHandle {\n readonly __cellsClassHandle: true;\n resolve(): Promise<\n { cls: DurableObjectClass; env: unknown; props?: unknown } | { isolated: IsolatedClass }\n >;\n}\n\n/** Key of the isolate's class factory on a module facade (see getDurableObjectClass). */\nexport const ISOLATED = Symbol.for(\"cellb.isolated-classes\");\n\n/** A Durable Object class that runs in an isolate: its instances and storage live there. */\nexport interface IsolatedClass {\n fetch(cellKey: string, req: Request): Promise<Response>;\n call(cellKey: string, method: string, args: unknown[]): Promise<unknown>;\n restart(cellKey: string): Promise<void>;\n delete(cellKey: string): Promise<void>;\n /**\n * Tells the isolate which root epoch the facet's log is written under, and the name of the\n * `id` given to `ctx.facets.get` (the facet's `ctx.id.name`; none: the facet's cell key).\n */\n attach?(cellKey: string, epoch?: number, idName?: string): Promise<void>;\n}\n\nexport function classHandle(resolve: ClassHandle[\"resolve\"]): ClassHandle {\n return { __cellsClassHandle: true, resolve };\n}\n\nexport function isClassHandle(v: unknown): v is ClassHandle {\n return (\n !!v &&\n (typeof v === \"object\" || typeof v === \"function\") &&\n (v as ClassHandle).__cellsClassHandle === true\n );\n}\n\n/** Answered `true` by cellb's stubs: they cross by reference. */\nexport const STUB = Symbol.for(\"cellb.stub\");\n/** Answered by a value that may not cross, with workerd's reason. */\nexport const REFUSE = Symbol.for(\"cellb.refuse\");\n/** Answered by a `ctx.exports.X({ props })` stub or class handle: `{ name, props }` (storable). */\nexport const EXPORT = Symbol.for(\"cellb.export\");\n\n/**\n * What crosses a stub, as in workerd: functions, `RpcTarget`s, stubs and class handles by\n * reference (`ref` says what stands for one on the far side; in one realm, the value itself),\n * arrays and plain objects walked, anything else structured-cloned (`copy`).\n */\nexport function cross<T>(\n v: T,\n ref: (v: object) => unknown = (x) => x,\n copy: (v: unknown) => unknown = structuredClone,\n): T {\n if (v === undefined || v === null || (typeof v !== \"object\" && typeof v !== \"function\"))\n return copy(v) as T;\n const refused = (v as Record<symbol, unknown>)[REFUSE];\n if (typeof refused === \"string\") throw new DOMException(refused, \"DataCloneError\");\n if (\n typeof v === \"function\" ||\n isRpcTarget(v) ||\n (v as Record<symbol, unknown>)[STUB] === true ||\n isClassHandle(v)\n )\n return ref(v) as T;\n if (Array.isArray(v)) return v.map((x) => cross(x, ref, copy)) as T;\n if (Object.getPrototypeOf(v) === Object.prototype) {\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(v)) out[k] = cross(x, ref, copy);\n return out as T;\n }\n return copy(v) as T;\n}\n\n/**\n * A value sent to an object on another node (cells-http, celld's tunnel), checked first: only\n * copies travel between nodes, so a function, `RpcTarget` or stub is refused, not sent as `{}`.\n */\nexport function toAnotherNode<T>(v: T): T {\n cross(\n v,\n () => {\n const e = new DOMException(\n \"Functions, RpcTargets and stubs cannot be sent to another node: they pass by reference only within one runtime.\",\n \"DataCloneError\",\n );\n // An own `name`, so it survives the error's trip back over the link.\n throw Object.defineProperty(e, \"name\", { value: e.name, enumerable: true });\n },\n (x) => x,\n );\n return v;\n}\n\n/** Where a call on an RpcPromise goes: the property path from its result, and the arguments. */\nexport type Pipe = (path: string[], args: unknown[]) => unknown;\n\nconst RPC_PROMISE = Symbol(\"cellb.rpc-promise\");\n\n/**\n * workerd's RpcPromise: what a call on a stub returns. It is awaited as a promise, and used\n * before it settles (promise pipelining): a property read gives the RpcPromise of that path,\n * and a call on a path goes through `pipe` at once, without waiting for `result`.\n */\nexport function rpcPromise(result: Promise<unknown>, pipe: Pipe): any {\n const at = (path: string[]): any => {\n let value: Promise<unknown> | undefined;\n // The result itself is a Promise-like object, not callable (node:assert calls a function\n // given to `rejects`); a property path is callable.\n return new Proxy(path.length ? () => {} : Object.create(Promise.prototype), {\n apply: (_t, _this, args) => rpcCall(() => pipe(path, args)),\n get(_t, prop) {\n if (prop === RPC_PROMISE) return true;\n if (prop === \"then\" || prop === \"catch\" || prop === \"finally\") {\n value ??= result.then((v) => path.reduce((o: any, k) => o[k], v));\n return value[prop].bind(value);\n }\n if (typeof prop === \"symbol\") return undefined;\n return at([...path, prop]);\n },\n });\n };\n return at([]);\n}\n\n/**\n * Runs a call and returns its result as an RpcPromise (`map` applies to the settled value);\n * calls on it go to the result: at once if the result is an RpcPromise itself, else once it\n * settles.\n */\nexport function rpcCall(call: () => unknown, map?: (v: unknown) => unknown): any {\n let r: unknown;\n try {\n r = call();\n } catch (e) {\n r = Promise.reject(e);\n }\n const result = Promise.resolve(r);\n return rpcPromise(map ? result.then(map) : result, (path, args) => pipeTo(r, path, args));\n}\n\n/** Calls `path` of `r` (a value, a promise of one, or an RpcPromise) with `args`. */\nexport function pipeTo(r: unknown, path: string[], args: unknown[]): unknown {\n const callAt = (v: any) => {\n if (!path.length) return v(...args);\n const receiver = path.slice(0, -1).reduce((o, k) => o[k], v);\n return receiver[path[path.length - 1]](...args);\n };\n return (r as Record<symbol, unknown>)?.[RPC_PROMISE]\n ? callAt(r)\n : Promise.resolve(r).then(callAt);\n}\n\n/**\n * A stub over an asynchronously obtained target: `fetch` and JS-RPC methods, arguments\n * and results crossing as between isolates. A method's result is an RpcPromise over what\n * `call` returns.\n */\nexport function asyncStub(\n call: (method: string, args: unknown[]) => unknown,\n fetch: (req: Request) => Promise<Response>,\n): Record<string, any> {\n return new Proxy(\n {},\n {\n get(_t, prop) {\n if (prop === STUB) return true;\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n if (prop === \"fetch\")\n return (input: RequestInfo | URL, init?: RequestInit) => {\n const req = new Request(input as RequestInfo, init);\n // A browser drops `Upgrade` and `Sec-WebSocket-*` from the copy: carried over, so a\n // WebSocket reaches a facet (partyserver forwards its upgrade request as it is).\n const from =\n init?.headers !== undefined\n ? new Headers(init.headers)\n : input instanceof Request\n ? input.headers\n : undefined;\n return fetch(from ? carryWebSocketHeaders(from, req) : req);\n };\n return (...args: unknown[]) => rpcCall(() => call(String(prop), cross(args)), cross);\n },\n },\n );\n}\n\n/**\n * A stub of a WorkerEntrypoint (or a default export object): a fresh instance per call,\n * as workerd creates one per request; `ctx.props` carries copied startup properties. Methods\n * of a plain object receive `(…args, env, ctx)`, as its `fetch` receives `(request, env, ctx)`.\n */\nexport function entrypointStub(\n target: unknown,\n env: unknown,\n props: unknown,\n exports?: unknown,\n): Record<string, any> {\n const objectCtx = () => ({\n waitUntil() {},\n passThroughOnException() {},\n props: cross(props ?? {}),\n });\n const make = () => {\n if (typeof target === \"function\") {\n const ctx = {\n props: cross(props ?? {}),\n exports,\n waitUntil() {},\n passThroughOnException() {},\n };\n return new (target as new (c: unknown, e: unknown) => any)(ctx, env);\n }\n return target as any;\n };\n return asyncStub(\n (method, args) => {\n const instance = make();\n const fn = instance?.[method];\n if (typeof fn !== \"function\")\n throw new TypeError(`The RPC receiver does not implement the method \"${method}\".`);\n return fn.apply(instance, typeof target === \"function\" ? args : [...args, env, objectCtx()]);\n },\n async (req) => {\n const instance = make();\n if (typeof instance?.fetch !== \"function\")\n throw new Error(\"Handler does not export a fetch() function.\");\n return typeof target === \"function\"\n ? instance.fetch(req)\n : instance.fetch(req, env, objectCtx());\n },\n );\n}\n\n/** workerd's refusal of `ctx.exports.<Entrypoint>` passed on without `({ props })`. */\nconst LOOPBACK =\n 'Could not serialize object of type \"LoopbackServiceStub\". This type does not support serialization.';\n\n/**\n * `ctx.exports`: loopback handles of a Worker's named exports. An entrypoint's (a\n * WorkerEntrypoint class, or an object with methods) is a stub (`ctx.exports.Greeter.greet()`),\n * and called with `{ props }` gives one with props; a Durable Object class's is a facet class\n * handle, also callable with `{ props }`.\n */\nexport function ctxExports(worker: Record<string, unknown>, env: unknown): Record<string, unknown> {\n const exports: Record<string, unknown> = {};\n for (const [name, value] of Object.entries(worker)) {\n if (name === \"default\" || !value || (typeof value !== \"function\" && typeof value !== \"object\"))\n continue;\n if (typeof value === \"object\" || isWorkerEntrypoint(value)) {\n const withProps = (o: { props?: unknown } = {}) => {\n const stub = entrypointStub(value, env, o.props, exports);\n return new Proxy(stub, {\n get: (t, prop) => (prop === EXPORT ? { name, props: o.props } : t[prop as string]),\n });\n };\n const stub = withProps();\n exports[name] = new Proxy(withProps, {\n get: (_t, prop) => (prop === REFUSE ? LOOPBACK : stub[prop as string]),\n });\n } else {\n const handle = (o: { props?: unknown } = {}) =>\n Object.assign(\n classHandle(async () => ({ cls: value as DurableObjectClass, env, props: o.props })),\n { [EXPORT]: { name, props: o.props } },\n );\n exports[name] = Object.assign(\n handle,\n classHandle(async () => ({ cls: value as DurableObjectClass, env })),\n );\n }\n }\n return exports;\n}\n\n/**\n * Stubs in Durable Object storage (workerd's `allow_irrevocable_stub_storage`), as V8 host\n * objects: a `ctx.exports.X({ props })` stub or class handle is stored as `[name, props]` and\n * read back as `ctx.exports[name]({ props })`. Other stubs and `RpcTarget`s are refused rather\n * than stored as `{}`.\n */\nexport function storedExports(exports: Record<string, unknown>): HostObjects {\n const host: HostObjects = {\n encode(v) {\n const e = (v as Record<symbol, { name: string; props: unknown } | undefined>)[EXPORT];\n if (e) return serialize([e.name, e.props], host);\n if ((v as Record<symbol, unknown>)[STUB] === true || isRpcTarget(v))\n throw new DOMException(\n \"Only ctx.exports.<name>({ props }) stubs and class handles can be stored.\",\n \"DataCloneError\",\n );\n return undefined;\n },\n decode(bytes) {\n const [name, props] = deserialize(bytes, host) as [string, unknown];\n return (exports[name] as (o: { props: unknown }) => unknown)({ props });\n },\n };\n return host;\n}\n"]}
|
package/dist/core/id.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { hmac } from "@noble/hashes/hmac";
|
|
2
|
-
import { sha256 } from "@noble/hashes/
|
|
3
|
-
import { bytesToHex, hexToBytes } from "@noble/hashes/utils";
|
|
1
|
+
import { hmac } from "@noble/hashes/hmac.js";
|
|
2
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
3
|
+
import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js";
|
|
4
4
|
/** 64-hex-char object id. idFromName is SYNCHRONOUS (as on CF), hence noble instead of crypto.subtle. */
|
|
5
5
|
export class DurableObjectId {
|
|
6
6
|
#hex;
|