@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,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* long-running-handle.ts — generic adapter (primitive #3 + #4).
|
|
3
|
+
*
|
|
4
|
+
* Goal: any long-running thing in a Nimbus session that *behaves* like
|
|
5
|
+
* an HTTP server should plug into the supervisor's port registry the
|
|
6
|
+
* same way, so:
|
|
7
|
+
*
|
|
8
|
+
* - `ps` shows it (via `processTable.spawn` + `setLongRunning`)
|
|
9
|
+
* - `/preview/?port=N` routes to it
|
|
10
|
+
* - `/preview/` routes to the default-target one
|
|
11
|
+
* - `vite stop` / `kill <pid>` tears it down
|
|
12
|
+
*
|
|
13
|
+
* Today, two "long-running things" exist in-process:
|
|
14
|
+
*
|
|
15
|
+
* 1. ViteDevServer (the built-in Cirrus shim)
|
|
16
|
+
* 2. CirrusReal (the experimental real-vite facet)
|
|
17
|
+
*
|
|
18
|
+
* Both already expose a `handleRequest(request, pathname)` method.
|
|
19
|
+
* `PortRegistry` expects facets exposing `handleHttpRequest(request)`
|
|
20
|
+
* (single-arg, full request, with the inner path baked into the URL).
|
|
21
|
+
*
|
|
22
|
+
* `makeLongRunningPortStub` adapts the (request, pathname) shape into
|
|
23
|
+
* the (request) shape, by stripping a configurable `basePath` prefix
|
|
24
|
+
* from `request.url.pathname` and forwarding the rest. It is the ONE
|
|
25
|
+
* hook every future long-running thing will use; we do not write a new
|
|
26
|
+
* adapter per framework.
|
|
27
|
+
*
|
|
28
|
+
* NOTE: this is a SUPERVISOR-LOCAL stub, NOT a `WorkerEntrypoint`
|
|
29
|
+
* RPC stub. The port-registry handler at `routeRequest` happily
|
|
30
|
+
* accepts any object exposing `handleHttpRequest`, including in-DO
|
|
31
|
+
* wrappers. That is by design — a long-running facet is NOT required
|
|
32
|
+
* to live in a separate isolate; the routing primitive is the same
|
|
33
|
+
* either way.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Build a port-registry-compatible stub that forwards into the given
|
|
37
|
+
* handler.
|
|
38
|
+
*
|
|
39
|
+
* The supervisor calls `stub.handleHttpRequest(request)` with a request
|
|
40
|
+
* whose URL pathname is the path relative to the port (`PortRegistry`
|
|
41
|
+
* already strips the `/port/<n>` prefix). We pass that pathname to the
|
|
42
|
+
* underlying handler unchanged.
|
|
43
|
+
*
|
|
44
|
+
* Concretely: `GET /port/3000/api/users?id=42`
|
|
45
|
+
* → port-registry rewrites url to `/api/users?id=42`
|
|
46
|
+
* → stub.handleHttpRequest(req) // req.url has /api/users?id=42
|
|
47
|
+
* → handler.handleRequest(req, "/api/users?id=42")
|
|
48
|
+
*/
|
|
49
|
+
export function makeLongRunningPortStub(handler) {
|
|
50
|
+
return {
|
|
51
|
+
async handleHttpRequest(request) {
|
|
52
|
+
const url = new URL(request.url);
|
|
53
|
+
const innerPath = (url.pathname || '/') + url.search;
|
|
54
|
+
return handler.handleRequest(request, innerPath);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Parse `--port N`, `--port=N`, `-p N`, `-p=N` from argv. Returns the
|
|
60
|
+
* parsed integer, or null. Last-wins (so `--port 3000 --port 4000` →
|
|
61
|
+
* 4000), matching POSIX convention.
|
|
62
|
+
*
|
|
63
|
+
* Out-of-range or non-numeric values are returned as null without
|
|
64
|
+
* throwing — callers fall back to the next source (env, config, default).
|
|
65
|
+
*/
|
|
66
|
+
export function parsePortFromArgv(argv) {
|
|
67
|
+
let result = null;
|
|
68
|
+
for (let i = 0; i < argv.length; i++) {
|
|
69
|
+
const a = argv[i];
|
|
70
|
+
let candidate;
|
|
71
|
+
if (a === '--port' || a === '-p') {
|
|
72
|
+
candidate = argv[i + 1];
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
else if (a.startsWith('--port=')) {
|
|
76
|
+
candidate = a.slice('--port='.length);
|
|
77
|
+
}
|
|
78
|
+
else if (a.startsWith('-p=')) {
|
|
79
|
+
candidate = a.slice('-p='.length);
|
|
80
|
+
}
|
|
81
|
+
if (!candidate)
|
|
82
|
+
continue;
|
|
83
|
+
const n = parseInt(candidate, 10);
|
|
84
|
+
if (Number.isFinite(n) && n > 0 && n < 65536)
|
|
85
|
+
result = n;
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Resolve a final port to bind to, given the various sources in
|
|
91
|
+
* priority order. Returns the first finite source.
|
|
92
|
+
*
|
|
93
|
+
* 1. argv flags (--port / -p)
|
|
94
|
+
* 2. env.PORT (post-shell-expansion; Markflow's `${PORT:-3000}` → 3000)
|
|
95
|
+
* 3. viteConfig.port (explicit `port: NNNN` in vite.config.ts)
|
|
96
|
+
* 4. fallback (caller-provided default, e.g. 5173 for vite, 3000 for express)
|
|
97
|
+
*/
|
|
98
|
+
export function resolveLongRunningPort(opts) {
|
|
99
|
+
const argvPort = opts.argv ? parsePortFromArgv(opts.argv) : null;
|
|
100
|
+
if (argvPort)
|
|
101
|
+
return argvPort;
|
|
102
|
+
const envPortStr = opts.env?.PORT;
|
|
103
|
+
if (envPortStr !== undefined && envPortStr !== null && envPortStr !== '') {
|
|
104
|
+
const n = parseInt(String(envPortStr), 10);
|
|
105
|
+
if (Number.isFinite(n) && n > 0 && n < 65536)
|
|
106
|
+
return n;
|
|
107
|
+
}
|
|
108
|
+
if (opts.configPort && opts.configPort > 0 && opts.configPort < 65536) {
|
|
109
|
+
return opts.configPort;
|
|
110
|
+
}
|
|
111
|
+
return opts.fallback;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Expand shell-style `${VAR}` and `${VAR:-default}` references in a
|
|
115
|
+
* single argv token, against the supplied env map.
|
|
116
|
+
*
|
|
117
|
+
* Nimbus's shell does not expand parameter substitution, so a
|
|
118
|
+
* package.json script line like
|
|
119
|
+
*
|
|
120
|
+
* "dev": "vite --host 0.0.0.0 --port ${PORT:-3000}"
|
|
121
|
+
*
|
|
122
|
+
* arrives at the vite handler as the literal token `${PORT:-3000}`.
|
|
123
|
+
* Without expansion, `--port ${PORT:-3000}` is parsed as a non-numeric
|
|
124
|
+
* port and discarded. With expansion (against `env.PORT` falling back
|
|
125
|
+
* to `3000`), the user gets the port they asked for.
|
|
126
|
+
*
|
|
127
|
+
* Supports the two forms commonly seen in `package.json` scripts:
|
|
128
|
+
*
|
|
129
|
+
* - ${VAR} → env[VAR] || ''
|
|
130
|
+
* - ${VAR:-default} → env[VAR] || default
|
|
131
|
+
* - ${VAR:-other_var} → recursive (one level), so the default may
|
|
132
|
+
* itself reference an env var
|
|
133
|
+
*
|
|
134
|
+
* Does NOT support: command substitution, arithmetic substitution,
|
|
135
|
+
* pattern operators (`${VAR##pat}` etc.), positional params, glob.
|
|
136
|
+
* That is intentional — full shell semantics belong in the shell, not
|
|
137
|
+
* the argv expander; this helper covers ~95% of dev-script usage.
|
|
138
|
+
*/
|
|
139
|
+
export function expandShellDefaults(token, env) {
|
|
140
|
+
if (!token || token.indexOf('${') < 0)
|
|
141
|
+
return token;
|
|
142
|
+
const lookup = (name) => {
|
|
143
|
+
const v = env?.[name];
|
|
144
|
+
if (v === undefined || v === null || v === '')
|
|
145
|
+
return undefined;
|
|
146
|
+
return String(v);
|
|
147
|
+
};
|
|
148
|
+
// ${VAR:-default}, ${VAR}. One pass; default value is itself
|
|
149
|
+
// recursively expanded once.
|
|
150
|
+
return token.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g, (_m, name, def) => {
|
|
151
|
+
const v = lookup(name);
|
|
152
|
+
if (v !== undefined)
|
|
153
|
+
return v;
|
|
154
|
+
if (def === undefined)
|
|
155
|
+
return '';
|
|
156
|
+
// One recursion level so `${PORT:-${PORT_FALLBACK:-3000}}` works.
|
|
157
|
+
if (def.indexOf('${') >= 0)
|
|
158
|
+
return expandShellDefaults(def, env);
|
|
159
|
+
return def;
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Apply `expandShellDefaults` to every argv token. Used at the top of
|
|
164
|
+
* a long-running handler before argv parsing so flag values are
|
|
165
|
+
* fully resolved.
|
|
166
|
+
*/
|
|
167
|
+
export function expandArgvShellDefaults(argv, env) {
|
|
168
|
+
return argv.map((t) => expandShellDefaults(t, env));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Pick the default `/preview/` target when no `?port=N` is supplied
|
|
172
|
+
* AND no in-process `viteDevServer` is currently running. The strategy
|
|
173
|
+
* is "first PortRegistry entry, ordered by registration time" — so if
|
|
174
|
+
* a session has only one long-running thing (Markflow's vite on :3000),
|
|
175
|
+
* `/preview/` lands on it without the user supplying a port.
|
|
176
|
+
*
|
|
177
|
+
* Returns null if the registry is empty, in which case the caller
|
|
178
|
+
* surfaces the existing "no dev server running" placeholder.
|
|
179
|
+
*/
|
|
180
|
+
export function pickDefaultPreviewPort(ports) {
|
|
181
|
+
if (ports.length === 0)
|
|
182
|
+
return null;
|
|
183
|
+
// Stable order: oldest registration first. A session that legitimately
|
|
184
|
+
// runs two servers (e.g. vite + express API) should put the FRONTEND
|
|
185
|
+
// (registered first) on the default `/preview/` route; the API is
|
|
186
|
+
// accessed via `/preview/?port=8000`.
|
|
187
|
+
let oldest = ports[0];
|
|
188
|
+
for (const p of ports)
|
|
189
|
+
if (p.registeredAt < oldest.registeredAt)
|
|
190
|
+
oldest = p;
|
|
191
|
+
return oldest.port;
|
|
192
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* node-repl.ts — Node REPL adapter.
|
|
3
|
+
*
|
|
4
|
+
* Node is native (workerd nodejs_compat). Pattern mirrors bun-repl.ts:
|
|
5
|
+
* a long-lived child-facet holds a vm.Context across submits.
|
|
6
|
+
*
|
|
7
|
+
* We do NOT use `node:repl` directly. Although workerd's nodejs_compat
|
|
8
|
+
* exposes node:repl, it expects a terminal stream interface (stdin/
|
|
9
|
+
* stdout) that the facet doesn't have — and trying to attach a
|
|
10
|
+
* Duplex stream to a Worker isolate is a bigger surgery than worth.
|
|
11
|
+
* Instead we replicate the core repl behaviours:
|
|
12
|
+
* - `> ` primary prompt, `... ` continuation
|
|
13
|
+
* - util.inspect of expression values (displayhook)
|
|
14
|
+
* - SyntaxError recoverable-detection for multi-line input
|
|
15
|
+
* - process.exit(code) propagation
|
|
16
|
+
* - .exit / .help / .clear dotted commands
|
|
17
|
+
*
|
|
18
|
+
* NOT supported in v1 (deferred):
|
|
19
|
+
* - REPL_MODE_STRICT switch
|
|
20
|
+
* - Top-level await at the prompt
|
|
21
|
+
* - Tab-completion
|
|
22
|
+
* - History pickling
|
|
23
|
+
*/
|
|
24
|
+
import type { FacetManager } from '../facets/manager.js';
|
|
25
|
+
import type { WebSocketTerminal } from '../facets/ws-terminal.js';
|
|
26
|
+
export interface NodeReplDeps {
|
|
27
|
+
facetMgr: FacetManager;
|
|
28
|
+
terminal: WebSocketTerminal;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Top-level wrapper: builds a Node REPL adapter, drives a ReplSession
|
|
32
|
+
* to completion, returns the exit code. Called from the node factory's
|
|
33
|
+
* wrapper in init.ts when `node` is invoked with no args.
|
|
34
|
+
*/
|
|
35
|
+
export declare function runNodeRepl(deps: NodeReplDeps): Promise<number>;
|
|
36
|
+
//# sourceMappingURL=node-repl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-repl.d.ts","sourceRoot":"","sources":["../../src/runtime/node-repl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKlE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AA2RD;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAIrE"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* node-repl.ts — Node REPL adapter.
|
|
3
|
+
*
|
|
4
|
+
* Node is native (workerd nodejs_compat). Pattern mirrors bun-repl.ts:
|
|
5
|
+
* a long-lived child-facet holds a vm.Context across submits.
|
|
6
|
+
*
|
|
7
|
+
* We do NOT use `node:repl` directly. Although workerd's nodejs_compat
|
|
8
|
+
* exposes node:repl, it expects a terminal stream interface (stdin/
|
|
9
|
+
* stdout) that the facet doesn't have — and trying to attach a
|
|
10
|
+
* Duplex stream to a Worker isolate is a bigger surgery than worth.
|
|
11
|
+
* Instead we replicate the core repl behaviours:
|
|
12
|
+
* - `> ` primary prompt, `... ` continuation
|
|
13
|
+
* - util.inspect of expression values (displayhook)
|
|
14
|
+
* - SyntaxError recoverable-detection for multi-line input
|
|
15
|
+
* - process.exit(code) propagation
|
|
16
|
+
* - .exit / .help / .clear dotted commands
|
|
17
|
+
*
|
|
18
|
+
* NOT supported in v1 (deferred):
|
|
19
|
+
* - REPL_MODE_STRICT switch
|
|
20
|
+
* - Top-level await at the prompt
|
|
21
|
+
* - Tab-completion
|
|
22
|
+
* - History pickling
|
|
23
|
+
*/
|
|
24
|
+
import { ReplSession } from './repl-session.js';
|
|
25
|
+
import { NODE_VERSION } from '../constants.js';
|
|
26
|
+
class NodeReplAdapter {
|
|
27
|
+
pool = null;
|
|
28
|
+
initDone = false;
|
|
29
|
+
deps;
|
|
30
|
+
ps1 = '> ';
|
|
31
|
+
ps2 = '... ';
|
|
32
|
+
constructor(deps) {
|
|
33
|
+
this.deps = deps;
|
|
34
|
+
}
|
|
35
|
+
banner() {
|
|
36
|
+
return (`Node.js ${NODE_VERSION} compatibility layer (Nimbus, over Cloudflare workerd)\r\n` +
|
|
37
|
+
'This is not Node.js itself. It is the workerd `nodejs_compat` API\r\n' +
|
|
38
|
+
"surface on top of V8. workerd's CSP blocks runtime eval/new-Function,\r\n" +
|
|
39
|
+
'so the REPL cannot persist `var`/`let`/`const` across lines.\r\n' +
|
|
40
|
+
'`console.log` and side-effect calls work per line. For stateful work,\r\n' +
|
|
41
|
+
'run a script: `node -e "<code>"` or `node script.js`\r\n' +
|
|
42
|
+
'Type ".help" for more information.\r\n');
|
|
43
|
+
}
|
|
44
|
+
async push(source) {
|
|
45
|
+
const trimmed = source.trim();
|
|
46
|
+
if (trimmed === '.exit') {
|
|
47
|
+
return { kind: 'exit', exitCode: 0 };
|
|
48
|
+
}
|
|
49
|
+
if (trimmed === '.help') {
|
|
50
|
+
return {
|
|
51
|
+
kind: 'output',
|
|
52
|
+
stdout: '.exit Exit the REPL\r\n' +
|
|
53
|
+
'.help Print this help\r\n' +
|
|
54
|
+
'.clear Reset context\r\n',
|
|
55
|
+
stderr: '',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (trimmed === '.clear') {
|
|
59
|
+
this.initDone = false;
|
|
60
|
+
return { kind: 'output', stdout: 'Clearing context...\r\n', stderr: '' };
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await this.ensurePool();
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
return { kind: 'error', stderr: `[node-repl] bootstrap failed: ${e?.message || e}\n` };
|
|
67
|
+
}
|
|
68
|
+
if (!this.initDone) {
|
|
69
|
+
try {
|
|
70
|
+
const initResult = await this.submitFacetFn({ mode: 'init' });
|
|
71
|
+
if (initResult.error) {
|
|
72
|
+
return { kind: 'error', stderr: `[node-repl] init failed: ${initResult.error}\n` };
|
|
73
|
+
}
|
|
74
|
+
this.initDone = true;
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
return { kind: 'error', stderr: `[node-repl] init dispatch failed: ${e?.message || e}\n` };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
let result;
|
|
81
|
+
try {
|
|
82
|
+
result = await this.submitFacetFn({ mode: 'push', source });
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
return { kind: 'error', stderr: `[node-repl] push dispatch failed: ${e?.message || e}\n` };
|
|
86
|
+
}
|
|
87
|
+
if (result.exit) {
|
|
88
|
+
return {
|
|
89
|
+
kind: 'exit',
|
|
90
|
+
exitCode: result.exitCode || 0,
|
|
91
|
+
stdout: result.stdout,
|
|
92
|
+
stderr: result.stderr,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (result.incomplete) {
|
|
96
|
+
return { kind: 'incomplete' };
|
|
97
|
+
}
|
|
98
|
+
return { kind: 'output', stdout: result.stdout || '', stderr: result.stderr || '' };
|
|
99
|
+
}
|
|
100
|
+
async close() {
|
|
101
|
+
if (this.pool) {
|
|
102
|
+
try {
|
|
103
|
+
this.pool.dispose?.();
|
|
104
|
+
}
|
|
105
|
+
catch { /* fail-soft */ }
|
|
106
|
+
this.pool = null;
|
|
107
|
+
}
|
|
108
|
+
this.initDone = false;
|
|
109
|
+
}
|
|
110
|
+
async ensurePool() {
|
|
111
|
+
if (this.pool)
|
|
112
|
+
return;
|
|
113
|
+
const { facetMgr } = this.deps;
|
|
114
|
+
const env = facetMgr.env;
|
|
115
|
+
const ctx = facetMgr.ctx;
|
|
116
|
+
const { NimbusLoaderPool } = await import('../loaders/loader-pool.js');
|
|
117
|
+
this.pool = new NimbusLoaderPool(env, ctx, {
|
|
118
|
+
tag: 'node-repl',
|
|
119
|
+
concurrency: 1,
|
|
120
|
+
omitSupervisor: true,
|
|
121
|
+
preamble: '', // node is native — no preamble shim needed
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async submitFacetFn(args) {
|
|
125
|
+
return await this.pool.submit(nodeReplStepFacetFn, args, {
|
|
126
|
+
timeoutMs: 60_000,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Facet-side function. Self-contained — serialized via fn.toString()
|
|
132
|
+
* across the LOADER boundary; no closure captures, no class refs,
|
|
133
|
+
* no bare 'this' word (the serializer rejects /\bthis\b/).
|
|
134
|
+
*
|
|
135
|
+
* Modes:
|
|
136
|
+
* - 'init': create vm.createContext(), expose curated globals,
|
|
137
|
+
* stash on globalThis.__nimbus_node_ctx.
|
|
138
|
+
* - 'push': try expression-mode eval; fall back to statement-mode;
|
|
139
|
+
* util.inspect non-undefined result; surface process.exit sentinel.
|
|
140
|
+
*/
|
|
141
|
+
function nodeReplStepFacetFn(args) {
|
|
142
|
+
const g = globalThis;
|
|
143
|
+
return (async function () {
|
|
144
|
+
if (args.mode === 'init') {
|
|
145
|
+
// workerd's node:vm is a stub (non-functional in nodejs_compat).
|
|
146
|
+
// Use direct eval against the facet's globalThis with console
|
|
147
|
+
// overrides for output capture + process.exit sentinel.
|
|
148
|
+
// @ts-ignore — node:util via workerd nodejs_compat at runtime.
|
|
149
|
+
const utilMod = await import('node:util');
|
|
150
|
+
g.__nimbus_node_util = utilMod;
|
|
151
|
+
g.__nimbus_node_stdout = [];
|
|
152
|
+
g.__nimbus_node_stderr = [];
|
|
153
|
+
const stdoutPush = (xs) => g.__nimbus_node_stdout.push(xs.map((x) => typeof x === 'string' ? x : utilMod.inspect(x, { colors: false })).join(' ') + '\n');
|
|
154
|
+
const stderrPush = (xs) => g.__nimbus_node_stderr.push(xs.map((x) => typeof x === 'string' ? x : utilMod.inspect(x, { colors: false })).join(' ') + '\n');
|
|
155
|
+
g.__nimbus_node_orig_console = g.console;
|
|
156
|
+
g.console = {
|
|
157
|
+
log: (...xs) => stdoutPush(xs),
|
|
158
|
+
error: (...xs) => stderrPush(xs),
|
|
159
|
+
warn: (...xs) => stderrPush(xs),
|
|
160
|
+
info: (...xs) => stdoutPush(xs),
|
|
161
|
+
debug: (...xs) => stdoutPush(xs),
|
|
162
|
+
};
|
|
163
|
+
if (g.process && typeof g.process === 'object') {
|
|
164
|
+
g.__nimbus_node_orig_exit = g.process.exit;
|
|
165
|
+
g.process.exit = function (code) {
|
|
166
|
+
const err = new Error('__nimbus_node_exit__');
|
|
167
|
+
err.__nimbus_exit_code = typeof code === 'number' ? code : 0;
|
|
168
|
+
throw err;
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return { stdout: '', stderr: '' };
|
|
172
|
+
}
|
|
173
|
+
const source = args.source || '';
|
|
174
|
+
const utilMod = g.__nimbus_node_util;
|
|
175
|
+
if (!utilMod) {
|
|
176
|
+
return { stdout: '', stderr: '', error: 'node repl not initialised' };
|
|
177
|
+
}
|
|
178
|
+
const stdoutStart = g.__nimbus_node_stdout.length;
|
|
179
|
+
const stderrStart = g.__nimbus_node_stderr.length;
|
|
180
|
+
try {
|
|
181
|
+
new Function('(function(){\n' + source + '\n})');
|
|
182
|
+
}
|
|
183
|
+
catch (parseErr) {
|
|
184
|
+
const msg = parseErr?.message || '';
|
|
185
|
+
const incompletePatterns = [
|
|
186
|
+
/Unexpected end of input/i,
|
|
187
|
+
/Unterminated template literal/i,
|
|
188
|
+
/Unterminated string constant/i,
|
|
189
|
+
/missing \) after argument list/i,
|
|
190
|
+
/Unexpected token \}/i,
|
|
191
|
+
];
|
|
192
|
+
if (incompletePatterns.some((re) => re.test(msg))) {
|
|
193
|
+
return {
|
|
194
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
195
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join(''),
|
|
196
|
+
incomplete: true,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// workerd's CSP blocks eval() at request-time. `new Function` is
|
|
201
|
+
// permitted. var/let/const bindings inside the Function body don't
|
|
202
|
+
// persist on globalThis, so we use accumulate-and-replay: each push
|
|
203
|
+
// re-runs the full session history with the new line appended,
|
|
204
|
+
// returning the value of the current line's expression for
|
|
205
|
+
// displayhook.
|
|
206
|
+
if (!g.__nimbus_node_history)
|
|
207
|
+
g.__nimbus_node_history = [];
|
|
208
|
+
let result;
|
|
209
|
+
let evaluatedAs = 'stmt';
|
|
210
|
+
try {
|
|
211
|
+
const histBody = g.__nimbus_node_history.join('\n');
|
|
212
|
+
const exprFn = new Function(histBody + '\nreturn (' + source + '\n);');
|
|
213
|
+
result = exprFn.call(globalThis);
|
|
214
|
+
evaluatedAs = 'expr';
|
|
215
|
+
g.__nimbus_node_history.push(source);
|
|
216
|
+
}
|
|
217
|
+
catch (exprErr) {
|
|
218
|
+
if (exprErr && exprErr.__nimbus_exit_code !== undefined) {
|
|
219
|
+
return {
|
|
220
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
221
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join(''),
|
|
222
|
+
exit: true,
|
|
223
|
+
exitCode: exprErr.__nimbus_exit_code,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (exprErr && /EvalError|Code generation from strings disallowed/i.test(exprErr.message || '')) {
|
|
227
|
+
return {
|
|
228
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
229
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join('') +
|
|
230
|
+
'workerd CSP: cannot evaluate JS at request time. Use `node -e "<code>"` instead.\n',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
const histBody = g.__nimbus_node_history.join('\n');
|
|
235
|
+
const stmtFn = new Function(histBody + '\n' + source);
|
|
236
|
+
result = stmtFn.call(globalThis);
|
|
237
|
+
evaluatedAs = 'stmt';
|
|
238
|
+
g.__nimbus_node_history.push(source);
|
|
239
|
+
}
|
|
240
|
+
catch (stmtErr) {
|
|
241
|
+
if (stmtErr && stmtErr.__nimbus_exit_code !== undefined) {
|
|
242
|
+
return {
|
|
243
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
244
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join(''),
|
|
245
|
+
exit: true,
|
|
246
|
+
exitCode: stmtErr.__nimbus_exit_code,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const errStr = (stmtErr && stmtErr.stack) || String(stmtErr);
|
|
250
|
+
return {
|
|
251
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
252
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join('') + errStr + '\n',
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (result && typeof result.then === 'function') {
|
|
257
|
+
try {
|
|
258
|
+
result = await result;
|
|
259
|
+
}
|
|
260
|
+
catch (awaitErr) {
|
|
261
|
+
const errStr = (awaitErr && awaitErr.stack) || String(awaitErr);
|
|
262
|
+
return {
|
|
263
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
264
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join('') + errStr + '\n',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
if (evaluatedAs === 'expr' && result !== undefined) {
|
|
269
|
+
let rendered;
|
|
270
|
+
try {
|
|
271
|
+
rendered = utilMod.inspect(result, { colors: false, depth: 4 });
|
|
272
|
+
}
|
|
273
|
+
catch (_e) {
|
|
274
|
+
rendered = '<inspect failed>';
|
|
275
|
+
}
|
|
276
|
+
g.__nimbus_node_stdout.push(rendered + '\n');
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
stdout: g.__nimbus_node_stdout.slice(stdoutStart).join(''),
|
|
280
|
+
stderr: g.__nimbus_node_stderr.slice(stderrStart).join(''),
|
|
281
|
+
};
|
|
282
|
+
})();
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Top-level wrapper: builds a Node REPL adapter, drives a ReplSession
|
|
286
|
+
* to completion, returns the exit code. Called from the node factory's
|
|
287
|
+
* wrapper in init.ts when `node` is invoked with no args.
|
|
288
|
+
*/
|
|
289
|
+
export async function runNodeRepl(deps) {
|
|
290
|
+
const adapter = new NodeReplAdapter(deps);
|
|
291
|
+
const session = new ReplSession(adapter, deps.terminal);
|
|
292
|
+
return await session.run();
|
|
293
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* node-runner.ts — Always-fresh-isolate dispatch for `node` and `bun`.
|
|
3
|
+
*
|
|
4
|
+
* Architectural promise (post fresh-isolate-bun-behavioral wave)
|
|
5
|
+
* ─────────────────────────────────────────────────────────────
|
|
6
|
+
* Every external runtime invocation (`node script`, `node -e`,
|
|
7
|
+
* `node --version`, `bun X`, `npx X`) is dispatched into a FRESH
|
|
8
|
+
* Worker Loader isolate. There is NO content-sniffing heuristic; the
|
|
9
|
+
* only routing signal is argv flags that explicitly mean "this is
|
|
10
|
+
* supposed to be long-lived" (`--watch`, `--inspect`, `--inspect-brk`).
|
|
11
|
+
*
|
|
12
|
+
* Two execution modes
|
|
13
|
+
* ───────────────────
|
|
14
|
+
* short — `facetMgr.exec(code, opts)`. Per-call LOADER.get(codeId)
|
|
15
|
+
* creates a fresh isolate keyed on hash(code+bundle+manifest).
|
|
16
|
+
* Output is streamed back via per-pid child DO Facet's
|
|
17
|
+
* supervisor RPC (`_rpcStdout` / `_rpcStderr`); supervisor
|
|
18
|
+
* awaits and returns the consolidated {exitCode, stdout,
|
|
19
|
+
* stderr}. The facet is deleted at completion.
|
|
20
|
+
*
|
|
21
|
+
* long — `facetMgr.spawn(workerCode, command, cwd)`. Fire-and-
|
|
22
|
+
* forget LOADER.load(). Returns {pid, facetStub} immediately;
|
|
23
|
+
* the shell prints a `[started (long-running): pid=N
|
|
24
|
+
* cmd=...]` notice and returns. The facet outlives the
|
|
25
|
+
* supervisor RPC until killed or evicted.
|
|
26
|
+
*
|
|
27
|
+
* Routing
|
|
28
|
+
* ───────
|
|
29
|
+
* args.includes('--watch' | '--inspect' | '--inspect-brk') → long
|
|
30
|
+
* default → short
|
|
31
|
+
*
|
|
32
|
+
* The previous `detectLongRunning(code, args)` content-regex sniff
|
|
33
|
+
* (deprecated) is removed. False-positives (a script that *imports*
|
|
34
|
+
* http but exits quickly) used to fork unnecessarily; with
|
|
35
|
+
* argv-only routing, the user gets the inline behaviour they expect
|
|
36
|
+
* unless they explicitly opted into long-running with a flag.
|
|
37
|
+
*
|
|
38
|
+
* For scripts that don't terminate but also don't carry one of the
|
|
39
|
+
* argv flags (e.g. an http.listen with no --watch), `facetMgr.exec`'s
|
|
40
|
+
* 5-minute timeout caps the worst case. The supervisor returns the
|
|
41
|
+
* timeout exit code; the facet is torn down. Documented trade-off.
|
|
42
|
+
*
|
|
43
|
+
* Anti-requirements observed
|
|
44
|
+
* ──────────────────────────
|
|
45
|
+
* - NO setTimeout / sleep on hot paths.
|
|
46
|
+
* - NO fallback to in-supervisor execution. facetMgr.exec /
|
|
47
|
+
* facetMgr.spawn throw if env.LOADER is missing.
|
|
48
|
+
* - NO content-sniffing heuristic. argv-only routing.
|
|
49
|
+
*
|
|
50
|
+
* Cold-start (measured against prod 9d30dc95):
|
|
51
|
+
* first-run `node -e` : 152–608 ms (warm-isolate cold case)
|
|
52
|
+
* warm `node -e` (median) : 102 ms
|
|
53
|
+
* warm `node script.js` : ~50–100 ms
|
|
54
|
+
* All under the 250ms warm-pool gate; no warm-pool needed.
|
|
55
|
+
*/
|
|
56
|
+
import type { FacetManager } from '../facets/manager.js';
|
|
57
|
+
/**
|
|
58
|
+
* Argv-only long-running detection. The ONLY signals we honour:
|
|
59
|
+
* --watch (node --watch / bun --watch)
|
|
60
|
+
* --inspect (node --inspect)
|
|
61
|
+
* --inspect-brk (node --inspect-brk)
|
|
62
|
+
*
|
|
63
|
+
* No content sniff; no heuristic over the script source. False-positive
|
|
64
|
+
* class is gone. False-negative class is "user runs a server without
|
|
65
|
+
* --watch and the supervisor RPC blocks for 5 min" — accepted; users
|
|
66
|
+
* are guided in docs to add `--watch` for keep-alive servers OR rely
|
|
67
|
+
* on the 5-min timeout to recover.
|
|
68
|
+
*/
|
|
69
|
+
export declare function isLongRunningInvocation(args: string[]): boolean;
|
|
70
|
+
/** Result of a `runFresh` call. */
|
|
71
|
+
export interface RunFreshResult {
|
|
72
|
+
exitCode: number;
|
|
73
|
+
stdout: string;
|
|
74
|
+
stderr: string;
|
|
75
|
+
spawnedPid?: number;
|
|
76
|
+
longRunning: boolean;
|
|
77
|
+
}
|
|
78
|
+
export interface RunFreshOpts {
|
|
79
|
+
argv?: string[];
|
|
80
|
+
env?: Record<string, string>;
|
|
81
|
+
cwd?: string;
|
|
82
|
+
filename?: string;
|
|
83
|
+
dirname?: string;
|
|
84
|
+
/** Display label for the long-running spawn. Defaults to the
|
|
85
|
+
* command + filename. Surfaced in the [started (long-running)]
|
|
86
|
+
* notice + /api/processes listing. */
|
|
87
|
+
command?: string;
|
|
88
|
+
/**
|
|
89
|
+
* G4 (runtime-pkg wave): caller has already allocated a
|
|
90
|
+
* processTable PID for this invocation; runFresh / facetMgr.exec
|
|
91
|
+
* should reuse it instead of spawning a duplicate. Used by the
|
|
92
|
+
* .bin handler in src/session/init.ts to keep `ps` showing ONE
|
|
93
|
+
* row per bin invocation instead of two (the wrapper + the inner
|
|
94
|
+
* node script).
|
|
95
|
+
*/
|
|
96
|
+
skipSpawn?: boolean;
|
|
97
|
+
callerPid?: number;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Always-fresh-isolate dispatcher. Replaces the previous
|
|
101
|
+
* `runNodeScript` content-sniff variant. Used by both `node` and
|
|
102
|
+
* `bun` shell handlers.
|
|
103
|
+
*/
|
|
104
|
+
export declare function runFresh(facetMgr: FacetManager, code: string, opts: RunFreshOpts): Promise<RunFreshResult>;
|
|
105
|
+
/**
|
|
106
|
+
* BACKWARD-COMPAT shim. The arch-gaps wave's `runNodeScript` is now an
|
|
107
|
+
* alias for `runFresh` so the call sites in src/session/init.ts don't
|
|
108
|
+
* need to change in this commit.
|
|
109
|
+
*/
|
|
110
|
+
export declare const runNodeScript: typeof runFresh;
|
|
111
|
+
//# sourceMappingURL=node-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-runner.d.ts","sourceRoot":"","sources":["../../src/runtime/node-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAG1E;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAO/D;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;2CAEuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6CD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CA8DzB;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,iBAAW,CAAC"}
|