@statewalker/cellb 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +323 -2
- package/dist/adapters/files-backup.d.ts +16 -0
- package/dist/adapters/files-backup.js +32 -0
- package/dist/adapters/files-backup.js.map +1 -0
- package/dist/adapters/files-changelog.d.ts +33 -0
- package/dist/adapters/files-changelog.js +96 -0
- package/dist/adapters/files-changelog.js.map +1 -0
- package/dist/adapters/files-ltx.d.ts +35 -0
- package/dist/adapters/files-ltx.js +9 -0
- package/dist/adapters/files-ltx.js.map +1 -0
- package/dist/adapters/ltx-vfs.d.ts +21 -0
- package/dist/adapters/ltx-vfs.js +286 -0
- package/dist/adapters/ltx-vfs.js.map +1 -0
- package/dist/adapters/node-sqlite.d.ts +45 -0
- package/dist/adapters/node-sqlite.js +254 -0
- package/dist/adapters/node-sqlite.js.map +1 -0
- package/dist/adapters/wasm-page-hook.d.ts +26 -0
- package/dist/adapters/wasm-page-hook.js +55 -0
- package/dist/adapters/wasm-page-hook.js.map +1 -0
- package/dist/adapters/wasm-session.d.ts +11 -0
- package/dist/adapters/wasm-session.js +76 -0
- package/dist/adapters/wasm-session.js.map +1 -0
- package/dist/adapters/wasm-sqlite.d.ts +89 -0
- package/dist/adapters/wasm-sqlite.js +258 -0
- package/dist/adapters/wasm-sqlite.js.map +1 -0
- package/dist/bindings/assets.d.ts +26 -0
- package/dist/bindings/assets.js +260 -0
- package/dist/bindings/assets.js.map +1 -0
- package/dist/bindings/cache.d.ts +16 -0
- package/dist/bindings/cache.js +34 -0
- package/dist/bindings/cache.js.map +1 -0
- package/dist/bindings/celld-kv.d.ts +26 -0
- package/dist/bindings/celld-kv.js +81 -0
- package/dist/bindings/celld-kv.js.map +1 -0
- package/dist/bindings/celld-queues.d.ts +56 -0
- package/dist/bindings/celld-queues.js +223 -0
- package/dist/bindings/celld-queues.js.map +1 -0
- package/dist/bindings/celld-workflows.d.ts +22 -0
- package/dist/bindings/celld-workflows.js +54 -0
- package/dist/bindings/celld-workflows.js.map +1 -0
- package/dist/bindings/cron.d.ts +27 -0
- package/dist/bindings/cron.js +232 -0
- package/dist/bindings/cron.js.map +1 -0
- package/dist/bindings/d1-migrations.d.ts +22 -0
- package/dist/bindings/d1-migrations.js +32 -0
- package/dist/bindings/d1-migrations.js.map +1 -0
- package/dist/bindings/html-rewriter.d.ts +8 -0
- package/dist/bindings/html-rewriter.js +75 -0
- package/dist/bindings/html-rewriter.js.map +1 -0
- package/dist/bindings/r2-celld.d.ts +3 -0
- package/dist/bindings/r2-celld.js +113 -0
- package/dist/bindings/r2-celld.js.map +1 -0
- package/dist/bindings/r2.d.ts +236 -0
- package/dist/bindings/r2.js +419 -0
- package/dist/bindings/r2.js.map +1 -0
- package/dist/bindings/worker-loader.d.ts +83 -0
- package/dist/bindings/worker-loader.js +183 -0
- package/dist/bindings/worker-loader.js.map +1 -0
- package/dist/bindings/workers-ai.d.ts +39 -0
- package/dist/bindings/workers-ai.js +175 -0
- package/dist/bindings/workers-ai.js.map +1 -0
- package/dist/browser.d.ts +7 -0
- package/dist/browser.js +8 -0
- package/dist/browser.js.map +1 -0
- package/dist/bucket/celld-cells.d.ts +86 -0
- package/dist/bucket/celld-cells.js +273 -0
- package/dist/bucket/celld-cells.js.map +1 -0
- package/dist/bucket/celld-format.d.ts +10 -0
- package/dist/bucket/celld-format.js +27 -0
- package/dist/bucket/celld-format.js.map +1 -0
- package/dist/bucket/idb-object-store.d.ts +9 -0
- package/dist/bucket/idb-object-store.js +73 -0
- package/dist/bucket/idb-object-store.js.map +1 -0
- package/dist/bucket/ltx-log.d.ts +34 -0
- package/dist/bucket/ltx-log.js +289 -0
- package/dist/bucket/ltx-log.js.map +1 -0
- package/dist/bucket/object-store.d.ts +51 -0
- package/dist/bucket/object-store.js +114 -0
- package/dist/bucket/object-store.js.map +1 -0
- package/dist/bucket/s3-object-store.d.ts +25 -0
- package/dist/bucket/s3-object-store.js +151 -0
- package/dist/bucket/s3-object-store.js.map +1 -0
- package/dist/bucket/sqlite-object-store.d.ts +10 -0
- package/dist/bucket/sqlite-object-store.js +107 -0
- package/dist/bucket/sqlite-object-store.js.map +1 -0
- package/dist/core/alarms.d.ts +27 -0
- package/dist/core/alarms.js +88 -0
- package/dist/core/alarms.js.map +1 -0
- package/dist/core/async-context.d.ts +34 -0
- package/dist/core/async-context.js +50 -0
- package/dist/core/async-context.js.map +1 -0
- package/dist/core/celld-schema.d.ts +14 -0
- package/dist/core/celld-schema.js +34 -0
- package/dist/core/celld-schema.js.map +1 -0
- package/dist/core/durable-object.d.ts +28 -0
- package/dist/core/durable-object.js +31 -0
- package/dist/core/durable-object.js.map +1 -0
- package/dist/core/gates.d.ts +33 -0
- package/dist/core/gates.js +89 -0
- package/dist/core/gates.js.map +1 -0
- package/dist/core/handles.d.ts +90 -0
- package/dist/core/handles.js +224 -0
- package/dist/core/handles.js.map +1 -0
- package/dist/core/id.d.ts +19 -0
- package/dist/core/id.js +64 -0
- package/dist/core/id.js.map +1 -0
- package/dist/core/namespace.d.ts +38 -0
- package/dist/core/namespace.js +141 -0
- package/dist/core/namespace.js.map +1 -0
- package/dist/core/object-host.d.ts +91 -0
- package/dist/core/object-host.js +616 -0
- package/dist/core/object-host.js.map +1 -0
- package/dist/core/request-body.d.ts +9 -0
- package/dist/core/request-body.js +55 -0
- package/dist/core/request-body.js.map +1 -0
- package/dist/core/runtime.d.ts +121 -0
- package/dist/core/runtime.js +366 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/shard.d.ts +7 -0
- package/dist/core/shard.js +10 -0
- package/dist/core/shard.js.map +1 -0
- package/dist/core/sql-split.d.ts +15 -0
- package/dist/core/sql-split.js +101 -0
- package/dist/core/sql-split.js.map +1 -0
- package/dist/core/sql-storage.d.ts +53 -0
- package/dist/core/sql-storage.js +407 -0
- package/dist/core/sql-storage.js.map +1 -0
- package/dist/core/state.d.ts +44 -0
- package/dist/core/state.js +93 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/storage.d.ts +103 -0
- package/dist/core/storage.js +351 -0
- package/dist/core/storage.js.map +1 -0
- package/dist/core/worker-rejections.d.ts +21 -0
- package/dist/core/worker-rejections.js +55 -0
- package/dist/core/worker-rejections.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/isolate/browser.d.ts +16 -0
- package/dist/isolate/browser.js +37 -0
- package/dist/isolate/browser.js.map +1 -0
- package/dist/isolate/host.d.ts +24 -0
- package/dist/isolate/host.js +74 -0
- package/dist/isolate/host.js.map +1 -0
- package/dist/isolate/isolate-worker.d.ts +1 -0
- package/dist/isolate/isolate-worker.js +53 -0
- package/dist/isolate/isolate-worker.js.map +1 -0
- package/dist/isolate/isolate.d.ts +10 -0
- package/dist/isolate/isolate.js +169 -0
- package/dist/isolate/isolate.js.map +1 -0
- package/dist/isolate/node-entry.d.ts +1 -0
- package/dist/isolate/node-entry.js +12 -0
- package/dist/isolate/node-entry.js.map +1 -0
- package/dist/isolate/protocol.d.ts +66 -0
- package/dist/isolate/protocol.js +205 -0
- package/dist/isolate/protocol.js.map +1 -0
- package/dist/ltx/crc64.d.ts +6 -0
- package/dist/ltx/crc64.js +46 -0
- package/dist/ltx/crc64.js.map +1 -0
- package/dist/ltx/ltx-page-server.d.ts +65 -0
- package/dist/ltx/ltx-page-server.js +309 -0
- package/dist/ltx/ltx-page-server.js.map +1 -0
- package/dist/ltx/ltx-pages.d.ts +81 -0
- package/dist/ltx/ltx-pages.js +315 -0
- package/dist/ltx/ltx-pages.js.map +1 -0
- package/dist/ltx/ltx-store-worker.d.ts +1 -0
- package/dist/ltx/ltx-store-worker.js +38 -0
- package/dist/ltx/ltx-store-worker.js.map +1 -0
- package/dist/ltx/ltx.d.ts +45 -0
- package/dist/ltx/ltx.js +203 -0
- package/dist/ltx/ltx.js.map +1 -0
- package/dist/ltx/lz4.d.ts +9 -0
- package/dist/ltx/lz4.js +156 -0
- package/dist/ltx/lz4.js.map +1 -0
- package/dist/ltx/opfs-sync-files.d.ts +23 -0
- package/dist/ltx/opfs-sync-files.js +191 -0
- package/dist/ltx/opfs-sync-files.js.map +1 -0
- package/dist/ltx/xxh32.d.ts +1 -0
- package/dist/ltx/xxh32.js +43 -0
- package/dist/ltx/xxh32.js.map +1 -0
- package/dist/miniflare-compat/blob-service.d.ts +13 -0
- package/dist/miniflare-compat/blob-service.js +66 -0
- package/dist/miniflare-compat/blob-service.js.map +1 -0
- package/dist/miniflare-compat/kv-binding.d.ts +44 -0
- package/dist/miniflare-compat/kv-binding.js +99 -0
- package/dist/miniflare-compat/kv-binding.js.map +1 -0
- package/dist/miniflare-compat/shims/assert.d.ts +15 -0
- package/dist/miniflare-compat/shims/assert.js +24 -0
- package/dist/miniflare-compat/shims/assert.js.map +1 -0
- package/dist/miniflare-compat/shims/workerd-cloudflare.d.ts +7 -0
- package/dist/miniflare-compat/shims/workerd-cloudflare.js +6 -0
- package/dist/miniflare-compat/shims/workerd-cloudflare.js.map +1 -0
- package/dist/miniflare-compat/shims/workerd-globals.d.ts +1 -0
- package/dist/miniflare-compat/shims/workerd-globals.js +30 -0
- package/dist/miniflare-compat/shims/workerd-globals.js.map +1 -0
- package/dist/miniflare-compat/shims/workerd-internal.d.ts +20 -0
- package/dist/miniflare-compat/shims/workerd-internal.js +23 -0
- package/dist/miniflare-compat/shims/workerd-internal.js.map +1 -0
- package/dist/miniflare-compat/shims/workerd-performance.d.ts +4 -0
- package/dist/miniflare-compat/shims/workerd-performance.js +17 -0
- package/dist/miniflare-compat/shims/workerd-performance.js.map +1 -0
- package/dist/miniflare-compat/simulator-fetcher.d.ts +9 -0
- package/dist/miniflare-compat/simulator-fetcher.js +14 -0
- package/dist/miniflare-compat/simulator-fetcher.js.map +1 -0
- package/dist/miniflare-compat/vendored.d.ts +15 -0
- package/dist/miniflare-compat/vendored.js +27 -0
- package/dist/miniflare-compat/vendored.js.map +1 -0
- package/dist/node-compat/async_hooks.d.ts +22 -0
- package/dist/node-compat/async_hooks.js +176 -0
- package/dist/node-compat/async_hooks.js.map +1 -0
- package/dist/node-compat/browser-registry.d.ts +3 -0
- package/dist/node-compat/browser-registry.js +39 -0
- package/dist/node-compat/browser-registry.js.map +1 -0
- package/dist/node-compat/crypto.d.ts +60 -0
- package/dist/node-compat/crypto.js +143 -0
- package/dist/node-compat/crypto.js.map +1 -0
- package/dist/node-compat/diagnostics_channel.d.ts +27 -0
- package/dist/node-compat/diagnostics_channel.js +46 -0
- package/dist/node-compat/diagnostics_channel.js.map +1 -0
- package/dist/node-compat/fs.d.ts +35 -0
- package/dist/node-compat/fs.js +40 -0
- package/dist/node-compat/fs.js.map +1 -0
- package/dist/node-compat/globals.d.ts +3 -0
- package/dist/node-compat/globals.js +4 -0
- package/dist/node-compat/globals.js.map +1 -0
- package/dist/node-compat/install.d.ts +5 -0
- package/dist/node-compat/install.js +12 -0
- package/dist/node-compat/install.js.map +1 -0
- package/dist/node-compat/module.d.ts +12 -0
- package/dist/node-compat/module.js +36 -0
- package/dist/node-compat/module.js.map +1 -0
- package/dist/node-compat/modules.d.ts +8 -0
- package/dist/node-compat/modules.js +23 -0
- package/dist/node-compat/modules.js.map +1 -0
- package/dist/node-compat/os.d.ts +36 -0
- package/dist/node-compat/os.js +36 -0
- package/dist/node-compat/os.js.map +1 -0
- package/dist/node-compat/process.d.ts +14 -0
- package/dist/node-compat/process.js +16 -0
- package/dist/node-compat/process.js.map +1 -0
- package/dist/node-compat/shims.d.ts +4 -0
- package/dist/node.d.ts +5 -0
- package/dist/node.js +6 -0
- package/dist/node.js.map +1 -0
- package/dist/peer/celld-peer.d.ts +53 -0
- package/dist/peer/celld-peer.js +555 -0
- package/dist/peer/celld-peer.js.map +1 -0
- package/dist/ports.d.ts +183 -0
- package/dist/ports.js +10 -0
- package/dist/ports.js.map +1 -0
- package/dist/project/browser-bundle.d.ts +17 -0
- package/dist/project/browser-bundle.js +125 -0
- package/dist/project/browser-bundle.js.map +1 -0
- package/dist/project/browser-cookies.d.ts +12 -0
- package/dist/project/browser-cookies.js +90 -0
- package/dist/project/browser-cookies.js.map +1 -0
- package/dist/project/browser-host.d.ts +173 -0
- package/dist/project/browser-host.js +200 -0
- package/dist/project/browser-host.js.map +1 -0
- package/dist/project/browser-modules.d.ts +17 -0
- package/dist/project/browser-modules.js +89 -0
- package/dist/project/browser-modules.js.map +1 -0
- package/dist/project/browser-shards.d.ts +62 -0
- package/dist/project/browser-shards.js +210 -0
- package/dist/project/browser-shards.js.map +1 -0
- package/dist/project/browser-tabs.d.ts +103 -0
- package/dist/project/browser-tabs.js +418 -0
- package/dist/project/browser-tabs.js.map +1 -0
- package/dist/project/cloudflare-email.d.ts +8 -0
- package/dist/project/cloudflare-email.js +11 -0
- package/dist/project/cloudflare-email.js.map +1 -0
- package/dist/project/cloudflare-workers.d.ts +12 -0
- package/dist/project/cloudflare-workers.js +16 -0
- package/dist/project/cloudflare-workers.js.map +1 -0
- package/dist/project/host-modules.d.ts +4 -0
- package/dist/project/host-modules.js +40 -0
- package/dist/project/host-modules.js.map +1 -0
- package/dist/project/jsonc.d.ts +2 -0
- package/dist/project/jsonc.js +27 -0
- package/dist/project/jsonc.js.map +1 -0
- package/dist/project/lower-await.d.ts +2 -0
- package/dist/project/lower-await.js +151 -0
- package/dist/project/lower-await.js.map +1 -0
- package/dist/project/node-project.d.ts +38 -0
- package/dist/project/node-project.js +362 -0
- package/dist/project/node-project.js.map +1 -0
- package/dist/project/own-module.d.ts +6 -0
- package/dist/project/own-module.js +13 -0
- package/dist/project/own-module.js.map +1 -0
- package/dist/project/scheduler.d.ts +2 -0
- package/dist/project/scheduler.js +3 -0
- package/dist/project/scheduler.js.map +1 -0
- package/dist/project/site.d.ts +74 -0
- package/dist/project/site.js +206 -0
- package/dist/project/site.js.map +1 -0
- package/dist/project/virtual-modules.d.ts +3 -0
- package/dist/project/worker-scope.d.ts +27 -0
- package/dist/project/worker-scope.js +46 -0
- package/dist/project/worker-scope.js.map +1 -0
- package/dist/project/workerd-message-channel.d.ts +13 -0
- package/dist/project/workerd-message-channel.js +137 -0
- package/dist/project/workerd-message-channel.js.map +1 -0
- package/dist/project/workers-global-names.d.ts +6 -0
- package/dist/project/workers-global-names.js +15 -0
- package/dist/project/workers-global-names.js.map +1 -0
- package/dist/project/workers-globals-module.d.ts +8 -0
- package/dist/project/workers-globals-module.js +9 -0
- package/dist/project/workers-globals-module.js.map +1 -0
- package/dist/project/workers-globals.d.ts +9 -0
- package/dist/project/workers-globals.js +19 -0
- package/dist/project/workers-globals.js.map +1 -0
- package/dist/project/wrangler.d.ts +116 -0
- package/dist/project/wrangler.js +342 -0
- package/dist/project/wrangler.js.map +1 -0
- package/dist/router/cell-router.d.ts +72 -0
- package/dist/router/cell-router.js +247 -0
- package/dist/router/cell-router.js.map +1 -0
- package/dist/router/shard-worker.d.ts +44 -0
- package/dist/router/shard-worker.js +163 -0
- package/dist/router/shard-worker.js.map +1 -0
- package/dist/transport/cells-http.d.ts +25 -0
- package/dist/transport/cells-http.js +141 -0
- package/dist/transport/cells-http.js.map +1 -0
- package/dist/transport/cells-link.d.ts +27 -0
- package/dist/transport/cells-link.js +71 -0
- package/dist/transport/cells-link.js.map +1 -0
- package/dist/transport/port.d.ts +26 -0
- package/dist/transport/port.js +100 -0
- package/dist/transport/port.js.map +1 -0
- package/dist/v8/codec.d.ts +6 -0
- package/dist/v8/codec.js +9 -0
- package/dist/v8/codec.js.map +1 -0
- package/dist/v8/serialize.d.ts +10 -0
- package/dist/v8/serialize.js +601 -0
- package/dist/v8/serialize.js.map +1 -0
- package/dist/ws/client.d.ts +25 -0
- package/dist/ws/client.js +203 -0
- package/dist/ws/client.js.map +1 -0
- package/dist/ws/control.d.ts +48 -0
- package/dist/ws/control.js +44 -0
- package/dist/ws/control.js.map +1 -0
- package/dist/ws/frames.d.ts +38 -0
- package/dist/ws/frames.js +39 -0
- package/dist/ws/frames.js.map +1 -0
- package/dist/ws/server.d.ts +99 -0
- package/dist/ws/server.js +295 -0
- package/dist/ws/server.js.map +1 -0
- package/dist/ws/sw-connector.d.ts +10 -0
- package/dist/ws/sw-connector.js +25 -0
- package/dist/ws/sw-connector.js.map +1 -0
- package/dist/ws/upgrade.d.ts +28 -0
- package/dist/ws/upgrade.js +75 -0
- package/dist/ws/upgrade.js.map +1 -0
- package/package.json +111 -3
- package/vendor/celld/LICENSE +202 -0
- package/vendor/celld/kv.js +1131 -0
- package/vendor/celld/queues.js +1656 -0
- package/vendor/celld/workflows.js +1610 -0
- package/vendor/html-rewriter-wasm/html_rewriter.js +925 -0
- package/vendor/html-rewriter-wasm/html_rewriter_bg.wasm +0 -0
- package/vendor/miniflare/d1-api.js +738 -0
- package/vendor/miniflare/d1-database.js +6978 -0
- package/vendor/miniflare/kv-namespace.js +3061 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opfs-sync-files.js","sourceRoot":"","sources":["../../src/ltx/opfs-sync-files.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The FilesApi the LTX store needs (exists, stats, list, read with ranges, write, remove, move)\n * on OPFS through SyncAccessHandles: for a worker that alone owns its directory (the LTX store\n * worker). A write is one synchronous `write()` per chunk into a fresh handle, against a\n * `createWritable()` stream (a swap file, then a copy) in the asynchronous API.\n */\nimport type { FileInfo, FilesApi } from \"@statewalker/webrun-files\";\n\ntype Dir = FileSystemDirectoryHandle;\ntype SyncHandle = {\n read(b: Uint8Array, o: { at: number }): number;\n write(b: Uint8Array, o: { at: number }): number;\n getSize(): number;\n truncate(n: number): void;\n flush(): void;\n close(): void;\n};\n\n/** Time spent per step of writes (ms), for traces. */\nexport const opfsSyncWriteStats = {\n writes: 0,\n lookupMs: 0,\n openMs: 0,\n writeMs: 0,\n flushMs: 0,\n closeMs: 0,\n};\n\n/** A write the origin's storage quota refused: what was written, and what the quota allows. */\nexport class StorageQuotaError extends Error {\n name = \"QuotaExceededError\";\n}\n\nfunction quotaError(path: string, at: number, wrote?: number, of?: number): StorageQuotaError {\n return new StorageQuotaError(\n `storage quota exceeded writing ${path} (${Math.round(at / 1e6)} MB written${wrote !== undefined ? `; the last write took ${wrote} of ${of} bytes` : \"\"}): free space in this origin's storage`,\n );\n}\n\nexport function opfsSyncFiles(root: Dir): FilesApi {\n const parts = (path: string) => path.split(\"/\").filter(Boolean);\n /** \"Not there\" is undefined; any other failure (quota, state, security) is thrown as is. */\n const absent = (err: unknown) => {\n const name = (err as DOMException)?.name;\n if (name === \"NotFoundError\" || name === \"TypeMismatchError\") return undefined;\n throw err;\n };\n const dirOf = async (segs: string[], create: boolean): Promise<Dir | undefined> => {\n let d = root;\n for (const s of segs) {\n try {\n d = await d.getDirectoryHandle(s, { create });\n } catch (err) {\n return absent(err);\n }\n }\n return d;\n };\n const fileOf = async (path: string, create = false) => {\n const p = parts(path);\n const d = await dirOf(p.slice(0, -1), create);\n if (!d || !p.length) return undefined;\n try {\n return await d.getFileHandle(p[p.length - 1], { create });\n } catch (err) {\n return absent(err);\n }\n };\n /** `f` renamed to `to`, replacing a file there. */\n const moveInto = async (f: FileSystemFileHandle, to: string) => {\n const t = parts(to);\n const d = await dirOf(t.slice(0, -1), true);\n if (!d) throw new Error(`opfs: cannot create the directory of ${to}`);\n const movable = f as FileSystemFileHandle & { move?: (d: Dir, n: string) => Promise<void> };\n if (!movable.move) throw new Error(\"opfs: FileSystemHandle.move() is not supported\");\n try {\n await movable.move(d, t[t.length - 1]);\n } catch (err) {\n // Where a move does not replace an existing file: remove it, then move.\n if ((err as DOMException)?.name !== \"InvalidModificationError\") throw err;\n await d.removeEntry(t[t.length - 1]);\n await movable.move(d, t[t.length - 1]);\n }\n };\n const sync = (f: FileSystemFileHandle) =>\n (f as unknown as { createSyncAccessHandle(): Promise<SyncHandle> }).createSyncAccessHandle();\n\n const api: Partial<FilesApi> = {\n async exists(path) {\n return !!(await fileOf(path)) || !!(await dirOf(parts(path), false));\n },\n async stats(path) {\n const f = await fileOf(path);\n if (f) {\n const file = await f.getFile();\n return { kind: \"file\", size: file.size, lastModified: file.lastModified };\n }\n return (await dirOf(parts(path), false)) ? { kind: \"directory\" } : undefined;\n },\n async *list(path) {\n const d = await dirOf(parts(path), false);\n if (!d) return;\n const base = `/${parts(path).join(\"/\")}`.replace(/\\/$/, \"\");\n const out: FileInfo[] = [];\n for await (const [name, h] of (\n d as unknown as { entries(): AsyncIterable<[string, FileSystemHandle]> }\n ).entries()) {\n const p = `${base}/${name}`;\n if (h.kind === \"file\") {\n const file = await (h as FileSystemFileHandle).getFile();\n out.push({\n kind: \"file\",\n name,\n path: p,\n size: file.size,\n lastModified: file.lastModified,\n });\n } else out.push({ kind: \"directory\", name, path: p });\n }\n out.sort((a, b) => (a.name < b.name ? -1 : 1));\n yield* out;\n },\n async *read(path, o) {\n const f = await fileOf(path);\n if (!f) return;\n // Reads go through the File snapshot (no exclusive handle needed).\n const file = await f.getFile();\n const start = o?.start ?? 0;\n const end = o?.length !== undefined ? Math.min(file.size, start + o.length) : file.size;\n if (end > start) yield new Uint8Array(await file.slice(start, end).arrayBuffer());\n },\n async write(path, content) {\n // Into a temporary file, moved into place once complete: a reader never sees a partial\n // file, and a failed write (quota) leaves nothing behind under `path`.\n const st = opfsSyncWriteStats;\n const p = parts(path);\n const tmp = `/${[...p.slice(0, -1), `${p[p.length - 1]}.part-${Math.random().toString(36).slice(2, 10)}`].join(\"/\")}`;\n let t = performance.now();\n const f = await fileOf(tmp, true);\n if (!f) throw new Error(`opfs: cannot create ${tmp}`);\n st.lookupMs += performance.now() - t;\n t = performance.now();\n const h = await sync(f);\n st.openMs += performance.now() - t;\n let at = 0;\n try {\n try {\n t = performance.now();\n for await (const c of content as AsyncIterable<Uint8Array>) {\n const n = h.write(c, { at });\n // Past the quota, Chromium's SyncAccessHandle does not throw: write() returns an\n // error code as an unsigned count (4294967288 = -8), or a short count. Adding it to\n // the offset put the next chunk gigabytes past the end of the file.\n if (n !== c.length) throw quotaError(path, at, n, c.length);\n at += n;\n }\n st.writeMs += performance.now() - t;\n t = performance.now();\n h.flush();\n st.flushMs += performance.now() - t;\n } finally {\n t = performance.now();\n h.close();\n st.closeMs += performance.now() - t;\n st.writes++;\n }\n await moveInto(f, path);\n } catch (err) {\n await api.remove?.(tmp).catch(() => false);\n if ((err as DOMException)?.name === \"QuotaExceededError\") throw quotaError(path, at);\n throw err;\n }\n },\n async remove(path) {\n const p = parts(path);\n const d = await dirOf(p.slice(0, -1), false);\n if (!d) return false;\n try {\n await d.removeEntry(p[p.length - 1], { recursive: true });\n return true;\n } catch {\n return false;\n }\n },\n async move(source, target) {\n const f = await fileOf(source);\n if (!f) return false;\n await moveInto(f, target);\n return true;\n },\n async mkdir(path) {\n await dirOf(parts(path), true);\n },\n };\n return api as FilesApi;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function xxh32(data: Uint8Array, seed?: number): number;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** xxHash32 (seed 0 by default) — the LZ4 frame format's checksum. */
|
|
2
|
+
const P1 = 2654435761;
|
|
3
|
+
const P2 = 2246822519;
|
|
4
|
+
const P3 = 3266489917;
|
|
5
|
+
const P4 = 668265263;
|
|
6
|
+
const P5 = 374761393;
|
|
7
|
+
const rotl = (x, r) => ((x << r) | (x >>> (32 - r))) >>> 0;
|
|
8
|
+
const mul = (a, b) => Math.imul(a, b) >>> 0;
|
|
9
|
+
export function xxh32(data, seed = 0) {
|
|
10
|
+
const len = data.length;
|
|
11
|
+
const v = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
12
|
+
let i = 0;
|
|
13
|
+
let h;
|
|
14
|
+
if (len >= 16) {
|
|
15
|
+
let a = (seed + P1 + P2) >>> 0;
|
|
16
|
+
let b = (seed + P2) >>> 0;
|
|
17
|
+
let c = seed >>> 0;
|
|
18
|
+
let d = (seed - P1) >>> 0;
|
|
19
|
+
while (i <= len - 16) {
|
|
20
|
+
a = mul(rotl((a + mul(v.getUint32(i, true), P2)) >>> 0, 13), P1);
|
|
21
|
+
b = mul(rotl((b + mul(v.getUint32(i + 4, true), P2)) >>> 0, 13), P1);
|
|
22
|
+
c = mul(rotl((c + mul(v.getUint32(i + 8, true), P2)) >>> 0, 13), P1);
|
|
23
|
+
d = mul(rotl((d + mul(v.getUint32(i + 12, true), P2)) >>> 0, 13), P1);
|
|
24
|
+
i += 16;
|
|
25
|
+
}
|
|
26
|
+
h = (rotl(a, 1) + rotl(b, 7) + rotl(c, 12) + rotl(d, 18)) >>> 0;
|
|
27
|
+
}
|
|
28
|
+
else
|
|
29
|
+
h = (seed + P5) >>> 0;
|
|
30
|
+
h = (h + len) >>> 0;
|
|
31
|
+
while (i <= len - 4) {
|
|
32
|
+
h = mul(rotl((h + mul(v.getUint32(i, true), P3)) >>> 0, 17), P4);
|
|
33
|
+
i += 4;
|
|
34
|
+
}
|
|
35
|
+
while (i < len) {
|
|
36
|
+
h = mul(rotl((h + mul(data[i], P5)) >>> 0, 11), P1);
|
|
37
|
+
i++;
|
|
38
|
+
}
|
|
39
|
+
h = mul(h ^ (h >>> 15), P2);
|
|
40
|
+
h = mul(h ^ (h >>> 13), P3);
|
|
41
|
+
return (h ^ (h >>> 16)) >>> 0;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=xxh32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xxh32.js","sourceRoot":"","sources":["../../src/ltx/xxh32.ts"],"names":[],"mappings":"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","sourcesContent":["/** xxHash32 (seed 0 by default) — the LZ4 frame format's checksum. */\nconst P1 = 2654435761;\nconst P2 = 2246822519;\nconst P3 = 3266489917;\nconst P4 = 668265263;\nconst P5 = 374761393;\nconst rotl = (x: number, r: number) => ((x << r) | (x >>> (32 - r))) >>> 0;\nconst mul = (a: number, b: number) => Math.imul(a, b) >>> 0;\n\nexport function xxh32(data: Uint8Array, seed = 0): number {\n const len = data.length;\n const v = new DataView(data.buffer, data.byteOffset, data.byteLength);\n let i = 0;\n let h: number;\n if (len >= 16) {\n let a = (seed + P1 + P2) >>> 0;\n let b = (seed + P2) >>> 0;\n let c = seed >>> 0;\n let d = (seed - P1) >>> 0;\n while (i <= len - 16) {\n a = mul(rotl((a + mul(v.getUint32(i, true), P2)) >>> 0, 13), P1);\n b = mul(rotl((b + mul(v.getUint32(i + 4, true), P2)) >>> 0, 13), P1);\n c = mul(rotl((c + mul(v.getUint32(i + 8, true), P2)) >>> 0, 13), P1);\n d = mul(rotl((d + mul(v.getUint32(i + 12, true), P2)) >>> 0, 13), P1);\n i += 16;\n }\n h = (rotl(a, 1) + rotl(b, 7) + rotl(c, 12) + rotl(d, 18)) >>> 0;\n } else h = (seed + P5) >>> 0;\n h = (h + len) >>> 0;\n while (i <= len - 4) {\n h = mul(rotl((h + mul(v.getUint32(i, true), P3)) >>> 0, 17), P4);\n i += 4;\n }\n while (i < len) {\n h = mul(rotl((h + mul(data[i], P5)) >>> 0, 11), P1);\n i++;\n }\n h = mul(h ^ (h >>> 15), P2);\n h = mul(h ^ (h >>> 13), P3);\n return (h ^ (h >>> 16)) >>> 0;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FilesApi } from "@statewalker/webrun-files";
|
|
2
|
+
/**
|
|
3
|
+
* The "disk directory service" that Miniflare's simulators expect behind their
|
|
4
|
+
* `MINIFLARE_BLOBS` service binding (workerd provides it from a local directory),
|
|
5
|
+
* implemented on a webrun-files FilesApi: OPFS in a browser, S3, memory, node fs…
|
|
6
|
+
*
|
|
7
|
+
* Protocol (as used by Miniflare's BlobStore): `PUT /<path>` stores the body,
|
|
8
|
+
* `GET /<path>` returns it (404 if absent) honouring a single `Range: bytes=a-b`,
|
|
9
|
+
* `HEAD /<path>` returns Content-Length, `DELETE /<path>` removes it.
|
|
10
|
+
*/
|
|
11
|
+
export declare function filesApiBlobService(files: FilesApi, root?: string): {
|
|
12
|
+
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
13
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The "disk directory service" that Miniflare's simulators expect behind their
|
|
3
|
+
* `MINIFLARE_BLOBS` service binding (workerd provides it from a local directory),
|
|
4
|
+
* implemented on a webrun-files FilesApi: OPFS in a browser, S3, memory, node fs…
|
|
5
|
+
*
|
|
6
|
+
* Protocol (as used by Miniflare's BlobStore): `PUT /<path>` stores the body,
|
|
7
|
+
* `GET /<path>` returns it (404 if absent) honouring a single `Range: bytes=a-b`,
|
|
8
|
+
* `HEAD /<path>` returns Content-Length, `DELETE /<path>` removes it.
|
|
9
|
+
*/
|
|
10
|
+
export function filesApiBlobService(files, root = "/blobs") {
|
|
11
|
+
const pathOf = (url) => `${root}${decodeURIComponent(url.pathname)}`;
|
|
12
|
+
const readAll = async (path) => {
|
|
13
|
+
if (!(await files.exists(path)))
|
|
14
|
+
return undefined;
|
|
15
|
+
const chunks = [];
|
|
16
|
+
for await (const c of files.read(path))
|
|
17
|
+
chunks.push(c);
|
|
18
|
+
const out = new Uint8Array(chunks.reduce((n, c) => n + c.byteLength, 0));
|
|
19
|
+
let o = 0;
|
|
20
|
+
for (const c of chunks) {
|
|
21
|
+
out.set(c, o);
|
|
22
|
+
o += c.byteLength;
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
async fetch(input, init) {
|
|
28
|
+
// Not `new Request(input, init)`: workerd code sends stream bodies without
|
|
29
|
+
// `duplex: "half"`, which browsers and Node reject when building a Request.
|
|
30
|
+
const src = input instanceof Request ? input : undefined;
|
|
31
|
+
const url = new URL(src ? src.url : String(input));
|
|
32
|
+
const method = (init?.method ?? src?.method ?? "GET").toUpperCase();
|
|
33
|
+
const headers = new Headers(init?.headers ?? src?.headers);
|
|
34
|
+
const path = pathOf(url);
|
|
35
|
+
if (method === "PUT") {
|
|
36
|
+
const body = init?.body ?? src?.body ?? null;
|
|
37
|
+
await files.write(path, [new Uint8Array(await new Response(body).arrayBuffer())]);
|
|
38
|
+
return new Response(null, { status: 204 });
|
|
39
|
+
}
|
|
40
|
+
if (method === "DELETE") {
|
|
41
|
+
await files.remove(path);
|
|
42
|
+
return new Response(null, { status: 204 });
|
|
43
|
+
}
|
|
44
|
+
const data = await readAll(path);
|
|
45
|
+
if (!data)
|
|
46
|
+
return new Response(null, { status: 404 });
|
|
47
|
+
if (method === "HEAD")
|
|
48
|
+
return new Response(null, { headers: { "Content-Length": String(data.byteLength) } });
|
|
49
|
+
const range = /^bytes=(\d+)-(\d+)$/.exec(headers.get("Range") ?? "");
|
|
50
|
+
if (range) {
|
|
51
|
+
const [start, end] = [Number(range[1]), Math.min(Number(range[2]), data.byteLength - 1)];
|
|
52
|
+
return new Response(data.slice(start, end + 1), {
|
|
53
|
+
status: 206,
|
|
54
|
+
headers: {
|
|
55
|
+
"Content-Range": `bytes ${start}-${end}/${data.byteLength}`,
|
|
56
|
+
"Content-Length": String(end - start + 1),
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return new Response(data, {
|
|
61
|
+
headers: { "Content-Length": String(data.byteLength) },
|
|
62
|
+
});
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=blob-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blob-service.js","sourceRoot":"","sources":["../../src/miniflare-compat/blob-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FilesApi } from \"@statewalker/webrun-files\";\n\n/**\n * The \"disk directory service\" that Miniflare's simulators expect behind their\n * `MINIFLARE_BLOBS` service binding (workerd provides it from a local directory),\n * implemented on a webrun-files FilesApi: OPFS in a browser, S3, memory, node fs…\n *\n * Protocol (as used by Miniflare's BlobStore): `PUT /<path>` stores the body,\n * `GET /<path>` returns it (404 if absent) honouring a single `Range: bytes=a-b`,\n * `HEAD /<path>` returns Content-Length, `DELETE /<path>` removes it.\n */\nexport function filesApiBlobService(\n files: FilesApi,\n root = \"/blobs\",\n): { fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> } {\n const pathOf = (url: URL) => `${root}${decodeURIComponent(url.pathname)}`;\n const readAll = async (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 return {\n async fetch(input, init) {\n // Not `new Request(input, init)`: workerd code sends stream bodies without\n // `duplex: \"half\"`, which browsers and Node reject when building a Request.\n const src = input instanceof Request ? input : undefined;\n const url = new URL(src ? src.url : String(input));\n const method = (init?.method ?? src?.method ?? \"GET\").toUpperCase();\n const headers = new Headers(init?.headers ?? src?.headers);\n const path = pathOf(url);\n if (method === \"PUT\") {\n const body = init?.body ?? src?.body ?? null;\n await files.write(path, [new Uint8Array(await new Response(body).arrayBuffer())]);\n return new Response(null, { status: 204 });\n }\n if (method === \"DELETE\") {\n await files.remove(path);\n return new Response(null, { status: 204 });\n }\n const data = await readAll(path);\n if (!data) return new Response(null, { status: 404 });\n if (method === \"HEAD\")\n return new Response(null, { headers: { \"Content-Length\": String(data.byteLength) } });\n const range = /^bytes=(\\d+)-(\\d+)$/.exec(headers.get(\"Range\") ?? \"\");\n if (range) {\n const [start, end] = [Number(range[1]), Math.min(Number(range[2]), data.byteLength - 1)];\n return new Response(data.slice(start, end + 1) as BodyInit, {\n status: 206,\n headers: {\n \"Content-Range\": `bytes ${start}-${end}/${data.byteLength}`,\n \"Content-Length\": String(end - start + 1),\n },\n });\n }\n return new Response(data as BodyInit, {\n headers: { \"Content-Length\": String(data.byteLength) },\n });\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { DurableObjectNamespace } from "../core/namespace.js";
|
|
2
|
+
/**
|
|
3
|
+
* The `KVNamespace` binding API (env.MY_KV.get/put/…) for Miniflare's KV simulator.
|
|
4
|
+
* In workerd this client is native C++ that speaks HTTP to the simulator; here it is
|
|
5
|
+
* TypeScript speaking the same protocol (Miniflare src/workers/kv/namespace.worker.ts):
|
|
6
|
+
* GET /<key>?urlencoded=true[&cache_ttl] → value, CF-Expiration, CF-KV-Metadata
|
|
7
|
+
* PUT /<key>?urlencoded=true[&expiration|expiration_ttl] + CF-KV-Metadata
|
|
8
|
+
* DELETE /<key>?urlencoded=true
|
|
9
|
+
* GET /?prefix&key_count_limit&cursor → { keys, list_complete, cursor? }
|
|
10
|
+
* One simulator object per namespace id; `cf.miniflare.name` carries the namespace name.
|
|
11
|
+
*/
|
|
12
|
+
export type KVGetType = "text" | "json" | "arrayBuffer" | "stream";
|
|
13
|
+
export interface KVPutOptions {
|
|
14
|
+
expiration?: number;
|
|
15
|
+
expirationTtl?: number;
|
|
16
|
+
metadata?: unknown;
|
|
17
|
+
}
|
|
18
|
+
export declare function kvNamespaceBinding(objects: DurableObjectNamespace, namespaceId: string): {
|
|
19
|
+
get(key: string | string[], opt?: KVGetType | {
|
|
20
|
+
type?: KVGetType;
|
|
21
|
+
cacheTtl?: number;
|
|
22
|
+
}): Promise<unknown>;
|
|
23
|
+
getWithMetadata(key: string, opt?: KVGetType | {
|
|
24
|
+
type?: KVGetType;
|
|
25
|
+
}): Promise<{
|
|
26
|
+
value: any;
|
|
27
|
+
metadata: any;
|
|
28
|
+
}>;
|
|
29
|
+
put(key: string, value: string | ArrayBuffer | ArrayBufferView | ReadableStream, options?: KVPutOptions): Promise<void>;
|
|
30
|
+
delete(key: string): Promise<void>;
|
|
31
|
+
list(options?: {
|
|
32
|
+
prefix?: string;
|
|
33
|
+
limit?: number;
|
|
34
|
+
cursor?: string;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
keys: {
|
|
37
|
+
name: string;
|
|
38
|
+
expiration?: number;
|
|
39
|
+
metadata?: unknown;
|
|
40
|
+
}[];
|
|
41
|
+
list_complete: boolean;
|
|
42
|
+
cursor?: string;
|
|
43
|
+
}>;
|
|
44
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export function kvNamespaceBinding(objects, namespaceId) {
|
|
2
|
+
const stub = objects.getByName(namespaceId);
|
|
3
|
+
const call = (path, params, init = {}) => {
|
|
4
|
+
const url = new URL(`http://kv.local${path}`);
|
|
5
|
+
for (const [k, v] of Object.entries(params))
|
|
6
|
+
if (v !== undefined)
|
|
7
|
+
url.searchParams.set(k, String(v));
|
|
8
|
+
return stub.fetch(url, { ...init, cf: { miniflare: { name: namespaceId } } });
|
|
9
|
+
};
|
|
10
|
+
const keyPath = (key) => `/${encodeURIComponent(key)}`;
|
|
11
|
+
const decode = async (res, type) => {
|
|
12
|
+
if (type === "json")
|
|
13
|
+
return res.json();
|
|
14
|
+
if (type === "arrayBuffer")
|
|
15
|
+
return res.arrayBuffer();
|
|
16
|
+
if (type === "stream")
|
|
17
|
+
return res.body;
|
|
18
|
+
return res.text();
|
|
19
|
+
};
|
|
20
|
+
const fail = async (res) => {
|
|
21
|
+
throw new Error(`KV ${res.status}: ${(await res.text()) || res.statusText}`);
|
|
22
|
+
};
|
|
23
|
+
const typeOf = (opt) => (typeof opt === "string" ? opt : opt?.type) ?? "text";
|
|
24
|
+
return {
|
|
25
|
+
async get(key, opt) {
|
|
26
|
+
// Bulk get: up to 100 keys → Map(key → value | null), types "text" or "json" only.
|
|
27
|
+
if (Array.isArray(key)) {
|
|
28
|
+
if (key.length > 100)
|
|
29
|
+
throw new Error("KV GET_BULK_ERROR: You can request a maximum of 100 keys");
|
|
30
|
+
const type = typeOf(opt);
|
|
31
|
+
if (type !== "text" && type !== "json")
|
|
32
|
+
throw new Error("KV GET_BULK_ERROR: type must be text or json");
|
|
33
|
+
const out = new Map();
|
|
34
|
+
for (const k of key)
|
|
35
|
+
out.set(k, await this.get(k, type));
|
|
36
|
+
return out;
|
|
37
|
+
}
|
|
38
|
+
const res = await call(keyPath(key), {
|
|
39
|
+
urlencoded: "true",
|
|
40
|
+
cache_ttl: typeof opt === "object" ? opt.cacheTtl : undefined,
|
|
41
|
+
});
|
|
42
|
+
if (res.status === 404)
|
|
43
|
+
return null;
|
|
44
|
+
if (!res.ok)
|
|
45
|
+
return fail(res);
|
|
46
|
+
return decode(res, typeOf(opt));
|
|
47
|
+
},
|
|
48
|
+
async getWithMetadata(key, opt) {
|
|
49
|
+
const res = await call(keyPath(key), { urlencoded: "true" });
|
|
50
|
+
if (res.status === 404)
|
|
51
|
+
return { value: null, metadata: null };
|
|
52
|
+
if (!res.ok)
|
|
53
|
+
return fail(res);
|
|
54
|
+
const meta = res.headers.get("CF-KV-Metadata");
|
|
55
|
+
return {
|
|
56
|
+
value: await decode(res, typeOf(opt)),
|
|
57
|
+
metadata: meta === null ? null : JSON.parse(meta),
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
async put(key, value, options = {}) {
|
|
61
|
+
const body = ArrayBuffer.isView(value)
|
|
62
|
+
? new Uint8Array(value.buffer, value.byteOffset, value.byteLength)
|
|
63
|
+
: value;
|
|
64
|
+
const headers = {};
|
|
65
|
+
if (options.metadata !== undefined)
|
|
66
|
+
headers["CF-KV-Metadata"] = JSON.stringify(options.metadata);
|
|
67
|
+
if (typeof value === "string")
|
|
68
|
+
headers["Content-Length"] = String(new TextEncoder().encode(value).byteLength);
|
|
69
|
+
const res = await call(keyPath(key), {
|
|
70
|
+
urlencoded: "true",
|
|
71
|
+
expiration: options.expiration,
|
|
72
|
+
expiration_ttl: options.expirationTtl,
|
|
73
|
+
}, { method: "PUT", headers, body: body, duplex: "half" });
|
|
74
|
+
if (!res.ok)
|
|
75
|
+
await fail(res);
|
|
76
|
+
},
|
|
77
|
+
async delete(key) {
|
|
78
|
+
const res = await call(keyPath(key), { urlencoded: "true" }, { method: "DELETE" });
|
|
79
|
+
if (!res.ok)
|
|
80
|
+
await fail(res);
|
|
81
|
+
},
|
|
82
|
+
async list(options = {}) {
|
|
83
|
+
const res = await call("/", {
|
|
84
|
+
prefix: options.prefix,
|
|
85
|
+
key_count_limit: options.limit,
|
|
86
|
+
cursor: options.cursor,
|
|
87
|
+
});
|
|
88
|
+
if (!res.ok)
|
|
89
|
+
return fail(res);
|
|
90
|
+
const out = (await res.json());
|
|
91
|
+
// The simulator returns metadata as stored (JSON text); workerd's binding parses it.
|
|
92
|
+
for (const k of out.keys)
|
|
93
|
+
if (typeof k.metadata === "string")
|
|
94
|
+
k.metadata = JSON.parse(k.metadata);
|
|
95
|
+
return out;
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=kv-binding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv-binding.js","sourceRoot":"","sources":["../../src/miniflare-compat/kv-binding.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DurableObjectNamespace } from \"../core/namespace.js\";\n\n/**\n * The `KVNamespace` binding API (env.MY_KV.get/put/…) for Miniflare's KV simulator.\n * In workerd this client is native C++ that speaks HTTP to the simulator; here it is\n * TypeScript speaking the same protocol (Miniflare src/workers/kv/namespace.worker.ts):\n * GET /<key>?urlencoded=true[&cache_ttl] → value, CF-Expiration, CF-KV-Metadata\n * PUT /<key>?urlencoded=true[&expiration|expiration_ttl] + CF-KV-Metadata\n * DELETE /<key>?urlencoded=true\n * GET /?prefix&key_count_limit&cursor → { keys, list_complete, cursor? }\n * One simulator object per namespace id; `cf.miniflare.name` carries the namespace name.\n */\nexport type KVGetType = \"text\" | \"json\" | \"arrayBuffer\" | \"stream\";\n\nexport interface KVPutOptions {\n expiration?: number;\n expirationTtl?: number;\n metadata?: unknown;\n}\n\nexport function kvNamespaceBinding(objects: DurableObjectNamespace, namespaceId: string) {\n const stub = objects.getByName(namespaceId);\n const call = (\n path: string,\n params: Record<string, string | number | undefined>,\n init: RequestInit = {},\n ) => {\n const url = new URL(`http://kv.local${path}`);\n for (const [k, v] of Object.entries(params))\n if (v !== undefined) url.searchParams.set(k, String(v));\n return stub.fetch(url, { ...init, cf: { miniflare: { name: namespaceId } } } as RequestInit);\n };\n const keyPath = (key: string) => `/${encodeURIComponent(key)}`;\n const decode = async (res: Response, type: KVGetType) => {\n if (type === \"json\") return res.json();\n if (type === \"arrayBuffer\") return res.arrayBuffer();\n if (type === \"stream\") return res.body;\n return res.text();\n };\n const fail = async (res: Response) => {\n throw new Error(`KV ${res.status}: ${(await res.text()) || res.statusText}`);\n };\n const typeOf = (opt?: KVGetType | { type?: KVGetType }) =>\n (typeof opt === \"string\" ? opt : opt?.type) ?? \"text\";\n\n return {\n async get(\n key: string | string[],\n opt?: KVGetType | { type?: KVGetType; cacheTtl?: number },\n ): Promise<unknown> {\n // Bulk get: up to 100 keys → Map(key → value | null), types \"text\" or \"json\" only.\n if (Array.isArray(key)) {\n if (key.length > 100)\n throw new Error(\"KV GET_BULK_ERROR: You can request a maximum of 100 keys\");\n const type = typeOf(opt);\n if (type !== \"text\" && type !== \"json\")\n throw new Error(\"KV GET_BULK_ERROR: type must be text or json\");\n const out = new Map<string, unknown>();\n for (const k of key) out.set(k, await this.get(k, type));\n return out;\n }\n const res = await call(keyPath(key), {\n urlencoded: \"true\",\n cache_ttl: typeof opt === \"object\" ? opt.cacheTtl : undefined,\n });\n if (res.status === 404) return null;\n if (!res.ok) return fail(res);\n return decode(res, typeOf(opt));\n },\n async getWithMetadata(key: string, opt?: KVGetType | { type?: KVGetType }) {\n const res = await call(keyPath(key), { urlencoded: \"true\" });\n if (res.status === 404) return { value: null, metadata: null };\n if (!res.ok) return fail(res);\n const meta = res.headers.get(\"CF-KV-Metadata\");\n return {\n value: await decode(res, typeOf(opt)),\n metadata: meta === null ? null : JSON.parse(meta),\n };\n },\n async put(\n key: string,\n value: string | ArrayBuffer | ArrayBufferView | ReadableStream,\n options: KVPutOptions = {},\n ) {\n const body = ArrayBuffer.isView(value)\n ? new Uint8Array(value.buffer, value.byteOffset, value.byteLength)\n : value;\n const headers: Record<string, string> = {};\n if (options.metadata !== undefined)\n headers[\"CF-KV-Metadata\"] = JSON.stringify(options.metadata);\n if (typeof value === \"string\")\n headers[\"Content-Length\"] = String(new TextEncoder().encode(value).byteLength);\n const res = await call(\n keyPath(key),\n {\n urlencoded: \"true\",\n expiration: options.expiration,\n expiration_ttl: options.expirationTtl,\n },\n { method: \"PUT\", headers, body: body as BodyInit, duplex: \"half\" } as RequestInit,\n );\n if (!res.ok) await fail(res);\n },\n async delete(key: string) {\n const res = await call(keyPath(key), { urlencoded: \"true\" }, { method: \"DELETE\" });\n if (!res.ok) await fail(res);\n },\n async list(options: { prefix?: string; limit?: number; cursor?: string } = {}) {\n const res = await call(\"/\", {\n prefix: options.prefix,\n key_count_limit: options.limit,\n cursor: options.cursor,\n });\n if (!res.ok) return fail(res);\n const out = (await res.json()) as {\n keys: { name: string; expiration?: number; metadata?: unknown }[];\n list_complete: boolean;\n cursor?: string;\n };\n // The simulator returns metadata as stored (JSON text); workerd's binding parses it.\n for (const k of out.keys)\n if (typeof k.metadata === \"string\") k.metadata = JSON.parse(k.metadata);\n return out;\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Minimal `node:assert` for code written for workerd (Miniflare's simulators). */
|
|
2
|
+
export declare class AssertionError extends Error {
|
|
3
|
+
constructor(message?: string);
|
|
4
|
+
}
|
|
5
|
+
declare function assert(value: unknown, message?: string | Error): asserts value;
|
|
6
|
+
declare namespace assert {
|
|
7
|
+
export { assert as ok };
|
|
8
|
+
export var _a: (a: unknown, b: unknown, message?: string) => void;
|
|
9
|
+
export { _a as strictEqual };
|
|
10
|
+
export var fail: (message?: string) => never;
|
|
11
|
+
export { AssertionError };
|
|
12
|
+
}
|
|
13
|
+
export default assert;
|
|
14
|
+
export declare const ok: typeof assert;
|
|
15
|
+
export declare const strictEqual: (a: unknown, b: unknown, message?: string) => void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Minimal `node:assert` for code written for workerd (Miniflare's simulators). */
|
|
2
|
+
export class AssertionError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message ?? "Assertion failed");
|
|
5
|
+
this.name = "AssertionError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function assert(value, message) {
|
|
9
|
+
if (!value)
|
|
10
|
+
throw message instanceof Error ? message : new AssertionError(message);
|
|
11
|
+
}
|
|
12
|
+
assert.ok = assert;
|
|
13
|
+
assert.strictEqual = (a, b, message) => {
|
|
14
|
+
if (!Object.is(a, b))
|
|
15
|
+
throw new AssertionError(message ?? `Expected ${String(a)} to be ${String(b)}`);
|
|
16
|
+
};
|
|
17
|
+
assert.fail = (message) => {
|
|
18
|
+
throw new AssertionError(message);
|
|
19
|
+
};
|
|
20
|
+
assert.AssertionError = AssertionError;
|
|
21
|
+
export default assert;
|
|
22
|
+
export const ok = assert;
|
|
23
|
+
export const strictEqual = assert.strictEqual;
|
|
24
|
+
//# sourceMappingURL=assert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assert.js","sourceRoot":"","sources":["../../../src/miniflare-compat/shims/assert.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,IAAI,kBAAkB,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AACD,SAAS,MAAM,CAAC,KAAc,EAAE,OAAwB;IACtD,IAAI,CAAC,KAAK;QAAE,MAAM,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AACrF,CAAC;AACD,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC;AACnB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,OAAgB,EAAE,EAAE;IAChE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,IAAI,cAAc,CAAC,OAAO,IAAI,YAAY,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpF,CAAC,CAAC;AACF,MAAM,CAAC,IAAI,GAAG,CAAC,OAAgB,EAAS,EAAE;IACxC,MAAM,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC,CAAC;AACF,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;AACvC,eAAe,MAAM,CAAC;AACtB,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC;AACzB,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC","sourcesContent":["/** Minimal `node:assert` for code written for workerd (Miniflare's simulators). */\nexport class AssertionError extends Error {\n constructor(message?: string) {\n super(message ?? \"Assertion failed\");\n this.name = \"AssertionError\";\n }\n}\nfunction assert(value: unknown, message?: string | Error): asserts value {\n if (!value) throw message instanceof Error ? message : new AssertionError(message);\n}\nassert.ok = assert;\nassert.strictEqual = (a: unknown, b: unknown, message?: string) => {\n if (!Object.is(a, b))\n throw new AssertionError(message ?? `Expected ${String(a)} to be ${String(b)}`);\n};\nassert.fail = (message?: string): never => {\n throw new AssertionError(message);\n};\nassert.AssertionError = AssertionError;\nexport default assert;\nexport const ok = assert;\nexport const strictEqual = assert.strictEqual;\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workerd's `Cloudflare` global (compatibility flags), injected by esbuild into the
|
|
3
|
+
* vendored workerd binding clients. No flags set = default behaviour.
|
|
4
|
+
*/
|
|
5
|
+
export const Cloudflare = { compatibilityFlags: {} };
|
|
6
|
+
//# sourceMappingURL=workerd-cloudflare.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerd-cloudflare.js","sourceRoot":"","sources":["../../../src/miniflare-compat/shims/workerd-cloudflare.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,kBAAkB,EAAE,EAA6B,EAAE,CAAC","sourcesContent":["/**\n * workerd's `Cloudflare` global (compatibility flags), injected by esbuild into the\n * vendored workerd binding clients. No flags set = default behaviour.\n */\nexport const Cloudflare = { compatibilityFlags: {} as Record<string, boolean> };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workerd extensions used by Miniflare's simulator Durable Objects, for browsers/Node:
|
|
3
|
+
* - `IdentityTransformStream`: a byte pass-through TransformStream;
|
|
4
|
+
* - `ReadableStreamBYOBReader#readAtLeast(min, view)`: read until `min` bytes or EOF.
|
|
5
|
+
* (Miniflare 2 shipped the same polyfills in TypeScript: packages/core/src/standards/streams.ts.)
|
|
6
|
+
*/
|
|
7
|
+
const g = globalThis;
|
|
8
|
+
if (typeof g.IdentityTransformStream === "undefined") {
|
|
9
|
+
g.IdentityTransformStream = class IdentityTransformStream extends (TransformStream) {
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const BYOB = globalThis.ReadableStreamBYOBReader;
|
|
13
|
+
if (BYOB && typeof BYOB.prototype.readAtLeast !== "function") {
|
|
14
|
+
BYOB.prototype.readAtLeast = async function readAtLeast(min, view) {
|
|
15
|
+
let offset = 0;
|
|
16
|
+
let buffer = view.buffer;
|
|
17
|
+
while (offset < min) {
|
|
18
|
+
const { value, done } = await this.read(new Uint8Array(buffer, view.byteOffset + offset, view.byteLength - offset));
|
|
19
|
+
if (value) {
|
|
20
|
+
buffer = value.buffer;
|
|
21
|
+
offset += value.byteLength;
|
|
22
|
+
}
|
|
23
|
+
if (done)
|
|
24
|
+
return { value: new Uint8Array(buffer, view.byteOffset, offset), done: offset === 0 };
|
|
25
|
+
}
|
|
26
|
+
return { value: new Uint8Array(buffer, view.byteOffset, offset), done: false };
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=workerd-globals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerd-globals.js","sourceRoot":"","sources":["../../../src/miniflare-compat/shims/workerd-globals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,GAAG,UAAqC,CAAC;AAEhD,IAAI,OAAO,CAAC,CAAC,uBAAuB,KAAK,WAAW,EAAE,CAAC;IACrD,CAAC,CAAC,uBAAuB,GAAG,MAAM,uBAAwB,SAAQ,CAChE,eAAuC,CACxC;KAAG,CAAC;AACP,CAAC;AAED,MAAM,IAAI,GACR,UACD,CAAC,wBAAwB,CAAC;AAC3B,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;IAC7D,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,KAAK,UAAU,WAAW,CAErD,GAAW,EACX,IAAgB;QAEhB,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,MAAM,GAAG,GAAG,EAAE,CAAC;YACpB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CACrC,IAAI,UAAU,CAAC,MAAqB,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAC1F,CAAC;YACF,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;YAC7B,CAAC;YACD,IAAI,IAAI;gBACN,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1F,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjF,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * workerd extensions used by Miniflare's simulator Durable Objects, for browsers/Node:\n * - `IdentityTransformStream`: a byte pass-through TransformStream;\n * - `ReadableStreamBYOBReader#readAtLeast(min, view)`: read until `min` bytes or EOF.\n * (Miniflare 2 shipped the same polyfills in TypeScript: packages/core/src/standards/streams.ts.)\n */\nconst g = globalThis as Record<string, unknown>;\n\nif (typeof g.IdentityTransformStream === \"undefined\") {\n g.IdentityTransformStream = class IdentityTransformStream extends (\n TransformStream<Uint8Array, Uint8Array>\n ) {};\n}\n\nconst BYOB = (\n globalThis as unknown as { ReadableStreamBYOBReader?: { prototype: Record<string, unknown> } }\n).ReadableStreamBYOBReader;\nif (BYOB && typeof BYOB.prototype.readAtLeast !== \"function\") {\n BYOB.prototype.readAtLeast = async function readAtLeast(\n this: ReadableStreamBYOBReader,\n min: number,\n view: Uint8Array,\n ): Promise<ReadableStreamReadResult<Uint8Array>> {\n let offset = 0;\n let buffer = view.buffer;\n while (offset < min) {\n const { value, done } = await this.read(\n new Uint8Array(buffer as ArrayBuffer, view.byteOffset + offset, view.byteLength - offset),\n );\n if (value) {\n buffer = value.buffer;\n offset += value.byteLength;\n }\n if (done)\n return { value: new Uint8Array(buffer, view.byteOffset, offset), done: offset === 0 };\n }\n return { value: new Uint8Array(buffer, view.byteOffset, offset), done: false };\n };\n}\n\nexport {};\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stand-ins for workerd's internal modules imported by its TypeScript binding
|
|
3
|
+
* clients (workerd src/cloudflare/internal/*-api.ts):
|
|
4
|
+
* - "cloudflare-internal:wrapped-binding": base class of wrapped bindings;
|
|
5
|
+
* - "cloudflare-internal:tracing-helpers": spans (no-op here).
|
|
6
|
+
*/
|
|
7
|
+
export declare class WrappedBinding {
|
|
8
|
+
constructor(_inner?: object);
|
|
9
|
+
}
|
|
10
|
+
declare const _default: {
|
|
11
|
+
WrappedBinding: typeof WrappedBinding;
|
|
12
|
+
};
|
|
13
|
+
export default _default;
|
|
14
|
+
declare const noopSpan: {
|
|
15
|
+
setAttribute(): void;
|
|
16
|
+
setAttributes(): void;
|
|
17
|
+
end(): void;
|
|
18
|
+
};
|
|
19
|
+
export declare function withSpan<T>(_name: string, fn: (span: typeof noopSpan) => T): T;
|
|
20
|
+
export declare function startSpan<T>(_name: string, fn: (span: typeof noopSpan) => T): T;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stand-ins for workerd's internal modules imported by its TypeScript binding
|
|
3
|
+
* clients (workerd src/cloudflare/internal/*-api.ts):
|
|
4
|
+
* - "cloudflare-internal:wrapped-binding": base class of wrapped bindings;
|
|
5
|
+
* - "cloudflare-internal:tracing-helpers": spans (no-op here).
|
|
6
|
+
*/
|
|
7
|
+
export class WrappedBinding {
|
|
8
|
+
// biome-ignore lint/complexity/noUselessConstructor: mirrors workerd's signature
|
|
9
|
+
constructor(_inner) { }
|
|
10
|
+
}
|
|
11
|
+
export default { WrappedBinding };
|
|
12
|
+
const noopSpan = {
|
|
13
|
+
setAttribute() { },
|
|
14
|
+
setAttributes() { },
|
|
15
|
+
end() { },
|
|
16
|
+
};
|
|
17
|
+
export function withSpan(_name, fn) {
|
|
18
|
+
return fn(noopSpan);
|
|
19
|
+
}
|
|
20
|
+
export function startSpan(_name, fn) {
|
|
21
|
+
return fn(noopSpan);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=workerd-internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerd-internal.js","sourceRoot":"","sources":["../../../src/miniflare-compat/shims/workerd-internal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACzB,iFAAiF;IACjF,YAAY,MAAe,IAAG,CAAC;CAChC;AACD,eAAe,EAAE,cAAc,EAAE,CAAC;AAElC,MAAM,QAAQ,GAAG;IACf,YAAY,KAAI,CAAC;IACjB,aAAa,KAAI,CAAC;IAClB,GAAG,KAAI,CAAC;CACT,CAAC;AACF,MAAM,UAAU,QAAQ,CAAI,KAAa,EAAE,EAAgC;IACzE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC;AACD,MAAM,UAAU,SAAS,CAAI,KAAa,EAAE,EAAgC;IAC1E,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC","sourcesContent":["/**\n * Stand-ins for workerd's internal modules imported by its TypeScript binding\n * clients (workerd src/cloudflare/internal/*-api.ts):\n * - \"cloudflare-internal:wrapped-binding\": base class of wrapped bindings;\n * - \"cloudflare-internal:tracing-helpers\": spans (no-op here).\n */\nexport class WrappedBinding {\n // biome-ignore lint/complexity/noUselessConstructor: mirrors workerd's signature\n constructor(_inner?: object) {}\n}\nexport default { WrappedBinding };\n\nconst noopSpan = {\n setAttribute() {},\n setAttributes() {},\n end() {},\n};\nexport function withSpan<T>(_name: string, fn: (span: typeof noopSpan) => T): T {\n return fn(noopSpan);\n}\nexport function startSpan<T>(_name: string, fn: (span: typeof noopSpan) => T): T {\n return fn(noopSpan);\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* workerd's `performance` clock is coarse: `timeOrigin` and `now()` are whole
|
|
3
|
+
* milliseconds (Spectre mitigation). Miniflare's BlobStore relies on it
|
|
4
|
+
* (`BigInt(performance.timeOrigin + performance.now())`), which throws on the
|
|
5
|
+
* fractional values of browsers and Node. Injected by esbuild as the `performance`
|
|
6
|
+
* identifier of the vendored simulators only — the real global is untouched.
|
|
7
|
+
*/
|
|
8
|
+
const real = globalThis.performance;
|
|
9
|
+
export const performance = {
|
|
10
|
+
get timeOrigin() {
|
|
11
|
+
return Math.floor(real.timeOrigin);
|
|
12
|
+
},
|
|
13
|
+
now() {
|
|
14
|
+
return Math.floor(real.now());
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=workerd-performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerd-performance.js","sourceRoot":"","sources":["../../../src/miniflare-compat/shims/workerd-performance.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IACD,GAAG;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAChC,CAAC;CACF,CAAC","sourcesContent":["/**\n * workerd's `performance` clock is coarse: `timeOrigin` and `now()` are whole\n * milliseconds (Spectre mitigation). Miniflare's BlobStore relies on it\n * (`BigInt(performance.timeOrigin + performance.now())`), which throws on the\n * fractional values of browsers and Node. Injected by esbuild as the `performance`\n * identifier of the vendored simulators only — the real global is untouched.\n */\nconst real = globalThis.performance;\nexport const performance = {\n get timeOrigin(): number {\n return Math.floor(real.timeOrigin);\n },\n now(): number {\n return Math.floor(real.now());\n },\n};\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DurableObjectNamespace } from "../core/namespace.js";
|
|
2
|
+
/**
|
|
3
|
+
* A `Fetcher` (what workerd hands to binding clients such as d1-api.ts) that reaches
|
|
4
|
+
* one Miniflare simulator object. Miniflare's objects read their persistent name from
|
|
5
|
+
* `request.cf.miniflare.name`, so every call carries it.
|
|
6
|
+
*/
|
|
7
|
+
export declare function simulatorFetcher(objects: DurableObjectNamespace, name: string): {
|
|
8
|
+
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
|
9
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A `Fetcher` (what workerd hands to binding clients such as d1-api.ts) that reaches
|
|
3
|
+
* one Miniflare simulator object. Miniflare's objects read their persistent name from
|
|
4
|
+
* `request.cf.miniflare.name`, so every call carries it.
|
|
5
|
+
*/
|
|
6
|
+
export function simulatorFetcher(objects, name) {
|
|
7
|
+
const stub = objects.getByName(name);
|
|
8
|
+
return {
|
|
9
|
+
fetch(input, init = {}) {
|
|
10
|
+
return stub.fetch(input, { ...init, cf: { miniflare: { name } } });
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=simulator-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulator-fetcher.js","sourceRoot":"","sources":["../../src/miniflare-compat/simulator-fetcher.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAA+B,EAAE,IAAY;IAC5E,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO;QACL,KAAK,CAAC,KAAwB,EAAE,IAAI,GAAgB,EAAE;YACpD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,EAAiB,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { DurableObjectNamespace } from \"../core/namespace.js\";\n\n/**\n * A `Fetcher` (what workerd hands to binding clients such as d1-api.ts) that reaches\n * one Miniflare simulator object. Miniflare's objects read their persistent name from\n * `request.cf.miniflare.name`, so every call carries it.\n */\nexport function simulatorFetcher(objects: DurableObjectNamespace, name: string) {\n const stub = objects.getByName(name);\n return {\n fetch(input: RequestInfo | URL, init: RequestInit = {}): Promise<Response> {\n return stub.fetch(input, { ...init, cf: { miniflare: { name } } } as RequestInit);\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DurableObjectClass } from "../core/handles.js";
|
|
2
|
+
/** Miniflare's KV simulator object (workers-sdk, unchanged). */
|
|
3
|
+
export declare const KVNamespaceObject: DurableObjectClass;
|
|
4
|
+
/**
|
|
5
|
+
* Miniflare's D1 simulator object (workers-sdk, unchanged). It asks its storage for
|
|
6
|
+
* bookmarks (commit tokens of D1 sessions); celld's Durable Object storage has no bookmark
|
|
7
|
+
* API (calling it is a TypeError), so only the simulator's instances get these methods.
|
|
8
|
+
*/
|
|
9
|
+
export declare const D1DatabaseObject: DurableObjectClass;
|
|
10
|
+
/** workerd's D1 binding client (src/cloudflare/internal/d1-api.ts, unchanged). */
|
|
11
|
+
export declare const makeD1Binding: (env: {
|
|
12
|
+
fetcher: {
|
|
13
|
+
fetch: typeof fetch;
|
|
14
|
+
};
|
|
15
|
+
}) => unknown;
|