@nimbus-sh/worker 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/README.md +219 -0
- package/dist/_shared/bytes.d.ts +18 -0
- package/dist/_shared/bytes.d.ts.map +1 -0
- package/dist/_shared/bytes.js +17 -0
- package/dist/_shared/cache-stats.d.ts +146 -0
- package/dist/_shared/cache-stats.d.ts.map +1 -0
- package/dist/_shared/cache-stats.js +162 -0
- package/dist/_shared/exports-resolver.d.ts +76 -0
- package/dist/_shared/exports-resolver.d.ts.map +1 -0
- package/dist/_shared/exports-resolver.js +284 -0
- package/dist/_shared/install-phase.d.ts +47 -0
- package/dist/_shared/install-phase.d.ts.map +1 -0
- package/dist/_shared/install-phase.js +1 -0
- package/dist/_shared/real-node-imports.d.ts +38 -0
- package/dist/_shared/real-node-imports.d.ts.map +1 -0
- package/dist/_shared/real-node-imports.js +46 -0
- package/dist/_shared/retry.d.ts +93 -0
- package/dist/_shared/retry.d.ts.map +1 -0
- package/dist/_shared/retry.js +161 -0
- package/dist/_shared/session-id.d.ts +39 -0
- package/dist/_shared/session-id.d.ts.map +1 -0
- package/dist/_shared/session-id.js +127 -0
- package/dist/_shared/session-router.d.ts +104 -0
- package/dist/_shared/session-router.d.ts.map +1 -0
- package/dist/_shared/session-router.js +165 -0
- package/dist/_shared/w7-frame.d.ts +93 -0
- package/dist/_shared/w7-frame.d.ts.map +1 -0
- package/dist/_shared/w7-frame.js +402 -0
- package/dist/auth/index.d.ts +16 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +15 -0
- package/dist/auth/middleware.d.ts +85 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +150 -0
- package/dist/auth/token.d.ts +96 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +226 -0
- package/dist/auth/types.d.ts +141 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +114 -0
- package/dist/bindings/d1.d.ts +102 -0
- package/dist/bindings/d1.d.ts.map +1 -0
- package/dist/bindings/d1.js +549 -0
- package/dist/bindings/kv.d.ts +82 -0
- package/dist/bindings/kv.d.ts.map +1 -0
- package/dist/bindings/kv.js +290 -0
- package/dist/bindings/r2.d.ts +137 -0
- package/dist/bindings/r2.d.ts.map +1 -0
- package/dist/bindings/r2.js +379 -0
- package/dist/cirrus-npm-cjs.generated.d.ts +17 -0
- package/dist/cirrus-npm-cjs.generated.d.ts.map +1 -0
- package/dist/cirrus-npm-cjs.generated.js +41 -0
- package/dist/cirrus-plugin-react.generated.d.ts +34 -0
- package/dist/cirrus-plugin-react.generated.d.ts.map +1 -0
- package/dist/cirrus-plugin-react.generated.js +33 -0
- package/dist/constants.d.ts +34 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +116 -0
- package/dist/esbuild-wasm-bundle.generated.d.ts +41 -0
- package/dist/esbuild-wasm-bundle.generated.d.ts.map +1 -0
- package/dist/esbuild-wasm-bundle.generated.js +40 -0
- package/dist/facets/cirrus-real.d.ts +147 -0
- package/dist/facets/cirrus-real.d.ts.map +1 -0
- package/dist/facets/cirrus-real.js +981 -0
- package/dist/facets/inner-do-registry.d.ts +41 -0
- package/dist/facets/inner-do-registry.d.ts.map +1 -0
- package/dist/facets/inner-do-registry.js +51 -0
- package/dist/facets/manager.d.ts +314 -0
- package/dist/facets/manager.d.ts.map +1 -0
- package/dist/facets/manager.js +2681 -0
- package/dist/facets/process.d.ts +318 -0
- package/dist/facets/process.d.ts.map +1 -0
- package/dist/facets/process.js +567 -0
- package/dist/facets/real-vite-fs-shim.d.ts +151 -0
- package/dist/facets/real-vite-fs-shim.d.ts.map +1 -0
- package/dist/facets/real-vite-fs-shim.js +1279 -0
- package/dist/facets/real-vite-hmr.d.ts +142 -0
- package/dist/facets/real-vite-hmr.d.ts.map +1 -0
- package/dist/facets/real-vite-hmr.js +476 -0
- package/dist/facets/vite-dev-server.d.ts +293 -0
- package/dist/facets/vite-dev-server.d.ts.map +1 -0
- package/dist/facets/vite-dev-server.js +2580 -0
- package/dist/facets/wasm-swap-registry.d.ts +261 -0
- package/dist/facets/wasm-swap-registry.d.ts.map +1 -0
- package/dist/facets/wasm-swap-registry.js +551 -0
- package/dist/facets/ws-terminal.d.ts +107 -0
- package/dist/facets/ws-terminal.d.ts.map +1 -0
- package/dist/facets/ws-terminal.js +207 -0
- package/dist/git/commands.d.ts +13 -0
- package/dist/git/commands.d.ts.map +1 -0
- package/dist/git/commands.js +633 -0
- package/dist/git/network-facet.d.ts +61 -0
- package/dist/git/network-facet.d.ts.map +1 -0
- package/dist/git/network-facet.js +700 -0
- package/dist/git-bundle.generated.d.ts +16 -0
- package/dist/git-bundle.generated.d.ts.map +1 -0
- package/dist/git-bundle.generated.js +15 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/loaders/child-process/spawn-facet.d.ts +90 -0
- package/dist/loaders/child-process/spawn-facet.d.ts.map +1 -0
- package/dist/loaders/child-process/spawn-facet.js +103 -0
- package/dist/loaders/child-process/spawn-pool.d.ts +110 -0
- package/dist/loaders/child-process/spawn-pool.d.ts.map +1 -0
- package/dist/loaders/child-process/spawn-pool.js +161 -0
- package/dist/loaders/fanout-pool.d.ts +195 -0
- package/dist/loaders/fanout-pool.d.ts.map +1 -0
- package/dist/loaders/fanout-pool.js +326 -0
- package/dist/loaders/generated-workers.d.ts +26 -0
- package/dist/loaders/generated-workers.d.ts.map +1 -0
- package/dist/loaders/generated-workers.js +25 -0
- package/dist/loaders/index.d.ts +15 -0
- package/dist/loaders/index.d.ts.map +1 -0
- package/dist/loaders/index.js +13 -0
- package/dist/loaders/loader-pool.d.ts +273 -0
- package/dist/loaders/loader-pool.d.ts.map +1 -0
- package/dist/loaders/loader-pool.js +624 -0
- package/dist/loaders/npm-resolve-preamble.d.ts +34 -0
- package/dist/loaders/npm-resolve-preamble.d.ts.map +1 -0
- package/dist/loaders/npm-resolve-preamble.js +237 -0
- package/dist/loaders/pre-bundle-preamble.d.ts +41 -0
- package/dist/loaders/pre-bundle-preamble.d.ts.map +1 -0
- package/dist/loaders/pre-bundle-preamble.js +114 -0
- package/dist/loaders/vendor/codegen.d.ts +24 -0
- package/dist/loaders/vendor/codegen.d.ts.map +1 -0
- package/dist/loaders/vendor/codegen.js +44 -0
- package/dist/loaders/vendor/errors.d.ts +24 -0
- package/dist/loaders/vendor/errors.d.ts.map +1 -0
- package/dist/loaders/vendor/errors.js +46 -0
- package/dist/loaders/vendor/index.d.ts +16 -0
- package/dist/loaders/vendor/index.d.ts.map +1 -0
- package/dist/loaders/vendor/index.js +11 -0
- package/dist/loaders/vendor/pool.d.ts +88 -0
- package/dist/loaders/vendor/pool.d.ts.map +1 -0
- package/dist/loaders/vendor/pool.js +353 -0
- package/dist/loaders/vendor/primitives.d.ts +11 -0
- package/dist/loaders/vendor/primitives.d.ts.map +1 -0
- package/dist/loaders/vendor/primitives.js +33 -0
- package/dist/loaders/vendor/serialize.d.ts +3 -0
- package/dist/loaders/vendor/serialize.d.ts.map +1 -0
- package/dist/loaders/vendor/serialize.js +25 -0
- package/dist/loaders/vendor/types.d.ts +60 -0
- package/dist/loaders/vendor/types.d.ts.map +1 -0
- package/dist/loaders/vendor/types.js +4 -0
- package/dist/npm/cache.d.ts +136 -0
- package/dist/npm/cache.d.ts.map +1 -0
- package/dist/npm/cache.js +429 -0
- package/dist/npm/install-batch-facet.d.ts +129 -0
- package/dist/npm/install-batch-facet.d.ts.map +1 -0
- package/dist/npm/install-batch-facet.js +598 -0
- package/dist/npm/install-facet.d.ts +29 -0
- package/dist/npm/install-facet.d.ts.map +1 -0
- package/dist/npm/install-facet.js +9 -0
- package/dist/npm/installer.d.ts +239 -0
- package/dist/npm/installer.d.ts.map +1 -0
- package/dist/npm/installer.js +2022 -0
- package/dist/npm/npx-install.d.ts +74 -0
- package/dist/npm/npx-install.d.ts.map +1 -0
- package/dist/npm/npx-install.js +302 -0
- package/dist/npm/pre-bundle-facet.d.ts +168 -0
- package/dist/npm/pre-bundle-facet.d.ts.map +1 -0
- package/dist/npm/pre-bundle-facet.js +653 -0
- package/dist/npm/r2-cache.d.ts +286 -0
- package/dist/npm/r2-cache.d.ts.map +1 -0
- package/dist/npm/r2-cache.js +506 -0
- package/dist/npm/resolve-facet.d.ts +202 -0
- package/dist/npm/resolve-facet.d.ts.map +1 -0
- package/dist/npm/resolve-facet.js +833 -0
- package/dist/npm/resolve-one-facet.d.ts +204 -0
- package/dist/npm/resolve-one-facet.d.ts.map +1 -0
- package/dist/npm/resolve-one-facet.js +437 -0
- package/dist/npm/resolver.d.ts +109 -0
- package/dist/npm/resolver.d.ts.map +1 -0
- package/dist/npm/resolver.js +899 -0
- package/dist/npm/tarball-stream.d.ts +85 -0
- package/dist/npm/tarball-stream.d.ts.map +1 -0
- package/dist/npm/tarball-stream.js +205 -0
- package/dist/npm/tarball.d.ts +51 -0
- package/dist/npm/tarball.d.ts.map +1 -0
- package/dist/npm/tarball.js +185 -0
- package/dist/observability/diag-counters.d.ts +292 -0
- package/dist/observability/diag-counters.d.ts.map +1 -0
- package/dist/observability/diag-counters.js +302 -0
- package/dist/observability/heap-estimate.d.ts +166 -0
- package/dist/observability/heap-estimate.d.ts.map +1 -0
- package/dist/observability/heap-estimate.js +192 -0
- package/dist/observability/heavy-alloc-coord.d.ts +95 -0
- package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
- package/dist/observability/heavy-alloc-coord.js +149 -0
- package/dist/observability/oom-classify.d.ts +56 -0
- package/dist/observability/oom-classify.d.ts.map +1 -0
- package/dist/observability/oom-classify.js +118 -0
- package/dist/observability/oom-discriminator.d.ts +192 -0
- package/dist/observability/oom-discriminator.d.ts.map +1 -0
- package/dist/observability/oom-discriminator.js +233 -0
- package/dist/real-vite-bundle.generated.d.ts +46 -0
- package/dist/real-vite-bundle.generated.d.ts.map +1 -0
- package/dist/real-vite-bundle.generated.js +53 -0
- package/dist/replica/routing.d.ts +171 -0
- package/dist/replica/routing.d.ts.map +1 -0
- package/dist/replica/routing.js +288 -0
- package/dist/replica/suspension.d.ts +36 -0
- package/dist/replica/suspension.d.ts.map +1 -0
- package/dist/replica/suspension.js +49 -0
- package/dist/router/index.d.ts +156 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +220 -0
- package/dist/runtime/assets-loader.d.ts +71 -0
- package/dist/runtime/assets-loader.d.ts.map +1 -0
- package/dist/runtime/assets-loader.js +128 -0
- package/dist/runtime/barrel-detect.d.ts +46 -0
- package/dist/runtime/barrel-detect.d.ts.map +1 -0
- package/dist/runtime/barrel-detect.js +73 -0
- package/dist/runtime/barrel-synthesizer.d.ts +181 -0
- package/dist/runtime/barrel-synthesizer.d.ts.map +1 -0
- package/dist/runtime/barrel-synthesizer.js +541 -0
- package/dist/runtime/bun-repl.d.ts +46 -0
- package/dist/runtime/bun-repl.d.ts.map +1 -0
- package/dist/runtime/bun-repl.js +326 -0
- package/dist/runtime/bun-runner.d.ts +66 -0
- package/dist/runtime/bun-runner.d.ts.map +1 -0
- package/dist/runtime/bun-runner.js +219 -0
- package/dist/runtime/clang-runner.d.ts +38 -0
- package/dist/runtime/clang-runner.d.ts.map +1 -0
- package/dist/runtime/clang-runner.js +1033 -0
- package/dist/runtime/comment-strip.d.ts +37 -0
- package/dist/runtime/comment-strip.d.ts.map +1 -0
- package/dist/runtime/comment-strip.js +74 -0
- package/dist/runtime/esbuild-service.d.ts +201 -0
- package/dist/runtime/esbuild-service.d.ts.map +1 -0
- package/dist/runtime/esbuild-service.js +1444 -0
- package/dist/runtime/esbuild-wasm-bytes.d.ts +87 -0
- package/dist/runtime/esbuild-wasm-bytes.d.ts.map +1 -0
- package/dist/runtime/esbuild-wasm-bytes.js +131 -0
- package/dist/runtime/framework-detect.d.ts +71 -0
- package/dist/runtime/framework-detect.d.ts.map +1 -0
- package/dist/runtime/framework-detect.js +178 -0
- package/dist/runtime/long-running-handle.d.ts +133 -0
- package/dist/runtime/long-running-handle.d.ts.map +1 -0
- package/dist/runtime/long-running-handle.js +192 -0
- package/dist/runtime/node-repl.d.ts +36 -0
- package/dist/runtime/node-repl.d.ts.map +1 -0
- package/dist/runtime/node-repl.js +293 -0
- package/dist/runtime/node-runner.d.ts +111 -0
- package/dist/runtime/node-runner.d.ts.map +1 -0
- package/dist/runtime/node-runner.js +194 -0
- package/dist/runtime/node-shims.d.ts +24 -0
- package/dist/runtime/node-shims.d.ts.map +1 -0
- package/dist/runtime/node-shims.js +3019 -0
- package/dist/runtime/package-manager.d.ts +118 -0
- package/dist/runtime/package-manager.d.ts.map +1 -0
- package/dist/runtime/package-manager.js +420 -0
- package/dist/runtime/port-registry.d.ts +80 -0
- package/dist/runtime/port-registry.d.ts.map +1 -0
- package/dist/runtime/port-registry.js +166 -0
- package/dist/runtime/process-logs-api.d.ts +102 -0
- package/dist/runtime/process-logs-api.d.ts.map +1 -0
- package/dist/runtime/process-logs-api.js +253 -0
- package/dist/runtime/process-logs.d.ts +311 -0
- package/dist/runtime/process-logs.d.ts.map +1 -0
- package/dist/runtime/process-logs.js +656 -0
- package/dist/runtime/process-table.d.ts +65 -0
- package/dist/runtime/process-table.d.ts.map +1 -0
- package/dist/runtime/process-table.js +107 -0
- package/dist/runtime/project-detect.d.ts +21 -0
- package/dist/runtime/project-detect.d.ts.map +1 -0
- package/dist/runtime/project-detect.js +46 -0
- package/dist/runtime/python-repl.d.ts +66 -0
- package/dist/runtime/python-repl.d.ts.map +1 -0
- package/dist/runtime/python-repl.js +563 -0
- package/dist/runtime/python-runner.d.ts +50 -0
- package/dist/runtime/python-runner.d.ts.map +1 -0
- package/dist/runtime/python-runner.js +870 -0
- package/dist/runtime/repl-session.d.ts +160 -0
- package/dist/runtime/repl-session.d.ts.map +1 -0
- package/dist/runtime/repl-session.js +393 -0
- package/dist/runtime/require-resolver.d.ts +52 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -0
- package/dist/runtime/require-resolver.js +690 -0
- package/dist/runtime/router-basename.d.ts +36 -0
- package/dist/runtime/router-basename.d.ts.map +1 -0
- package/dist/runtime/router-basename.js +310 -0
- package/dist/runtime/ruby-repl.d.ts +43 -0
- package/dist/runtime/ruby-repl.d.ts.map +1 -0
- package/dist/runtime/ruby-repl.js +229 -0
- package/dist/runtime/ruby-runner.d.ts +62 -0
- package/dist/runtime/ruby-runner.d.ts.map +1 -0
- package/dist/runtime/ruby-runner.js +737 -0
- package/dist/runtime/runtime-catalog.d.ts +99 -0
- package/dist/runtime/runtime-catalog.d.ts.map +1 -0
- package/dist/runtime/runtime-catalog.js +183 -0
- package/dist/runtime/runtime-registry.d.ts +136 -0
- package/dist/runtime/runtime-registry.d.ts.map +1 -0
- package/dist/runtime/runtime-registry.js +318 -0
- package/dist/runtime/streams.d.ts +13 -0
- package/dist/runtime/streams.d.ts.map +1 -0
- package/dist/runtime/streams.js +402 -0
- package/dist/runtime/wasi-instance.d.ts +190 -0
- package/dist/runtime/wasi-instance.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.js +2044 -0
- package/dist/runtime/wasm-runner.d.ts +117 -0
- package/dist/runtime/wasm-runner.d.ts.map +1 -0
- package/dist/runtime/wasm-runner.js +705 -0
- package/dist/session/bindings.d.ts +168 -0
- package/dist/session/bindings.d.ts.map +1 -0
- package/dist/session/bindings.js +524 -0
- package/dist/session/ctx-exports.d.ts +16 -0
- package/dist/session/ctx-exports.d.ts.map +1 -0
- package/dist/session/ctx-exports.js +22 -0
- package/dist/session/diag.d.ts +62 -0
- package/dist/session/diag.d.ts.map +1 -0
- package/dist/session/diag.js +118 -0
- package/dist/session/fs-watch.d.ts +132 -0
- package/dist/session/fs-watch.d.ts.map +1 -0
- package/dist/session/fs-watch.js +255 -0
- package/dist/session/helpers.d.ts +150 -0
- package/dist/session/helpers.d.ts.map +1 -0
- package/dist/session/helpers.js +472 -0
- package/dist/session/hibernation.d.ts +145 -0
- package/dist/session/hibernation.d.ts.map +1 -0
- package/dist/session/hibernation.js +385 -0
- package/dist/session/init-phases.d.ts +87 -0
- package/dist/session/init-phases.d.ts.map +1 -0
- package/dist/session/init-phases.js +137 -0
- package/dist/session/init.d.ts +46 -0
- package/dist/session/init.d.ts.map +1 -0
- package/dist/session/init.js +3579 -0
- package/dist/session/keys.d.ts +56 -0
- package/dist/session/keys.d.ts.map +1 -0
- package/dist/session/keys.js +55 -0
- package/dist/session/nimbus-session.d.ts +434 -0
- package/dist/session/nimbus-session.d.ts.map +1 -0
- package/dist/session/nimbus-session.js +1084 -0
- package/dist/session/programmatic.d.ts +105 -0
- package/dist/session/programmatic.d.ts.map +1 -0
- package/dist/session/programmatic.js +326 -0
- package/dist/session/replica-routes.d.ts +68 -0
- package/dist/session/replica-routes.d.ts.map +1 -0
- package/dist/session/replica-routes.js +77 -0
- package/dist/session/routes.d.ts +29 -0
- package/dist/session/routes.d.ts.map +1 -0
- package/dist/session/routes.js +1331 -0
- package/dist/session/rpc.d.ts +323 -0
- package/dist/session/rpc.d.ts.map +1 -0
- package/dist/session/rpc.js +808 -0
- package/dist/session/state-store.d.ts +210 -0
- package/dist/session/state-store.d.ts.map +1 -0
- package/dist/session/state-store.js +459 -0
- package/dist/session/supervisor-rpc.d.ts +269 -0
- package/dist/session/supervisor-rpc.d.ts.map +1 -0
- package/dist/session/supervisor-rpc.js +437 -0
- package/dist/session/ws-hibernation-config.d.ts +64 -0
- package/dist/session/ws-hibernation-config.d.ts.map +1 -0
- package/dist/session/ws-hibernation-config.js +89 -0
- package/dist/session/ws.d.ts +95 -0
- package/dist/session/ws.d.ts.map +1 -0
- package/dist/session/ws.js +395 -0
- package/dist/shell/features.d.ts +410 -0
- package/dist/shell/features.d.ts.map +1 -0
- package/dist/shell/features.js +1885 -0
- package/dist/shell/unix-commands.d.ts +15 -0
- package/dist/shell/unix-commands.d.ts.map +1 -0
- package/dist/shell/unix-commands.js +3703 -0
- package/dist/stubs/lifo-ui.d.ts +10 -0
- package/dist/stubs/lifo-ui.d.ts.map +1 -0
- package/dist/stubs/lifo-ui.js +1 -0
- package/dist/tailwind-play.generated.d.ts +19 -0
- package/dist/tailwind-play.generated.d.ts.map +1 -0
- package/dist/tailwind-play.generated.js +18 -0
- package/dist/vfs/dev-provider.d.ts +64 -0
- package/dist/vfs/dev-provider.d.ts.map +1 -0
- package/dist/vfs/dev-provider.js +191 -0
- package/dist/vfs/events.d.ts +51 -0
- package/dist/vfs/events.d.ts.map +1 -0
- package/dist/vfs/events.js +127 -0
- package/dist/vfs/path.d.ts +30 -0
- package/dist/vfs/path.d.ts.map +1 -0
- package/dist/vfs/path.js +41 -0
- package/dist/vfs/seed-project.d.ts +62 -0
- package/dist/vfs/seed-project.d.ts.map +1 -0
- package/dist/vfs/seed-project.js +1045 -0
- package/dist/vfs/sqlite-vfs.d.ts +435 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
- package/dist/vfs/sqlite-vfs.js +1670 -0
- package/dist/vfs/symlink-registry.d.ts +64 -0
- package/dist/vfs/symlink-registry.d.ts.map +1 -0
- package/dist/vfs/symlink-registry.js +137 -0
- package/dist/wrangler/nimbus-wrangler.d.ts +157 -0
- package/dist/wrangler/nimbus-wrangler.d.ts.map +1 -0
- package/dist/wrangler/nimbus-wrangler.js +931 -0
- package/package.json +77 -0
- package/public/_assets/cirrus-plugin-react.bundle.js +70740 -0
- package/public/_assets/esbuild-0.24.2.wasm +0 -0
- package/public/_assets/real-vite-bundle.js +101478 -0
- package/public/_assets/rollup.wasm +0 -0
- package/public/favicon.svg +8 -0
- package/public/index.html +565 -0
- package/public/s/index.html +2379 -0
- package/scripts/bundle-esbuild-wasm.mjs +244 -0
- package/scripts/bundle-facet-workers.mjs +137 -0
- package/scripts/bundle-git.mjs +118 -0
- package/scripts/bundle-npm-cjs.mjs +363 -0
- package/scripts/bundle-plugin-react.mjs +480 -0
- package/scripts/bundle-real-vite.mjs +959 -0
- package/scripts/bundle-runtime.mjs +600 -0
- package/scripts/bundle-tailwind-play.mjs +130 -0
- package/scripts/patch-lifo-ui.mjs +131 -0
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* session/bindings.ts — Inner-Worker + assets binding shims (W10).
|
|
3
|
+
*
|
|
4
|
+
* `nimbus-wrangler dev` runs a USER worker as a child process. That
|
|
5
|
+
* child needs working `env` bindings (env.ASSETS, env.LOADER, env.MY_DO,
|
|
6
|
+
* etc.) but the DO's `env` belongs to the supervisor's contract — we
|
|
7
|
+
* can't pass it through directly. Workerd's enable_ctx_exports
|
|
8
|
+
* (compat date 2026-04-01+) auto-populates Service Bindings from
|
|
9
|
+
* top-level WorkerEntrypoint classes; these classes ARE those entry
|
|
10
|
+
* points. They forward each binding kind back to the supervisor DO via
|
|
11
|
+
* RPC stub (`env.NIMBUS_SESSION.idFromString(doId).get()...`).
|
|
12
|
+
*
|
|
13
|
+
* The shims have NO interaction with NimbusSession internals except
|
|
14
|
+
* through that RPC stub. Co-located here for grep-ability.
|
|
15
|
+
*
|
|
16
|
+
* Originally lines 4934-5341 of pre-Phase-1 src/nimbus-session.ts (before
|
|
17
|
+
* any refactor commits); lines 4513-4957 in the post-S1 source.
|
|
18
|
+
* Per audit/sections/SESSION-REFACTOR-PLAN.md §B.3.9 + S2.
|
|
19
|
+
*
|
|
20
|
+
* Exports re-shipped from nimbus-session.ts so existing import paths work:
|
|
21
|
+
* NimbusAssetsRPC, NimbusLoaderRPC, NimbusLoadedWorker,
|
|
22
|
+
* NimbusLoadedEntrypoint, NimbusDurableObjectNamespace, NimbusDOStub.
|
|
23
|
+
*
|
|
24
|
+
* **Bundle-graph note** (per plan §B.4 + §VI.9): these classes MUST remain
|
|
25
|
+
* reachable from `src/index.ts`'s entry graph for wrangler to bundle them.
|
|
26
|
+
* The re-export hub in nimbus-session.ts preserves that linkage.
|
|
27
|
+
*/
|
|
28
|
+
import { WorkerEntrypoint } from 'cloudflare:workers';
|
|
29
|
+
// ── Inner-Worker loopback bindings ────────────────────────────────────
|
|
30
|
+
//
|
|
31
|
+
// These WorkerEntrypoint classes are top-level exports so that ctx.exports
|
|
32
|
+
// auto-populates Service Bindings for them (enable_ctx_exports compat
|
|
33
|
+
// flag is already enabled via default compatibility_date 2026-04-01).
|
|
34
|
+
//
|
|
35
|
+
// They are re-exported from src/index.ts so wrangler detects them as
|
|
36
|
+
// reachable from the entry file and bundles their classes.
|
|
37
|
+
//
|
|
38
|
+
// Usage pattern (in nimbus-wrangler.ts):
|
|
39
|
+
// ctx.exports.NimbusAssetsRPC({ props: { vfsRoot, assetsDir } })
|
|
40
|
+
// produces a Service Binding stub that can be placed in the inner
|
|
41
|
+
// Worker's `env` under whatever binding name the user declared in
|
|
42
|
+
// wrangler.jsonc's `assets.binding` (typically "ASSETS").
|
|
43
|
+
/**
|
|
44
|
+
* Assets binding shim. The inner Worker calls `env.ASSETS.fetch(request)`
|
|
45
|
+
* and we serve the file from VFS under `<vfsRoot>/<assetsDir>/<pathname>`.
|
|
46
|
+
*
|
|
47
|
+
* Props (passed via ctx.props when this binding is constructed):
|
|
48
|
+
* vfsRoot — project root in VFS (e.g. "home/user/myapp")
|
|
49
|
+
* assetsDir — directory declared in wrangler.jsonc.assets.directory
|
|
50
|
+
* (e.g. "./public" → we trim the leading ./)
|
|
51
|
+
*
|
|
52
|
+
* The hostname on the incoming Request is irrelevant (Workers Assets
|
|
53
|
+
* convention); only pathname matters. Path traversal (`..`) is clamped.
|
|
54
|
+
* Directories resolve to their `index.html` child; missing files fall
|
|
55
|
+
* back to the assetsDir root `index.html` (SPA convention), then 404.
|
|
56
|
+
*
|
|
57
|
+
* The VFS is read from the supervisor DO via the class property
|
|
58
|
+
* `_nimbusVfsResolver` set by NimbusSession at construction. WorkerEntrypoint
|
|
59
|
+
* instances don't have direct access to the supervisor's SqliteVFS, so we
|
|
60
|
+
* reach it through the supervisor stub (env.NIMBUS_SESSION.idFromString).
|
|
61
|
+
* For Phase 1, we use a simpler approach: the props carry a supervisor
|
|
62
|
+
* DO id so we can round-trip through an RPC method that reads the file.
|
|
63
|
+
*/
|
|
64
|
+
export class NimbusAssetsRPC extends WorkerEntrypoint {
|
|
65
|
+
/**
|
|
66
|
+
* Fetch a static asset. Called by the inner Worker as
|
|
67
|
+
* `env.ASSETS.fetch(request)`. The request URL's pathname is used to
|
|
68
|
+
* resolve a file under the configured assets directory.
|
|
69
|
+
*/
|
|
70
|
+
async fetch(request) {
|
|
71
|
+
const url = new URL(request.url);
|
|
72
|
+
const propsAny = this.ctx.props || {};
|
|
73
|
+
const vfsRoot = String(propsAny.vfsRoot || '');
|
|
74
|
+
const assetsDir = String(propsAny.assetsDir || '').replace(/^\.\//, '').replace(/^\/+/, '').replace(/\/+$/, '');
|
|
75
|
+
const doId = String(propsAny.doId || '');
|
|
76
|
+
// Normalize pathname: no leading /, drop .. segments entirely.
|
|
77
|
+
let clean = url.pathname.replace(/^\/+/, '');
|
|
78
|
+
const parts = clean.split('/').filter((p) => p && p !== '..' && p !== '.');
|
|
79
|
+
clean = parts.join('/');
|
|
80
|
+
// Resolve the supervisor DO stub so we can call its VFS read RPC.
|
|
81
|
+
const ns = this.env.NIMBUS_SESSION;
|
|
82
|
+
if (!ns || !doId) {
|
|
83
|
+
return new Response('ASSETS binding not wired: missing NIMBUS_SESSION or doId', { status: 500 });
|
|
84
|
+
}
|
|
85
|
+
const stub = ns.get(ns.idFromString(doId));
|
|
86
|
+
// Candidate VFS paths, tried in order. The assetsDir is relative to
|
|
87
|
+
// the project root in VFS. Trailing-slash and bare dir → index.html.
|
|
88
|
+
const base = (vfsRoot ? vfsRoot + '/' : '') + (assetsDir ? assetsDir + '/' : '');
|
|
89
|
+
const candidates = [];
|
|
90
|
+
if (clean) {
|
|
91
|
+
candidates.push(base + clean);
|
|
92
|
+
if (!clean.endsWith('.html') && !clean.includes('.')) {
|
|
93
|
+
candidates.push(base + clean.replace(/\/+$/, '') + '/index.html');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
candidates.push(base + 'index.html');
|
|
98
|
+
}
|
|
99
|
+
// SPA fallback: any unmatched path serves the top-level index.html.
|
|
100
|
+
candidates.push(base + 'index.html');
|
|
101
|
+
for (const candidate of candidates) {
|
|
102
|
+
try {
|
|
103
|
+
const bytes = await stub._rpcReadFileBytes(candidate);
|
|
104
|
+
if (bytes && bytes.byteLength !== undefined) {
|
|
105
|
+
return new Response(bytes, {
|
|
106
|
+
status: 200,
|
|
107
|
+
headers: {
|
|
108
|
+
'Content-Type': mimeTypeForPath(candidate),
|
|
109
|
+
'Cache-Control': 'no-store',
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch { /* try next */ }
|
|
115
|
+
}
|
|
116
|
+
return new Response('Not found', { status: 404 });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Pick a sensible content-type from a filename. Conservative list; the
|
|
121
|
+
* inner Worker can always override via the response it constructs
|
|
122
|
+
* (which Workers Assets won't touch for env.ASSETS.fetch results).
|
|
123
|
+
*/
|
|
124
|
+
function mimeTypeForPath(path) {
|
|
125
|
+
const i = path.lastIndexOf('.');
|
|
126
|
+
if (i < 0)
|
|
127
|
+
return 'application/octet-stream';
|
|
128
|
+
const ext = path.slice(i + 1).toLowerCase();
|
|
129
|
+
switch (ext) {
|
|
130
|
+
case 'html':
|
|
131
|
+
case 'htm': return 'text/html; charset=utf-8';
|
|
132
|
+
case 'css': return 'text/css; charset=utf-8';
|
|
133
|
+
case 'js':
|
|
134
|
+
case 'mjs': return 'application/javascript; charset=utf-8';
|
|
135
|
+
case 'json': return 'application/json; charset=utf-8';
|
|
136
|
+
case 'svg': return 'image/svg+xml';
|
|
137
|
+
case 'png': return 'image/png';
|
|
138
|
+
case 'jpg':
|
|
139
|
+
case 'jpeg': return 'image/jpeg';
|
|
140
|
+
case 'webp': return 'image/webp';
|
|
141
|
+
case 'gif': return 'image/gif';
|
|
142
|
+
case 'ico': return 'image/x-icon';
|
|
143
|
+
case 'woff': return 'font/woff';
|
|
144
|
+
case 'woff2': return 'font/woff2';
|
|
145
|
+
case 'txt': return 'text/plain; charset=utf-8';
|
|
146
|
+
case 'xml': return 'application/xml; charset=utf-8';
|
|
147
|
+
case 'wasm': return 'application/wasm';
|
|
148
|
+
case 'map': return 'application/json; charset=utf-8';
|
|
149
|
+
default: return 'application/octet-stream';
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Worker Loader binding shim.
|
|
154
|
+
*
|
|
155
|
+
* Option A — return the raw WorkerStub from RPC — was attempted first
|
|
156
|
+
* and failed at runtime with:
|
|
157
|
+
* "Could not serialize object of type \"WorkerStub\". This type does
|
|
158
|
+
* not support serialization."
|
|
159
|
+
*
|
|
160
|
+
* Option B — proxy the stub via chained WorkerEntrypoint classes — is
|
|
161
|
+
* implemented here. The three classes below mirror the three hops a
|
|
162
|
+
* caller makes:
|
|
163
|
+
*
|
|
164
|
+
* env.LOADER.load(code) → NimbusLoaderRPC.load (returns NimbusLoadedWorker)
|
|
165
|
+
* .getEntrypoint(name?) → NimbusLoadedWorker.getEntrypoint (returns NimbusLoadedEntrypoint)
|
|
166
|
+
* .fetch(request) → NimbusLoadedEntrypoint.fetch
|
|
167
|
+
*
|
|
168
|
+
* Each class is a WorkerEntrypoint, so Service Binding stubs for them
|
|
169
|
+
* pass across the isolate boundary cleanly. The outer WorkerStub lives
|
|
170
|
+
* at a module-level Map keyed by a random id that's carried in
|
|
171
|
+
* ctx.props so subsequent hops can look it up from the outer side.
|
|
172
|
+
*
|
|
173
|
+
* Depth cap (ctx.props.depth) prevents infinite nesting: Nimbus-in-
|
|
174
|
+
* Nimbus-in-Nimbus is fine; five levels deep is almost certainly a
|
|
175
|
+
* runaway and we throw a clear error. Default limit is 4; overridable
|
|
176
|
+
* via the NIMBUS_INNER_LOADER_DEPTH env var on the outermost session.
|
|
177
|
+
*/
|
|
178
|
+
/**
|
|
179
|
+
* Module-level map of loaded worker CODE (not stubs), keyed by a random
|
|
180
|
+
* id. WorkerStubs are I/O objects tied to a request context, so they
|
|
181
|
+
* can't be stashed for later use ("Cannot perform I/O on behalf of a
|
|
182
|
+
* different request"). Storing the code instead lets each new outer
|
|
183
|
+
* request re-load the worker in its own context via env.LOADER.get(id)
|
|
184
|
+
* — workerd caches by id so repeated loads are essentially free.
|
|
185
|
+
*
|
|
186
|
+
* H7 (heap-correctness wave). The pre-fix comment said "GC isn't
|
|
187
|
+
* needed" because "inner stubs that reference them die with the DO."
|
|
188
|
+
* That was true for STUBS but FALSE for these CODE entries: nothing
|
|
189
|
+
* deletes them. `wrangler dev`'s rebuild-on-save loop calls load()
|
|
190
|
+
* on every save, so the Map grows without bound until the supervisor
|
|
191
|
+
* isolate is evicted (or hits the 128 MiB hard cap and crashes).
|
|
192
|
+
*
|
|
193
|
+
* Fix: hard-cap LRU. The Map's iteration order is insertion order;
|
|
194
|
+
* we re-insert on every read AND eviction-on-overflow drops the
|
|
195
|
+
* oldest entry. _LOADED_CODES_MAX is a documented architectural cap
|
|
196
|
+
* (32 entries). Eviction count is observable via getLoadedCodesStats()
|
|
197
|
+
* which the diag endpoint surfaces.
|
|
198
|
+
*
|
|
199
|
+
* Why 32? wrangler dev's typical rebuild burst is < 5 entries before
|
|
200
|
+
* the user notices and stops typing. 32 covers a power user's
|
|
201
|
+
* iteration cycle and a reasonable amount of `LOADER.get(id, cb)`
|
|
202
|
+
* memoization without exposing more than a few MiB of code text in
|
|
203
|
+
* the worst case (typical user-worker bundle: 50-300 KiB; 32 × 300 KiB
|
|
204
|
+
* = ~10 MiB ceiling — well under the 64 MiB supervisor budget).
|
|
205
|
+
*/
|
|
206
|
+
const _NIMBUS_LOADED_CODES = new Map();
|
|
207
|
+
const _LOADED_CODES_MAX = 32;
|
|
208
|
+
let _loadedCodesEvictions = 0;
|
|
209
|
+
/**
|
|
210
|
+
* Insert OR refresh a key in the LRU. New keys may evict the oldest
|
|
211
|
+
* entry if at the cap; existing keys are re-inserted to update their
|
|
212
|
+
* recency.
|
|
213
|
+
*/
|
|
214
|
+
function _loadedCodesPut(key, code) {
|
|
215
|
+
// If the key already exists, delete first so re-insertion lands at
|
|
216
|
+
// the MRU end of the iteration order (LRU-style refresh).
|
|
217
|
+
if (_NIMBUS_LOADED_CODES.has(key)) {
|
|
218
|
+
_NIMBUS_LOADED_CODES.delete(key);
|
|
219
|
+
}
|
|
220
|
+
else if (_NIMBUS_LOADED_CODES.size >= _LOADED_CODES_MAX) {
|
|
221
|
+
// Evict the LRU entry — the first key in insertion order.
|
|
222
|
+
const oldest = _NIMBUS_LOADED_CODES.keys().next();
|
|
223
|
+
if (!oldest.done) {
|
|
224
|
+
_NIMBUS_LOADED_CODES.delete(oldest.value);
|
|
225
|
+
_loadedCodesEvictions++;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
_NIMBUS_LOADED_CODES.set(key, code);
|
|
229
|
+
}
|
|
230
|
+
function _loadedCodesGet(key) {
|
|
231
|
+
const v = _NIMBUS_LOADED_CODES.get(key);
|
|
232
|
+
if (v === undefined)
|
|
233
|
+
return undefined;
|
|
234
|
+
// LRU-refresh on read so memoization-style usage (LOADER.get(id, cb)
|
|
235
|
+
// re-hitting the same id repeatedly) keeps the entry warm.
|
|
236
|
+
_NIMBUS_LOADED_CODES.delete(key);
|
|
237
|
+
_NIMBUS_LOADED_CODES.set(key, v);
|
|
238
|
+
return v;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Diagnostic surface for /api/_diag/memory. Returns a snapshot of
|
|
242
|
+
* the Map state — entry count, configured cap, eviction counter
|
|
243
|
+
* since isolate boot. Pure read; no I/O.
|
|
244
|
+
*/
|
|
245
|
+
export function getLoadedCodesStats() {
|
|
246
|
+
return {
|
|
247
|
+
entries: _NIMBUS_LOADED_CODES.size,
|
|
248
|
+
maxEntries: _LOADED_CODES_MAX,
|
|
249
|
+
evictions: _loadedCodesEvictions,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function _genStubId() {
|
|
253
|
+
return 'ldr-' + Math.random().toString(36).slice(2) + Date.now().toString(36);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Look up the stored code by key and create a fresh outer WorkerStub
|
|
257
|
+
* in the CURRENT request context. Uses LOADER.get(id, cb) so repeated
|
|
258
|
+
* calls reuse the same dynamic worker rather than spawning new ones.
|
|
259
|
+
*/
|
|
260
|
+
function _resolveStubInCurrentContext(outerLoader, key) {
|
|
261
|
+
const code = _loadedCodesGet(key);
|
|
262
|
+
if (!code)
|
|
263
|
+
return null;
|
|
264
|
+
return outerLoader.get(key, async () => code);
|
|
265
|
+
}
|
|
266
|
+
/** Hop 1: env.LOADER.{load,get} forwarded to the outer loader. */
|
|
267
|
+
export class NimbusLoaderRPC extends WorkerEntrypoint {
|
|
268
|
+
_currentDepth() {
|
|
269
|
+
const d = this.ctx.props?.depth;
|
|
270
|
+
return typeof d === 'number' && d >= 0 ? d : 0;
|
|
271
|
+
}
|
|
272
|
+
_maxDepth() {
|
|
273
|
+
const raw = this.env?.NIMBUS_INNER_LOADER_DEPTH;
|
|
274
|
+
const parsed = raw ? parseInt(String(raw), 10) : NaN;
|
|
275
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 4;
|
|
276
|
+
}
|
|
277
|
+
_assertDepthOk() {
|
|
278
|
+
const depth = this._currentDepth();
|
|
279
|
+
const max = this._maxDepth();
|
|
280
|
+
if (depth >= max) {
|
|
281
|
+
throw new Error(`Nimbus: refusing to spawn inner Worker Loader (depth=${depth + 1}, max=${max}). ` +
|
|
282
|
+
`Set NIMBUS_INNER_LOADER_DEPTH to raise the cap or break the recursion.`);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Inner: env.LOADER.load(code). Stashes the CODE (not a stub — stubs
|
|
287
|
+
* are I/O-bound to the calling request context) and returns a
|
|
288
|
+
* NimbusLoadedWorker RPC stub. Each downstream call re-loads the
|
|
289
|
+
* worker in its own request context via LOADER.get(key, cb).
|
|
290
|
+
*/
|
|
291
|
+
load(code) {
|
|
292
|
+
this._assertDepthOk();
|
|
293
|
+
const outerLoader = this.env?.LOADER;
|
|
294
|
+
if (!outerLoader)
|
|
295
|
+
throw new Error('Nimbus: outer env.LOADER missing');
|
|
296
|
+
// Validate by loading once in THIS context (fails fast on bad code).
|
|
297
|
+
// The stub is discarded; downstream calls re-load fresh in their
|
|
298
|
+
// own context.
|
|
299
|
+
outerLoader.load(code);
|
|
300
|
+
const key = _genStubId();
|
|
301
|
+
_loadedCodesPut(key, code);
|
|
302
|
+
const ctxExports = this.ctx?.exports;
|
|
303
|
+
if (!ctxExports?.NimbusLoadedWorker) {
|
|
304
|
+
throw new Error('Nimbus: ctx.exports.NimbusLoadedWorker unavailable');
|
|
305
|
+
}
|
|
306
|
+
return ctxExports.NimbusLoadedWorker({
|
|
307
|
+
props: { key, depth: this.ctx.props?.depth || 0 },
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Inner: env.LOADER.get(id, callback). The inner's callback returns
|
|
312
|
+
* a code object; we treat `id` as the outer cache key (prefixed so
|
|
313
|
+
* it doesn't collide with load()-generated keys).
|
|
314
|
+
*/
|
|
315
|
+
async get(id, callback) {
|
|
316
|
+
this._assertDepthOk();
|
|
317
|
+
const outerLoader = this.env?.LOADER;
|
|
318
|
+
if (!outerLoader)
|
|
319
|
+
throw new Error('Nimbus: outer env.LOADER missing');
|
|
320
|
+
const key = 'get:' + id;
|
|
321
|
+
if (_loadedCodesGet(key) === undefined) {
|
|
322
|
+
const code = await callback();
|
|
323
|
+
_loadedCodesPut(key, code);
|
|
324
|
+
}
|
|
325
|
+
const ctxExports = this.ctx?.exports;
|
|
326
|
+
if (!ctxExports?.NimbusLoadedWorker) {
|
|
327
|
+
throw new Error('Nimbus: ctx.exports.NimbusLoadedWorker unavailable');
|
|
328
|
+
}
|
|
329
|
+
return ctxExports.NimbusLoadedWorker({
|
|
330
|
+
props: { key, depth: this.ctx.props?.depth || 0 },
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/** Hop 2: the returned "worker" stub. Exposes .getEntrypoint(). */
|
|
335
|
+
export class NimbusLoadedWorker extends WorkerEntrypoint {
|
|
336
|
+
/**
|
|
337
|
+
* Returns a NimbusLoadedEntrypoint stub that carries the code key +
|
|
338
|
+
* entrypoint name forward. The actual outer-side load + fetch happens
|
|
339
|
+
* inside NimbusLoadedEntrypoint.fetch() so all outer hops run in a
|
|
340
|
+
* SINGLE outer request context (the cross-request-I/O limitation is
|
|
341
|
+
* real — stubs created in one outer request can't be used by another).
|
|
342
|
+
*/
|
|
343
|
+
getEntrypoint(name) {
|
|
344
|
+
const propsAny = this.ctx.props || {};
|
|
345
|
+
const ctxExports = this.ctx?.exports;
|
|
346
|
+
if (!ctxExports?.NimbusLoadedEntrypoint) {
|
|
347
|
+
throw new Error('Nimbus: ctx.exports.NimbusLoadedEntrypoint unavailable');
|
|
348
|
+
}
|
|
349
|
+
return ctxExports.NimbusLoadedEntrypoint({
|
|
350
|
+
props: { key: propsAny.key, name: name || null, depth: propsAny.depth },
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Pass-through to outer worker.getDurableObjectClass(name). The
|
|
355
|
+
* returned stub is tied to THIS method's outer request context; if
|
|
356
|
+
* the caller (the inner worker) uses the class in a later request
|
|
357
|
+
* it will fail the cross-request-I/O check. For Phase 3 DO binding
|
|
358
|
+
* synthesis we resolve classes directly from nimbus-wrangler's own
|
|
359
|
+
* request context (which is the build-time context), not through
|
|
360
|
+
* this method.
|
|
361
|
+
*/
|
|
362
|
+
getDurableObjectClass(name) {
|
|
363
|
+
const propsAny = this.ctx.props || {};
|
|
364
|
+
const outerLoader = this.env?.LOADER;
|
|
365
|
+
if (!outerLoader)
|
|
366
|
+
throw new Error('Nimbus: outer env.LOADER missing');
|
|
367
|
+
const outer = _resolveStubInCurrentContext(outerLoader, propsAny.key);
|
|
368
|
+
if (!outer)
|
|
369
|
+
throw new Error('Nimbus: loaded worker code missing (key=' + propsAny.key + ')');
|
|
370
|
+
return outer.getDurableObjectClass(name);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
/** Hop 3: a named-or-default entrypoint. Exposes .fetch(). */
|
|
374
|
+
export class NimbusLoadedEntrypoint extends WorkerEntrypoint {
|
|
375
|
+
/**
|
|
376
|
+
* Forward fetch() to the outer worker's entrypoint. All three outer
|
|
377
|
+
* hops (load → getEntrypoint → fetch) run in the same outer request
|
|
378
|
+
* context (this method's invocation), which sidesteps the
|
|
379
|
+
* cross-request-I/O limitation.
|
|
380
|
+
*/
|
|
381
|
+
async fetch(request) {
|
|
382
|
+
const propsAny = this.ctx.props || {};
|
|
383
|
+
const outerLoader = this.env?.LOADER;
|
|
384
|
+
if (!outerLoader)
|
|
385
|
+
return new Response('Nimbus: outer env.LOADER missing', { status: 500 });
|
|
386
|
+
const outer = _resolveStubInCurrentContext(outerLoader, propsAny.key);
|
|
387
|
+
if (!outer)
|
|
388
|
+
return new Response('Nimbus: loaded worker code missing', { status: 502 });
|
|
389
|
+
const ep = propsAny.name ? outer.getEntrypoint(propsAny.name) : outer.getEntrypoint();
|
|
390
|
+
return ep.fetch(request);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// ── Durable Object binding synthesis ────────────────────────────────────
|
|
394
|
+
//
|
|
395
|
+
// The inner-DO class registry was extracted to ./inner-do-registry.ts in
|
|
396
|
+
// Arc A Phase 3 to break the import cycle:
|
|
397
|
+
// index.ts -> nimbus-session.ts -> nimbus-wrangler.ts -> nimbus-session.ts
|
|
398
|
+
// nimbus-wrangler.ts now consumes registerInnerDoClass/clearInnerDoClasses
|
|
399
|
+
// directly from the leaf, and this file consumes getInnerDoClass via the
|
|
400
|
+
// imports at the top. The Map identity is preserved across the isolate
|
|
401
|
+
// (still process-scoped module-level state).
|
|
402
|
+
//
|
|
403
|
+
// Inner Worker code:
|
|
404
|
+
// const stub = env.MY_DO.get(env.MY_DO.idFromName('x'));
|
|
405
|
+
// await stub.fetch(req);
|
|
406
|
+
// We synthesize env.MY_DO as a NimbusDurableObjectNamespace
|
|
407
|
+
// WorkerEntrypoint stub. Its .get() returns a NimbusDOStub that — on
|
|
408
|
+
// fetch() — resolves the class from the registry and invokes
|
|
409
|
+
// ctx.facets.get(facetName, {class, id}).fetch(req) in the same outer
|
|
410
|
+
// request context.
|
|
411
|
+
/**
|
|
412
|
+
* `env.MY_DO` shim — a DurableObjectNamespace-like WorkerEntrypoint.
|
|
413
|
+
*
|
|
414
|
+
* Usage from inner Worker:
|
|
415
|
+
* const id = await env.MY_DO.idFromName('x'); // AWAIT required
|
|
416
|
+
* const stub = env.MY_DO.get(id);
|
|
417
|
+
* await stub.fetch(request);
|
|
418
|
+
*
|
|
419
|
+
* IMPORTANT: unlike the real DurableObjectNamespace, idFromName /
|
|
420
|
+
* newUniqueId / idFromString here return **Promises**, because they're
|
|
421
|
+
* RPC-backed WorkerEntrypoint methods. The inner caller MUST `await`
|
|
422
|
+
* them before passing the result to `.get()`. Workers RPC pipelining
|
|
423
|
+
* does not currently allow passing an RpcPromise as a method argument
|
|
424
|
+
* — the no-await form fails with:
|
|
425
|
+
* "Could not serialize object of type \"RpcPromise\"."
|
|
426
|
+
*
|
|
427
|
+
* Typical real-Worker code written for Cloudflare's synchronous
|
|
428
|
+
* DurableObjectNamespace needs a one-word change (add `await`).
|
|
429
|
+
*
|
|
430
|
+
* idFromName produces prefix `name:` (deterministic FNV-style hash);
|
|
431
|
+
* newUniqueId uses `uniq:` (random). The prefixes keep the two id
|
|
432
|
+
* spaces distinct so a name-derived id can't collide with a random
|
|
433
|
+
* one.
|
|
434
|
+
*/
|
|
435
|
+
export class NimbusDurableObjectNamespace extends WorkerEntrypoint {
|
|
436
|
+
/** Stable string id derived from a name. Hash is deterministic. */
|
|
437
|
+
idFromName(name) {
|
|
438
|
+
// Simple 64-bit-ish FNV-style hash → hex. Stable across runs;
|
|
439
|
+
// distinct names → distinct strings; same name → same string.
|
|
440
|
+
let h1 = 0xdeadbeef ^ name.length;
|
|
441
|
+
let h2 = 0x41c6ce57 ^ name.length;
|
|
442
|
+
for (let i = 0; i < name.length; i++) {
|
|
443
|
+
const ch = name.charCodeAt(i);
|
|
444
|
+
h1 = Math.imul(h1 ^ ch, 2654435761);
|
|
445
|
+
h2 = Math.imul(h2 ^ ch, 1597334677);
|
|
446
|
+
}
|
|
447
|
+
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ Math.imul(h2 ^ (h2 >>> 13), 3266489909);
|
|
448
|
+
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ Math.imul(h1 ^ (h1 >>> 13), 3266489909);
|
|
449
|
+
const high = (h1 >>> 0).toString(16).padStart(8, '0');
|
|
450
|
+
const low = (h2 >>> 0).toString(16).padStart(8, '0');
|
|
451
|
+
return 'name:' + high + low;
|
|
452
|
+
}
|
|
453
|
+
/** Fresh random id (matches DurableObjectNamespace.newUniqueId()). */
|
|
454
|
+
newUniqueId() {
|
|
455
|
+
return 'uniq:' + Math.random().toString(36).slice(2) + Date.now().toString(36);
|
|
456
|
+
}
|
|
457
|
+
/** Accept-through for an already-formatted id. */
|
|
458
|
+
idFromString(s) {
|
|
459
|
+
return s;
|
|
460
|
+
}
|
|
461
|
+
/** Return a stub bound to the given id. */
|
|
462
|
+
get(id) {
|
|
463
|
+
const ctxExports = this.ctx?.exports;
|
|
464
|
+
if (!ctxExports?.NimbusDOStub)
|
|
465
|
+
throw new Error('Nimbus: ctx.exports.NimbusDOStub unavailable');
|
|
466
|
+
const propsAny = this.ctx.props || {};
|
|
467
|
+
return ctxExports.NimbusDOStub({
|
|
468
|
+
props: {
|
|
469
|
+
bindingName: propsAny.bindingName,
|
|
470
|
+
supervisorDoId: propsAny.supervisorDoId,
|
|
471
|
+
id: String(id),
|
|
472
|
+
},
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* A Durable-Object-namespace-stub for a specific id. Exposes fetch()
|
|
478
|
+
* and will, if we later need it, forward RPC method calls through a
|
|
479
|
+
* dispatch helper. The important invariant: EVERY call resolves the
|
|
480
|
+
* inner DO class via getInnerDoClass() (./inner-do-registry.js) and
|
|
481
|
+
* spins up / attaches to a facet via the supervisor's ctx.facets in
|
|
482
|
+
* the SAME outer request context — never reusing stubs across requests.
|
|
483
|
+
*/
|
|
484
|
+
export class NimbusDOStub extends WorkerEntrypoint {
|
|
485
|
+
/**
|
|
486
|
+
* Resolve the supervisor DO from env.NIMBUS_SESSION and route through
|
|
487
|
+
* its _rpcInnerDoFetch RPC method, which runs ctx.facets.get(...) in
|
|
488
|
+
* its own context and forwards the request.
|
|
489
|
+
*/
|
|
490
|
+
async fetch(request) {
|
|
491
|
+
const propsAny = this.ctx.props || {};
|
|
492
|
+
const ns = this.env?.NIMBUS_SESSION;
|
|
493
|
+
if (!ns)
|
|
494
|
+
return new Response('Nimbus: env.NIMBUS_SESSION unavailable', { status: 500 });
|
|
495
|
+
const supervisorDoId = String(propsAny.supervisorDoId || '');
|
|
496
|
+
if (!supervisorDoId)
|
|
497
|
+
return new Response('Nimbus: supervisorDoId missing', { status: 500 });
|
|
498
|
+
const bindingName = String(propsAny.bindingName || '');
|
|
499
|
+
const id = String(propsAny.id || '');
|
|
500
|
+
const stub = ns.get(ns.idFromString(supervisorDoId));
|
|
501
|
+
// Forward the full request (method, body, headers preserved) by
|
|
502
|
+
// serializing what's needed and reconstructing on the other side.
|
|
503
|
+
// The supervisor reconstitutes the Request from these fields and
|
|
504
|
+
// invokes the facet.
|
|
505
|
+
const body = request.method !== 'GET' && request.method !== 'HEAD'
|
|
506
|
+
? await request.arrayBuffer()
|
|
507
|
+
: null;
|
|
508
|
+
const headerList = [];
|
|
509
|
+
request.headers.forEach((v, k) => { headerList.push([k, v]); });
|
|
510
|
+
const res = await stub._rpcInnerDoFetch({
|
|
511
|
+
bindingName,
|
|
512
|
+
id,
|
|
513
|
+
method: request.method,
|
|
514
|
+
url: request.url,
|
|
515
|
+
headers: headerList,
|
|
516
|
+
body,
|
|
517
|
+
});
|
|
518
|
+
return new Response(res.body, {
|
|
519
|
+
status: res.status,
|
|
520
|
+
statusText: res.statusText,
|
|
521
|
+
headers: res.headers,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctx-exports.ts — leaf module holding the ctx.exports reference.
|
|
3
|
+
*
|
|
4
|
+
* Isolated from src/index.ts so helpers (notably src/loaders/loader-pool.ts)
|
|
5
|
+
* can read `ctx.exports` without transitively importing the Durable Object
|
|
6
|
+
* classes. Keeping this a leaf (no imports) lets the pool be unit-tested in
|
|
7
|
+
* a plain Node/Bun process.
|
|
8
|
+
*
|
|
9
|
+
* The fetch handler in src/index.ts calls `setCtxExports(ctx.exports)` on
|
|
10
|
+
* the first request; callers like NimbusLoaderPool read via `getCtxExports()`.
|
|
11
|
+
* If the pool is constructed before the first fetch (unlikely) it just gets
|
|
12
|
+
* null — the caller decides how to degrade.
|
|
13
|
+
*/
|
|
14
|
+
export declare function setCtxExports(value: any): void;
|
|
15
|
+
export declare function getCtxExports(): any;
|
|
16
|
+
//# sourceMappingURL=ctx-exports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctx-exports.d.ts","sourceRoot":"","sources":["../../src/session/ctx-exports.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CAG9C;AAED,wBAAgB,aAAa,IAAI,GAAG,CAEnC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctx-exports.ts — leaf module holding the ctx.exports reference.
|
|
3
|
+
*
|
|
4
|
+
* Isolated from src/index.ts so helpers (notably src/loaders/loader-pool.ts)
|
|
5
|
+
* can read `ctx.exports` without transitively importing the Durable Object
|
|
6
|
+
* classes. Keeping this a leaf (no imports) lets the pool be unit-tested in
|
|
7
|
+
* a plain Node/Bun process.
|
|
8
|
+
*
|
|
9
|
+
* The fetch handler in src/index.ts calls `setCtxExports(ctx.exports)` on
|
|
10
|
+
* the first request; callers like NimbusLoaderPool read via `getCtxExports()`.
|
|
11
|
+
* If the pool is constructed before the first fetch (unlikely) it just gets
|
|
12
|
+
* null — the caller decides how to degrade.
|
|
13
|
+
*/
|
|
14
|
+
let _ctxExports = null;
|
|
15
|
+
export function setCtxExports(value) {
|
|
16
|
+
if (_ctxExports)
|
|
17
|
+
return; // first-write-wins, same as the prior inline impl
|
|
18
|
+
_ctxExports = value;
|
|
19
|
+
}
|
|
20
|
+
export function getCtxExports() {
|
|
21
|
+
return _ctxExports;
|
|
22
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* session/diag.ts — heap probe + W5 OOM-ring persistence helpers.
|
|
3
|
+
*
|
|
4
|
+
* Why a sibling module: heap-sampling state (peak RSS, sample count)
|
|
5
|
+
* is per-DO-instance but doesn't belong in the DO class itself —
|
|
6
|
+
* it's pure data + one ctx-side persistence helper, kept here so the
|
|
7
|
+
* class file stays small and the diag is testable without a workerd
|
|
8
|
+
* harness.
|
|
9
|
+
*
|
|
10
|
+
* Surfaces:
|
|
11
|
+
* - readNodeMem() — process.memoryUsage() if available; null otherwise.
|
|
12
|
+
* - readPerfMem() — performance.memory if available; null otherwise.
|
|
13
|
+
* - sampleMemory(host) — read + update peak trackers (no I/O, microseconds).
|
|
14
|
+
* - rehydrateRingFromStorage(host, ctx) — load OOM ring snapshot at boot.
|
|
15
|
+
* - persistRing(host, ctx) — async put with redundant-write skip.
|
|
16
|
+
*
|
|
17
|
+
* Per DEFECT-D1: ctx is taken as a separate explicit arg.
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* Minimal host shape. Per plan §IX.1 b': fields drop `private` on the class.
|
|
21
|
+
*/
|
|
22
|
+
export interface DiagHost {
|
|
23
|
+
_diagPeakRss: number;
|
|
24
|
+
_diagPeakHeapUsed: number;
|
|
25
|
+
_diagPeakAt: number;
|
|
26
|
+
_diagSampleCount: number;
|
|
27
|
+
_w5LastPersistAt: number;
|
|
28
|
+
_w5LastPersistRingSize: number;
|
|
29
|
+
}
|
|
30
|
+
export declare function readNodeMem(): {
|
|
31
|
+
rss: number;
|
|
32
|
+
heapTotal: number;
|
|
33
|
+
heapUsed: number;
|
|
34
|
+
external: number;
|
|
35
|
+
arrayBuffers: number;
|
|
36
|
+
} | null;
|
|
37
|
+
export declare function readPerfMem(): {
|
|
38
|
+
jsHeapSizeLimit: number;
|
|
39
|
+
totalJSHeapSize: number;
|
|
40
|
+
usedJSHeapSize: number;
|
|
41
|
+
} | null;
|
|
42
|
+
/**
|
|
43
|
+
* Sample current heap and update peak trackers. Idempotent on call
|
|
44
|
+
* count beyond `_diagSampleCount`. Safe to call from any code path
|
|
45
|
+
* (request handler, install/bundle progress callbacks) — does NO
|
|
46
|
+
* I/O, NO async work, returns immediately. Cost: one process.memoryUsage()
|
|
47
|
+
* which is microseconds.
|
|
48
|
+
*/
|
|
49
|
+
export declare function sampleMemory(host: DiagHost): void;
|
|
50
|
+
/**
|
|
51
|
+
* W5 Lever 5: rehydrate the OOM ring from storage (best-effort).
|
|
52
|
+
* Survives DO hibernation; lets cf-tail-style forensics include
|
|
53
|
+
* pre-hibernate failures. Fail-soft on garbage / missing.
|
|
54
|
+
*/
|
|
55
|
+
export declare function rehydrateRingFromStorage(_host: DiagHost, ctx: any): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Snapshot the ring + persist to ctx.storage. Async; callers should
|
|
58
|
+
* pass the returned promise to ctx.waitUntil so close-handler return
|
|
59
|
+
* doesn't race the put. Skips redundant writes.
|
|
60
|
+
*/
|
|
61
|
+
export declare function persistRing(host: DiagHost, ctx: any): Promise<void> | null;
|
|
62
|
+
//# sourceMappingURL=diag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diag.d.ts","sourceRoot":"","sources":["../../src/session/diag.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAejI;AAED,wBAAgB,WAAW,IAAI;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAYjH;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAgBjD;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAoB1E"}
|