@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,205 @@
|
|
|
1
|
+
import { fetchOverDuplex, serveFetchOverDuplex } from "@statewalker/webrun-http-streams";
|
|
2
|
+
import { callPort, duplexOverPort, listenPort, multiplexPort, NO_TIMEOUT, serveDuplexOverPort, structuredCodec, } from "@statewalker/webrun-rpc";
|
|
3
|
+
import { cross, pipeTo, rpcPromise, STUB } from "../core/handles.js";
|
|
4
|
+
import { withUrl } from "../core/request-body.js";
|
|
5
|
+
/**
|
|
6
|
+
* The host's end of an isolate's port: one webrun-rpc multiplexer over it, a calls port on
|
|
7
|
+
* which each side calls the other (`callPort`/`listenPort`, no timeout: a call lasts as long
|
|
8
|
+
* as the work it starts), and a port per fetch. `outbound` serves the loaded code's global
|
|
9
|
+
* `fetch()` (its `globalOutbound` Fetcher).
|
|
10
|
+
*/
|
|
11
|
+
export async function hostPort(port, handle, outbound) {
|
|
12
|
+
const mux = multiplexPort(messageTarget(port), {
|
|
13
|
+
codec: structuredCodec,
|
|
14
|
+
side: "initiator",
|
|
15
|
+
onPort(p, meta) {
|
|
16
|
+
const m = meta;
|
|
17
|
+
if (m?.kind !== "outbound" || !outbound)
|
|
18
|
+
return false;
|
|
19
|
+
serveFetch(p, m.url, outbound);
|
|
20
|
+
return true;
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
const call = callsOver(await mux.openPort({ kind: "calls" }), handle);
|
|
24
|
+
const fetch = (target, req) => fetchOver(mux, { kind: "fetch", target }, req);
|
|
25
|
+
return { call, fetch };
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The isolate's end: accepts the ports the host opens. Everything the isolate calls the host
|
|
29
|
+
* for happens while serving a host call, so the calls port is open by then. `outbound` sends
|
|
30
|
+
* a fetch to the host's `globalOutbound`.
|
|
31
|
+
*/
|
|
32
|
+
export function isolatePort(port, handle, fetch) {
|
|
33
|
+
let calls;
|
|
34
|
+
const mux = multiplexPort(messageTarget(port), {
|
|
35
|
+
codec: structuredCodec,
|
|
36
|
+
side: "responder",
|
|
37
|
+
onPort(p, meta) {
|
|
38
|
+
const m = meta;
|
|
39
|
+
if (m?.kind === "fetch") {
|
|
40
|
+
serveFetch(p, m.url, (r) => fetch(m.target, r));
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
if (m?.kind !== "calls" || calls)
|
|
44
|
+
return false;
|
|
45
|
+
calls = callsOver(p, handle);
|
|
46
|
+
return true;
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
call: (msg) => calls(msg),
|
|
51
|
+
outbound: (req) => fetchOver(mux, { kind: "outbound" }, req),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** A fetch over a new port of `mux`; the URL rides in the meta (the HTTP/1.1 wire drops its scheme). */
|
|
55
|
+
function fetchOver(mux, meta, req) {
|
|
56
|
+
return fetchOverDuplex((input) => (async function* () {
|
|
57
|
+
yield* duplexOverPort(await mux.openPort({ ...meta, url: req.url }))(input);
|
|
58
|
+
})(), req);
|
|
59
|
+
}
|
|
60
|
+
/** Serves the fetch on port `p` (its URL from the meta) with `fetch`. */
|
|
61
|
+
function serveFetch(p, url, fetch) {
|
|
62
|
+
serveDuplexOverPort(p, serveFetchOverDuplex((req) => withUrl(req, url).then(fetch).catch(throwOwn)));
|
|
63
|
+
}
|
|
64
|
+
/** Marks a value passed by reference in a message: `{ [REF]: id }`. */
|
|
65
|
+
const REF = "\u0000cellb.ref";
|
|
66
|
+
/**
|
|
67
|
+
* The calls of one port, with values passed by reference: each side keeps the values it
|
|
68
|
+
* passed (by id, and how many ids hold each); the other side calls them through stubs. A
|
|
69
|
+
* stub's `Symbol.dispose` (or its garbage collection) releases its id; the last release of a
|
|
70
|
+
* value runs the value's own `Symbol.dispose`, as workerd does for an `RpcTarget`. A call
|
|
71
|
+
* returns an RpcPromise: calls on it go to the other side at once, naming its answer.
|
|
72
|
+
*/
|
|
73
|
+
function callsOver(port, handle) {
|
|
74
|
+
const values = new Map();
|
|
75
|
+
const answers = new Map();
|
|
76
|
+
let lastAnswer = 0;
|
|
77
|
+
const holders = new Map();
|
|
78
|
+
let lastId = 0;
|
|
79
|
+
const encode = (v) => cloneable(cross(v, (x) => {
|
|
80
|
+
values.set(++lastId, x);
|
|
81
|
+
holders.set(x, (holders.get(x) ?? 0) + 1);
|
|
82
|
+
return { [REF]: lastId };
|
|
83
|
+
}, (x) => x));
|
|
84
|
+
const release = (id) => {
|
|
85
|
+
const v = values.get(id);
|
|
86
|
+
if (!values.delete(id))
|
|
87
|
+
return;
|
|
88
|
+
const n = (holders.get(v) ?? 1) - 1;
|
|
89
|
+
if (n)
|
|
90
|
+
holders.set(v, n);
|
|
91
|
+
else {
|
|
92
|
+
holders.delete(v);
|
|
93
|
+
v[Symbol.dispose]?.();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const send = (msg) => callPort(port, msg, { timeout: NO_TIMEOUT }).catch(() => { });
|
|
97
|
+
const collected = new FinalizationRegistry((id) => send({ type: "release", id }));
|
|
98
|
+
const stubOf = (id) => {
|
|
99
|
+
const invoke = (path, args) => call({ type: "ref", id, path, args });
|
|
100
|
+
const stub = new Proxy(() => { }, {
|
|
101
|
+
apply: (_t, _this, args) => invoke([], args),
|
|
102
|
+
get(_t, prop) {
|
|
103
|
+
if (prop === STUB)
|
|
104
|
+
return true;
|
|
105
|
+
if (prop === Symbol.dispose)
|
|
106
|
+
return () => {
|
|
107
|
+
collected.unregister(stub);
|
|
108
|
+
send({ type: "release", id });
|
|
109
|
+
};
|
|
110
|
+
if (prop === "then" || typeof prop === "symbol")
|
|
111
|
+
return undefined;
|
|
112
|
+
return (...args) => invoke([prop], args);
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
collected.register(stub, id, stub);
|
|
116
|
+
return stub;
|
|
117
|
+
};
|
|
118
|
+
// Messages arrive as fresh copies: stubs replace the markers in place.
|
|
119
|
+
const decode = (v) => {
|
|
120
|
+
if (Array.isArray(v))
|
|
121
|
+
for (let i = 0; i < v.length; i++)
|
|
122
|
+
v[i] = decode(v[i]);
|
|
123
|
+
else if (v && Object.getPrototypeOf(v) === Object.prototype) {
|
|
124
|
+
if (typeof v[REF] === "number")
|
|
125
|
+
return stubOf(v[REF]);
|
|
126
|
+
for (const k of Object.keys(v))
|
|
127
|
+
v[k] = decode(v[k]);
|
|
128
|
+
}
|
|
129
|
+
return v;
|
|
130
|
+
};
|
|
131
|
+
const run = (m) => {
|
|
132
|
+
if (m.type !== "ref")
|
|
133
|
+
return handle(m);
|
|
134
|
+
if (m.on !== undefined)
|
|
135
|
+
return pipeTo(answers.get(m.on), m.path, m.args);
|
|
136
|
+
const v = values.get(m.id);
|
|
137
|
+
if (v === undefined)
|
|
138
|
+
throw new Error("A stub was used after it was disposed.");
|
|
139
|
+
return pipeTo(v, m.path, m.args);
|
|
140
|
+
};
|
|
141
|
+
// The answer is kept as the message arrives: a pipelined call on it may arrive before it
|
|
142
|
+
// settles.
|
|
143
|
+
const serve = async (m) => {
|
|
144
|
+
if (m.type === "release") {
|
|
145
|
+
if (m.answer === undefined)
|
|
146
|
+
release(m.id);
|
|
147
|
+
else
|
|
148
|
+
answers.delete(m.answer);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
let r;
|
|
152
|
+
try {
|
|
153
|
+
r = run(m);
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
r = Promise.reject(e);
|
|
157
|
+
}
|
|
158
|
+
answers.set(m.answer, r);
|
|
159
|
+
return r;
|
|
160
|
+
};
|
|
161
|
+
listenPort(port, (msg) => serve(decode(msg)).then(encode).catch(throwOwn));
|
|
162
|
+
const call = (msg) => {
|
|
163
|
+
const answer = ++lastAnswer;
|
|
164
|
+
const result = (async () => decode(await callPort(port, encode({ ...msg, answer }), { timeout: NO_TIMEOUT })))();
|
|
165
|
+
// Calls on the answer sent before now are ahead of this release on the port.
|
|
166
|
+
const done = () => send({ type: "release", answer });
|
|
167
|
+
result.then(done, done);
|
|
168
|
+
return rpcPromise(result, (path, args) => call({ type: "ref", on: answer, path, args }));
|
|
169
|
+
};
|
|
170
|
+
return call;
|
|
171
|
+
}
|
|
172
|
+
/** Errors cross with their own properties (so `code` does); `name` is inherited, so copy it. */
|
|
173
|
+
function throwOwn(e) {
|
|
174
|
+
if (e && typeof e === "object")
|
|
175
|
+
Object.defineProperty(e, "name", { value: e.name, enumerable: true });
|
|
176
|
+
throw e;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Throws `DataCloneError` for a value the port cannot carry: the multiplexer drops a message
|
|
180
|
+
* it fails to post, and the call would wait forever.
|
|
181
|
+
*/
|
|
182
|
+
function cloneable(value) {
|
|
183
|
+
structuredClone(value);
|
|
184
|
+
return value;
|
|
185
|
+
}
|
|
186
|
+
/** A worker_threads Worker is an EventEmitter; MessagePorts and Dedicated Workers are targets. */
|
|
187
|
+
function messageTarget(port) {
|
|
188
|
+
if (port.addEventListener)
|
|
189
|
+
return port;
|
|
190
|
+
const on = port.on.bind(port);
|
|
191
|
+
const listeners = new Map();
|
|
192
|
+
return {
|
|
193
|
+
postMessage: (msg, transfer) => port.postMessage(msg, transfer),
|
|
194
|
+
addEventListener(_type, fn) {
|
|
195
|
+
const listener = (data) => void fn({ data });
|
|
196
|
+
listeners.set(fn, listener);
|
|
197
|
+
on("message", listener);
|
|
198
|
+
},
|
|
199
|
+
removeEventListener(_type, fn) {
|
|
200
|
+
port.off?.("message", listeners.get(fn));
|
|
201
|
+
listeners.delete(fn);
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/isolate/protocol.ts"],"names":[],"mappings":"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","sourcesContent":["import { fetchOverDuplex, serveFetchOverDuplex } from \"@statewalker/webrun-http-streams\";\nimport {\n callPort,\n duplexOverPort,\n listenPort,\n type MessageTarget,\n multiplexPort,\n NO_TIMEOUT,\n type PortMux,\n serveDuplexOverPort,\n structuredCodec,\n} from \"@statewalker/webrun-rpc\";\nimport { cross, pipeTo, rpcPromise, STUB } from \"../core/handles.js\";\nimport { withUrl } from \"../core/request-body.js\";\n\n/**\n * Isolation for loaded Workers (celld runs each in its own V8 isolate): the loaded code runs\n * in a separate realm — a worker thread on Node, a Dedicated Worker in browsers — and talks\n * to the host over one MessagePort, multiplexed with `@statewalker/webrun-rpc`. The host keeps\n * everything else: bindings in the loaded Worker's env are reached through stubs, and its logs\n * come back for Tail Workers. Errors cross with their own properties (`name`, `code`, …).\n * Functions, `RpcTarget`s and stubs anywhere in a call or result cross by reference (as\n * workerd passes them): the far side gets a stub whose calls come back.\n *\n * Calls (one port, both directions; each names an `answer`, which the serving side keeps until\n * the caller has the result, so calls on it can be sent before then — promise pipelining):\n * host → isolate load {source|url, env, outbound} → loaded {exports}\n * call {name, method, args, props} → result\n * isolate → host log {level, args}\n * either way ref {id|on, path, args} (a call on a stub of the other side's value, or\n * on answer `on`: `path` is the property path\n * called, [] the value itself)\n * release {id|answer} (that stub was disposed or collected; the caller\n * has that answer)\n * Fetches: one port per request (meta: its target and URL), HTTP/1.1 with streamed bodies,\n * as cells-http over a port (src/transport/port.ts): host → isolate to an export or facet,\n * isolate → host for the loaded code's global `fetch()` when a `globalOutbound` Fetcher routes it.\n */\nexport interface PortLike {\n postMessage(msg: unknown, transfer?: Transferable[]): void;\n addEventListener?(type: \"message\", fn: (e: { data: unknown }) => void): void;\n removeEventListener?(type: \"message\", fn: (e: { data: unknown }) => void): void;\n on?(type: \"message\", fn: (data: unknown) => void): void;\n off?(type: \"message\", fn: (data: unknown) => void): void;\n start?(): void;\n}\n\n/** Where a fetch goes in the isolate: an export of the loaded Worker, or one of its facets. */\nexport type FetchTarget =\n | { name: string; props?: unknown }\n | { className: string; cellKey: string };\ntype Fetch = (target: FetchTarget, req: Request) => Promise<Response>;\n\nexport type Call = <T = unknown>(msg: object) => Promise<T>;\ntype Handle = (msg: any) => Promise<unknown>;\n\n/**\n * The host's end of an isolate's port: one webrun-rpc multiplexer over it, a calls port on\n * which each side calls the other (`callPort`/`listenPort`, no timeout: a call lasts as long\n * as the work it starts), and a port per fetch. `outbound` serves the loaded code's global\n * `fetch()` (its `globalOutbound` Fetcher).\n */\nexport async function hostPort(\n port: PortLike,\n handle: Handle,\n outbound?: (req: Request) => Promise<Response>,\n): Promise<{ call: Call; fetch: Fetch }> {\n const mux = multiplexPort(messageTarget(port), {\n codec: structuredCodec,\n side: \"initiator\",\n onPort(p, meta) {\n const m = meta as { kind?: string; url: string } | undefined;\n if (m?.kind !== \"outbound\" || !outbound) return false;\n serveFetch(p, m.url, outbound);\n return true;\n },\n });\n const call = callsOver(await mux.openPort({ kind: \"calls\" }), handle);\n const fetch: Fetch = (target, req) => fetchOver(mux, { kind: \"fetch\", target }, req);\n return { call, fetch };\n}\n\n/**\n * The isolate's end: accepts the ports the host opens. Everything the isolate calls the host\n * for happens while serving a host call, so the calls port is open by then. `outbound` sends\n * a fetch to the host's `globalOutbound`.\n */\nexport function isolatePort(\n port: PortLike,\n handle: Handle,\n fetch: Fetch,\n): { call: Call; outbound: (req: Request) => Promise<Response> } {\n let calls: Call | undefined;\n const mux = multiplexPort(messageTarget(port), {\n codec: structuredCodec,\n side: \"responder\",\n onPort(p, meta) {\n const m = meta as { kind?: string; target: FetchTarget; url: string } | undefined;\n if (m?.kind === \"fetch\") {\n serveFetch(p, m.url, (r) => fetch(m.target, r));\n return true;\n }\n if (m?.kind !== \"calls\" || calls) return false;\n calls = callsOver(p, handle);\n return true;\n },\n });\n return {\n call: (msg) => calls!(msg),\n outbound: (req) => fetchOver(mux, { kind: \"outbound\" }, req),\n };\n}\n\n/** A fetch over a new port of `mux`; the URL rides in the meta (the HTTP/1.1 wire drops its scheme). */\nfunction fetchOver(mux: PortMux, meta: object, req: Request): Promise<Response> {\n return fetchOverDuplex(\n (input) =>\n (async function* () {\n yield* duplexOverPort(await mux.openPort({ ...meta, url: req.url }))(input);\n })(),\n req,\n );\n}\n\n/** Serves the fetch on port `p` (its URL from the meta) with `fetch`. */\nfunction serveFetch(p: MessageTarget, url: string, fetch: (req: Request) => Promise<Response>) {\n serveDuplexOverPort(\n p,\n serveFetchOverDuplex((req) => withUrl(req, url).then(fetch).catch(throwOwn)),\n );\n}\n\n/** Marks a value passed by reference in a message: `{ [REF]: id }`. */\nconst REF = \"\\u0000cellb.ref\";\n\n/**\n * The calls of one port, with values passed by reference: each side keeps the values it\n * passed (by id, and how many ids hold each); the other side calls them through stubs. A\n * stub's `Symbol.dispose` (or its garbage collection) releases its id; the last release of a\n * value runs the value's own `Symbol.dispose`, as workerd does for an `RpcTarget`. A call\n * returns an RpcPromise: calls on it go to the other side at once, naming its answer.\n */\nfunction callsOver(port: MessageTarget, handle: Handle): Call {\n const values = new Map<number, any>();\n const answers = new Map<number, unknown>();\n let lastAnswer = 0;\n const holders = new Map<unknown, number>();\n let lastId = 0;\n const encode = (v: unknown) =>\n cloneable(\n cross(\n v,\n (x) => {\n values.set(++lastId, x);\n holders.set(x, (holders.get(x) ?? 0) + 1);\n return { [REF]: lastId };\n },\n (x) => x, // the port copies the rest\n ),\n );\n const release = (id: number) => {\n const v = values.get(id);\n if (!values.delete(id)) return;\n const n = (holders.get(v) ?? 1) - 1;\n if (n) holders.set(v, n);\n else {\n holders.delete(v);\n v[Symbol.dispose]?.();\n }\n };\n const send = (msg: object) => callPort(port, msg, { timeout: NO_TIMEOUT }).catch(() => {});\n const collected = new FinalizationRegistry<number>((id) => send({ type: \"release\", id }));\n const stubOf = (id: number) => {\n const invoke = (path: string[], args: unknown[]) => call({ type: \"ref\", id, path, args });\n const stub: any = new Proxy(() => {}, {\n apply: (_t, _this, args) => invoke([], args),\n get(_t, prop) {\n if (prop === STUB) return true;\n if (prop === Symbol.dispose)\n return () => {\n collected.unregister(stub);\n send({ type: \"release\", id });\n };\n if (prop === \"then\" || typeof prop === \"symbol\") return undefined;\n return (...args: unknown[]) => invoke([prop], args);\n },\n });\n collected.register(stub, id, stub);\n return stub;\n };\n // Messages arrive as fresh copies: stubs replace the markers in place.\n const decode = (v: any): any => {\n if (Array.isArray(v)) for (let i = 0; i < v.length; i++) v[i] = decode(v[i]);\n else if (v && Object.getPrototypeOf(v) === Object.prototype) {\n if (typeof v[REF] === \"number\") return stubOf(v[REF]);\n for (const k of Object.keys(v)) v[k] = decode(v[k]);\n }\n return v;\n };\n const run = (m: any): unknown => {\n if (m.type !== \"ref\") return handle(m);\n if (m.on !== undefined) return pipeTo(answers.get(m.on), m.path, m.args);\n const v = values.get(m.id);\n if (v === undefined) throw new Error(\"A stub was used after it was disposed.\");\n return pipeTo(v, m.path, m.args);\n };\n // The answer is kept as the message arrives: a pipelined call on it may arrive before it\n // settles.\n const serve = async (m: any) => {\n if (m.type === \"release\") {\n if (m.answer === undefined) release(m.id);\n else answers.delete(m.answer);\n return;\n }\n let r: unknown;\n try {\n r = run(m);\n } catch (e) {\n r = Promise.reject(e);\n }\n answers.set(m.answer, r);\n return r;\n };\n listenPort(port, (msg) => serve(decode(msg)).then(encode).catch(throwOwn));\n const call: Call = (msg) => {\n const answer = ++lastAnswer;\n const result = (async () =>\n decode(await callPort(port, encode({ ...msg, answer }), { timeout: NO_TIMEOUT })))();\n // Calls on the answer sent before now are ahead of this release on the port.\n const done = () => send({ type: \"release\", answer });\n result.then(done, done);\n return rpcPromise(result, (path, args) => call({ type: \"ref\", on: answer, path, args }));\n };\n return call;\n}\n\n/** Errors cross with their own properties (so `code` does); `name` is inherited, so copy it. */\nfunction throwOwn(e: unknown): never {\n if (e && typeof e === \"object\")\n Object.defineProperty(e, \"name\", { value: (e as Error).name, enumerable: true });\n throw e;\n}\n\n/**\n * Throws `DataCloneError` for a value the port cannot carry: the multiplexer drops a message\n * it fails to post, and the call would wait forever.\n */\nfunction cloneable<T>(value: T): T {\n structuredClone(value);\n return value;\n}\n\n/** A worker_threads Worker is an EventEmitter; MessagePorts and Dedicated Workers are targets. */\nfunction messageTarget(port: PortLike): MessageTarget {\n if (port.addEventListener) return port as MessageTarget;\n const on = port.on!.bind(port);\n const listeners = new Map<unknown, (data: unknown) => void>();\n return {\n postMessage: (msg, transfer) => port.postMessage(msg, transfer),\n addEventListener(_type, fn) {\n const listener = (data: unknown) => void fn({ data } as MessageEvent);\n listeners.set(fn, listener);\n on(\"message\", listener);\n },\n removeEventListener(_type, fn) {\n port.off?.(\"message\", listeners.get(fn)!);\n listeners.delete(fn);\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CRC-64/ISO as Go's `crc64.MakeTable(crc64.ISO)`: reflected polynomial 0xD800000000000000,
|
|
3
|
+
* init 0, per update invert → process → invert. Computed on two 32-bit halves (no BigInt
|
|
4
|
+
* in the loop). Values are returned as bigint.
|
|
5
|
+
*/
|
|
6
|
+
const TABLE_LO = new Uint32Array(256);
|
|
7
|
+
const TABLE_HI = new Uint32Array(256);
|
|
8
|
+
for (let i = 0; i < 256; i++) {
|
|
9
|
+
let lo = i >>> 0;
|
|
10
|
+
let hi = 0;
|
|
11
|
+
for (let k = 0; k < 8; k++) {
|
|
12
|
+
const carry = lo & 1;
|
|
13
|
+
lo = ((lo >>> 1) | ((hi & 1) << 31)) >>> 0;
|
|
14
|
+
hi = hi >>> 1;
|
|
15
|
+
if (carry)
|
|
16
|
+
hi = (hi ^ 0xd8000000) >>> 0;
|
|
17
|
+
}
|
|
18
|
+
TABLE_LO[i] = lo;
|
|
19
|
+
TABLE_HI[i] = hi;
|
|
20
|
+
}
|
|
21
|
+
export class Crc64 {
|
|
22
|
+
#lo = 0;
|
|
23
|
+
#hi = 0;
|
|
24
|
+
update(data) {
|
|
25
|
+
let lo = ~this.#lo >>> 0;
|
|
26
|
+
let hi = ~this.#hi >>> 0;
|
|
27
|
+
for (let i = 0; i < data.length; i++) {
|
|
28
|
+
const idx = (lo ^ data[i]) & 0xff;
|
|
29
|
+
lo = (((lo >>> 8) | (hi << 24)) ^ TABLE_LO[idx]) >>> 0;
|
|
30
|
+
hi = ((hi >>> 8) ^ TABLE_HI[idx]) >>> 0;
|
|
31
|
+
}
|
|
32
|
+
this.#lo = ~lo >>> 0;
|
|
33
|
+
this.#hi = ~hi >>> 0;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
digest() {
|
|
37
|
+
return (BigInt(this.#hi) << 32n) | BigInt(this.#lo);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export const crc64 = (...parts) => {
|
|
41
|
+
const c = new Crc64();
|
|
42
|
+
for (const p of parts)
|
|
43
|
+
c.update(p);
|
|
44
|
+
return c.digest();
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=crc64.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crc64.js","sourceRoot":"","sources":["../../src/ltx/crc64.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;AACtC,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;AACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC7B,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACjB,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3C,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACd,IAAI,KAAK;YAAE,EAAE,GAAG,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACjB,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,KAAK;IAChB,GAAG,GAAG,CAAC,CAAC;IACR,GAAG,GAAG,CAAC,CAAC;IACR,MAAM,CAAC,IAAgB;QACrB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACzB,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YAClC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACvD,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM;QACJ,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAG,KAAmB,EAAU,EAAE;IACtD,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC;AACpB,CAAC,CAAC","sourcesContent":["/**\n * CRC-64/ISO as Go's `crc64.MakeTable(crc64.ISO)`: reflected polynomial 0xD800000000000000,\n * init 0, per update invert → process → invert. Computed on two 32-bit halves (no BigInt\n * in the loop). Values are returned as bigint.\n */\nconst TABLE_LO = new Uint32Array(256);\nconst TABLE_HI = new Uint32Array(256);\nfor (let i = 0; i < 256; i++) {\n let lo = i >>> 0;\n let hi = 0;\n for (let k = 0; k < 8; k++) {\n const carry = lo & 1;\n lo = ((lo >>> 1) | ((hi & 1) << 31)) >>> 0;\n hi = hi >>> 1;\n if (carry) hi = (hi ^ 0xd8000000) >>> 0;\n }\n TABLE_LO[i] = lo;\n TABLE_HI[i] = hi;\n}\n\nexport class Crc64 {\n #lo = 0;\n #hi = 0;\n update(data: Uint8Array): this {\n let lo = ~this.#lo >>> 0;\n let hi = ~this.#hi >>> 0;\n for (let i = 0; i < data.length; i++) {\n const idx = (lo ^ data[i]) & 0xff;\n lo = (((lo >>> 8) | (hi << 24)) ^ TABLE_LO[idx]) >>> 0;\n hi = ((hi >>> 8) ^ TABLE_HI[idx]) >>> 0;\n }\n this.#lo = ~lo >>> 0;\n this.#hi = ~hi >>> 0;\n return this;\n }\n digest(): bigint {\n return (BigInt(this.#hi) << 32n) | BigInt(this.#lo);\n }\n}\n\nexport const crc64 = (...parts: Uint8Array[]): bigint => {\n const c = new Crc64();\n for (const p of parts) c.update(p);\n return c.digest();\n};\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The asynchronous side of the LTX VFS (src/adapters/ltx-vfs.ts): serves cells' pages from their
|
|
3
|
+
* LTX files on a FilesApi and turns each commit into one LTX file there, in celld's layout
|
|
4
|
+
* (`cells/<cell>/ltx/e1/0000/<min>-<max>.ltx`, a snapshot 1..N first). Runs in any thread that
|
|
5
|
+
* is not one blocked on reads (a worker of its own, or a page): `handle(msg)` answers into the
|
|
6
|
+
* shared buffer. A cell whose files pass `compactAfter` is folded into one snapshot (streamed).
|
|
7
|
+
*/
|
|
8
|
+
import type { FilesApi } from "@statewalker/webrun-files";
|
|
9
|
+
export interface LtxStoreMessage {
|
|
10
|
+
op: "meta" | "read" | "readRun" | "commit" | "stats";
|
|
11
|
+
cell: string;
|
|
12
|
+
pgno?: number;
|
|
13
|
+
count?: number;
|
|
14
|
+
pageSize?: number;
|
|
15
|
+
pageCount?: number;
|
|
16
|
+
pages?: [number, Uint8Array][];
|
|
17
|
+
}
|
|
18
|
+
export declare function ltxCellStore(files: FilesApi, sab: SharedArrayBuffer, opts?: {
|
|
19
|
+
root?: string;
|
|
20
|
+
compactAfter?: number;
|
|
21
|
+
autoCompact?: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* What the files are (the OPFS directory's name, say): part of each cell's Web Lock, so the
|
|
24
|
+
* stores of two directories (two projects in one tab) do not take each other's locks.
|
|
25
|
+
*/
|
|
26
|
+
lockScope?: string;
|
|
27
|
+
}): {
|
|
28
|
+
/** Answers one request of a VFS (requests are served in order). */
|
|
29
|
+
handle(msg: LtxStoreMessage): void;
|
|
30
|
+
/** Folds a cell's files into one snapshot; answers its file count after. */
|
|
31
|
+
/** Folds a cell's files into one snapshot (not through the request queue: it takes its
|
|
32
|
+
* own turn there to swap the files); answers the cell's file count after. */
|
|
33
|
+
compact: (cell: string) => Promise<number>;
|
|
34
|
+
stats: {
|
|
35
|
+
commits: number;
|
|
36
|
+
writeMs: number;
|
|
37
|
+
appendMs: number;
|
|
38
|
+
compactions: number;
|
|
39
|
+
compactMs: number;
|
|
40
|
+
reads: number;
|
|
41
|
+
readMs: number;
|
|
42
|
+
};
|
|
43
|
+
/** The paths of a cell's current files. */
|
|
44
|
+
files: (cell: string) => Promise<string[]>;
|
|
45
|
+
};
|
|
46
|
+
/** One cell at `dir` (the earlier single-cell form): messages may omit `cell`. */
|
|
47
|
+
export declare function ltxPageServer(files: FilesApi, dir: string, sab: SharedArrayBuffer): {
|
|
48
|
+
ready: Promise<void>;
|
|
49
|
+
handle: (msg: Omit<LtxStoreMessage, "cell"> & {
|
|
50
|
+
cell?: string;
|
|
51
|
+
}) => void;
|
|
52
|
+
compact: () => Promise<number>;
|
|
53
|
+
readonly files: unknown[];
|
|
54
|
+
stats: {
|
|
55
|
+
commits: number;
|
|
56
|
+
writeMs: number;
|
|
57
|
+
appendMs: number;
|
|
58
|
+
compactions: number;
|
|
59
|
+
compactMs: number;
|
|
60
|
+
reads: number;
|
|
61
|
+
readMs: number;
|
|
62
|
+
};
|
|
63
|
+
/** The cell's file count, after the requests sent so far. */
|
|
64
|
+
fileCount: () => Promise<number>;
|
|
65
|
+
};
|