@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,437 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* supervisor-rpc.ts — WorkerEntrypoint for facet → supervisor IPC.
|
|
3
|
+
*
|
|
4
|
+
* Exported from index.ts. Facets receive `env.SUPERVISOR` service binding
|
|
5
|
+
* pointing to this class via ctx.exports loopback binding.
|
|
6
|
+
*
|
|
7
|
+
* Props: { doId: string, pid: number }
|
|
8
|
+
* doId — the supervisor DO's durable object ID (for routing)
|
|
9
|
+
* pid — the process ID (for stdout/stderr routing)
|
|
10
|
+
*
|
|
11
|
+
* Methods callable by facets via RPC:
|
|
12
|
+
* readFile(path) → string | null
|
|
13
|
+
* writeFile(path, content) → void
|
|
14
|
+
* stat(path) → { type, size, mtime, mode } | null
|
|
15
|
+
* readdir(path) → { name, type }[]
|
|
16
|
+
* exists(path) → boolean
|
|
17
|
+
* mkdir(path) → void
|
|
18
|
+
* unlink(path) → void
|
|
19
|
+
* writeBatch(payload) → { inodes, chunks } (bulk atomic write)
|
|
20
|
+
* stdout(data) → void (pushed to WebSocket + ring buffer)
|
|
21
|
+
* stderr(data) → void
|
|
22
|
+
* reportExit(code, tail?) → void (called from facet's finally block)
|
|
23
|
+
* prefetch(cwd, entryCode) → Record<string, string>
|
|
24
|
+
*/
|
|
25
|
+
import { WorkerEntrypoint } from 'cloudflare:workers';
|
|
26
|
+
// W5: OOM discriminator — record last-known RPC frame on writeBatch entry
|
|
27
|
+
import { setLastRpcFrame } from '../observability/oom-discriminator.js';
|
|
28
|
+
// Phase 2 A'.2 — supervisor in-flight RPC payload byte tracking.
|
|
29
|
+
import { rpcPayloadStart, rpcPayloadEnd } from '../observability/diag-counters.js';
|
|
30
|
+
// W4: R2 cross-tenant npm cache (tarballs + packuments)
|
|
31
|
+
import { R2CacheClient, MAX_R2_TARBALL_BYTES } from '../npm/r2-cache.js';
|
|
32
|
+
import { r2TarballHit, r2TarballMiss, r2PackumentHit, r2PackumentMiss, r2TarballPutOk, r2TarballPutFail, r2PackumentPutOk, r2PackumentPutFail, } from '../observability/diag-counters.js';
|
|
33
|
+
/**
|
|
34
|
+
* Drain the per-call event list captured by R2CacheClient during this
|
|
35
|
+
* SupervisorRPC call.
|
|
36
|
+
*
|
|
37
|
+
* cache-obs-2 (the v2 fold-side flip):
|
|
38
|
+
* We RETURN the drained events to the facet so they propagate via
|
|
39
|
+
* the install-batch-facet result -> installer.ts fold -> DO
|
|
40
|
+
* singleton path. No recursion (return-value flow, not subrequest).
|
|
41
|
+
*
|
|
42
|
+
* The R2CacheClient instance lives only for the duration of one RPC
|
|
43
|
+
* call (constructed fresh in _r2()). Draining its event list at the
|
|
44
|
+
* end of the call is the natural lifecycle boundary.
|
|
45
|
+
*/
|
|
46
|
+
function _drainCacheEvents(client) {
|
|
47
|
+
const drained = (client && Array.isArray(client._cacheEvents)) ? client._cacheEvents : [];
|
|
48
|
+
if (client && Array.isArray(client._cacheEvents))
|
|
49
|
+
client._cacheEvents = [];
|
|
50
|
+
return drained;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* W5 Lever 5: estimate the byte-cost of a writeBatch payload so the
|
|
54
|
+
* /api/_diag/memory.rpc.lastFrame.payloadBytes field is meaningful.
|
|
55
|
+
* Counts chunk data bytes + per-inode header overhead. Fast (no copy).
|
|
56
|
+
*/
|
|
57
|
+
function _estimateWriteBatchBytes(payload) {
|
|
58
|
+
if (!payload)
|
|
59
|
+
return 0;
|
|
60
|
+
let n = 0;
|
|
61
|
+
const chunks = payload.chunks ?? [];
|
|
62
|
+
for (const c of chunks) {
|
|
63
|
+
n += (c?.data?.length ?? c?.data?.byteLength ?? 0);
|
|
64
|
+
}
|
|
65
|
+
const inodes = payload.inodes ?? [];
|
|
66
|
+
for (const i of inodes)
|
|
67
|
+
n += 80 + (i?.path?.length ?? 0);
|
|
68
|
+
return n;
|
|
69
|
+
}
|
|
70
|
+
export class SupervisorRPC extends WorkerEntrypoint {
|
|
71
|
+
/**
|
|
72
|
+
* Cached supervisor DO stub. WorkerEntrypoint instances live for one
|
|
73
|
+
* facet invocation — caching inside the instance is correct per-facet
|
|
74
|
+
* scoping with no cross-invocation leak.
|
|
75
|
+
*
|
|
76
|
+
* Before this cache every method (readFile, writeFile, stdout, ...)
|
|
77
|
+
* called NIMBUS_SESSION.get(id) which mints a fresh RPC stub per call.
|
|
78
|
+
* During npm install / git clone that multiplies to tens of thousands
|
|
79
|
+
* of undisposed stubs per session, exhausting workerd's RPC queue
|
|
80
|
+
* (queueState != ACTIVE fatal). See CRASH-INVESTIGATION-V2.md.
|
|
81
|
+
*/
|
|
82
|
+
_stubCache = null;
|
|
83
|
+
/**
|
|
84
|
+
* Get the supervisor DO stub for RPC routing.
|
|
85
|
+
* Uses doId from ctx.props to find the correct NimbusSession instance.
|
|
86
|
+
*/
|
|
87
|
+
_getStub() {
|
|
88
|
+
if (this._stubCache)
|
|
89
|
+
return this._stubCache;
|
|
90
|
+
const doId = this.ctx.props?.doId;
|
|
91
|
+
if (!doId)
|
|
92
|
+
throw new Error('SupervisorRPC: missing doId in props');
|
|
93
|
+
const id = this.env.NIMBUS_SESSION.idFromString(doId);
|
|
94
|
+
this._stubCache = this.env.NIMBUS_SESSION.get(id);
|
|
95
|
+
return this._stubCache;
|
|
96
|
+
}
|
|
97
|
+
// ── Filesystem RPC ────────────────────────────────────────────────────
|
|
98
|
+
async readFile(path) {
|
|
99
|
+
return this._getStub()._rpcReadFile(path);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Read a file as raw bytes. Used by the git network facet for binary
|
|
103
|
+
* object/pack files where the text readFile would corrupt content.
|
|
104
|
+
*/
|
|
105
|
+
async readFileBytes(path) {
|
|
106
|
+
return this._getStub()._rpcReadFileBytes(path);
|
|
107
|
+
}
|
|
108
|
+
async writeFile(path, content) {
|
|
109
|
+
// binary-fs wave: accept Uint8Array natively. Pre-fix this RPC was
|
|
110
|
+
// string-only, which forced node-shims.ts:writeFileSync to UTF-8-
|
|
111
|
+
// decode every Uint8Array write — mangling bytes ≥ 0x80 to U+FFFD
|
|
112
|
+
// and corrupting binary content. RPC structured-clone handles
|
|
113
|
+
// Uint8Array transparently; downstream _rpcWriteFile also accepts
|
|
114
|
+
// either shape. See /workspace/.seal-internal/2026-05-10-binary-fs/.
|
|
115
|
+
return this._getStub()._rpcWriteFile(path, content);
|
|
116
|
+
}
|
|
117
|
+
async stat(path) {
|
|
118
|
+
return this._getStub()._rpcStat(path);
|
|
119
|
+
}
|
|
120
|
+
async readdir(path) {
|
|
121
|
+
return this._getStub()._rpcReaddir(path);
|
|
122
|
+
}
|
|
123
|
+
async exists(path) {
|
|
124
|
+
return this._getStub()._rpcExists(path);
|
|
125
|
+
}
|
|
126
|
+
async mkdir(path) {
|
|
127
|
+
return this._getStub()._rpcMkdir(path);
|
|
128
|
+
}
|
|
129
|
+
async unlink(path) {
|
|
130
|
+
return this._getStub()._rpcUnlink(path);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Bulk-write all inodes + chunks in ONE transactionSync on the supervisor.
|
|
134
|
+
* Used by facets that buffer writes locally (git clone/fetch/pull).
|
|
135
|
+
*
|
|
136
|
+
* payload shape:
|
|
137
|
+
* {
|
|
138
|
+
* inodes: Array<{path, parentPath, isDir, size, mtime, mode, chunkCount}>,
|
|
139
|
+
* chunks: Array<{path, chunkId, data: Uint8Array}>,
|
|
140
|
+
* deletePaths?: string[]
|
|
141
|
+
* }
|
|
142
|
+
*/
|
|
143
|
+
async writeBatch(payload) {
|
|
144
|
+
// W5 Lever 5: record the frame on entry so /api/_diag/memory has
|
|
145
|
+
// last-known-RPC context if the supervisor crashes mid-RPC.
|
|
146
|
+
// Phase 2 A'.2: bump the in-flight RPC payload counter so the
|
|
147
|
+
// supervisor's heap estimate accounts for the bytes claimed by
|
|
148
|
+
// this RPC for the duration of the await.
|
|
149
|
+
const payloadBytes = _estimateWriteBatchBytes(payload);
|
|
150
|
+
setLastRpcFrame('writeBatch', payloadBytes);
|
|
151
|
+
rpcPayloadStart(payloadBytes);
|
|
152
|
+
try {
|
|
153
|
+
return await this._getStub()._rpcWriteBatch(payload);
|
|
154
|
+
}
|
|
155
|
+
finally {
|
|
156
|
+
rpcPayloadEnd(payloadBytes);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* W7 — Streaming bulk-write. Same semantics as writeBatch() but the
|
|
161
|
+
* argument is a ReadableStream<Uint8Array> in the W7 wire-protocol
|
|
162
|
+
* (see src/_shared/w7-frame.ts). Bypasses the 32 MiB structured-clone
|
|
163
|
+
* cap entirely; the byte stream traverses the RPC boundary with
|
|
164
|
+
* automatic flow control per Cloudflare RPC docs.
|
|
165
|
+
*
|
|
166
|
+
* Acceptance per audit/sections/MASTER-ROADMAP.md §W7:
|
|
167
|
+
* - Install of 5GB monorepo doesn't hit 32 MiB wall.
|
|
168
|
+
* - Peak heap reduction 48 MiB → 30 MiB on the facet side.
|
|
169
|
+
*
|
|
170
|
+
* The RPC frame itself does NOT pre-clone the stream — workerd
|
|
171
|
+
* transfers the byte stream's underlying-source ownership to the
|
|
172
|
+
* receiver. From the OOM-discriminator's perspective, payloadBytes
|
|
173
|
+
* is unknown up-front (-1 sentinel); it is the supervisor's
|
|
174
|
+
* decoder that observes the actual byte count.
|
|
175
|
+
*/
|
|
176
|
+
async writeBatchStream(stream) {
|
|
177
|
+
// The streaming bytes flow with backpressure (W7_HIGHWATER_BYTES =
|
|
178
|
+
// 256 KiB per active encoder per src/_shared/w7-frame.ts:53). The
|
|
179
|
+
// supervisor-resident bound is the queue highwater, NOT the total
|
|
180
|
+
// payload — the LastRpcFrame surfaces -1 to mark "stream"; the
|
|
181
|
+
// RPC payload counter sees the bounded chunk-size estimate.
|
|
182
|
+
const STREAM_RESIDENT_BYTES = 256 * 1024;
|
|
183
|
+
setLastRpcFrame('writeBatchStream', -1);
|
|
184
|
+
rpcPayloadStart(STREAM_RESIDENT_BYTES);
|
|
185
|
+
try {
|
|
186
|
+
return await this._getStub()._rpcWriteBatchStream(stream);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
rpcPayloadEnd(STREAM_RESIDENT_BYTES);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Bulk-write npm registry cache entries (resolved packument metadata)
|
|
194
|
+
* in ONE RPC. Used by the resolver-facet to flush a wave of resolved
|
|
195
|
+
* packages back to the supervisor without per-entry round-trips.
|
|
196
|
+
*
|
|
197
|
+
* `entries` is an array of RegistryCacheEntry from src/npm-cache.ts:
|
|
198
|
+
* { name, version, tarballUrl, integrity, depsJson, exportsJson,
|
|
199
|
+
* main, moduleField, binJson, fetchedAt }
|
|
200
|
+
*
|
|
201
|
+
* Returns { written, failed } — partial writes are tolerated; cache
|
|
202
|
+
* is best-effort (resolver correctness depends on the returned
|
|
203
|
+
* ResolvedPackage[], not on cache hits).
|
|
204
|
+
*/
|
|
205
|
+
async putRegistryEntries(entries) {
|
|
206
|
+
// Phase 2 A'.2: track the inbound array's resident byte cost.
|
|
207
|
+
// Each registry entry is ~500 B (deps + integrity + tarballUrl);
|
|
208
|
+
// a wave of 100 entries is ~50 KiB. Bounded; counted in
|
|
209
|
+
// streamingBuffersBytes for visibility.
|
|
210
|
+
const REGISTRY_ENTRY_BYTES = 512;
|
|
211
|
+
const payloadBytes = (Array.isArray(entries) ? entries.length : 0) * REGISTRY_ENTRY_BYTES;
|
|
212
|
+
rpcPayloadStart(payloadBytes);
|
|
213
|
+
try {
|
|
214
|
+
return await this._getStub()._rpcPutRegistryEntries(entries);
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
rpcPayloadEnd(payloadBytes);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// ── R2-backed npm cache RPC [W4] ─────────────────────────────────────
|
|
221
|
+
//
|
|
222
|
+
// The R2 buckets are bindings on the SUPERVISOR worker (not the
|
|
223
|
+
// facet). The facet only sees what we hang on its `env: { SUPERVISOR }`
|
|
224
|
+
// injection (see src/facet-manager.ts:892 and similar). To expose R2
|
|
225
|
+
// to the facet without pinning a binding stub through the LOADER, we
|
|
226
|
+
// proxy reads/writes through these RPC methods.
|
|
227
|
+
//
|
|
228
|
+
// Counter increments live HERE (supervisor isolate, where diag-counters
|
|
229
|
+
// is module-scoped). The facet itself never sees the counter module.
|
|
230
|
+
//
|
|
231
|
+
// Graceful-degrade: if NPM_TARBALL_CACHE / NPM_PACKUMENT_CACHE bindings
|
|
232
|
+
// aren't configured (deploy without R2 buckets, or local dev), the
|
|
233
|
+
// R2CacheClient falls through to null returns / no-op writes; the
|
|
234
|
+
// facet sees null and uses its existing network-fetch path. No errors,
|
|
235
|
+
// no breakage. See audit/sections/W4-plan.md §8 risk #1.
|
|
236
|
+
/**
|
|
237
|
+
* Build a fresh R2CacheClient bound to this request's env. Cheap to
|
|
238
|
+
* instantiate; does no async work. Called from each R2 RPC method to
|
|
239
|
+
* avoid keeping the client in instance state (the WorkerEntrypoint
|
|
240
|
+
* lifecycle is per-invocation and we want a clean closure each time).
|
|
241
|
+
*/
|
|
242
|
+
_r2() {
|
|
243
|
+
const tar = this.env?.NPM_TARBALL_CACHE ?? null;
|
|
244
|
+
const pkm = this.env?.NPM_PACKUMENT_CACHE ?? null;
|
|
245
|
+
return new R2CacheClient(tar, pkm);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Look up a tarball in the R2 cross-tenant cache. Returns
|
|
249
|
+
* { bytes, events } where:
|
|
250
|
+
* - bytes: Uint8Array on hit, null on miss/oversize/no-binding
|
|
251
|
+
* - events: L2/L3 hit/miss tuples captured during this lookup
|
|
252
|
+
*
|
|
253
|
+
* cache-obs-2: return-shape change from `Uint8Array | null` to
|
|
254
|
+
* `{ bytes, events }`. Facets propagate events into their result
|
|
255
|
+
* for installer.ts to fold into the DO singleton (mirroring the
|
|
256
|
+
* recordR2RaceCounters pattern). Without this enrichment the
|
|
257
|
+
* L2/L3 distinction is supervisor-side knowledge only.
|
|
258
|
+
*
|
|
259
|
+
* The caller is responsible for integrity-verifying bytes before
|
|
260
|
+
* unpacking — same posture as the network-fetch path. The events
|
|
261
|
+
* list is structured-clone-safe (plain objects + strings + numbers).
|
|
262
|
+
*/
|
|
263
|
+
async getCachedTarball(name, version) {
|
|
264
|
+
const r2 = this._r2();
|
|
265
|
+
const bytes = await r2.getTarball(name, version);
|
|
266
|
+
const events = _drainCacheEvents(r2);
|
|
267
|
+
if (bytes && bytes.length > 0 && bytes.length <= MAX_R2_TARBALL_BYTES) {
|
|
268
|
+
r2TarballHit();
|
|
269
|
+
return { bytes, events };
|
|
270
|
+
}
|
|
271
|
+
r2TarballMiss();
|
|
272
|
+
return { bytes: null, events };
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Store a tarball in the R2 cross-tenant cache. Best-effort: on R2
|
|
276
|
+
* write failure, returns false but the install pipeline continues
|
|
277
|
+
* unaffected. Caller passes the bytes already verified against the
|
|
278
|
+
* resolver's integrity hash.
|
|
279
|
+
*/
|
|
280
|
+
async putCachedTarball(name, version, bytes) {
|
|
281
|
+
// L4 hits are captured FACET-SIDE in cache-obs-2 — the facet did
|
|
282
|
+
// the registry fetch, so it can push the L4 event directly into
|
|
283
|
+
// its own cacheStatEvents list before calling putCachedTarball.
|
|
284
|
+
// This RPC remains a one-way write (returns bool); the L4 event
|
|
285
|
+
// does NOT flow through this return path.
|
|
286
|
+
const r2 = this._r2();
|
|
287
|
+
const ok = await r2.putTarball(name, version, bytes);
|
|
288
|
+
if (ok)
|
|
289
|
+
r2TarballPutOk();
|
|
290
|
+
else
|
|
291
|
+
r2TarballPutFail();
|
|
292
|
+
return ok;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Look up a packument in the R2 cross-tenant cache. Returns
|
|
296
|
+
* { json, ageMs, expired } or null on miss / missing binding.
|
|
297
|
+
*
|
|
298
|
+
* Caller MUST honour the `expired` flag: only treat as a hot-path
|
|
299
|
+
* hit when expired === false. Stale data is returned only for
|
|
300
|
+
* stale-while-error fallback semantics.
|
|
301
|
+
*/
|
|
302
|
+
/**
|
|
303
|
+
* Look up a packument in the R2 cross-tenant cache. Returns
|
|
304
|
+
* { cached, events } where:
|
|
305
|
+
* - cached: { json, ageMs, expired } on hit, null on miss/no-binding
|
|
306
|
+
* - events: L2/L3 hit/miss tuples captured during this lookup
|
|
307
|
+
*
|
|
308
|
+
* cache-obs-2: return-shape change from
|
|
309
|
+
* `{json, ageMs, expired} | null` to
|
|
310
|
+
* `{ cached: {json,ageMs,expired} | null, events: ... }`.
|
|
311
|
+
*
|
|
312
|
+
* Caller MUST honour the `cached.expired` flag the same as v1
|
|
313
|
+
* (only treat as hot-path hit when expired === false). Events are
|
|
314
|
+
* recorded regardless of expiration — an expired L2 hit is still
|
|
315
|
+
* recorded as 'hit' at the L2 tier; the staleness is a separate axis.
|
|
316
|
+
*/
|
|
317
|
+
async getCachedPackument(name) {
|
|
318
|
+
const r2 = this._r2();
|
|
319
|
+
const cached = await r2.getPackument(name);
|
|
320
|
+
const events = _drainCacheEvents(r2);
|
|
321
|
+
if (cached && !cached.expired) {
|
|
322
|
+
r2PackumentHit();
|
|
323
|
+
return { cached, events };
|
|
324
|
+
}
|
|
325
|
+
if (cached && cached.expired) {
|
|
326
|
+
// Treat expired as a miss for hit-rate accounting; still return
|
|
327
|
+
// the data so callers can use it for stale-while-error.
|
|
328
|
+
r2PackumentMiss();
|
|
329
|
+
return { cached, events };
|
|
330
|
+
}
|
|
331
|
+
r2PackumentMiss();
|
|
332
|
+
return { cached: null, events };
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Store a packument in the R2 cross-tenant cache with a TTL stamp.
|
|
336
|
+
* Best-effort. Returns true on success.
|
|
337
|
+
*/
|
|
338
|
+
async putCachedPackument(name, json) {
|
|
339
|
+
// L4 hit captured facet-side (the facet did the registry fetch).
|
|
340
|
+
// This RPC is one-way write.
|
|
341
|
+
const r2 = this._r2();
|
|
342
|
+
const ok = await r2.putPackument(name, json);
|
|
343
|
+
if (ok)
|
|
344
|
+
r2PackumentPutOk();
|
|
345
|
+
else
|
|
346
|
+
r2PackumentPutFail();
|
|
347
|
+
return ok;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Admin: purge a single tarball from R2. Used in incident response.
|
|
351
|
+
*/
|
|
352
|
+
async purgeCachedTarball(name, version) {
|
|
353
|
+
const r2 = this._r2();
|
|
354
|
+
return r2.deleteTarball(name, version);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Admin: purge a single packument from R2.
|
|
358
|
+
*/
|
|
359
|
+
async purgeCachedPackument(name) {
|
|
360
|
+
const r2 = this._r2();
|
|
361
|
+
return r2.deletePackument(name);
|
|
362
|
+
}
|
|
363
|
+
// ── Process I/O ───────────────────────────────────────────────────────
|
|
364
|
+
async stdout(data) {
|
|
365
|
+
return this._getStub()._rpcStdout(this.ctx.props?.pid || 0, data);
|
|
366
|
+
}
|
|
367
|
+
async stderr(data) {
|
|
368
|
+
return this._getStub()._rpcStderr(this.ctx.props?.pid || 0, data);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Report process exit to the supervisor. Called from the facet's own
|
|
372
|
+
* `finally` block after I/O has drained. The supervisor uses this to
|
|
373
|
+
* stamp the log buffer and, for non-zero exits, emit a terminal dump.
|
|
374
|
+
*
|
|
375
|
+
* `tail` is an optional trailing stderr string — useful when the facet
|
|
376
|
+
* has error state it couldn't stream in-band (rare; main path drains
|
|
377
|
+
* via __pendingIO first).
|
|
378
|
+
*/
|
|
379
|
+
async reportExit(code, tail) {
|
|
380
|
+
const pid = this.ctx.props?.pid || 0;
|
|
381
|
+
return this._getStub()._rpcReportExit(pid, code, tail || '');
|
|
382
|
+
}
|
|
383
|
+
// ── Prefetch ──────────────────────────────────────────────────────────
|
|
384
|
+
async prefetch(cwd, entryCode) {
|
|
385
|
+
return this._getStub()._rpcPrefetch(cwd, entryCode);
|
|
386
|
+
}
|
|
387
|
+
// ── Port registration ─────────────────────────────────────────────────
|
|
388
|
+
async registerPort(port) {
|
|
389
|
+
return this._getStub()._rpcRegisterPort(this.ctx.props?.pid || 0, port);
|
|
390
|
+
}
|
|
391
|
+
async unregisterPort(port) {
|
|
392
|
+
return this._getStub()._rpcUnregisterPort(port);
|
|
393
|
+
}
|
|
394
|
+
// ── Esbuild transform ─────────────────────────────────────────────────
|
|
395
|
+
async transform(code, loader) {
|
|
396
|
+
return this._getStub()._rpcTransform(code, loader);
|
|
397
|
+
}
|
|
398
|
+
// ── child_process [W8 Phase 1] ────────────────────────────────────────
|
|
399
|
+
//
|
|
400
|
+
// The parent facet's `child_process.spawn` shim (node-shims.ts) calls
|
|
401
|
+
// these methods. They delegate to NimbusSession._rpcCp* methods which
|
|
402
|
+
// route through the shared FacetProcessManager.
|
|
403
|
+
//
|
|
404
|
+
// Contract documented in audit/sections/W8-plan.md §2 / §8.5.
|
|
405
|
+
async cpSpawn(req) {
|
|
406
|
+
return this._getStub()._rpcCpSpawn(req);
|
|
407
|
+
}
|
|
408
|
+
async cpStdinWrite(childPid, data) {
|
|
409
|
+
return this._getStub()._rpcCpStdinWrite(childPid, data);
|
|
410
|
+
}
|
|
411
|
+
async cpStdinEnd(childPid) {
|
|
412
|
+
return this._getStub()._rpcCpStdinEnd(childPid);
|
|
413
|
+
}
|
|
414
|
+
async cpReadOutput(childPid, fd, sinceSeq, waitMs) {
|
|
415
|
+
return this._getStub()._rpcCpReadOutput(childPid, fd, sinceSeq, waitMs);
|
|
416
|
+
}
|
|
417
|
+
async cpDrainOutput(childPid) {
|
|
418
|
+
return this._getStub()._rpcCpDrainOutput(childPid);
|
|
419
|
+
}
|
|
420
|
+
async cpKill(childPid, signal) {
|
|
421
|
+
return this._getStub()._rpcCpKill(childPid, signal);
|
|
422
|
+
}
|
|
423
|
+
async cpWait(childPid, waitMs) {
|
|
424
|
+
return this._getStub()._rpcCpWait(childPid, waitMs);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* arch-gaps gap #1: dispatch a single cp.spawn request inline using
|
|
428
|
+
* the existing pure-builtin / facet-direct logic, returning final
|
|
429
|
+
* stdout/stderr/exitCode (NOT streamed via hooks). Called from
|
|
430
|
+
* spawn-facet.ts:runSpawnInIsolate inside a fresh Worker Loader
|
|
431
|
+
* isolate to delegate the actual command execution back to the
|
|
432
|
+
* supervisor while keeping the dispatch envelope in a fresh isolate.
|
|
433
|
+
*/
|
|
434
|
+
async cpDispatchInline(req, kind) {
|
|
435
|
+
return this._getStub()._rpcCpDispatchInline(req, kind);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ws-hibernation-config.ts — W9 (CF research §C.3 + §C.4) configuration
|
|
3
|
+
* for setWebSocketAutoResponse + setHibernatableWebSocketEventTimeout.
|
|
4
|
+
*
|
|
5
|
+
* Why a dedicated module:
|
|
6
|
+
* - NimbusSession's constructor is already crowded; the calls have
|
|
7
|
+
* specific failure modes (workerd version dependence, optional
|
|
8
|
+
* globals) that deserve isolation.
|
|
9
|
+
* - Unit-testable in Node by passing a mock ctx — the constructor
|
|
10
|
+
* itself can't be (it pulls cloudflare:workers).
|
|
11
|
+
*
|
|
12
|
+
* What this does, in order:
|
|
13
|
+
* 1. setWebSocketAutoResponse(WebSocketRequestResponsePair('ping','pong'))
|
|
14
|
+
* — vite HMR clients ping every 30s and idle xterm tabs ping per
|
|
15
|
+
* minute. Without auto-response, every ping wakes the actor from
|
|
16
|
+
* hibernation: ~2880 wakes/day per idle tab. After this, zero
|
|
17
|
+
* billable wakes for matched ping/pong frames. Auto-response config
|
|
18
|
+
* survives hibernation per the STOR/Durable Objects WebSocket
|
|
19
|
+
* Primer (wiki page id 1372566651).
|
|
20
|
+
* 2. setHibernatableWebSocketEventTimeout(5000) — bound a single
|
|
21
|
+
* hibernation message handler. Long-running work runs in facets
|
|
22
|
+
* with their own CPU budget; the supervisor's WS handlers should
|
|
23
|
+
* enqueue then return. 5 s recommended in CF research §C.3.
|
|
24
|
+
*
|
|
25
|
+
* Both calls are gated on try/catch:
|
|
26
|
+
* - workerd builds before mid-2024 don't expose either method.
|
|
27
|
+
* - WebSocketRequestResponsePair is a workerd global; absent in Node.
|
|
28
|
+
* Failure is reported honestly via the return value so /api/_diag/memory
|
|
29
|
+
* can show whether the runtime supported the configuration.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Recommended hibernation event timeout (ms). 5 s per CF research §C.3
|
|
33
|
+
* — long enough for the heaviest non-facet WS message handler observed
|
|
34
|
+
* in W5 telemetry (~120 ms p99 for a heavy autocomplete request), short
|
|
35
|
+
* enough to bound a runaway handler before it pins the actor.
|
|
36
|
+
*/
|
|
37
|
+
export declare const NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS = 5000;
|
|
38
|
+
/** Public ping/pong contract — clients send `ping`, receive `pong`. */
|
|
39
|
+
export declare const WS_AUTO_RESPONSE_REQUEST = "ping";
|
|
40
|
+
export declare const WS_AUTO_RESPONSE_RESPONSE = "pong";
|
|
41
|
+
export interface WsHibernationConfigResult {
|
|
42
|
+
/** True iff `setWebSocketAutoResponse` ran without throwing. */
|
|
43
|
+
autoResponseConfigured: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* The timeout (in ms) we successfully set, or null if the call wasn't
|
|
46
|
+
* available / threw. Reported separately from autoResponseConfigured
|
|
47
|
+
* so a partial-support workerd shows the partial truth.
|
|
48
|
+
*/
|
|
49
|
+
timeoutSetMs: number | null;
|
|
50
|
+
/** Optional error message — human-readable, never thrown. */
|
|
51
|
+
autoResponseError?: string;
|
|
52
|
+
timeoutError?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Configure WS hibernation behaviours on a DurableObjectState. Idempotent
|
|
56
|
+
* — safe to call multiple times. Returns a result that NimbusSession
|
|
57
|
+
* surfaces via /api/_diag/memory under the `hib` key.
|
|
58
|
+
*
|
|
59
|
+
* The `ctx` parameter is structurally typed (anything with the right
|
|
60
|
+
* methods works) so this module stays Node-testable. In production the
|
|
61
|
+
* caller passes the real `this.ctx` from NimbusSession's constructor.
|
|
62
|
+
*/
|
|
63
|
+
export declare function configureWsHibernation(ctx: any): WsHibernationConfigResult;
|
|
64
|
+
//# sourceMappingURL=ws-hibernation-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-hibernation-config.d.ts","sourceRoot":"","sources":["../../src/session/ws-hibernation-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,OAAO,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAC/C,eAAO,MAAM,yBAAyB,SAAS,CAAC;AAEhD,MAAM,WAAW,yBAAyB;IACxC,gEAAgE;IAChE,sBAAsB,EAAE,OAAO,CAAC;IAChC;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,GAAG,GACP,yBAAyB,CAqC3B"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ws-hibernation-config.ts — W9 (CF research §C.3 + §C.4) configuration
|
|
3
|
+
* for setWebSocketAutoResponse + setHibernatableWebSocketEventTimeout.
|
|
4
|
+
*
|
|
5
|
+
* Why a dedicated module:
|
|
6
|
+
* - NimbusSession's constructor is already crowded; the calls have
|
|
7
|
+
* specific failure modes (workerd version dependence, optional
|
|
8
|
+
* globals) that deserve isolation.
|
|
9
|
+
* - Unit-testable in Node by passing a mock ctx — the constructor
|
|
10
|
+
* itself can't be (it pulls cloudflare:workers).
|
|
11
|
+
*
|
|
12
|
+
* What this does, in order:
|
|
13
|
+
* 1. setWebSocketAutoResponse(WebSocketRequestResponsePair('ping','pong'))
|
|
14
|
+
* — vite HMR clients ping every 30s and idle xterm tabs ping per
|
|
15
|
+
* minute. Without auto-response, every ping wakes the actor from
|
|
16
|
+
* hibernation: ~2880 wakes/day per idle tab. After this, zero
|
|
17
|
+
* billable wakes for matched ping/pong frames. Auto-response config
|
|
18
|
+
* survives hibernation per the STOR/Durable Objects WebSocket
|
|
19
|
+
* Primer (wiki page id 1372566651).
|
|
20
|
+
* 2. setHibernatableWebSocketEventTimeout(5000) — bound a single
|
|
21
|
+
* hibernation message handler. Long-running work runs in facets
|
|
22
|
+
* with their own CPU budget; the supervisor's WS handlers should
|
|
23
|
+
* enqueue then return. 5 s recommended in CF research §C.3.
|
|
24
|
+
*
|
|
25
|
+
* Both calls are gated on try/catch:
|
|
26
|
+
* - workerd builds before mid-2024 don't expose either method.
|
|
27
|
+
* - WebSocketRequestResponsePair is a workerd global; absent in Node.
|
|
28
|
+
* Failure is reported honestly via the return value so /api/_diag/memory
|
|
29
|
+
* can show whether the runtime supported the configuration.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Recommended hibernation event timeout (ms). 5 s per CF research §C.3
|
|
33
|
+
* — long enough for the heaviest non-facet WS message handler observed
|
|
34
|
+
* in W5 telemetry (~120 ms p99 for a heavy autocomplete request), short
|
|
35
|
+
* enough to bound a runaway handler before it pins the actor.
|
|
36
|
+
*/
|
|
37
|
+
export const NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS = 5000;
|
|
38
|
+
/** Public ping/pong contract — clients send `ping`, receive `pong`. */
|
|
39
|
+
export const WS_AUTO_RESPONSE_REQUEST = 'ping';
|
|
40
|
+
export const WS_AUTO_RESPONSE_RESPONSE = 'pong';
|
|
41
|
+
/**
|
|
42
|
+
* Configure WS hibernation behaviours on a DurableObjectState. Idempotent
|
|
43
|
+
* — safe to call multiple times. Returns a result that NimbusSession
|
|
44
|
+
* surfaces via /api/_diag/memory under the `hib` key.
|
|
45
|
+
*
|
|
46
|
+
* The `ctx` parameter is structurally typed (anything with the right
|
|
47
|
+
* methods works) so this module stays Node-testable. In production the
|
|
48
|
+
* caller passes the real `this.ctx` from NimbusSession's constructor.
|
|
49
|
+
*/
|
|
50
|
+
export function configureWsHibernation(ctx) {
|
|
51
|
+
const result = {
|
|
52
|
+
autoResponseConfigured: false,
|
|
53
|
+
timeoutSetMs: null,
|
|
54
|
+
};
|
|
55
|
+
// Step 1: auto-response.
|
|
56
|
+
const Pair = globalThis.WebSocketRequestResponsePair;
|
|
57
|
+
if (typeof ctx?.setWebSocketAutoResponse === 'function' && typeof Pair === 'function') {
|
|
58
|
+
try {
|
|
59
|
+
const pair = new Pair(WS_AUTO_RESPONSE_REQUEST, WS_AUTO_RESPONSE_RESPONSE);
|
|
60
|
+
ctx.setWebSocketAutoResponse(pair);
|
|
61
|
+
result.autoResponseConfigured = true;
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
result.autoResponseError = e?.message || String(e);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (typeof Pair !== 'function') {
|
|
68
|
+
result.autoResponseError = 'WebSocketRequestResponsePair global not available';
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
result.autoResponseError = 'ctx.setWebSocketAutoResponse not available';
|
|
72
|
+
}
|
|
73
|
+
// Step 2: hibernation event timeout. Independent of auto-response —
|
|
74
|
+
// a workerd that lacks the global may still support the timeout
|
|
75
|
+
// method, and vice versa.
|
|
76
|
+
if (typeof ctx?.setHibernatableWebSocketEventTimeout === 'function') {
|
|
77
|
+
try {
|
|
78
|
+
ctx.setHibernatableWebSocketEventTimeout(NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS);
|
|
79
|
+
result.timeoutSetMs = NIMBUS_HIBERNATION_EVENT_TIMEOUT_MS;
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
result.timeoutError = e?.message || String(e);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
result.timeoutError = 'ctx.setHibernatableWebSocketEventTimeout not available';
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|