@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
package/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# @nimbus-sh/worker
|
|
2
|
+
|
|
3
|
+
The Nimbus runtime — Durable Object + router + facet machinery — packaged
|
|
4
|
+
for embedding in any Cloudflare Workers project.
|
|
5
|
+
|
|
6
|
+
## Install
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
npm install @nimbus-sh/worker
|
|
10
|
+
# or
|
|
11
|
+
bun add @nimbus-sh/worker
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Quickstart
|
|
15
|
+
|
|
16
|
+
`src/index.ts`:
|
|
17
|
+
|
|
18
|
+
```ts
|
|
19
|
+
import {
|
|
20
|
+
NimbusSession,
|
|
21
|
+
SupervisorRPC,
|
|
22
|
+
NimbusAssetsRPC,
|
|
23
|
+
NimbusLoaderRPC,
|
|
24
|
+
NimbusLoadedWorker,
|
|
25
|
+
NimbusLoadedEntrypoint,
|
|
26
|
+
NimbusDurableObjectNamespace,
|
|
27
|
+
NimbusDOStub,
|
|
28
|
+
CirrusHmrRPC,
|
|
29
|
+
createNimbusHandler,
|
|
30
|
+
} from '@nimbus-sh/worker';
|
|
31
|
+
|
|
32
|
+
// Re-export the DO + every RPC class so wrangler's `class_name` lookup +
|
|
33
|
+
// `enable_ctx_exports` find them in your Worker's main-module exports.
|
|
34
|
+
export {
|
|
35
|
+
NimbusSession,
|
|
36
|
+
SupervisorRPC,
|
|
37
|
+
NimbusAssetsRPC,
|
|
38
|
+
NimbusLoaderRPC,
|
|
39
|
+
NimbusLoadedWorker,
|
|
40
|
+
NimbusLoadedEntrypoint,
|
|
41
|
+
NimbusDurableObjectNamespace,
|
|
42
|
+
NimbusDOStub,
|
|
43
|
+
CirrusHmrRPC,
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export default createNimbusHandler();
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`wrangler.jsonc` (use `@nimbus-sh/config` to generate, or adapt
|
|
50
|
+
`apps/dogfood/wrangler.jsonc`):
|
|
51
|
+
|
|
52
|
+
```jsonc
|
|
53
|
+
{
|
|
54
|
+
"name": "my-nimbus",
|
|
55
|
+
"main": "src/index.ts",
|
|
56
|
+
"compatibility_date": "2026-04-01",
|
|
57
|
+
"compatibility_flags": ["nodejs_compat"],
|
|
58
|
+
"placement": { "mode": "smart" },
|
|
59
|
+
"assets": {
|
|
60
|
+
"directory": "node_modules/@nimbus-sh/worker/public",
|
|
61
|
+
"binding": "ASSETS",
|
|
62
|
+
"run_worker_first": ["/s/*", "/new"]
|
|
63
|
+
},
|
|
64
|
+
"alias": {
|
|
65
|
+
"@lifo-sh/ui": "./node_modules/@nimbus-sh/worker/dist/stubs/lifo-ui.js",
|
|
66
|
+
"clean-git-ref": "clean-git-ref/lib/index.js",
|
|
67
|
+
"is-git-ref-name-valid": "is-git-ref-name-valid/index.js",
|
|
68
|
+
"crc-32": "crc-32",
|
|
69
|
+
"sha.js": "sha.js",
|
|
70
|
+
"pako": "pako", "pify": "pify", "diff": "diff", "diff3": "diff3",
|
|
71
|
+
"ignore": "ignore", "readable-stream": "readable-stream",
|
|
72
|
+
"simple-get": "simple-get", "minimisted": "minimisted"
|
|
73
|
+
},
|
|
74
|
+
"durable_objects": {
|
|
75
|
+
"bindings": [{ "name": "NIMBUS_SESSION", "class_name": "NimbusSession" }]
|
|
76
|
+
},
|
|
77
|
+
"migrations": [
|
|
78
|
+
{ "tag": "nimbus-v1", "new_sqlite_classes": ["NimbusSession"] }
|
|
79
|
+
],
|
|
80
|
+
"worker_loaders": [{ "binding": "LOADER" }],
|
|
81
|
+
"r2_buckets": [
|
|
82
|
+
{ "binding": "NPM_TARBALL_CACHE", "bucket_name": "my-nimbus-npm-cache" },
|
|
83
|
+
{ "binding": "NPM_PACKUMENT_CACHE", "bucket_name": "my-nimbus-npm-packument-cache" },
|
|
84
|
+
{ "binding": "NIMBUS_RUNTIME_CACHE", "bucket_name": "nimbus-runtime-cache-public" }
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Then:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
wrangler secret put JWT_SECRET # 32+ hex chars
|
|
93
|
+
wrangler deploy
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`JWT_SECRET` is required for token-enforced deployments. Legacy-public
|
|
97
|
+
single-tenant demos can set `NIMBUS_LEGACY_PUBLIC=1` and rely on URL
|
|
98
|
+
possession instead.
|
|
99
|
+
|
|
100
|
+
## Composable API
|
|
101
|
+
|
|
102
|
+
`createNimbusHandler(options)` accepts:
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
{
|
|
106
|
+
auth?: { mode?: 'auto' | 'enforce' | 'legacy'; legacyPublic?: boolean };
|
|
107
|
+
hooks?: {
|
|
108
|
+
onSessionStart?: (ctx) => void | Promise<void>;
|
|
109
|
+
onSessionEnd?: (ctx) => void | Promise<void>; // reserved v0.2
|
|
110
|
+
};
|
|
111
|
+
routes?: (request, env, ctx) => Response | null | Promise<Response | null>;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Custom routes
|
|
116
|
+
|
|
117
|
+
Routes that return non-`null` short-circuit Nimbus's router. Use them
|
|
118
|
+
for a token-mint endpoint, `/healthz`, SDK smoke tests, or backend
|
|
119
|
+
sandbox jobs.
|
|
120
|
+
|
|
121
|
+
```ts
|
|
122
|
+
import { issueNimbusToken } from '@nimbus-sh/sdk/token';
|
|
123
|
+
|
|
124
|
+
export default createNimbusHandler({
|
|
125
|
+
routes: async (req, env) => {
|
|
126
|
+
if (new URL(req.url).pathname === '/api/auth/mint' && req.method === 'POST') {
|
|
127
|
+
const { tenant, sub } = await req.json();
|
|
128
|
+
const token = await issueNimbusToken(env, { tn: tenant, sub });
|
|
129
|
+
return Response.json({ token });
|
|
130
|
+
}
|
|
131
|
+
return null;
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Programmatic sandbox route:
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import { Nimbus } from '@nimbus-sh/sdk/sandbox';
|
|
140
|
+
|
|
141
|
+
export default createNimbusHandler({
|
|
142
|
+
routes: async (req, env) => {
|
|
143
|
+
const url = new URL(req.url);
|
|
144
|
+
if (url.pathname === '/api/run-python') {
|
|
145
|
+
const nimbus = Nimbus.fromEnv(env, {
|
|
146
|
+
endpoint: url.origin,
|
|
147
|
+
sandboxes: {
|
|
148
|
+
default: {
|
|
149
|
+
root: '/home/user',
|
|
150
|
+
runtimes: { preinstall: ['python'], onDemand: true },
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
const box = nimbus.sandbox('api-job-1', { tenant: 'api', subject: 'python' });
|
|
155
|
+
const result = await box.runCode('print(2 + 2)', {
|
|
156
|
+
language: 'python',
|
|
157
|
+
install: 'ifMissing',
|
|
158
|
+
});
|
|
159
|
+
return Response.json(result);
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For long-running app servers, start an explicit long-running process and
|
|
167
|
+
expose the virtual port:
|
|
168
|
+
|
|
169
|
+
```ts
|
|
170
|
+
await box.files.write('/home/user/app/server.js', serverSource);
|
|
171
|
+
await box.startProcess('node --watch /home/user/app/server.js');
|
|
172
|
+
const port = await box.ports.expose(3000);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Hooks
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
export default createNimbusHandler({
|
|
179
|
+
hooks: {
|
|
180
|
+
onSessionStart: ({ sessionId, tenantSegment, request }) => {
|
|
181
|
+
console.log(`[${tenantSegment}] session ${sessionId} attached from ${request.headers.get('cf-connecting-ip')}`);
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Auth modes
|
|
188
|
+
|
|
189
|
+
| Mode | Meaning |
|
|
190
|
+
|---|---|
|
|
191
|
+
| `'auto'` (default) | Verify token when `JWT_SECRET` is set AND `NIMBUS_LEGACY_PUBLIC` is unset. Otherwise legacy-public. |
|
|
192
|
+
| `'enforce'` | Always verify token; fail closed if `JWT_SECRET` is missing. |
|
|
193
|
+
| `'legacy'` | Never verify; all requests route to the single `legacy:public:_` tenant. Use only for single-tenant demos. |
|
|
194
|
+
|
|
195
|
+
## Subpath exports
|
|
196
|
+
|
|
197
|
+
| Subpath | What |
|
|
198
|
+
|---|---|
|
|
199
|
+
| `@nimbus-sh/worker` | `NimbusSession`, `SupervisorRPC` + other RPC classes, `createNimbusHandler`, auth types. |
|
|
200
|
+
| `@nimbus-sh/worker/router` | `createNimbusHandler`, hooks types. |
|
|
201
|
+
| `@nimbus-sh/worker/auth` | HS256 JWT issue/verify, typed errors. |
|
|
202
|
+
|
|
203
|
+
## Required bindings
|
|
204
|
+
|
|
205
|
+
Every binding is load-bearing — see `apps/dogfood/wrangler.jsonc` or
|
|
206
|
+
`@nimbus-sh/config` for the canonical set:
|
|
207
|
+
|
|
208
|
+
- `NIMBUS_SESSION` (Durable Object) — per-session SQLite state
|
|
209
|
+
- `LOADER` (Worker Loader) — dynamic-isolate spawning for npm + vite + facets
|
|
210
|
+
- `NPM_TARBALL_CACHE` + `NPM_PACKUMENT_CACHE` + `NIMBUS_RUNTIME_CACHE` (R2)
|
|
211
|
+
- `ASSETS` — serves the xterm shell + lazy-loaded WASM/JS blobs
|
|
212
|
+
- `JWT_SECRET` (secret) — HS256 signing key for token-enforced deployments
|
|
213
|
+
|
|
214
|
+
## Status
|
|
215
|
+
|
|
216
|
+
v0.1 — first public release. SemVer not yet stable; expect breaking
|
|
217
|
+
changes through v0.x. Issues + PRs welcome.
|
|
218
|
+
|
|
219
|
+
MIT. © Ashish Kumar Singh + contributors.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* _shared/bytes.ts — Singleton TextEncoder / TextDecoder.
|
|
3
|
+
*
|
|
4
|
+
* TextEncoder and TextDecoder for UTF-8 are stateless per the WHATWG
|
|
5
|
+
* Encoding spec, so a module-scope singleton is safe and saves the
|
|
6
|
+
* repeated allocation (which shows up in flame graphs of hot paths
|
|
7
|
+
* like sqlite-vfs writeFile and the WebSocket terminal frame decoder).
|
|
8
|
+
*
|
|
9
|
+
* Use these everywhere instead of `new TextEncoder()` / `new TextDecoder()`
|
|
10
|
+
* in the supervisor isolate. Facet-isolate code-strings (e.g. inside
|
|
11
|
+
* generateGitNetworkFacetCode) cannot import this module and must keep
|
|
12
|
+
* their inline allocations — those copies are justified.
|
|
13
|
+
*/
|
|
14
|
+
/** Shared UTF-8 encoder. Stateless; safe to share across all callers. */
|
|
15
|
+
export declare const enc: TextEncoder;
|
|
16
|
+
/** Shared UTF-8 decoder. Stateless; safe to share across all callers. */
|
|
17
|
+
export declare const dec: TextDecoder;
|
|
18
|
+
//# sourceMappingURL=bytes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/_shared/bytes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,eAAO,MAAM,GAAG,aAAoB,CAAC;AAErC,yEAAyE;AACzE,eAAO,MAAM,GAAG,aAAoB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* _shared/bytes.ts — Singleton TextEncoder / TextDecoder.
|
|
3
|
+
*
|
|
4
|
+
* TextEncoder and TextDecoder for UTF-8 are stateless per the WHATWG
|
|
5
|
+
* Encoding spec, so a module-scope singleton is safe and saves the
|
|
6
|
+
* repeated allocation (which shows up in flame graphs of hot paths
|
|
7
|
+
* like sqlite-vfs writeFile and the WebSocket terminal frame decoder).
|
|
8
|
+
*
|
|
9
|
+
* Use these everywhere instead of `new TextEncoder()` / `new TextDecoder()`
|
|
10
|
+
* in the supervisor isolate. Facet-isolate code-strings (e.g. inside
|
|
11
|
+
* generateGitNetworkFacetCode) cannot import this module and must keep
|
|
12
|
+
* their inline allocations — those copies are justified.
|
|
13
|
+
*/
|
|
14
|
+
/** Shared UTF-8 encoder. Stateless; safe to share across all callers. */
|
|
15
|
+
export const enc = new TextEncoder();
|
|
16
|
+
/** Shared UTF-8 decoder. Stateless; safe to share across all callers. */
|
|
17
|
+
export const dec = new TextDecoder();
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cache-stats.ts — Per-tier hit/miss/bytes counters for the npm cache stack.
|
|
3
|
+
*
|
|
4
|
+
* Purpose
|
|
5
|
+
* ───────
|
|
6
|
+
* The supervisor (and its facets) make cache lookups at four tiers:
|
|
7
|
+
*
|
|
8
|
+
* L1 — per-DO SQLite (NpmCache) ~1 ms / file
|
|
9
|
+
* L2 — caches.default (per-colo) ~50-500 µs hit
|
|
10
|
+
* L3 — R2 (cross-tenant global) ~30-100 ms regional
|
|
11
|
+
* L4 — registry.npmjs.org origin ~100-300 ms cross-region
|
|
12
|
+
*
|
|
13
|
+
* Pre-cache-observability wave: hit/miss counters lived in
|
|
14
|
+
* src/observability/diag-counters.ts but only tracked the RPC-call
|
|
15
|
+
* boundary (`r2.tarballHit`, `r2.packumentMiss`), not per-tier. From
|
|
16
|
+
* prod we couldn't tell whether L2 hit-rate was 90% or 30%.
|
|
17
|
+
*
|
|
18
|
+
* This module adds per-tier × per-kind counters. SAME singleton-per-
|
|
19
|
+
* isolate pattern as diag-counters.ts so any supervisor code path can
|
|
20
|
+
* write to it and `/api/_diag/cache` reads it back.
|
|
21
|
+
*
|
|
22
|
+
* Why a separate module instead of extending diag-counters.ts:
|
|
23
|
+
* - Avoids touching diag-counters.ts (other waves may extend that
|
|
24
|
+
* file's R2 race counters; keeping these orthogonal makes rebases
|
|
25
|
+
* trivial).
|
|
26
|
+
* - The new shape (Tier × Kind grid) is structurally different from
|
|
27
|
+
* diag-counters' flat r2.* shape. Mixing them in one type would
|
|
28
|
+
* create awkward conditional types.
|
|
29
|
+
* - The new counters are exposed at /api/_diag/cache; diag-counters
|
|
30
|
+
* is exposed at /api/_diag/memory. Separate endpoints, separate
|
|
31
|
+
* modules.
|
|
32
|
+
*
|
|
33
|
+
* Lives in src/_shared/ so anyone (supervisor + future facet code) can
|
|
34
|
+
* import it without crossing the npm/, runtime/, facets/ boundaries
|
|
35
|
+
* that have wave-owners.
|
|
36
|
+
*/
|
|
37
|
+
/**
|
|
38
|
+
* Tier in the cache stack. Each tier is checked in order from L1 (warmest,
|
|
39
|
+
* fastest) down to L4 (coldest, slowest origin). Cache writes typically
|
|
40
|
+
* "fill" lower numbers from higher numbers — an L4 fetch may writeback
|
|
41
|
+
* to L3 and L2, an L3 hit may writeback to L2, etc.
|
|
42
|
+
*/
|
|
43
|
+
export type CacheTier = 'L1' | 'L2' | 'L3' | 'L4';
|
|
44
|
+
/**
|
|
45
|
+
* Kind of content cached. Each kind has its own size profile and eviction
|
|
46
|
+
* policy:
|
|
47
|
+
*
|
|
48
|
+
* tarball — gzipped tar bytes, immutable forever, 30 MiB cap on L3
|
|
49
|
+
* packument — registry metadata JSON, TTL-bounded (60 min post-P6),
|
|
50
|
+
* unbounded size in practice (~10 KB - 1 MB typical)
|
|
51
|
+
* asset — non-package binaries cached cross-tenant (esbuild.wasm,
|
|
52
|
+
* rolldown.wasm, etc.). Immutable forever, low churn.
|
|
53
|
+
*/
|
|
54
|
+
export type CacheKind = 'tarball' | 'packument' | 'asset';
|
|
55
|
+
/**
|
|
56
|
+
* Per-(tier, kind) cell. A hit happened when we asked the tier "do you
|
|
57
|
+
* have <key>?" and it said yes (and returned bytes). A miss happened when
|
|
58
|
+
* we asked and it said no.
|
|
59
|
+
*
|
|
60
|
+
* `bytes` accumulates the size of HIT payloads only — misses have no
|
|
61
|
+
* bytes by definition. This means:
|
|
62
|
+
*
|
|
63
|
+
* bytes / hits = average hit payload size
|
|
64
|
+
*
|
|
65
|
+
* which is the metric operators care about for capacity planning.
|
|
66
|
+
*/
|
|
67
|
+
export interface CacheCell {
|
|
68
|
+
hits: number;
|
|
69
|
+
misses: number;
|
|
70
|
+
/** Cumulative bytes returned on hits. Does NOT include miss "size" (0). */
|
|
71
|
+
bytes: number;
|
|
72
|
+
}
|
|
73
|
+
export interface CacheStatsSnapshot {
|
|
74
|
+
/** Tier × Kind grid. Each cell tracks hits, misses, bytes-on-hit. */
|
|
75
|
+
byTier: Record<CacheTier, Record<CacheKind, CacheCell>>;
|
|
76
|
+
/**
|
|
77
|
+
* Wall-clock ms at module load (when this isolate first received a
|
|
78
|
+
* request that imported this module). Stable across requests within
|
|
79
|
+
* the same isolate; resets on DO reboot (itself a useful signal).
|
|
80
|
+
*/
|
|
81
|
+
startedAt: number;
|
|
82
|
+
/**
|
|
83
|
+
* Wall-clock ms at the most recent `reset()` call. Equals startedAt
|
|
84
|
+
* if reset() has never been called.
|
|
85
|
+
*/
|
|
86
|
+
lastResetAt: number;
|
|
87
|
+
/**
|
|
88
|
+
* Derived hit-rate per (tier, kind), 0..1. Computed as
|
|
89
|
+
* hits / (hits + misses). NaN-safe: returns 0 when (hits + misses)
|
|
90
|
+
* is 0 so JSON serialisation stays clean. Mirrors the byTier shape
|
|
91
|
+
* exactly so consumers can ZIP the two structures with the same key
|
|
92
|
+
* paths.
|
|
93
|
+
*/
|
|
94
|
+
hitRate: Record<CacheTier, Record<CacheKind, number>>;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Record a cache HIT at the given tier for the given kind.
|
|
98
|
+
*
|
|
99
|
+
* `bytes` is the size of the payload returned by the hit, in bytes.
|
|
100
|
+
* For packuments this is the JSON text length; for tarballs it's the
|
|
101
|
+
* gzipped tar byte length; for assets it's the asset bytes. The caller
|
|
102
|
+
* already has the size (post-fetch); passing it here is cheap.
|
|
103
|
+
*
|
|
104
|
+
* Pass 0 if the hit returned an empty payload (shouldn't happen in
|
|
105
|
+
* practice but the API tolerates it).
|
|
106
|
+
*/
|
|
107
|
+
export declare function recordHit(tier: CacheTier, kind: CacheKind, bytes: number): void;
|
|
108
|
+
/**
|
|
109
|
+
* Record a cache MISS at the given tier for the given kind.
|
|
110
|
+
*
|
|
111
|
+
* Misses don't carry payload bytes. A miss at tier N typically means
|
|
112
|
+
* the caller will fall through to tier N+1; that downstream call will
|
|
113
|
+
* record its OWN hit or miss. So a single fetch flow naturally records
|
|
114
|
+
* a chain of misses ending in one hit at the tier that served the data.
|
|
115
|
+
*
|
|
116
|
+
* Example: cold fetch of `react@18.3.1` tarball records:
|
|
117
|
+
*
|
|
118
|
+
* recordMiss('L1', 'tarball');
|
|
119
|
+
* recordMiss('L2', 'tarball');
|
|
120
|
+
* recordMiss('L3', 'tarball');
|
|
121
|
+
* recordHit('L4', 'tarball', 12345); // bytes from registry response
|
|
122
|
+
*
|
|
123
|
+
* After the writeback path runs, the same key from a subsequent fetch
|
|
124
|
+
* would record:
|
|
125
|
+
*
|
|
126
|
+
* recordMiss('L1', 'tarball');
|
|
127
|
+
* recordHit('L2', 'tarball', 12345);
|
|
128
|
+
*/
|
|
129
|
+
export declare function recordMiss(tier: CacheTier, kind: CacheKind): void;
|
|
130
|
+
/**
|
|
131
|
+
* Return a snapshot of current counters + derived hit-rates.
|
|
132
|
+
*
|
|
133
|
+
* The returned object is a fresh copy — caller-side mutations don't
|
|
134
|
+
* affect the singleton. Mirrors readDiagCounters() in diag-counters.ts.
|
|
135
|
+
*/
|
|
136
|
+
export declare function snapshot(): CacheStatsSnapshot;
|
|
137
|
+
/**
|
|
138
|
+
* Zero all counters. Sets lastResetAt to now. Used by the
|
|
139
|
+
* `/api/_diag/cache/reset` endpoint to start a fresh measurement window.
|
|
140
|
+
*
|
|
141
|
+
* Does NOT clear startedAt — that remains the original module-load time
|
|
142
|
+
* so operators can tell "this isolate has been up for X but counters
|
|
143
|
+
* were reset at Y" (the gap is intentional vs an isolate reboot).
|
|
144
|
+
*/
|
|
145
|
+
export declare function reset(): void;
|
|
146
|
+
//# sourceMappingURL=cache-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-stats.d.ts","sourceRoot":"","sources":["../../src/_shared/cache-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD;;;;;;;;;GASG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAE1D;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAyCD;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAO/E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAGjE;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,IAAI,kBAAkB,CAqB7C;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAS5B"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cache-stats.ts — Per-tier hit/miss/bytes counters for the npm cache stack.
|
|
3
|
+
*
|
|
4
|
+
* Purpose
|
|
5
|
+
* ───────
|
|
6
|
+
* The supervisor (and its facets) make cache lookups at four tiers:
|
|
7
|
+
*
|
|
8
|
+
* L1 — per-DO SQLite (NpmCache) ~1 ms / file
|
|
9
|
+
* L2 — caches.default (per-colo) ~50-500 µs hit
|
|
10
|
+
* L3 — R2 (cross-tenant global) ~30-100 ms regional
|
|
11
|
+
* L4 — registry.npmjs.org origin ~100-300 ms cross-region
|
|
12
|
+
*
|
|
13
|
+
* Pre-cache-observability wave: hit/miss counters lived in
|
|
14
|
+
* src/observability/diag-counters.ts but only tracked the RPC-call
|
|
15
|
+
* boundary (`r2.tarballHit`, `r2.packumentMiss`), not per-tier. From
|
|
16
|
+
* prod we couldn't tell whether L2 hit-rate was 90% or 30%.
|
|
17
|
+
*
|
|
18
|
+
* This module adds per-tier × per-kind counters. SAME singleton-per-
|
|
19
|
+
* isolate pattern as diag-counters.ts so any supervisor code path can
|
|
20
|
+
* write to it and `/api/_diag/cache` reads it back.
|
|
21
|
+
*
|
|
22
|
+
* Why a separate module instead of extending diag-counters.ts:
|
|
23
|
+
* - Avoids touching diag-counters.ts (other waves may extend that
|
|
24
|
+
* file's R2 race counters; keeping these orthogonal makes rebases
|
|
25
|
+
* trivial).
|
|
26
|
+
* - The new shape (Tier × Kind grid) is structurally different from
|
|
27
|
+
* diag-counters' flat r2.* shape. Mixing them in one type would
|
|
28
|
+
* create awkward conditional types.
|
|
29
|
+
* - The new counters are exposed at /api/_diag/cache; diag-counters
|
|
30
|
+
* is exposed at /api/_diag/memory. Separate endpoints, separate
|
|
31
|
+
* modules.
|
|
32
|
+
*
|
|
33
|
+
* Lives in src/_shared/ so anyone (supervisor + future facet code) can
|
|
34
|
+
* import it without crossing the npm/, runtime/, facets/ boundaries
|
|
35
|
+
* that have wave-owners.
|
|
36
|
+
*/
|
|
37
|
+
const TIERS = ['L1', 'L2', 'L3', 'L4'];
|
|
38
|
+
const KINDS = ['tarball', 'packument', 'asset'];
|
|
39
|
+
function makeEmptyGrid() {
|
|
40
|
+
const grid = {};
|
|
41
|
+
for (const tier of TIERS) {
|
|
42
|
+
grid[tier] = {};
|
|
43
|
+
for (const kind of KINDS) {
|
|
44
|
+
grid[tier][kind] = { hits: 0, misses: 0, bytes: 0 };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return grid;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Module-scoped singleton. Lives for the lifetime of the isolate.
|
|
51
|
+
*
|
|
52
|
+
* Workerd may evict the isolate at any time (memory pressure, idle
|
|
53
|
+
* shutdown, code update); when that happens, counters reset to zero
|
|
54
|
+
* on the next request — itself diagnostic signal: counters all-zero
|
|
55
|
+
* immediately after a request means we just woke up from cold.
|
|
56
|
+
*
|
|
57
|
+
* startedAt lazy-init: workerd returns 0 for `Date.now()` at
|
|
58
|
+
* module-evaluation time because IO is gated until the first request.
|
|
59
|
+
* Initialize lazily on the first hit/miss/snapshot so the timestamp
|
|
60
|
+
* reflects actual module-first-touched-by-request time, not the
|
|
61
|
+
* sentinel 0 value.
|
|
62
|
+
*/
|
|
63
|
+
const _grid = makeEmptyGrid();
|
|
64
|
+
let _startedAt = 0;
|
|
65
|
+
let _lastResetAt = 0;
|
|
66
|
+
function _ensureStartedAt() {
|
|
67
|
+
if (_startedAt === 0) {
|
|
68
|
+
const now = Date.now();
|
|
69
|
+
_startedAt = now;
|
|
70
|
+
_lastResetAt = now;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Record a cache HIT at the given tier for the given kind.
|
|
75
|
+
*
|
|
76
|
+
* `bytes` is the size of the payload returned by the hit, in bytes.
|
|
77
|
+
* For packuments this is the JSON text length; for tarballs it's the
|
|
78
|
+
* gzipped tar byte length; for assets it's the asset bytes. The caller
|
|
79
|
+
* already has the size (post-fetch); passing it here is cheap.
|
|
80
|
+
*
|
|
81
|
+
* Pass 0 if the hit returned an empty payload (shouldn't happen in
|
|
82
|
+
* practice but the API tolerates it).
|
|
83
|
+
*/
|
|
84
|
+
export function recordHit(tier, kind, bytes) {
|
|
85
|
+
_ensureStartedAt();
|
|
86
|
+
const cell = _grid[tier][kind];
|
|
87
|
+
cell.hits++;
|
|
88
|
+
// Negative bytes is meaningless; coerce to 0. We trust the caller for
|
|
89
|
+
// accuracy but defend against accidental -1 sentinels.
|
|
90
|
+
cell.bytes += bytes > 0 ? bytes : 0;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Record a cache MISS at the given tier for the given kind.
|
|
94
|
+
*
|
|
95
|
+
* Misses don't carry payload bytes. A miss at tier N typically means
|
|
96
|
+
* the caller will fall through to tier N+1; that downstream call will
|
|
97
|
+
* record its OWN hit or miss. So a single fetch flow naturally records
|
|
98
|
+
* a chain of misses ending in one hit at the tier that served the data.
|
|
99
|
+
*
|
|
100
|
+
* Example: cold fetch of `react@18.3.1` tarball records:
|
|
101
|
+
*
|
|
102
|
+
* recordMiss('L1', 'tarball');
|
|
103
|
+
* recordMiss('L2', 'tarball');
|
|
104
|
+
* recordMiss('L3', 'tarball');
|
|
105
|
+
* recordHit('L4', 'tarball', 12345); // bytes from registry response
|
|
106
|
+
*
|
|
107
|
+
* After the writeback path runs, the same key from a subsequent fetch
|
|
108
|
+
* would record:
|
|
109
|
+
*
|
|
110
|
+
* recordMiss('L1', 'tarball');
|
|
111
|
+
* recordHit('L2', 'tarball', 12345);
|
|
112
|
+
*/
|
|
113
|
+
export function recordMiss(tier, kind) {
|
|
114
|
+
_ensureStartedAt();
|
|
115
|
+
_grid[tier][kind].misses++;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Return a snapshot of current counters + derived hit-rates.
|
|
119
|
+
*
|
|
120
|
+
* The returned object is a fresh copy — caller-side mutations don't
|
|
121
|
+
* affect the singleton. Mirrors readDiagCounters() in diag-counters.ts.
|
|
122
|
+
*/
|
|
123
|
+
export function snapshot() {
|
|
124
|
+
_ensureStartedAt();
|
|
125
|
+
// Deep copy so caller mutations don't leak back into the singleton.
|
|
126
|
+
const byTier = {};
|
|
127
|
+
const hitRate = {};
|
|
128
|
+
for (const tier of TIERS) {
|
|
129
|
+
byTier[tier] = {};
|
|
130
|
+
hitRate[tier] = {};
|
|
131
|
+
for (const kind of KINDS) {
|
|
132
|
+
const c = _grid[tier][kind];
|
|
133
|
+
byTier[tier][kind] = { hits: c.hits, misses: c.misses, bytes: c.bytes };
|
|
134
|
+
const lookups = c.hits + c.misses;
|
|
135
|
+
hitRate[tier][kind] = lookups === 0 ? 0 : c.hits / lookups;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
byTier,
|
|
140
|
+
startedAt: _startedAt,
|
|
141
|
+
lastResetAt: _lastResetAt,
|
|
142
|
+
hitRate,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Zero all counters. Sets lastResetAt to now. Used by the
|
|
147
|
+
* `/api/_diag/cache/reset` endpoint to start a fresh measurement window.
|
|
148
|
+
*
|
|
149
|
+
* Does NOT clear startedAt — that remains the original module-load time
|
|
150
|
+
* so operators can tell "this isolate has been up for X but counters
|
|
151
|
+
* were reset at Y" (the gap is intentional vs an isolate reboot).
|
|
152
|
+
*/
|
|
153
|
+
export function reset() {
|
|
154
|
+
for (const tier of TIERS) {
|
|
155
|
+
for (const kind of KINDS) {
|
|
156
|
+
_grid[tier][kind].hits = 0;
|
|
157
|
+
_grid[tier][kind].misses = 0;
|
|
158
|
+
_grid[tier][kind].bytes = 0;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
_lastResetAt = Date.now();
|
|
162
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* exports-resolver.ts — Single source of truth for `package.json#exports` /
|
|
3
|
+
* `package.json#imports` resolution per the Node.js spec.
|
|
4
|
+
*
|
|
5
|
+
* Used in three contexts:
|
|
6
|
+
*
|
|
7
|
+
* 1. Install-time supervisor (TS) — `src/npm-resolver.ts` re-exports the
|
|
8
|
+
* typed functions for tree resolution.
|
|
9
|
+
*
|
|
10
|
+
* 2. NimbusLoaderPool isolates (JS string) — `src/parallel/pre-bundle-preamble.ts`
|
|
11
|
+
* embeds `getExportsResolverJS()` as part of the pool preamble so the
|
|
12
|
+
* pre-bundle facet uses identical resolution semantics to the supervisor.
|
|
13
|
+
*
|
|
14
|
+
* 3. User-shell `node` runtime (JS string) — `src/node-shims.ts` embeds
|
|
15
|
+
* the same JS source so `require()` from inside a user's `node` script
|
|
16
|
+
* sees the same exports map as the install pipeline.
|
|
17
|
+
*
|
|
18
|
+
* Audit reference: audit/sections/03-resolver-gaps.md §3.1, §3.2.
|
|
19
|
+
*
|
|
20
|
+
* Spec features supported:
|
|
21
|
+
* - String shorthand: "exports": "./dist/index.mjs"
|
|
22
|
+
* - Subpath maps: { ".": "...", "./client": "..." }
|
|
23
|
+
* - Conditional maps (top-level): { "import": "...", "require": "..." }
|
|
24
|
+
* - Nested conditions: { ".": { "node": { "default": "..." } } }
|
|
25
|
+
* - Subpath wildcards: { "./*": "./dist/*.js" }
|
|
26
|
+
* - Array fallbacks: [ "./esm.js", "./cjs.js" ]
|
|
27
|
+
* - `imports` field (`#name`): same shape, same impl (re-uses resolveExports)
|
|
28
|
+
* - Null-target enforcement: { "./private/*": null } — returns null, blocks fallback
|
|
29
|
+
*
|
|
30
|
+
* Caller-controlled `conditions` lets the same impl serve:
|
|
31
|
+
* - install/ESM/browser → ['import', 'module', 'browser', 'default']
|
|
32
|
+
* - runtime CJS → ['require', 'node', 'default']
|
|
33
|
+
*/
|
|
34
|
+
/** Default conditions for ESM/install/browser resolution. */
|
|
35
|
+
export declare const DEFAULT_ESM_CONDITIONS: string[];
|
|
36
|
+
/** Default conditions for CJS runtime resolution (user-shell node). */
|
|
37
|
+
export declare const DEFAULT_CJS_CONDITIONS: string[];
|
|
38
|
+
/**
|
|
39
|
+
* Resolve `package.json#exports` (or `#imports`) per Node spec.
|
|
40
|
+
*
|
|
41
|
+
* @param exportsField Raw value from package.json#exports or #imports
|
|
42
|
+
* @param subpath '.' for root, './foo' for subpath, '#name' for imports
|
|
43
|
+
* @param conditions Active conditions, in priority order
|
|
44
|
+
* @returns Relative path target string, or null if not found / forbidden
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveExports(exportsField: any, subpath?: string, conditions?: string[]): string | null;
|
|
47
|
+
/**
|
|
48
|
+
* Resolve a package's entry-point file relative to its directory.
|
|
49
|
+
* Priority: exports → module → main → null.
|
|
50
|
+
* For non-root subpaths without an `exports` field, returns the subpath
|
|
51
|
+
* itself (caller probes filesystem with extension-list).
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolvePackageEntry(pkg: {
|
|
54
|
+
exports?: any;
|
|
55
|
+
module?: string;
|
|
56
|
+
main?: string;
|
|
57
|
+
}, subpath?: string, conditions?: string[]): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Returns the resolver source as plain JavaScript (no TypeScript syntax),
|
|
60
|
+
* suitable for embedding into a generated worker preamble or shim string.
|
|
61
|
+
*
|
|
62
|
+
* The emitted source declares three top-level functions in scope:
|
|
63
|
+
* - resolveExports(exports, subpath, conditions)
|
|
64
|
+
* - resolveConditionValue(target, conditions) (helper)
|
|
65
|
+
* - resolvePackageEntry(pkg, subpath, conditions)
|
|
66
|
+
*
|
|
67
|
+
* It also declares two arrays:
|
|
68
|
+
* - DEFAULT_ESM_CONDITIONS
|
|
69
|
+
* - DEFAULT_CJS_CONDITIONS
|
|
70
|
+
*
|
|
71
|
+
* This source must be byte-equivalent to the TS impl above (modulo type
|
|
72
|
+
* annotations and `export` keywords). Keep them in sync — there is one
|
|
73
|
+
* verification probe in audit/probes that compares parity.
|
|
74
|
+
*/
|
|
75
|
+
export declare function getExportsResolverJS(): string;
|
|
76
|
+
//# sourceMappingURL=exports-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exports-resolver.d.ts","sourceRoot":"","sources":["../../src/_shared/exports-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,UAA6C,CAAC;AAEjF,uEAAuE;AACvE,eAAO,MAAM,sBAAsB,UAAiC,CAAC;AAErE;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,GAAG,EACjB,OAAO,GAAE,MAAY,EACrB,UAAU,GAAE,MAAM,EAA2B,GAC5C,MAAM,GAAG,IAAI,CAkEf;AAwCD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EACtD,OAAO,GAAE,MAAY,EACrB,UAAU,GAAE,MAAM,EAA2B,GAC5C,MAAM,GAAG,IAAI,CAqBf;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAiG7C"}
|