@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,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* diag-counters.ts — application-level memory + phase observability.
|
|
3
|
+
*
|
|
4
|
+
* Why: workerd's `process.memoryUsage()` returns 0 for all fields inside
|
|
5
|
+
* a Durable Object class context (only dynamic-worker isolates under
|
|
6
|
+
* nodejs_compat get the real implementation). Without a working heap
|
|
7
|
+
* probe we have no way to confirm OOM hypotheses or verify a fix.
|
|
8
|
+
*
|
|
9
|
+
* Replacement: deterministic counters bumped at known allocation sites.
|
|
10
|
+
* Cumulative bytes decoded, in-flight stub counts, and phase markers
|
|
11
|
+
* give us the same operational signal as a heap probe — and they're
|
|
12
|
+
* exact, not estimated.
|
|
13
|
+
*
|
|
14
|
+
* Singleton-per-isolate. Lives at module scope so any code path in the
|
|
15
|
+
* supervisor bundle can write to it (installer, resolver, retry) and
|
|
16
|
+
* the request handler in nimbus-session.ts:/api/_diag/memory can read
|
|
17
|
+
* it. Survives across requests within the same isolate; resets on DO
|
|
18
|
+
* reboot — itself a useful signal (counters at 0 immediately after the
|
|
19
|
+
* banner reprinted = the killed isolate took its state with it).
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Phase tags surfaced via /api/_diag/memory. Strings are ASCII so
|
|
23
|
+
* humans can grep for them in logs.
|
|
24
|
+
*
|
|
25
|
+
* installPhase tracks the high-level npm-install state machine:
|
|
26
|
+
* idle → resolve → hoist → diff → fetch → write → link-bins → bundle → done
|
|
27
|
+
*
|
|
28
|
+
* resolverPhase tracks what resolveTree / resolvePackage is doing
|
|
29
|
+
* RIGHT NOW (only meaningful while installPhase === 'resolve'):
|
|
30
|
+
* idle → fetching → parsing → caching → done
|
|
31
|
+
*/
|
|
32
|
+
export type { InstallPhase } from '../_shared/install-phase.js';
|
|
33
|
+
import type { InstallPhase } from '../_shared/install-phase.js';
|
|
34
|
+
export type ResolverPhase = 'idle' | 'fetching' | 'parsing' | 'caching' | 'done';
|
|
35
|
+
export interface DiagCounters {
|
|
36
|
+
/** Top-level install phase. */
|
|
37
|
+
installPhase: InstallPhase;
|
|
38
|
+
/** Sub-phase within the resolver. Set only during 'resolve'. */
|
|
39
|
+
resolverPhase: ResolverPhase;
|
|
40
|
+
/** Number of packument fetches currently awaiting a response. */
|
|
41
|
+
inFlightPackumentFetches: number;
|
|
42
|
+
/** Number of RPC Response stubs alive (incremented at fetch entry,
|
|
43
|
+
* decremented at dispose / explicit drop). Should track close to
|
|
44
|
+
* inFlightPackumentFetches; a divergence means we're leaking. */
|
|
45
|
+
liveResponseStubs: number;
|
|
46
|
+
/**
|
|
47
|
+
* Sum of payload bytes claimed by RPCs currently in flight on the
|
|
48
|
+
* SUPERVISOR boundary [Phase 2 A'.2].
|
|
49
|
+
*
|
|
50
|
+
* Bumped at RPC entry by `rpcPayloadStart(bytes)` (called from
|
|
51
|
+
* src/supervisor-rpc.ts handlers); debited at exit by
|
|
52
|
+
* `rpcPayloadEnd(bytes)`. Goes back to zero after every RPC settles.
|
|
53
|
+
*
|
|
54
|
+
* The C'.1 heap estimator surfaces this as
|
|
55
|
+
* `breakdown.streamingBuffersBytes` so any RPC path that buffers
|
|
56
|
+
* MORE than the W7 streaming guarantee shows up as supervisor heap
|
|
57
|
+
* pressure rather than disappearing into the bundle baseline.
|
|
58
|
+
*
|
|
59
|
+
* Streamed payloads (writeBatchStream over W7 frames) report -1
|
|
60
|
+
* up-front; we substitute 0 here because the bytes flow with
|
|
61
|
+
* backpressure and the supervisor-resident buffer is bounded by
|
|
62
|
+
* the W7 chunk size (a few KiB), not by the total payload.
|
|
63
|
+
*/
|
|
64
|
+
inFlightRpcPayloadBytes: number;
|
|
65
|
+
/** Bytes returned by the most recent packument fetch (Content-Length
|
|
66
|
+
* if advertised, else final buffer size). Spot indicator for the
|
|
67
|
+
* current spike. */
|
|
68
|
+
lastPackumentBytes: number;
|
|
69
|
+
/** Cumulative bytes JSON.parse'd from packuments since process start.
|
|
70
|
+
* THIS IS THE SMOKING GUN: pre-fix we expect this to climb into
|
|
71
|
+
* hundreds of MB on the supervisor before the crash; post-fix
|
|
72
|
+
* (resolver moved to facet) we expect this to stay near 0. */
|
|
73
|
+
cumulativePackumentBytesDecoded: number;
|
|
74
|
+
/** Number of packuments fully decoded since process start. */
|
|
75
|
+
packumentsDecoded: number;
|
|
76
|
+
/** Most recent packument name + size — useful for narrowing which
|
|
77
|
+
* registry entry tripped a spike. */
|
|
78
|
+
lastPackumentName: string;
|
|
79
|
+
/** Whether the resolver-facet path executed for the most recent
|
|
80
|
+
* install. Phase 2 A'.1 made the facet resolver the single
|
|
81
|
+
* resolver path — the union narrowed from 3 values to 2.
|
|
82
|
+
* 'unset' before any install runs in the lifetime of the DO; flips
|
|
83
|
+
* to 'in-facet' on the first install. */
|
|
84
|
+
resolverPath: 'in-facet' | 'unset';
|
|
85
|
+
/** Install-facet counters. Populated by npm-installer after a
|
|
86
|
+
* successful batch-facet dispatch returns. Confirms the install ran
|
|
87
|
+
* in the facet (tarballsCompleted > 0) and surfaces the
|
|
88
|
+
* facet-internal byte count. */
|
|
89
|
+
installFacet: {
|
|
90
|
+
/** Path used for the most recent install fetch phase. Phase 2 A'.1
|
|
91
|
+
* made batch-facet the single fetch path. */
|
|
92
|
+
path: 'batch-facet' | 'unset';
|
|
93
|
+
/** Number of tarballs the install-batch-facet successfully streamed. */
|
|
94
|
+
tarballsCompleted: number;
|
|
95
|
+
/** Cumulative tarball body bytes the facet decoded (gunzip input). */
|
|
96
|
+
cumulativeBytesDecoded: number;
|
|
97
|
+
/** Peak in-flight tarball pipelines inside the facet at any one moment. */
|
|
98
|
+
peakInFlight: number;
|
|
99
|
+
};
|
|
100
|
+
/** Pre-bundle facet counters. Tracks the fire-and-forget pre-bundle
|
|
101
|
+
* phase. Aggregates across all dispatches in this DO's lifetime. */
|
|
102
|
+
preBundleFacet: {
|
|
103
|
+
/** Specifiers attempted (queue depth at start of phase). */
|
|
104
|
+
attempted: number;
|
|
105
|
+
/** Bundles that completed successfully (esmCode produced). */
|
|
106
|
+
bundlesCompleted: number;
|
|
107
|
+
/** Bundles that failed (errorText set on PrebundleResult). */
|
|
108
|
+
errors: number;
|
|
109
|
+
/** Bundles skipped before facet dispatch (e.g. slice cap exceeded). */
|
|
110
|
+
skipped: number;
|
|
111
|
+
/** First-call wasm-fetch payload size. 0 until first successful dispatch
|
|
112
|
+
* records it; stays at first-seen value (RPC returns the same Module
|
|
113
|
+
* every time, but the cumulativeBytes the FACET reports may grow on
|
|
114
|
+
* retries). */
|
|
115
|
+
wasmBootBytes: number;
|
|
116
|
+
/** Most recent error message — truncated to keep the diag payload bounded. */
|
|
117
|
+
lastError: string;
|
|
118
|
+
/** Per-module errors from the MOST RECENT pre-bundle batch, keyed by
|
|
119
|
+
* specifier (e.g. "lucide-react", "framer-motion"). REPLACED on each
|
|
120
|
+
* recordPreBundleSummary() call so the map is bounded by the batch
|
|
121
|
+
* size (≤ pending.length, typically <20). lastError is a 1-string
|
|
122
|
+
* legacy that loses fidelity when multiple modules in one batch
|
|
123
|
+
* fail — this map is the proper fix.
|
|
124
|
+
*
|
|
125
|
+
* Example: { "lucide-react": "Worker exceeded memory limit." }
|
|
126
|
+
*
|
|
127
|
+
* Empty when the most recent batch had zero errors. */
|
|
128
|
+
errorsByModule: Record<string, string>;
|
|
129
|
+
};
|
|
130
|
+
/** R2-backed cross-tenant npm cache counters (W4). All counts are
|
|
131
|
+
* cumulative since DO-isolate start. Hits drop install latency;
|
|
132
|
+
* tracking the hit-rate is the smoking gun for whether the W4 plan
|
|
133
|
+
* is delivering its promised wins. */
|
|
134
|
+
r2: {
|
|
135
|
+
/** Tarball R2 cache hits (bytes returned from R2, integrity-verified
|
|
136
|
+
* on read by the install facet). */
|
|
137
|
+
tarballHit: number;
|
|
138
|
+
/** Tarball R2 cache misses (R2 returned null OR oversize-bypass). */
|
|
139
|
+
tarballMiss: number;
|
|
140
|
+
/** Packument R2 cache hits — fresh, not expired. */
|
|
141
|
+
packumentHit: number;
|
|
142
|
+
/** Packument R2 cache misses — absent OR expired. */
|
|
143
|
+
packumentMiss: number;
|
|
144
|
+
/** Tarball R2 writes that succeeded. */
|
|
145
|
+
tarballPutOk: number;
|
|
146
|
+
/** Tarball R2 writes that failed (non-fatal, install proceeds). */
|
|
147
|
+
tarballPutFail: number;
|
|
148
|
+
/** Packument R2 writes that succeeded. */
|
|
149
|
+
packumentPutOk: number;
|
|
150
|
+
/** Packument R2 writes that failed (non-fatal). */
|
|
151
|
+
packumentPutFail: number;
|
|
152
|
+
/** Pipelined-RPC race wins for tarballs (R2 came back first; network
|
|
153
|
+
* was cancelled). */
|
|
154
|
+
pipelinedTarballRaceWins: number;
|
|
155
|
+
/** Pipelined-RPC race losses for tarballs (R2 came back too slow or
|
|
156
|
+
* empty; network response used). */
|
|
157
|
+
pipelinedTarballRaceLosses: number;
|
|
158
|
+
/** Pipelined-RPC race wins for packuments. */
|
|
159
|
+
pipelinedPackumentRaceWins: number;
|
|
160
|
+
/** Pipelined-RPC race losses for packuments. */
|
|
161
|
+
pipelinedPackumentRaceLosses: number;
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/** Read a snapshot — caller-side mutations don't affect the singleton. */
|
|
165
|
+
export declare function readDiagCounters(): DiagCounters;
|
|
166
|
+
/** Set the install phase. */
|
|
167
|
+
export declare function setInstallPhase(p: InstallPhase): void;
|
|
168
|
+
/** Set the resolver sub-phase. No-op if installPhase isn't 'resolve' to
|
|
169
|
+
* keep the signal clean — caller paths that bump phase outside the
|
|
170
|
+
* resolver are a bug worth surfacing rather than silently accepting. */
|
|
171
|
+
export declare function setResolverPhase(p: ResolverPhase): void;
|
|
172
|
+
/** Indicate which resolver path is in use for the current install. */
|
|
173
|
+
export declare function setResolverPath(p: DiagCounters['resolverPath']): void;
|
|
174
|
+
/** Bump in-flight count. Call before issuing the network fetch. */
|
|
175
|
+
export declare function packumentFetchStart(name: string): void;
|
|
176
|
+
/** Decrement in-flight count + record bytes. Call after we've read the
|
|
177
|
+
* body and are about to dispose the stub.
|
|
178
|
+
*
|
|
179
|
+
* bytesDecoded: the size of the JSON-parse INPUT (i.e. the response
|
|
180
|
+
* body length). Pass 0 if the fetch failed and we never decoded. */
|
|
181
|
+
export declare function packumentFetchEnd(bytesDecoded: number): void;
|
|
182
|
+
/** Decrement liveResponseStubs after Symbol.dispose has been called.
|
|
183
|
+
* Separate from packumentFetchEnd because some failure paths dispose
|
|
184
|
+
* before they finish reading bytes. */
|
|
185
|
+
export declare function responseStubDisposed(): void;
|
|
186
|
+
/**
|
|
187
|
+
* Track an in-flight supervisor RPC payload [Phase 2 A'.2].
|
|
188
|
+
*
|
|
189
|
+
* Call at RPC entry, BEFORE awaiting any work that depends on
|
|
190
|
+
* `payload`. Pair with `rpcPayloadEnd(bytes)` in the matching `finally`
|
|
191
|
+
* so the counter goes back to zero on both success and failure.
|
|
192
|
+
*
|
|
193
|
+
* `bytes` is the supervisor-resident byte cost of the RPC's argument
|
|
194
|
+
* (or return value, whichever is bigger). For structured-clone RPCs
|
|
195
|
+
* this is the size of the cloned payload in bytes.
|
|
196
|
+
*
|
|
197
|
+
* Streamed payloads (ReadableStream-over-RPC) flow with backpressure
|
|
198
|
+
* and the supervisor-resident bound is the chunk size, not the total
|
|
199
|
+
* payload. Pass the chunk-size estimate (typically ≤ 1 MiB) — never
|
|
200
|
+
* the unknown total. -1 is silently coerced to 0 to keep the counter
|
|
201
|
+
* non-negative; callers that don't know the size should call this
|
|
202
|
+
* with 0 explicitly rather than relying on coercion.
|
|
203
|
+
*/
|
|
204
|
+
export declare function rpcPayloadStart(bytes: number): void;
|
|
205
|
+
/**
|
|
206
|
+
* Release an in-flight supervisor RPC payload [Phase 2 A'.2].
|
|
207
|
+
* Pass the same byte count given to the matching `rpcPayloadStart`.
|
|
208
|
+
*
|
|
209
|
+
* Floors at 0 to absorb arithmetic drift (e.g. if a payload-byte
|
|
210
|
+
* counter rounding gave a slightly different number on entry vs.
|
|
211
|
+
* exit). Drift in routine paths should be zero — a non-zero floor
|
|
212
|
+
* hit is a bug worth investigating.
|
|
213
|
+
*/
|
|
214
|
+
export declare function rpcPayloadEnd(bytes: number): void;
|
|
215
|
+
/** Set the install-fetch path label. Called at fetch-phase entry by
|
|
216
|
+
* npm-installer once the dispatch decision is known. */
|
|
217
|
+
export declare function setInstallFacetPath(p: DiagCounters['installFacet']['path']): void;
|
|
218
|
+
/** Fold facet-returned counters into the supervisor's diag state.
|
|
219
|
+
* Called by npm-installer after the batch-facet returns; aggregates
|
|
220
|
+
* rather than replaces so multiple install runs in the same DO
|
|
221
|
+
* lifetime accumulate in cumulativeBytesDecoded. */
|
|
222
|
+
export declare function recordInstallFacetCounters(c: {
|
|
223
|
+
tarballsCompleted: number;
|
|
224
|
+
cumulativeBytesDecoded: number;
|
|
225
|
+
peakInFlight: number;
|
|
226
|
+
}): void;
|
|
227
|
+
/** Record pre-bundle phase summary. Aggregates lifetime totals across
|
|
228
|
+
* all phases run in this DO's lifetime, but REPLACES the
|
|
229
|
+
* errorsByModule map every call so it reflects only the most recent
|
|
230
|
+
* batch. Loosing prior-batch errors is fine — they're already aggregated
|
|
231
|
+
* into `errors` (count); the map is for "which modules failed this
|
|
232
|
+
* time." */
|
|
233
|
+
export declare function recordPreBundleSummary(s: {
|
|
234
|
+
attempted: number;
|
|
235
|
+
bundlesCompleted: number;
|
|
236
|
+
errors: number;
|
|
237
|
+
skipped: number;
|
|
238
|
+
wasmBootBytes?: number;
|
|
239
|
+
lastError?: string;
|
|
240
|
+
errorsByModule?: Record<string, string>;
|
|
241
|
+
}): void;
|
|
242
|
+
export declare function r2TarballHit(): void;
|
|
243
|
+
export declare function r2TarballMiss(): void;
|
|
244
|
+
export declare function r2PackumentHit(): void;
|
|
245
|
+
export declare function r2PackumentMiss(): void;
|
|
246
|
+
export declare function r2TarballPutOk(): void;
|
|
247
|
+
export declare function r2TarballPutFail(): void;
|
|
248
|
+
export declare function r2PackumentPutOk(): void;
|
|
249
|
+
export declare function r2PackumentPutFail(): void;
|
|
250
|
+
/** Bump pipelined-RPC race outcome counters. The facet returns these
|
|
251
|
+
* in its result counters; the supervisor folds them in alongside the
|
|
252
|
+
* existing installFacet counters. */
|
|
253
|
+
export declare function recordR2RaceCounters(c: {
|
|
254
|
+
pipelinedTarballRaceWins: number;
|
|
255
|
+
pipelinedTarballRaceLosses: number;
|
|
256
|
+
pipelinedPackumentRaceWins: number;
|
|
257
|
+
pipelinedPackumentRaceLosses: number;
|
|
258
|
+
}): void;
|
|
259
|
+
/**
|
|
260
|
+
* cache-obs-2: fold facet-collected per-tier cache events into the
|
|
261
|
+
* DO-side cache-stats singleton. Called from installer.ts after a
|
|
262
|
+
* batch-facet / resolve-facet returns — mirrors recordR2RaceCounters
|
|
263
|
+
* (a wave-1 establish ed pattern where the facet collects metrics in
|
|
264
|
+
* its result and the supervisor folds them in the DO isolate).
|
|
265
|
+
*
|
|
266
|
+
* Each event has shape:
|
|
267
|
+
* { kind: 'hit', tier: 'L2'|'L3'|'L4', cacheKind: 'tarball'|'packument'|'asset', bytes: number }
|
|
268
|
+
* { kind: 'miss', tier: ..., cacheKind: ... }
|
|
269
|
+
*
|
|
270
|
+
* Defensively validates each event so a future facet shape mismatch
|
|
271
|
+
* doesn't poison the DO singleton.
|
|
272
|
+
*
|
|
273
|
+
* Imports cache-stats dynamically (the recordHit/recordMiss surface
|
|
274
|
+
* is defined in src/_shared/cache-stats.ts which is off-limits for
|
|
275
|
+
* direct extension in this wave — we only consume it). Static import
|
|
276
|
+
* is fine; the module is already a peer of this one.
|
|
277
|
+
*/
|
|
278
|
+
import { type CacheTier, type CacheKind } from '../_shared/cache-stats.js';
|
|
279
|
+
export type CacheStatEvent = {
|
|
280
|
+
kind: 'hit';
|
|
281
|
+
tier: CacheTier;
|
|
282
|
+
cacheKind: CacheKind;
|
|
283
|
+
bytes: number;
|
|
284
|
+
} | {
|
|
285
|
+
kind: 'miss';
|
|
286
|
+
tier: CacheTier;
|
|
287
|
+
cacheKind: CacheKind;
|
|
288
|
+
};
|
|
289
|
+
export declare function recordCacheStatEvents(events: readonly unknown[] | undefined): void;
|
|
290
|
+
/** Reset everything. Used by tests; not called from prod paths. */
|
|
291
|
+
export declare function resetDiagCounters(): void;
|
|
292
|
+
//# sourceMappingURL=diag-counters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diag-counters.d.ts","sourceRoot":"","sources":["../../src/observability/diag-counters.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* diag-counters.ts — application-level memory + phase observability.
|
|
3
|
+
*
|
|
4
|
+
* Why: workerd's `process.memoryUsage()` returns 0 for all fields inside
|
|
5
|
+
* a Durable Object class context (only dynamic-worker isolates under
|
|
6
|
+
* nodejs_compat get the real implementation). Without a working heap
|
|
7
|
+
* probe we have no way to confirm OOM hypotheses or verify a fix.
|
|
8
|
+
*
|
|
9
|
+
* Replacement: deterministic counters bumped at known allocation sites.
|
|
10
|
+
* Cumulative bytes decoded, in-flight stub counts, and phase markers
|
|
11
|
+
* give us the same operational signal as a heap probe — and they're
|
|
12
|
+
* exact, not estimated.
|
|
13
|
+
*
|
|
14
|
+
* Singleton-per-isolate. Lives at module scope so any code path in the
|
|
15
|
+
* supervisor bundle can write to it (installer, resolver, retry) and
|
|
16
|
+
* the request handler in nimbus-session.ts:/api/_diag/memory can read
|
|
17
|
+
* it. Survives across requests within the same isolate; resets on DO
|
|
18
|
+
* reboot — itself a useful signal (counters at 0 immediately after the
|
|
19
|
+
* banner reprinted = the killed isolate took its state with it).
|
|
20
|
+
*/
|
|
21
|
+
const _counters = {
|
|
22
|
+
installPhase: 'idle',
|
|
23
|
+
resolverPhase: 'idle',
|
|
24
|
+
inFlightPackumentFetches: 0,
|
|
25
|
+
liveResponseStubs: 0,
|
|
26
|
+
inFlightRpcPayloadBytes: 0,
|
|
27
|
+
lastPackumentBytes: 0,
|
|
28
|
+
cumulativePackumentBytesDecoded: 0,
|
|
29
|
+
packumentsDecoded: 0,
|
|
30
|
+
lastPackumentName: '',
|
|
31
|
+
resolverPath: 'unset',
|
|
32
|
+
installFacet: {
|
|
33
|
+
path: 'unset',
|
|
34
|
+
tarballsCompleted: 0,
|
|
35
|
+
cumulativeBytesDecoded: 0,
|
|
36
|
+
peakInFlight: 0,
|
|
37
|
+
},
|
|
38
|
+
preBundleFacet: {
|
|
39
|
+
attempted: 0,
|
|
40
|
+
bundlesCompleted: 0,
|
|
41
|
+
errors: 0,
|
|
42
|
+
skipped: 0,
|
|
43
|
+
wasmBootBytes: 0,
|
|
44
|
+
lastError: '',
|
|
45
|
+
errorsByModule: {},
|
|
46
|
+
},
|
|
47
|
+
r2: {
|
|
48
|
+
tarballHit: 0,
|
|
49
|
+
tarballMiss: 0,
|
|
50
|
+
packumentHit: 0,
|
|
51
|
+
packumentMiss: 0,
|
|
52
|
+
tarballPutOk: 0,
|
|
53
|
+
tarballPutFail: 0,
|
|
54
|
+
packumentPutOk: 0,
|
|
55
|
+
packumentPutFail: 0,
|
|
56
|
+
pipelinedTarballRaceWins: 0,
|
|
57
|
+
pipelinedTarballRaceLosses: 0,
|
|
58
|
+
pipelinedPackumentRaceWins: 0,
|
|
59
|
+
pipelinedPackumentRaceLosses: 0,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
/** Read a snapshot — caller-side mutations don't affect the singleton. */
|
|
63
|
+
export function readDiagCounters() {
|
|
64
|
+
return { ..._counters };
|
|
65
|
+
}
|
|
66
|
+
/** Set the install phase. */
|
|
67
|
+
export function setInstallPhase(p) {
|
|
68
|
+
_counters.installPhase = p;
|
|
69
|
+
if (p !== 'resolve')
|
|
70
|
+
_counters.resolverPhase = 'idle';
|
|
71
|
+
}
|
|
72
|
+
/** Set the resolver sub-phase. No-op if installPhase isn't 'resolve' to
|
|
73
|
+
* keep the signal clean — caller paths that bump phase outside the
|
|
74
|
+
* resolver are a bug worth surfacing rather than silently accepting. */
|
|
75
|
+
export function setResolverPhase(p) {
|
|
76
|
+
_counters.resolverPhase = p;
|
|
77
|
+
}
|
|
78
|
+
/** Indicate which resolver path is in use for the current install. */
|
|
79
|
+
export function setResolverPath(p) {
|
|
80
|
+
_counters.resolverPath = p;
|
|
81
|
+
}
|
|
82
|
+
/** Bump in-flight count. Call before issuing the network fetch. */
|
|
83
|
+
export function packumentFetchStart(name) {
|
|
84
|
+
_counters.inFlightPackumentFetches++;
|
|
85
|
+
_counters.liveResponseStubs++;
|
|
86
|
+
_counters.lastPackumentName = name;
|
|
87
|
+
}
|
|
88
|
+
/** Decrement in-flight count + record bytes. Call after we've read the
|
|
89
|
+
* body and are about to dispose the stub.
|
|
90
|
+
*
|
|
91
|
+
* bytesDecoded: the size of the JSON-parse INPUT (i.e. the response
|
|
92
|
+
* body length). Pass 0 if the fetch failed and we never decoded. */
|
|
93
|
+
export function packumentFetchEnd(bytesDecoded) {
|
|
94
|
+
if (_counters.inFlightPackumentFetches > 0)
|
|
95
|
+
_counters.inFlightPackumentFetches--;
|
|
96
|
+
if (bytesDecoded > 0) {
|
|
97
|
+
_counters.lastPackumentBytes = bytesDecoded;
|
|
98
|
+
_counters.cumulativePackumentBytesDecoded += bytesDecoded;
|
|
99
|
+
_counters.packumentsDecoded++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Decrement liveResponseStubs after Symbol.dispose has been called.
|
|
103
|
+
* Separate from packumentFetchEnd because some failure paths dispose
|
|
104
|
+
* before they finish reading bytes. */
|
|
105
|
+
export function responseStubDisposed() {
|
|
106
|
+
if (_counters.liveResponseStubs > 0)
|
|
107
|
+
_counters.liveResponseStubs--;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Track an in-flight supervisor RPC payload [Phase 2 A'.2].
|
|
111
|
+
*
|
|
112
|
+
* Call at RPC entry, BEFORE awaiting any work that depends on
|
|
113
|
+
* `payload`. Pair with `rpcPayloadEnd(bytes)` in the matching `finally`
|
|
114
|
+
* so the counter goes back to zero on both success and failure.
|
|
115
|
+
*
|
|
116
|
+
* `bytes` is the supervisor-resident byte cost of the RPC's argument
|
|
117
|
+
* (or return value, whichever is bigger). For structured-clone RPCs
|
|
118
|
+
* this is the size of the cloned payload in bytes.
|
|
119
|
+
*
|
|
120
|
+
* Streamed payloads (ReadableStream-over-RPC) flow with backpressure
|
|
121
|
+
* and the supervisor-resident bound is the chunk size, not the total
|
|
122
|
+
* payload. Pass the chunk-size estimate (typically ≤ 1 MiB) — never
|
|
123
|
+
* the unknown total. -1 is silently coerced to 0 to keep the counter
|
|
124
|
+
* non-negative; callers that don't know the size should call this
|
|
125
|
+
* with 0 explicitly rather than relying on coercion.
|
|
126
|
+
*/
|
|
127
|
+
export function rpcPayloadStart(bytes) {
|
|
128
|
+
const n = Number(bytes);
|
|
129
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
130
|
+
return;
|
|
131
|
+
_counters.inFlightRpcPayloadBytes += n;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Release an in-flight supervisor RPC payload [Phase 2 A'.2].
|
|
135
|
+
* Pass the same byte count given to the matching `rpcPayloadStart`.
|
|
136
|
+
*
|
|
137
|
+
* Floors at 0 to absorb arithmetic drift (e.g. if a payload-byte
|
|
138
|
+
* counter rounding gave a slightly different number on entry vs.
|
|
139
|
+
* exit). Drift in routine paths should be zero — a non-zero floor
|
|
140
|
+
* hit is a bug worth investigating.
|
|
141
|
+
*/
|
|
142
|
+
export function rpcPayloadEnd(bytes) {
|
|
143
|
+
const n = Number(bytes);
|
|
144
|
+
if (!Number.isFinite(n) || n <= 0)
|
|
145
|
+
return;
|
|
146
|
+
_counters.inFlightRpcPayloadBytes -= n;
|
|
147
|
+
if (_counters.inFlightRpcPayloadBytes < 0) {
|
|
148
|
+
_counters.inFlightRpcPayloadBytes = 0;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** Set the install-fetch path label. Called at fetch-phase entry by
|
|
152
|
+
* npm-installer once the dispatch decision is known. */
|
|
153
|
+
export function setInstallFacetPath(p) {
|
|
154
|
+
_counters.installFacet.path = p;
|
|
155
|
+
}
|
|
156
|
+
/** Fold facet-returned counters into the supervisor's diag state.
|
|
157
|
+
* Called by npm-installer after the batch-facet returns; aggregates
|
|
158
|
+
* rather than replaces so multiple install runs in the same DO
|
|
159
|
+
* lifetime accumulate in cumulativeBytesDecoded. */
|
|
160
|
+
export function recordInstallFacetCounters(c) {
|
|
161
|
+
_counters.installFacet.tarballsCompleted += c.tarballsCompleted;
|
|
162
|
+
_counters.installFacet.cumulativeBytesDecoded += c.cumulativeBytesDecoded;
|
|
163
|
+
if (c.peakInFlight > _counters.installFacet.peakInFlight) {
|
|
164
|
+
_counters.installFacet.peakInFlight = c.peakInFlight;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/** Record pre-bundle phase summary. Aggregates lifetime totals across
|
|
168
|
+
* all phases run in this DO's lifetime, but REPLACES the
|
|
169
|
+
* errorsByModule map every call so it reflects only the most recent
|
|
170
|
+
* batch. Loosing prior-batch errors is fine — they're already aggregated
|
|
171
|
+
* into `errors` (count); the map is for "which modules failed this
|
|
172
|
+
* time." */
|
|
173
|
+
export function recordPreBundleSummary(s) {
|
|
174
|
+
_counters.preBundleFacet.attempted += s.attempted;
|
|
175
|
+
_counters.preBundleFacet.bundlesCompleted += s.bundlesCompleted;
|
|
176
|
+
_counters.preBundleFacet.errors += s.errors;
|
|
177
|
+
_counters.preBundleFacet.skipped += s.skipped;
|
|
178
|
+
if (s.wasmBootBytes && _counters.preBundleFacet.wasmBootBytes === 0) {
|
|
179
|
+
_counters.preBundleFacet.wasmBootBytes = s.wasmBootBytes;
|
|
180
|
+
}
|
|
181
|
+
if (s.lastError) {
|
|
182
|
+
// Truncate to keep diag payload bounded.
|
|
183
|
+
_counters.preBundleFacet.lastError = String(s.lastError).slice(0, 200);
|
|
184
|
+
}
|
|
185
|
+
// Replace (not merge) so we capture only the most recent batch.
|
|
186
|
+
// Bounded by batch size; truncate each value to 200 chars.
|
|
187
|
+
if (s.errorsByModule) {
|
|
188
|
+
const trimmed = {};
|
|
189
|
+
for (const [name, msg] of Object.entries(s.errorsByModule)) {
|
|
190
|
+
trimmed[name] = String(msg).slice(0, 200);
|
|
191
|
+
}
|
|
192
|
+
_counters.preBundleFacet.errorsByModule = trimmed;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// ── R2-backed npm cache counters [W4] ──────────────────────────────────
|
|
196
|
+
//
|
|
197
|
+
// These counter bumps live in the supervisor isolate (called from
|
|
198
|
+
// SupervisorRPC.getCachedTarball / getCachedPackument / putCached*).
|
|
199
|
+
// The facet itself never imports diag-counters — it sees only the
|
|
200
|
+
// SUPERVISOR RPC binding; the bump happens on the supervisor side after
|
|
201
|
+
// the RPC method fires.
|
|
202
|
+
export function r2TarballHit() { _counters.r2.tarballHit++; }
|
|
203
|
+
export function r2TarballMiss() { _counters.r2.tarballMiss++; }
|
|
204
|
+
export function r2PackumentHit() { _counters.r2.packumentHit++; }
|
|
205
|
+
export function r2PackumentMiss() { _counters.r2.packumentMiss++; }
|
|
206
|
+
export function r2TarballPutOk() { _counters.r2.tarballPutOk++; }
|
|
207
|
+
export function r2TarballPutFail() { _counters.r2.tarballPutFail++; }
|
|
208
|
+
export function r2PackumentPutOk() { _counters.r2.packumentPutOk++; }
|
|
209
|
+
export function r2PackumentPutFail() { _counters.r2.packumentPutFail++; }
|
|
210
|
+
/** Bump pipelined-RPC race outcome counters. The facet returns these
|
|
211
|
+
* in its result counters; the supervisor folds them in alongside the
|
|
212
|
+
* existing installFacet counters. */
|
|
213
|
+
export function recordR2RaceCounters(c) {
|
|
214
|
+
_counters.r2.pipelinedTarballRaceWins += c.pipelinedTarballRaceWins;
|
|
215
|
+
_counters.r2.pipelinedTarballRaceLosses += c.pipelinedTarballRaceLosses;
|
|
216
|
+
_counters.r2.pipelinedPackumentRaceWins += c.pipelinedPackumentRaceWins;
|
|
217
|
+
_counters.r2.pipelinedPackumentRaceLosses += c.pipelinedPackumentRaceLosses;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* cache-obs-2: fold facet-collected per-tier cache events into the
|
|
221
|
+
* DO-side cache-stats singleton. Called from installer.ts after a
|
|
222
|
+
* batch-facet / resolve-facet returns — mirrors recordR2RaceCounters
|
|
223
|
+
* (a wave-1 establish ed pattern where the facet collects metrics in
|
|
224
|
+
* its result and the supervisor folds them in the DO isolate).
|
|
225
|
+
*
|
|
226
|
+
* Each event has shape:
|
|
227
|
+
* { kind: 'hit', tier: 'L2'|'L3'|'L4', cacheKind: 'tarball'|'packument'|'asset', bytes: number }
|
|
228
|
+
* { kind: 'miss', tier: ..., cacheKind: ... }
|
|
229
|
+
*
|
|
230
|
+
* Defensively validates each event so a future facet shape mismatch
|
|
231
|
+
* doesn't poison the DO singleton.
|
|
232
|
+
*
|
|
233
|
+
* Imports cache-stats dynamically (the recordHit/recordMiss surface
|
|
234
|
+
* is defined in src/_shared/cache-stats.ts which is off-limits for
|
|
235
|
+
* direct extension in this wave — we only consume it). Static import
|
|
236
|
+
* is fine; the module is already a peer of this one.
|
|
237
|
+
*/
|
|
238
|
+
import { recordHit as _cacheRecordHit, recordMiss as _cacheRecordMiss, } from '../_shared/cache-stats.js';
|
|
239
|
+
export function recordCacheStatEvents(events) {
|
|
240
|
+
if (!events || events.length === 0)
|
|
241
|
+
return;
|
|
242
|
+
const validTiers = new Set(['L1', 'L2', 'L3', 'L4']);
|
|
243
|
+
const validKinds = new Set(['tarball', 'packument', 'asset']);
|
|
244
|
+
for (const raw of events) {
|
|
245
|
+
if (!raw || typeof raw !== 'object')
|
|
246
|
+
continue;
|
|
247
|
+
const e = raw;
|
|
248
|
+
if (!validTiers.has(e.tier))
|
|
249
|
+
continue;
|
|
250
|
+
if (!validKinds.has(e.cacheKind))
|
|
251
|
+
continue;
|
|
252
|
+
if (e.kind === 'hit') {
|
|
253
|
+
const bytes = typeof e.bytes === 'number' && e.bytes > 0 ? e.bytes : 0;
|
|
254
|
+
_cacheRecordHit(e.tier, e.cacheKind, bytes);
|
|
255
|
+
}
|
|
256
|
+
else if (e.kind === 'miss') {
|
|
257
|
+
_cacheRecordMiss(e.tier, e.cacheKind);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/** Reset everything. Used by tests; not called from prod paths. */
|
|
262
|
+
export function resetDiagCounters() {
|
|
263
|
+
_counters.installPhase = 'idle';
|
|
264
|
+
_counters.resolverPhase = 'idle';
|
|
265
|
+
_counters.inFlightPackumentFetches = 0;
|
|
266
|
+
_counters.liveResponseStubs = 0;
|
|
267
|
+
_counters.inFlightRpcPayloadBytes = 0;
|
|
268
|
+
_counters.lastPackumentBytes = 0;
|
|
269
|
+
_counters.cumulativePackumentBytesDecoded = 0;
|
|
270
|
+
_counters.packumentsDecoded = 0;
|
|
271
|
+
_counters.lastPackumentName = '';
|
|
272
|
+
_counters.resolverPath = 'unset';
|
|
273
|
+
_counters.installFacet = {
|
|
274
|
+
path: 'unset',
|
|
275
|
+
tarballsCompleted: 0,
|
|
276
|
+
cumulativeBytesDecoded: 0,
|
|
277
|
+
peakInFlight: 0,
|
|
278
|
+
};
|
|
279
|
+
_counters.preBundleFacet = {
|
|
280
|
+
attempted: 0,
|
|
281
|
+
bundlesCompleted: 0,
|
|
282
|
+
errors: 0,
|
|
283
|
+
skipped: 0,
|
|
284
|
+
wasmBootBytes: 0,
|
|
285
|
+
lastError: '',
|
|
286
|
+
errorsByModule: {},
|
|
287
|
+
};
|
|
288
|
+
_counters.r2 = {
|
|
289
|
+
tarballHit: 0,
|
|
290
|
+
tarballMiss: 0,
|
|
291
|
+
packumentHit: 0,
|
|
292
|
+
packumentMiss: 0,
|
|
293
|
+
tarballPutOk: 0,
|
|
294
|
+
tarballPutFail: 0,
|
|
295
|
+
packumentPutOk: 0,
|
|
296
|
+
packumentPutFail: 0,
|
|
297
|
+
pipelinedTarballRaceWins: 0,
|
|
298
|
+
pipelinedTarballRaceLosses: 0,
|
|
299
|
+
pipelinedPackumentRaceWins: 0,
|
|
300
|
+
pipelinedPackumentRaceLosses: 0,
|
|
301
|
+
};
|
|
302
|
+
}
|