@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,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bun-repl.ts — Bun REPL adapter.
|
|
3
|
+
*
|
|
4
|
+
* Bun is native (workerd nodejs_compat) — no facet-bootstrap like
|
|
5
|
+
* Pyodide. We dispatch eval through a long-lived child-facet that
|
|
6
|
+
* holds a vm.Context across submits, so user-defined variables /
|
|
7
|
+
* functions / imports persist.
|
|
8
|
+
*
|
|
9
|
+
* Design:
|
|
10
|
+
* - One child-facet per REPL session (NimbusLoaderPool with
|
|
11
|
+
* concurrency=1, omitSupervisor=true).
|
|
12
|
+
* - Facet-side: globalThis.__nimbus_bun_ctx caches a vm.createContext()
|
|
13
|
+
* dict; each push() runs vm.runInContext(line, ctx) and returns
|
|
14
|
+
* {stdout, stderr, isIncomplete, isExit}.
|
|
15
|
+
* - Continuation detection: probe parse via `new Function(...code)`
|
|
16
|
+
* wrapped in try/catch — recoverable SyntaxError patterns
|
|
17
|
+
* (per Node's repl.Recoverable shape) → incomplete.
|
|
18
|
+
* - Expression displayhook: vm.runInContext returns the last
|
|
19
|
+
* expression value; if !== undefined, util.inspect(value) → stdout.
|
|
20
|
+
* - Exit: override process.exit inside the context to throw a
|
|
21
|
+
* sentinel; catch sentinel → kind:'exit'.
|
|
22
|
+
*
|
|
23
|
+
* NOT supported in v1 (deferred):
|
|
24
|
+
* - Top-level await at the REPL prompt (Bun supports this natively
|
|
25
|
+
* but vm.runInContext doesn't unwrap top-level await — would need
|
|
26
|
+
* vm.SourceTextModule or evaluation pre-wrap).
|
|
27
|
+
* - Ctrl-C mid-execution (no SIGINT plumbing across facet boundary).
|
|
28
|
+
* - Tab-completion.
|
|
29
|
+
*
|
|
30
|
+
* No setTimeout / sleep / retry / defensive-catch on hot paths. Errors
|
|
31
|
+
* thrown by vm bubble up; we surface them as stderr via the runtime
|
|
32
|
+
* stderr capture.
|
|
33
|
+
*/
|
|
34
|
+
import { ReplSession } from './repl-session.js';
|
|
35
|
+
import { BUN_SHIM_PREAMBLE, BUN_VERSION } from './bun-runner.js';
|
|
36
|
+
class BunReplAdapter {
|
|
37
|
+
pool = null;
|
|
38
|
+
initDone = false;
|
|
39
|
+
deps;
|
|
40
|
+
ps1 = '> ';
|
|
41
|
+
ps2 = '... ';
|
|
42
|
+
constructor(deps) {
|
|
43
|
+
this.deps = deps;
|
|
44
|
+
}
|
|
45
|
+
banner() {
|
|
46
|
+
return (`Bun ${BUN_VERSION} emulation (Nimbus, over Cloudflare workerd)\r\n` +
|
|
47
|
+
'This is not Bun itself. It is a Bun-compatible API surface on top of\r\n' +
|
|
48
|
+
"workerd's V8. workerd's CSP blocks runtime eval/new-Function, so the\r\n" +
|
|
49
|
+
'REPL cannot persist `var`/`let`/`const` across lines. `console.log` and\r\n' +
|
|
50
|
+
'side-effect calls work per line. For stateful work, run a script:\r\n' +
|
|
51
|
+
' `bun -e "<code>"` or `bun script.ts`\r\n' +
|
|
52
|
+
'Type ".exit" or press Ctrl-D to exit.\r\n');
|
|
53
|
+
}
|
|
54
|
+
async push(source) {
|
|
55
|
+
// Surface dotted commands the way Node's repl does: .exit, .clear, .help.
|
|
56
|
+
const trimmed = source.trim();
|
|
57
|
+
if (trimmed === '.exit') {
|
|
58
|
+
return { kind: 'exit', exitCode: 0 };
|
|
59
|
+
}
|
|
60
|
+
if (trimmed === '.help') {
|
|
61
|
+
return {
|
|
62
|
+
kind: 'output',
|
|
63
|
+
stdout: '.exit Exit the REPL\r\n.help Print this help\r\n.clear Reset context\r\n',
|
|
64
|
+
stderr: '',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
if (trimmed === '.clear') {
|
|
68
|
+
this.initDone = false;
|
|
69
|
+
return { kind: 'output', stdout: 'Context cleared.\r\n', stderr: '' };
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
await this.ensurePool();
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
return { kind: 'error', stderr: `[bun-repl] bootstrap failed: ${e?.message || e}\n` };
|
|
76
|
+
}
|
|
77
|
+
if (!this.initDone) {
|
|
78
|
+
try {
|
|
79
|
+
const initResult = await this.submitFacetFn({ mode: 'init' });
|
|
80
|
+
if (initResult.error) {
|
|
81
|
+
return { kind: 'error', stderr: `[bun-repl] init failed: ${initResult.error}\n` };
|
|
82
|
+
}
|
|
83
|
+
this.initDone = true;
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
return { kind: 'error', stderr: `[bun-repl] init dispatch failed: ${e?.message || e}\n` };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
let result;
|
|
90
|
+
try {
|
|
91
|
+
result = await this.submitFacetFn({ mode: 'push', source });
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
return { kind: 'error', stderr: `[bun-repl] push dispatch failed: ${e?.message || e}\n` };
|
|
95
|
+
}
|
|
96
|
+
if (result.exit) {
|
|
97
|
+
return {
|
|
98
|
+
kind: 'exit',
|
|
99
|
+
exitCode: result.exitCode || 0,
|
|
100
|
+
stdout: result.stdout,
|
|
101
|
+
stderr: result.stderr,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
if (result.incomplete) {
|
|
105
|
+
return { kind: 'incomplete' };
|
|
106
|
+
}
|
|
107
|
+
return { kind: 'output', stdout: result.stdout || '', stderr: result.stderr || '' };
|
|
108
|
+
}
|
|
109
|
+
async close() {
|
|
110
|
+
if (this.pool) {
|
|
111
|
+
try {
|
|
112
|
+
this.pool.dispose?.();
|
|
113
|
+
}
|
|
114
|
+
catch { /* fail-soft */ }
|
|
115
|
+
this.pool = null;
|
|
116
|
+
}
|
|
117
|
+
this.initDone = false;
|
|
118
|
+
}
|
|
119
|
+
async ensurePool() {
|
|
120
|
+
if (this.pool)
|
|
121
|
+
return;
|
|
122
|
+
const { facetMgr } = this.deps;
|
|
123
|
+
const env = facetMgr.env;
|
|
124
|
+
const ctx = facetMgr.ctx;
|
|
125
|
+
// Preamble: install the Bun shim global at facet startup so the
|
|
126
|
+
// REPL context has Bun.* available like real Bun does.
|
|
127
|
+
const preamble = BUN_SHIM_PREAMBLE;
|
|
128
|
+
const { NimbusLoaderPool } = await import('../loaders/loader-pool.js');
|
|
129
|
+
this.pool = new NimbusLoaderPool(env, ctx, {
|
|
130
|
+
tag: 'bun-repl',
|
|
131
|
+
concurrency: 1,
|
|
132
|
+
omitSupervisor: true,
|
|
133
|
+
preamble,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async submitFacetFn(args) {
|
|
137
|
+
return await this.pool.submit(bunReplStepFacetFn, args, {
|
|
138
|
+
timeoutMs: 60_000,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Facet-side function. Self-contained — serialized via fn.toString()
|
|
144
|
+
* across the LOADER boundary, so no closure captures, no class refs.
|
|
145
|
+
*
|
|
146
|
+
* Modes:
|
|
147
|
+
* - 'init': create vm.createContext() with Bun shim already in
|
|
148
|
+
* globalThis (from preamble), stash on globalThis.__nimbus_bun_ctx.
|
|
149
|
+
* - 'push': vm.runInContext(args.source, ctx); capture stdout/stderr
|
|
150
|
+
* via console hooks; detect SyntaxError-incomplete; detect
|
|
151
|
+
* process.exit sentinel.
|
|
152
|
+
*/
|
|
153
|
+
function bunReplStepFacetFn(args) {
|
|
154
|
+
const g = globalThis;
|
|
155
|
+
return (async function () {
|
|
156
|
+
if (args.mode === 'init') {
|
|
157
|
+
// workerd's node:vm is a stub (per CF docs: "partially supported,
|
|
158
|
+
// non-functional"). runInContext throws "not implemented". Use a
|
|
159
|
+
// direct Function-based eval against the facet's globalThis,
|
|
160
|
+
// with console overridden to capture stdout/stderr and a
|
|
161
|
+
// process.exit override for SystemExit semantics.
|
|
162
|
+
// @ts-ignore — node:util via workerd nodejs_compat at runtime.
|
|
163
|
+
const utilMod = await import('node:util');
|
|
164
|
+
g.__nimbus_bun_util = utilMod;
|
|
165
|
+
g.__nimbus_bun_stdout = [];
|
|
166
|
+
g.__nimbus_bun_stderr = [];
|
|
167
|
+
// Override console on globalThis so user-written console.log
|
|
168
|
+
// routes through capture buffers. process.exit override via
|
|
169
|
+
// a property mutation.
|
|
170
|
+
const stdoutPush = (xs) => g.__nimbus_bun_stdout.push(xs.map((x) => typeof x === 'string' ? x : utilMod.inspect(x, { colors: false })).join(' ') + '\n');
|
|
171
|
+
const stderrPush = (xs) => g.__nimbus_bun_stderr.push(xs.map((x) => typeof x === 'string' ? x : utilMod.inspect(x, { colors: false })).join(' ') + '\n');
|
|
172
|
+
// Preserve any pre-existing console for the supervisor's own logging.
|
|
173
|
+
g.__nimbus_bun_orig_console = g.console;
|
|
174
|
+
g.console = {
|
|
175
|
+
log: (...xs) => stdoutPush(xs),
|
|
176
|
+
error: (...xs) => stderrPush(xs),
|
|
177
|
+
warn: (...xs) => stderrPush(xs),
|
|
178
|
+
info: (...xs) => stdoutPush(xs),
|
|
179
|
+
debug: (...xs) => stdoutPush(xs),
|
|
180
|
+
};
|
|
181
|
+
// process.exit override: throw a sentinel that the eval catches.
|
|
182
|
+
if (g.process && typeof g.process === 'object') {
|
|
183
|
+
g.__nimbus_bun_orig_exit = g.process.exit;
|
|
184
|
+
g.process.exit = function (code) {
|
|
185
|
+
const err = new Error('__nimbus_bun_exit__');
|
|
186
|
+
err.__nimbus_exit_code = typeof code === 'number' ? code : 0;
|
|
187
|
+
throw err;
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return { stdout: '', stderr: '' };
|
|
191
|
+
}
|
|
192
|
+
const source = args.source || '';
|
|
193
|
+
const utilMod = g.__nimbus_bun_util;
|
|
194
|
+
if (!utilMod) {
|
|
195
|
+
return { stdout: '', stderr: '', error: 'bun repl not initialised' };
|
|
196
|
+
}
|
|
197
|
+
const stdoutStart = g.__nimbus_bun_stdout.length;
|
|
198
|
+
const stderrStart = g.__nimbus_bun_stderr.length;
|
|
199
|
+
// Recoverable-syntax detection: wrap user source in a Function ctor
|
|
200
|
+
// call; if it throws specific 'Unexpected end of input'-class
|
|
201
|
+
// messages, signal incomplete to the host.
|
|
202
|
+
try {
|
|
203
|
+
new Function('(function(){\n' + source + '\n})');
|
|
204
|
+
}
|
|
205
|
+
catch (parseErr) {
|
|
206
|
+
const msg = parseErr?.message || '';
|
|
207
|
+
const incompletePatterns = [
|
|
208
|
+
/Unexpected end of input/i,
|
|
209
|
+
/Unterminated template literal/i,
|
|
210
|
+
/Unterminated string constant/i,
|
|
211
|
+
/missing \) after argument list/i,
|
|
212
|
+
/Unexpected token \}/i,
|
|
213
|
+
];
|
|
214
|
+
if (incompletePatterns.some((re) => re.test(msg))) {
|
|
215
|
+
return {
|
|
216
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
217
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join(''),
|
|
218
|
+
incomplete: true,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Evaluate the source. workerd's CSP blocks eval() at request time
|
|
223
|
+
// ("Code generation from strings disallowed"), but `new Function`
|
|
224
|
+
// is permitted because it goes through V8's compile-pipeline as a
|
|
225
|
+
// separate code unit (not synchronously string→eval). The trade-off:
|
|
226
|
+
// var/let/const bindings declared inside the Function body are
|
|
227
|
+
// LOCAL to that function — they DON'T persist on globalThis the
|
|
228
|
+
// way (0, eval) would. To get persistence, we cache the
|
|
229
|
+
// accumulated source on globalThis.__nimbus_bun_history and
|
|
230
|
+
// re-execute the full history on each push, prepending to the
|
|
231
|
+
// current line. The Function's return value is captured for
|
|
232
|
+
// displayhook.
|
|
233
|
+
if (!g.__nimbus_bun_history)
|
|
234
|
+
g.__nimbus_bun_history = [];
|
|
235
|
+
let result;
|
|
236
|
+
let evaluatedAs = 'stmt';
|
|
237
|
+
try {
|
|
238
|
+
const histBody = g.__nimbus_bun_history.join('\n');
|
|
239
|
+
const exprFn = new Function(histBody + '\nreturn (' + source + '\n);');
|
|
240
|
+
result = exprFn.call(globalThis);
|
|
241
|
+
evaluatedAs = 'expr';
|
|
242
|
+
g.__nimbus_bun_history.push(source);
|
|
243
|
+
}
|
|
244
|
+
catch (exprErr) {
|
|
245
|
+
if (exprErr && exprErr.__nimbus_exit_code !== undefined) {
|
|
246
|
+
return {
|
|
247
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
248
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join(''),
|
|
249
|
+
exit: true,
|
|
250
|
+
exitCode: exprErr.__nimbus_exit_code,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// workerd CSP blocks dynamic code → EvalError. Surface a clear
|
|
254
|
+
// message instead of the cryptic stack so users know to use
|
|
255
|
+
// `bun -e` for full functionality.
|
|
256
|
+
if (exprErr && /EvalError|Code generation from strings disallowed/i.test(exprErr.message || '')) {
|
|
257
|
+
return {
|
|
258
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
259
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join('') +
|
|
260
|
+
'workerd CSP: cannot evaluate JS at request time. Use `bun -e "<code>"` instead.\n',
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
try {
|
|
264
|
+
const histBody = g.__nimbus_bun_history.join('\n');
|
|
265
|
+
const stmtFn = new Function(histBody + '\n' + source);
|
|
266
|
+
result = stmtFn.call(globalThis);
|
|
267
|
+
evaluatedAs = 'stmt';
|
|
268
|
+
g.__nimbus_bun_history.push(source);
|
|
269
|
+
}
|
|
270
|
+
catch (stmtErr) {
|
|
271
|
+
if (stmtErr && stmtErr.__nimbus_exit_code !== undefined) {
|
|
272
|
+
return {
|
|
273
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
274
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join(''),
|
|
275
|
+
exit: true,
|
|
276
|
+
exitCode: stmtErr.__nimbus_exit_code,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const errStr = (stmtErr && stmtErr.stack) || String(stmtErr);
|
|
280
|
+
return {
|
|
281
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
282
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join('') + errStr + '\n',
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Resolve thenables — user code may return a Promise from an
|
|
287
|
+
// expression (e.g. `fetch('/api')`). Await it so the displayhook
|
|
288
|
+
// shows the resolved value, not "[object Promise]".
|
|
289
|
+
if (result && typeof result.then === 'function') {
|
|
290
|
+
try {
|
|
291
|
+
result = await result;
|
|
292
|
+
}
|
|
293
|
+
catch (awaitErr) {
|
|
294
|
+
const errStr = (awaitErr && awaitErr.stack) || String(awaitErr);
|
|
295
|
+
return {
|
|
296
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
297
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join('') + errStr + '\n',
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (evaluatedAs === 'expr' && result !== undefined) {
|
|
302
|
+
let rendered;
|
|
303
|
+
try {
|
|
304
|
+
rendered = utilMod.inspect(result, { colors: false, depth: 4 });
|
|
305
|
+
}
|
|
306
|
+
catch (_e) {
|
|
307
|
+
rendered = '<inspect failed>';
|
|
308
|
+
}
|
|
309
|
+
g.__nimbus_bun_stdout.push(rendered + '\n');
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
stdout: g.__nimbus_bun_stdout.slice(stdoutStart).join(''),
|
|
313
|
+
stderr: g.__nimbus_bun_stderr.slice(stderrStart).join(''),
|
|
314
|
+
};
|
|
315
|
+
})();
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Top-level wrapper: builds a Bun REPL adapter, drives a ReplSession
|
|
319
|
+
* to completion, returns the exit code. Called from the bun factory's
|
|
320
|
+
* wrapper in init.ts when `bun` is invoked with no args.
|
|
321
|
+
*/
|
|
322
|
+
export async function runBunRepl(deps) {
|
|
323
|
+
const adapter = new BunReplAdapter(deps);
|
|
324
|
+
const session = new ReplSession(adapter, deps.terminal);
|
|
325
|
+
return await session.run();
|
|
326
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bun-runner.ts — Always-fresh-isolate dispatch for `bun`.
|
|
3
|
+
*
|
|
4
|
+
* Built on the same architecture as src/runtime/node-runner.ts: every
|
|
5
|
+
* `bun X` invocation runs in a fresh Worker Loader isolate. The
|
|
6
|
+
* dispatcher delegates to `runFresh` (in node-runner.ts) which uses
|
|
7
|
+
* `facetMgr.exec` (short scripts) or `facetMgr.spawn` (--watch /
|
|
8
|
+
* --inspect / --inspect-brk).
|
|
9
|
+
*
|
|
10
|
+
* What's bun-specific
|
|
11
|
+
* ───────────────────
|
|
12
|
+
* Before executing the user's script, we PREPEND a `Bun` global
|
|
13
|
+
* shim object that maps the most common Bun APIs onto Workers /
|
|
14
|
+
* Cloudflare-native equivalents:
|
|
15
|
+
*
|
|
16
|
+
* Bun.serve(opts) — wraps via the long-running fork; opts.fetch
|
|
17
|
+
* is the only required field. Returns
|
|
18
|
+
* {port, hostname, stop, url}.
|
|
19
|
+
* Bun.file(path) — VFS-backed BunFile {text, json, exists,
|
|
20
|
+
* arrayBuffer, size, type}.
|
|
21
|
+
* Bun.write(dst, data) — VFS write, accepts string|Uint8Array|
|
|
22
|
+
* Response|BunFile|Blob.
|
|
23
|
+
* Bun.spawn(cmd, opts) — node:child_process.spawn under the hood
|
|
24
|
+
* (via the supervisor's cp-spawn pool).
|
|
25
|
+
* Bun.password.hash/verify — Web Crypto SHA-256 + PBKDF2-style
|
|
26
|
+
* salt-or-bcrypt-compat surface.
|
|
27
|
+
* Bun.gunzip(bytes) — DecompressionStream('gzip') wrapper.
|
|
28
|
+
* Bun.sql(connStr) — stub that throws "not implemented in
|
|
29
|
+
* Cloudflare Workers; use D1/Hyperdrive".
|
|
30
|
+
* Bun.S3 — stub that throws "not implemented; use
|
|
31
|
+
* R2 binding".
|
|
32
|
+
* Bun.argv — process.argv.
|
|
33
|
+
* Bun.env — process.env.
|
|
34
|
+
* Bun.version — string (matches BUN_VERSION constant).
|
|
35
|
+
*
|
|
36
|
+
* Anti-requirements observed (mirrors node-runner.ts):
|
|
37
|
+
* - NO setTimeout / sleep on hot paths.
|
|
38
|
+
* - NO content-sniffing heuristic.
|
|
39
|
+
* - Hard-fail on missing env.LOADER (via runFresh).
|
|
40
|
+
*/
|
|
41
|
+
import type { FacetManager } from '../facets/manager.js';
|
|
42
|
+
import { type RunFreshResult, type RunFreshOpts } from './node-runner.js';
|
|
43
|
+
/** Bun version string surfaced via `bun --version` and `Bun.version`. */
|
|
44
|
+
export declare const BUN_VERSION = "1.1.42";
|
|
45
|
+
/**
|
|
46
|
+
* Source code injected at the top of every `bun` script. Defines the
|
|
47
|
+
* `Bun` global with the documented shims. Self-contained — no external
|
|
48
|
+
* imports beyond what the loader isolate already has (web-API-native
|
|
49
|
+
* crypto, fetch, ReadableStream, DecompressionStream, …).
|
|
50
|
+
*
|
|
51
|
+
* Kept as a single string constant so it can be prepended to user code
|
|
52
|
+
* without esbuild gymnastics.
|
|
53
|
+
*/
|
|
54
|
+
export declare const BUN_SHIM_PREAMBLE: string;
|
|
55
|
+
/**
|
|
56
|
+
* Run a bun script with the Bun shim preamble prepended.
|
|
57
|
+
*
|
|
58
|
+
* The user's `code` is wrapped:
|
|
59
|
+
* <BUN_SHIM_PREAMBLE>;
|
|
60
|
+
* <user code>
|
|
61
|
+
*
|
|
62
|
+
* Routing follows runFresh: argv flags --watch / --inspect /
|
|
63
|
+
* --inspect-brk → long-running fork; otherwise short fresh-isolate.
|
|
64
|
+
*/
|
|
65
|
+
export declare function runBunScript(facetMgr: FacetManager, code: string, opts: RunFreshOpts): Promise<RunFreshResult>;
|
|
66
|
+
//# sourceMappingURL=bun-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bun-runner.d.ts","sourceRoot":"","sources":["../../src/runtime/bun-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAY,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEpF,yEAAyE;AACzE,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,QAwJf,CAAC;AAEhB;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,cAAc,CAAC,CAGzB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bun-runner.ts — Always-fresh-isolate dispatch for `bun`.
|
|
3
|
+
*
|
|
4
|
+
* Built on the same architecture as src/runtime/node-runner.ts: every
|
|
5
|
+
* `bun X` invocation runs in a fresh Worker Loader isolate. The
|
|
6
|
+
* dispatcher delegates to `runFresh` (in node-runner.ts) which uses
|
|
7
|
+
* `facetMgr.exec` (short scripts) or `facetMgr.spawn` (--watch /
|
|
8
|
+
* --inspect / --inspect-brk).
|
|
9
|
+
*
|
|
10
|
+
* What's bun-specific
|
|
11
|
+
* ───────────────────
|
|
12
|
+
* Before executing the user's script, we PREPEND a `Bun` global
|
|
13
|
+
* shim object that maps the most common Bun APIs onto Workers /
|
|
14
|
+
* Cloudflare-native equivalents:
|
|
15
|
+
*
|
|
16
|
+
* Bun.serve(opts) — wraps via the long-running fork; opts.fetch
|
|
17
|
+
* is the only required field. Returns
|
|
18
|
+
* {port, hostname, stop, url}.
|
|
19
|
+
* Bun.file(path) — VFS-backed BunFile {text, json, exists,
|
|
20
|
+
* arrayBuffer, size, type}.
|
|
21
|
+
* Bun.write(dst, data) — VFS write, accepts string|Uint8Array|
|
|
22
|
+
* Response|BunFile|Blob.
|
|
23
|
+
* Bun.spawn(cmd, opts) — node:child_process.spawn under the hood
|
|
24
|
+
* (via the supervisor's cp-spawn pool).
|
|
25
|
+
* Bun.password.hash/verify — Web Crypto SHA-256 + PBKDF2-style
|
|
26
|
+
* salt-or-bcrypt-compat surface.
|
|
27
|
+
* Bun.gunzip(bytes) — DecompressionStream('gzip') wrapper.
|
|
28
|
+
* Bun.sql(connStr) — stub that throws "not implemented in
|
|
29
|
+
* Cloudflare Workers; use D1/Hyperdrive".
|
|
30
|
+
* Bun.S3 — stub that throws "not implemented; use
|
|
31
|
+
* R2 binding".
|
|
32
|
+
* Bun.argv — process.argv.
|
|
33
|
+
* Bun.env — process.env.
|
|
34
|
+
* Bun.version — string (matches BUN_VERSION constant).
|
|
35
|
+
*
|
|
36
|
+
* Anti-requirements observed (mirrors node-runner.ts):
|
|
37
|
+
* - NO setTimeout / sleep on hot paths.
|
|
38
|
+
* - NO content-sniffing heuristic.
|
|
39
|
+
* - Hard-fail on missing env.LOADER (via runFresh).
|
|
40
|
+
*/
|
|
41
|
+
import { runFresh } from './node-runner.js';
|
|
42
|
+
/** Bun version string surfaced via `bun --version` and `Bun.version`. */
|
|
43
|
+
export const BUN_VERSION = '1.1.42';
|
|
44
|
+
/**
|
|
45
|
+
* Source code injected at the top of every `bun` script. Defines the
|
|
46
|
+
* `Bun` global with the documented shims. Self-contained — no external
|
|
47
|
+
* imports beyond what the loader isolate already has (web-API-native
|
|
48
|
+
* crypto, fetch, ReadableStream, DecompressionStream, …).
|
|
49
|
+
*
|
|
50
|
+
* Kept as a single string constant so it can be prepended to user code
|
|
51
|
+
* without esbuild gymnastics.
|
|
52
|
+
*/
|
|
53
|
+
export const BUN_SHIM_PREAMBLE = `
|
|
54
|
+
// ── Bun-runtime shim preamble (Nimbus) ──────────────────────────────
|
|
55
|
+
// Provides a Bun-compatible global for scripts that target the bun
|
|
56
|
+
// runtime. Backed by Workers-native primitives.
|
|
57
|
+
(function installBunShim() {
|
|
58
|
+
if (typeof globalThis.Bun !== 'undefined' && globalThis.Bun.__nimbus) return;
|
|
59
|
+
const fs = (() => { try { return require('fs'); } catch { return null; } })();
|
|
60
|
+
const path = (() => { try { return require('path'); } catch { return null; } })();
|
|
61
|
+
const cp = (() => { try { return require('child_process'); } catch { return null; } })();
|
|
62
|
+
const BUN_VERSION = ${JSON.stringify(BUN_VERSION)};
|
|
63
|
+
|
|
64
|
+
function makeBunFile(p) {
|
|
65
|
+
const resolved = (path && path.resolve) ? path.resolve(p) : p;
|
|
66
|
+
return {
|
|
67
|
+
name: resolved,
|
|
68
|
+
get size() {
|
|
69
|
+
try { return fs.statSync(resolved).size; } catch { return 0; }
|
|
70
|
+
},
|
|
71
|
+
get type() {
|
|
72
|
+
// Best-effort MIME by extension. Workers-native — no mime-db.
|
|
73
|
+
const ext = (resolved.split('.').pop() || '').toLowerCase();
|
|
74
|
+
const map = { html: 'text/html', css: 'text/css', js: 'application/javascript',
|
|
75
|
+
json: 'application/json', txt: 'text/plain', md: 'text/markdown',
|
|
76
|
+
png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', svg: 'image/svg+xml' };
|
|
77
|
+
return map[ext] || 'application/octet-stream';
|
|
78
|
+
},
|
|
79
|
+
async text() { try { return fs.readFileSync(resolved, 'utf8'); } catch { return ''; } },
|
|
80
|
+
async json() { try { return JSON.parse(fs.readFileSync(resolved, 'utf8')); } catch (e) { throw e; } },
|
|
81
|
+
async arrayBuffer() {
|
|
82
|
+
try { const b = fs.readFileSync(resolved); return b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength); }
|
|
83
|
+
catch { return new ArrayBuffer(0); }
|
|
84
|
+
},
|
|
85
|
+
async exists() { try { return fs.existsSync(resolved); } catch { return false; } },
|
|
86
|
+
stream() {
|
|
87
|
+
const text = fs.readFileSync(resolved);
|
|
88
|
+
return new ReadableStream({
|
|
89
|
+
start(controller) { controller.enqueue(text); controller.close(); },
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function bunWrite(dst, data) {
|
|
96
|
+
let target;
|
|
97
|
+
if (typeof dst === 'string') target = dst;
|
|
98
|
+
else if (dst && dst.name) target = dst.name;
|
|
99
|
+
else throw new Error('Bun.write: dst must be a path or BunFile');
|
|
100
|
+
let bytes;
|
|
101
|
+
if (typeof data === 'string') bytes = data;
|
|
102
|
+
else if (data instanceof Uint8Array) bytes = Buffer.from(data);
|
|
103
|
+
else if (data instanceof ArrayBuffer) bytes = Buffer.from(data);
|
|
104
|
+
else if (data && typeof data.text === 'function') bytes = await data.text();
|
|
105
|
+
else if (data && typeof data.arrayBuffer === 'function') {
|
|
106
|
+
const ab = await data.arrayBuffer(); bytes = Buffer.from(ab);
|
|
107
|
+
} else throw new Error('Bun.write: unsupported data type');
|
|
108
|
+
fs.writeFileSync(target, bytes);
|
|
109
|
+
return typeof bytes === 'string' ? bytes.length : bytes.byteLength;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function bunSpawn(cmd, opts) {
|
|
113
|
+
if (!cp) throw new Error('Bun.spawn: child_process unavailable');
|
|
114
|
+
const args = Array.isArray(cmd) ? cmd : [cmd];
|
|
115
|
+
const c = cp.spawn(args[0], args.slice(1), opts || {});
|
|
116
|
+
// Bun.spawn returns a richer object than Node's; expose the common surface.
|
|
117
|
+
return {
|
|
118
|
+
pid: c.pid,
|
|
119
|
+
stdin: c.stdin,
|
|
120
|
+
stdout: c.stdout,
|
|
121
|
+
stderr: c.stderr,
|
|
122
|
+
exitCode: null,
|
|
123
|
+
kill(sig) { return c.kill(sig); },
|
|
124
|
+
exited: new Promise((res) => c.on('exit', (code) => res(code))),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Simple synchronous-style password hashing via Web Crypto. Bun's
|
|
129
|
+
// real impl uses bcrypt by default; this is a safe-enough SHA-256
|
|
130
|
+
// approximation suitable for prototypes — documented as not
|
|
131
|
+
// bcrypt-compatible in the Nimbus README's bun shim section.
|
|
132
|
+
const bunPassword = {
|
|
133
|
+
async hash(pw, _opts) {
|
|
134
|
+
const enc = new TextEncoder().encode(pw);
|
|
135
|
+
const buf = await crypto.subtle.digest('SHA-256', enc);
|
|
136
|
+
const arr = Array.from(new Uint8Array(buf));
|
|
137
|
+
return '$nimbus-sha256$' + arr.map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
138
|
+
},
|
|
139
|
+
async verify(pw, hash) {
|
|
140
|
+
const recomputed = await bunPassword.hash(pw);
|
|
141
|
+
return recomputed === hash;
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
async function bunGunzip(bytes) {
|
|
146
|
+
const u8 = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
147
|
+
const ds = new DecompressionStream('gzip');
|
|
148
|
+
const stream = new Blob([u8]).stream().pipeThrough(ds);
|
|
149
|
+
const out = new Response(stream);
|
|
150
|
+
return new Uint8Array(await out.arrayBuffer());
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
globalThis.Bun = {
|
|
154
|
+
__nimbus: true,
|
|
155
|
+
version: BUN_VERSION,
|
|
156
|
+
revision: 'nimbus-' + BUN_VERSION,
|
|
157
|
+
argv: (typeof process !== 'undefined') ? process.argv : [],
|
|
158
|
+
env: (typeof process !== 'undefined') ? process.env : {},
|
|
159
|
+
file: makeBunFile,
|
|
160
|
+
write: bunWrite,
|
|
161
|
+
spawn: bunSpawn,
|
|
162
|
+
spawnSync(cmd, opts) {
|
|
163
|
+
// Best-effort: cp.spawnSync where available; otherwise throw.
|
|
164
|
+
if (cp && cp.spawnSync) {
|
|
165
|
+
const args = Array.isArray(cmd) ? cmd : [cmd];
|
|
166
|
+
return cp.spawnSync(args[0], args.slice(1), opts || {});
|
|
167
|
+
}
|
|
168
|
+
throw new Error('Bun.spawnSync: child_process.spawnSync unavailable');
|
|
169
|
+
},
|
|
170
|
+
serve(opts) {
|
|
171
|
+
// Minimal Bun.serve shim: registers the user fetch handler under
|
|
172
|
+
// a CommonJS module export so the long-running facet wraps it.
|
|
173
|
+
// The user-visible "started (long-running)" notice fires.
|
|
174
|
+
// Returns a Bun.Server-shaped object.
|
|
175
|
+
const port = (opts && opts.port) || 3000;
|
|
176
|
+
const hostname = (opts && opts.hostname) || '0.0.0.0';
|
|
177
|
+
// Stash the handler globally so the runFresh long-running shim
|
|
178
|
+
// can wire it as the worker entrypoint's fetch handler.
|
|
179
|
+
globalThis.__nimbus_bun_serve = { fetch: opts && opts.fetch, port, hostname };
|
|
180
|
+
console.log('[bun.serve] listening on ' + hostname + ':' + port);
|
|
181
|
+
return {
|
|
182
|
+
port, hostname, url: new URL('http://' + hostname + ':' + port + '/'),
|
|
183
|
+
stop() { /* no-op; facet kill handles teardown */ },
|
|
184
|
+
reload(_opts) { /* no-op */ },
|
|
185
|
+
development: false,
|
|
186
|
+
pendingRequests: 0,
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
sql() { throw new Error('Bun.sql: not implemented on Cloudflare Workers; use D1 or Hyperdrive bindings'); },
|
|
190
|
+
S3: new Proxy({}, {
|
|
191
|
+
get() { throw new Error('Bun.S3: not implemented on Cloudflare Workers; use R2 binding'); },
|
|
192
|
+
}),
|
|
193
|
+
password: bunPassword,
|
|
194
|
+
gunzip: bunGunzip,
|
|
195
|
+
gzipSync() { throw new Error('Bun.gzipSync: not yet implemented; use Node zlib'); },
|
|
196
|
+
inspect(v) { return JSON.stringify(v, null, 2); },
|
|
197
|
+
sleep(ms) { return new Promise((r) => setTimeout(r, ms)); },
|
|
198
|
+
sleepSync(_ms) { throw new Error('Bun.sleepSync: not implementable in async runtime'); },
|
|
199
|
+
nanoseconds() { return BigInt(Math.floor(performance.now() * 1e6)); },
|
|
200
|
+
fileURLToPath(u) { return new URL(u).pathname; },
|
|
201
|
+
pathToFileURL(p) { return new URL('file://' + p); },
|
|
202
|
+
};
|
|
203
|
+
})();
|
|
204
|
+
// ── End Bun-runtime shim preamble ──────────────────────────────────
|
|
205
|
+
`.trim() + '\n';
|
|
206
|
+
/**
|
|
207
|
+
* Run a bun script with the Bun shim preamble prepended.
|
|
208
|
+
*
|
|
209
|
+
* The user's `code` is wrapped:
|
|
210
|
+
* <BUN_SHIM_PREAMBLE>;
|
|
211
|
+
* <user code>
|
|
212
|
+
*
|
|
213
|
+
* Routing follows runFresh: argv flags --watch / --inspect /
|
|
214
|
+
* --inspect-brk → long-running fork; otherwise short fresh-isolate.
|
|
215
|
+
*/
|
|
216
|
+
export async function runBunScript(facetMgr, code, opts) {
|
|
217
|
+
const wrappedCode = BUN_SHIM_PREAMBLE + code;
|
|
218
|
+
return runFresh(facetMgr, wrappedCode, opts);
|
|
219
|
+
}
|