@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,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm-tarball-stream.ts — pure streaming tar primitives.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from npm-tarball.ts so these helpers can be esbuild-bundled
|
|
5
|
+
* WITHOUT dragging in NpmCache / NpmResolver / SqliteVFS. Consumed by
|
|
6
|
+
* scripts/bundle-facet-workers.mjs which emits a string constant the
|
|
7
|
+
* NimbusLoaderPool uses to inject the tar parser into dynamic workers.
|
|
8
|
+
*
|
|
9
|
+
* Zero dependencies. Works identically on the supervisor and inside a
|
|
10
|
+
* facet isolate. Never buffers the full decompressed tarball — peak
|
|
11
|
+
* transient heap is one file's bytes plus a 512-byte carry.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Maximum size of a single file inside a tarball. Larger entries are skipped.
|
|
15
|
+
*
|
|
16
|
+
* History: 5 MB was too low — it silently dropped `esbuild-wasm/esbuild.wasm`
|
|
17
|
+
* (11.35 MB on v0.24.2), which made Nimbus-in-Nimbus `npm run dev` fail with
|
|
18
|
+
* `No such module "esbuild-wasm/esbuild.wasm"` since the missing file caused
|
|
19
|
+
* esbuild's VFS plugin to mark the import `external`, and workerd's LOADER
|
|
20
|
+
* has no entry for that specifier. 20 MB covers esbuild-wasm with headroom
|
|
21
|
+
* while keeping per-facet peak heap bounded for the streaming extractor.
|
|
22
|
+
*/
|
|
23
|
+
export declare const MAX_FILE_BYTES = 20000000;
|
|
24
|
+
/**
|
|
25
|
+
* Read one tar header (USTAR) out of `block`. Returns parsed fields or
|
|
26
|
+
* `null` for an end-of-archive block (all zeros).
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseTarHeader(block: Uint8Array): {
|
|
29
|
+
name: string;
|
|
30
|
+
size: number;
|
|
31
|
+
typeFlag: number;
|
|
32
|
+
} | null;
|
|
33
|
+
/**
|
|
34
|
+
* Wrap a `ReadableStream<Uint8Array>` as an async iterable. Workerd and
|
|
35
|
+
* Node both support `Symbol.asyncIterator` on ReadableStream, but we
|
|
36
|
+
* spell the reader loop out so we don't depend on ambient lib typings.
|
|
37
|
+
*/
|
|
38
|
+
export declare function readableStreamToAsyncIterable(rs: ReadableStream<Uint8Array>): AsyncGenerator<Uint8Array, void, undefined>;
|
|
39
|
+
/**
|
|
40
|
+
* Reason a tar entry was skipped and never yielded. Surfaced to callers
|
|
41
|
+
* via the optional `onSkip` callback on `streamTarEntries`.
|
|
42
|
+
*
|
|
43
|
+
* - 'too-large': size > MAX_FILE_BYTES. The most common reason Nimbus
|
|
44
|
+
* cares about — it's what caused esbuild-wasm/esbuild.wasm to vanish
|
|
45
|
+
* silently in Nimbus-in-Nimbus before the cap was raised.
|
|
46
|
+
* - 'non-regular': typeFlag indicates a symlink / hardlink / directory /
|
|
47
|
+
* PaxHeader / GNU LongName etc. These aren't files we stage.
|
|
48
|
+
* - 'no-name': header parsed but name was empty (malformed or a PaxHeader
|
|
49
|
+
* that our parser didn't recognize as non-regular).
|
|
50
|
+
*/
|
|
51
|
+
export type TarSkipReason = 'too-large' | 'non-regular' | 'no-name';
|
|
52
|
+
/**
|
|
53
|
+
* Optional skip-observer passed to `streamTarEntries`. Called ONCE per
|
|
54
|
+
* skipped entry, with the declared name (may be empty for 'no-name'
|
|
55
|
+
* skips) and the declared size in bytes.
|
|
56
|
+
*
|
|
57
|
+
* Consumers typically push these into a per-package warnings array so
|
|
58
|
+
* users see what wasn't installed. The callback is synchronous and
|
|
59
|
+
* must not throw — thrown errors are swallowed to keep the extractor
|
|
60
|
+
* best-effort.
|
|
61
|
+
*/
|
|
62
|
+
export type TarSkipCallback = (name: string, size: number, reason: TarSkipReason) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Streaming tar extractor.
|
|
65
|
+
*
|
|
66
|
+
* Consumes an async iterable of Uint8Array chunks (the decompressed tar
|
|
67
|
+
* byte stream) and yields one `{ name, data }` entry per regular file,
|
|
68
|
+
* as each file completes.
|
|
69
|
+
*
|
|
70
|
+
* Memory invariant: holds at most one pending file's bytes (≤ MAX_FILE_BYTES)
|
|
71
|
+
* plus a small carry buffer for the tar header being assembled.
|
|
72
|
+
*
|
|
73
|
+
* Skips: symlinks, directories, hardlinks, long-name extensions (PaxHeader),
|
|
74
|
+
* and any file whose declared size exceeds MAX_FILE_BYTES.
|
|
75
|
+
*
|
|
76
|
+
* If `onSkip` is provided, it is invoked for each skipped entry with the
|
|
77
|
+
* name, declared size, and reason code. Callers that need to surface
|
|
78
|
+
* dropped-file warnings to users should pass one; legacy callers that
|
|
79
|
+
* omit the arg still behave exactly as before (silent skip).
|
|
80
|
+
*/
|
|
81
|
+
export declare function streamTarEntries(source: AsyncIterable<Uint8Array>, onSkip?: TarSkipCallback): AsyncGenerator<{
|
|
82
|
+
name: string;
|
|
83
|
+
data: Uint8Array;
|
|
84
|
+
}, void, undefined>;
|
|
85
|
+
//# sourceMappingURL=tarball-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tarball-stream.d.ts","sourceRoot":"","sources":["../../src/npm/tarball-stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,WAAa,CAAC;AAEzC;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBzG;AAED;;;;GAIG;AACH,wBAAuB,6BAA6B,CAClD,EAAE,EAAE,cAAc,CAAC,UAAU,CAAC,GAC7B,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAW7C;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,KAClB,IAAI,CAAC;AAEV;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAuB,gBAAgB,CACrC,MAAM,EAAE,aAAa,CAAC,UAAU,CAAC,EACjC,MAAM,CAAC,EAAE,eAAe,GACvB,cAAc,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,EAAE,IAAI,EAAE,SAAS,CAAC,CA6GrE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm-tarball-stream.ts — pure streaming tar primitives.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from npm-tarball.ts so these helpers can be esbuild-bundled
|
|
5
|
+
* WITHOUT dragging in NpmCache / NpmResolver / SqliteVFS. Consumed by
|
|
6
|
+
* scripts/bundle-facet-workers.mjs which emits a string constant the
|
|
7
|
+
* NimbusLoaderPool uses to inject the tar parser into dynamic workers.
|
|
8
|
+
*
|
|
9
|
+
* Zero dependencies. Works identically on the supervisor and inside a
|
|
10
|
+
* facet isolate. Never buffers the full decompressed tarball — peak
|
|
11
|
+
* transient heap is one file's bytes plus a 512-byte carry.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Maximum size of a single file inside a tarball. Larger entries are skipped.
|
|
15
|
+
*
|
|
16
|
+
* History: 5 MB was too low — it silently dropped `esbuild-wasm/esbuild.wasm`
|
|
17
|
+
* (11.35 MB on v0.24.2), which made Nimbus-in-Nimbus `npm run dev` fail with
|
|
18
|
+
* `No such module "esbuild-wasm/esbuild.wasm"` since the missing file caused
|
|
19
|
+
* esbuild's VFS plugin to mark the import `external`, and workerd's LOADER
|
|
20
|
+
* has no entry for that specifier. 20 MB covers esbuild-wasm with headroom
|
|
21
|
+
* while keeping per-facet peak heap bounded for the streaming extractor.
|
|
22
|
+
*/
|
|
23
|
+
export const MAX_FILE_BYTES = 20_000_000;
|
|
24
|
+
/**
|
|
25
|
+
* Read one tar header (USTAR) out of `block`. Returns parsed fields or
|
|
26
|
+
* `null` for an end-of-archive block (all zeros).
|
|
27
|
+
*/
|
|
28
|
+
export function parseTarHeader(block) {
|
|
29
|
+
if (block[0] === 0)
|
|
30
|
+
return null;
|
|
31
|
+
let name = '';
|
|
32
|
+
for (let i = 0; i < 100 && block[i] !== 0; i++) {
|
|
33
|
+
name += String.fromCharCode(block[i]);
|
|
34
|
+
}
|
|
35
|
+
let prefix = '';
|
|
36
|
+
for (let i = 345; i < 500 && block[i] !== 0; i++) {
|
|
37
|
+
prefix += String.fromCharCode(block[i]);
|
|
38
|
+
}
|
|
39
|
+
if (prefix)
|
|
40
|
+
name = prefix + '/' + name;
|
|
41
|
+
// Strip the npm `package/` convention.
|
|
42
|
+
name = name.replace(/^package\//, '');
|
|
43
|
+
let sizeStr = '';
|
|
44
|
+
for (let i = 124; i < 136 && block[i] !== 0; i++) {
|
|
45
|
+
sizeStr += String.fromCharCode(block[i]);
|
|
46
|
+
}
|
|
47
|
+
const size = parseInt(sizeStr.trim(), 8) || 0;
|
|
48
|
+
const typeFlag = block[156];
|
|
49
|
+
return { name, size, typeFlag };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Wrap a `ReadableStream<Uint8Array>` as an async iterable. Workerd and
|
|
53
|
+
* Node both support `Symbol.asyncIterator` on ReadableStream, but we
|
|
54
|
+
* spell the reader loop out so we don't depend on ambient lib typings.
|
|
55
|
+
*/
|
|
56
|
+
export async function* readableStreamToAsyncIterable(rs) {
|
|
57
|
+
const reader = rs.getReader();
|
|
58
|
+
try {
|
|
59
|
+
while (true) {
|
|
60
|
+
const { value, done } = await reader.read();
|
|
61
|
+
if (done)
|
|
62
|
+
return;
|
|
63
|
+
if (value && value.length > 0)
|
|
64
|
+
yield value;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
try {
|
|
69
|
+
reader.releaseLock();
|
|
70
|
+
}
|
|
71
|
+
catch { /* ignore */ }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Streaming tar extractor.
|
|
76
|
+
*
|
|
77
|
+
* Consumes an async iterable of Uint8Array chunks (the decompressed tar
|
|
78
|
+
* byte stream) and yields one `{ name, data }` entry per regular file,
|
|
79
|
+
* as each file completes.
|
|
80
|
+
*
|
|
81
|
+
* Memory invariant: holds at most one pending file's bytes (≤ MAX_FILE_BYTES)
|
|
82
|
+
* plus a small carry buffer for the tar header being assembled.
|
|
83
|
+
*
|
|
84
|
+
* Skips: symlinks, directories, hardlinks, long-name extensions (PaxHeader),
|
|
85
|
+
* and any file whose declared size exceeds MAX_FILE_BYTES.
|
|
86
|
+
*
|
|
87
|
+
* If `onSkip` is provided, it is invoked for each skipped entry with the
|
|
88
|
+
* name, declared size, and reason code. Callers that need to surface
|
|
89
|
+
* dropped-file warnings to users should pass one; legacy callers that
|
|
90
|
+
* omit the arg still behave exactly as before (silent skip).
|
|
91
|
+
*/
|
|
92
|
+
export async function* streamTarEntries(source, onSkip) {
|
|
93
|
+
let carry = new Uint8Array(0);
|
|
94
|
+
let state = { kind: 'header' };
|
|
95
|
+
function concat(a, b) {
|
|
96
|
+
if (a.length === 0)
|
|
97
|
+
return b;
|
|
98
|
+
if (b.length === 0)
|
|
99
|
+
return a;
|
|
100
|
+
const out = new Uint8Array(a.length + b.length);
|
|
101
|
+
out.set(a, 0);
|
|
102
|
+
out.set(b, a.length);
|
|
103
|
+
return out;
|
|
104
|
+
}
|
|
105
|
+
for await (const chunkRaw of source) {
|
|
106
|
+
let buf = concat(carry, chunkRaw);
|
|
107
|
+
let cursor = 0;
|
|
108
|
+
while (true) {
|
|
109
|
+
if (state.kind === 'header') {
|
|
110
|
+
if (buf.length - cursor < 512)
|
|
111
|
+
break;
|
|
112
|
+
const header = buf.subarray(cursor, cursor + 512);
|
|
113
|
+
const parsed = parseTarHeader(header);
|
|
114
|
+
cursor += 512;
|
|
115
|
+
if (!parsed)
|
|
116
|
+
return; // end-of-archive
|
|
117
|
+
const { name, size, typeFlag } = parsed;
|
|
118
|
+
const pad = size === 0 ? 0 : (512 - (size % 512)) % 512;
|
|
119
|
+
const isRegularFile = (typeFlag === 48 /* '0' */ || typeFlag === 0);
|
|
120
|
+
if (size === 0) {
|
|
121
|
+
if (isRegularFile && name) {
|
|
122
|
+
yield { name, data: new Uint8Array(0) };
|
|
123
|
+
}
|
|
124
|
+
state = { kind: 'header' };
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!isRegularFile || !name || size > MAX_FILE_BYTES) {
|
|
128
|
+
if (onSkip) {
|
|
129
|
+
// Classify before entering the skip state so the reason is
|
|
130
|
+
// exact. Precedence matches the condition order above:
|
|
131
|
+
// non-regular first (directories/symlinks/PaxHeaders are
|
|
132
|
+
// skipped regardless of size), then no-name, then too-large.
|
|
133
|
+
const reason = !isRegularFile
|
|
134
|
+
? 'non-regular'
|
|
135
|
+
: !name
|
|
136
|
+
? 'no-name'
|
|
137
|
+
: 'too-large';
|
|
138
|
+
try {
|
|
139
|
+
onSkip(name, size, reason);
|
|
140
|
+
}
|
|
141
|
+
catch { /* best-effort */ }
|
|
142
|
+
}
|
|
143
|
+
state = { kind: 'skip', remaining: size + pad };
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
state = {
|
|
147
|
+
kind: 'file',
|
|
148
|
+
name,
|
|
149
|
+
remaining: size,
|
|
150
|
+
fileBuf: new Uint8Array(size),
|
|
151
|
+
fileOffset: 0,
|
|
152
|
+
pad,
|
|
153
|
+
skip: false,
|
|
154
|
+
};
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (state.kind === 'file') {
|
|
158
|
+
const avail = buf.length - cursor;
|
|
159
|
+
if (avail === 0)
|
|
160
|
+
break;
|
|
161
|
+
if (state.remaining > 0) {
|
|
162
|
+
const take = Math.min(state.remaining, avail);
|
|
163
|
+
state.fileBuf.set(buf.subarray(cursor, cursor + take), state.fileOffset);
|
|
164
|
+
state.fileOffset += take;
|
|
165
|
+
state.remaining -= take;
|
|
166
|
+
cursor += take;
|
|
167
|
+
if (state.remaining > 0)
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
if (state.pad > 0) {
|
|
171
|
+
const avail2 = buf.length - cursor;
|
|
172
|
+
if (avail2 === 0)
|
|
173
|
+
break;
|
|
174
|
+
const take = Math.min(state.pad, avail2);
|
|
175
|
+
state.pad -= take;
|
|
176
|
+
cursor += take;
|
|
177
|
+
if (state.pad > 0)
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
yield { name: state.name, data: state.fileBuf };
|
|
181
|
+
state = { kind: 'header' };
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// state.kind === 'skip'
|
|
185
|
+
const avail = buf.length - cursor;
|
|
186
|
+
if (avail === 0)
|
|
187
|
+
break;
|
|
188
|
+
const take = Math.min(state.remaining, avail);
|
|
189
|
+
cursor += take;
|
|
190
|
+
state.remaining -= take;
|
|
191
|
+
if (state.remaining > 0)
|
|
192
|
+
break;
|
|
193
|
+
state = { kind: 'header' };
|
|
194
|
+
}
|
|
195
|
+
if (cursor >= buf.length) {
|
|
196
|
+
carry = new Uint8Array(0);
|
|
197
|
+
}
|
|
198
|
+
else if (cursor === 0) {
|
|
199
|
+
carry = buf;
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
carry = buf.slice(cursor);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm-tarball.ts — tarball extraction + cache-restore payload builder.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 A'.1 reduced this module to:
|
|
5
|
+
* - extractTarball / extractTarballFromResponse — streaming gunzip+tar.
|
|
6
|
+
* Used by the install-batch facet (which holds the bytes inside its
|
|
7
|
+
* own 128 MiB envelope, not the supervisor's).
|
|
8
|
+
* - buildCacheRestorePayload — supervisor-side BatchWritePayload
|
|
9
|
+
* builder for the cached-tarball fast path. Runs only on a cache
|
|
10
|
+
* hit; the bytes already live in the per-DO npm cache rather than
|
|
11
|
+
* being fetched off the network.
|
|
12
|
+
*
|
|
13
|
+
* The legacy `fetchWaves` async generator + `buildBatchPayload` builder
|
|
14
|
+
* were removed — they ran in supervisor heap and held tarball bytes long
|
|
15
|
+
* enough to OOM the DO on large installs. The single batch-facet path
|
|
16
|
+
* (src/npm-install-batch-facet.ts) supersedes them.
|
|
17
|
+
*/
|
|
18
|
+
import type { NpmCache } from './cache.js';
|
|
19
|
+
import type { ResolvedPackage, HoistPlan } from './resolver.js';
|
|
20
|
+
import type { BatchWritePayload } from '../vfs/sqlite-vfs.js';
|
|
21
|
+
export interface FetchedPackage {
|
|
22
|
+
pkg: ResolvedPackage;
|
|
23
|
+
files: Map<string, Uint8Array>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Streaming extractor driven by a `Response` body.
|
|
27
|
+
*
|
|
28
|
+
* Pipes `resp.body` through `DecompressionStream('gzip')` (npm tarballs are
|
|
29
|
+
* always gzipped) and walks the tar stream entry-by-entry. Never buffers the
|
|
30
|
+
* full decompressed tarball — peak transient heap is one file's bytes plus a
|
|
31
|
+
* small carry buffer. This is the path used by live installs; the cache
|
|
32
|
+
* restore path (in-memory bytes from SQLite) still uses `extractTarball`.
|
|
33
|
+
*
|
|
34
|
+
* The returned Map is per-file Uint8Arrays, same shape as the legacy
|
|
35
|
+
* extractor so downstream `putTarballFiles` / `buildBatchPayload` don't care.
|
|
36
|
+
* If the response has no body (unusual but possible with some proxies), we
|
|
37
|
+
* fall back to `arrayBuffer()` + `extractTarball` so we still make progress.
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractTarballFromResponse(resp: Response): Promise<Map<string, Uint8Array>>;
|
|
40
|
+
/**
|
|
41
|
+
* Legacy buffered extractor. Kept for code paths that receive a fully-buffered
|
|
42
|
+
* tarball (e.g. the tarball cache restore path, which already stores bytes in
|
|
43
|
+
* SQLite as Uint8Arrays). New install paths use `streamTarEntries` instead.
|
|
44
|
+
*/
|
|
45
|
+
export declare function extractTarball(tarball: ArrayBuffer): Promise<Map<string, Uint8Array>>;
|
|
46
|
+
/**
|
|
47
|
+
* Build a BatchWritePayload from the tarball cache (for packages that were
|
|
48
|
+
* already cached — no fetch needed).
|
|
49
|
+
*/
|
|
50
|
+
export declare function buildCacheRestorePayload(packages: ResolvedPackage[], hoistPlan: HoistPlan, nodeModulesDir: string, cache: NpmCache): BatchWritePayload;
|
|
51
|
+
//# sourceMappingURL=tarball.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tarball.d.ts","sourceRoot":"","sources":["../../src/npm/tarball.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,KAAK,EAAoC,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAShG,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,eAAe,CAAC;IACrB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAChC;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,GACb,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAmClC;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAsBlC;AAoBD;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,eAAe,EAAE,EAC3B,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,QAAQ,GACd,iBAAiB,CAgEnB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm-tarball.ts — tarball extraction + cache-restore payload builder.
|
|
3
|
+
*
|
|
4
|
+
* Phase 2 A'.1 reduced this module to:
|
|
5
|
+
* - extractTarball / extractTarballFromResponse — streaming gunzip+tar.
|
|
6
|
+
* Used by the install-batch facet (which holds the bytes inside its
|
|
7
|
+
* own 128 MiB envelope, not the supervisor's).
|
|
8
|
+
* - buildCacheRestorePayload — supervisor-side BatchWritePayload
|
|
9
|
+
* builder for the cached-tarball fast path. Runs only on a cache
|
|
10
|
+
* hit; the bytes already live in the per-DO npm cache rather than
|
|
11
|
+
* being fetched off the network.
|
|
12
|
+
*
|
|
13
|
+
* The legacy `fetchWaves` async generator + `buildBatchPayload` builder
|
|
14
|
+
* were removed — they ran in supervisor heap and held tarball bytes long
|
|
15
|
+
* enough to OOM the DO on large installs. The single batch-facet path
|
|
16
|
+
* (src/npm-install-batch-facet.ts) supersedes them.
|
|
17
|
+
*/
|
|
18
|
+
import { streamTarEntries, readableStreamToAsyncIterable, } from './tarball-stream.js';
|
|
19
|
+
import { CHUNK_SIZE } from '../constants.js';
|
|
20
|
+
// ── Tarball extraction ──────────────────────────────────────────────────
|
|
21
|
+
//
|
|
22
|
+
// The streaming primitives (parseTarHeader, streamTarEntries,
|
|
23
|
+
// readableStreamToAsyncIterable, MAX_FILE_BYTES) live in
|
|
24
|
+
// ./npm-tarball-stream.ts — a dependency-free leaf so
|
|
25
|
+
// scripts/bundle-facet-workers.mjs can esbuild it into a string the facet
|
|
26
|
+
// pool injects into dynamic workers. Import them directly from that module.
|
|
27
|
+
/**
|
|
28
|
+
* Streaming extractor driven by a `Response` body.
|
|
29
|
+
*
|
|
30
|
+
* Pipes `resp.body` through `DecompressionStream('gzip')` (npm tarballs are
|
|
31
|
+
* always gzipped) and walks the tar stream entry-by-entry. Never buffers the
|
|
32
|
+
* full decompressed tarball — peak transient heap is one file's bytes plus a
|
|
33
|
+
* small carry buffer. This is the path used by live installs; the cache
|
|
34
|
+
* restore path (in-memory bytes from SQLite) still uses `extractTarball`.
|
|
35
|
+
*
|
|
36
|
+
* The returned Map is per-file Uint8Arrays, same shape as the legacy
|
|
37
|
+
* extractor so downstream `putTarballFiles` / `buildBatchPayload` don't care.
|
|
38
|
+
* If the response has no body (unusual but possible with some proxies), we
|
|
39
|
+
* fall back to `arrayBuffer()` + `extractTarball` so we still make progress.
|
|
40
|
+
*/
|
|
41
|
+
export async function extractTarballFromResponse(resp) {
|
|
42
|
+
const files = new Map();
|
|
43
|
+
const body = resp.body;
|
|
44
|
+
if (!body) {
|
|
45
|
+
// Fallback: no streamable body (shouldn't happen, but handle it).
|
|
46
|
+
const buf = await resp.arrayBuffer();
|
|
47
|
+
return extractTarball(buf);
|
|
48
|
+
}
|
|
49
|
+
// Time-bound the whole extraction to detect hung gunzip streams.
|
|
50
|
+
const controller = new AbortController();
|
|
51
|
+
const timer = setTimeout(() => controller.abort(), 60_000);
|
|
52
|
+
try {
|
|
53
|
+
const decompressed = body.pipeThrough(new DecompressionStream('gzip'));
|
|
54
|
+
const source = readableStreamToAsyncIterable(decompressed);
|
|
55
|
+
for await (const entry of streamTarEntries(source)) {
|
|
56
|
+
if (controller.signal.aborted)
|
|
57
|
+
throw new Error('tarball extract timeout');
|
|
58
|
+
files.set(entry.name, entry.data);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
// On any error, just return whatever we managed to extract. Callers
|
|
63
|
+
// treat `files.size === 0` as a failed fetch and mark the package failed.
|
|
64
|
+
// If partial data is present (some files succeeded before the stream
|
|
65
|
+
// broke), we propagate it; the installer will re-fetch on mismatch.
|
|
66
|
+
if (files.size === 0) {
|
|
67
|
+
clearTimeout(timer);
|
|
68
|
+
throw e;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
}
|
|
74
|
+
return files;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Legacy buffered extractor. Kept for code paths that receive a fully-buffered
|
|
78
|
+
* tarball (e.g. the tarball cache restore path, which already stores bytes in
|
|
79
|
+
* SQLite as Uint8Arrays). New install paths use `streamTarEntries` instead.
|
|
80
|
+
*/
|
|
81
|
+
export async function extractTarball(tarball) {
|
|
82
|
+
const files = new Map();
|
|
83
|
+
const raw = new Uint8Array(tarball);
|
|
84
|
+
// Adapter: wrap the single buffer as an async iterable. If gzipped, pipe
|
|
85
|
+
// through DecompressionStream so the streaming parser still sees tar bytes.
|
|
86
|
+
let source;
|
|
87
|
+
if (raw[0] === 0x1f && raw[1] === 0x8b) {
|
|
88
|
+
const rs = new Blob([tarball]).stream().pipeThrough(new DecompressionStream('gzip'));
|
|
89
|
+
source = readableStreamToAsyncIterable(rs);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
source = (async function* () { yield raw; })();
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
for await (const entry of streamTarEntries(source)) {
|
|
96
|
+
files.set(entry.name, entry.data);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return files;
|
|
101
|
+
}
|
|
102
|
+
return files;
|
|
103
|
+
}
|
|
104
|
+
// ── Removed Phase 2 A'.1 ─────────────────────────────────────────────────
|
|
105
|
+
//
|
|
106
|
+
// The supervisor-resident `fetchWaves` async generator and its companion
|
|
107
|
+
// `buildBatchPayload` BatchWritePayload builder were deleted when the
|
|
108
|
+
// install became single-path (batch-facet only). Both ran in supervisor
|
|
109
|
+
// heap and held tarball bytes in memory long enough to OOM the DO on
|
|
110
|
+
// large installs. The single batch-facet path
|
|
111
|
+
// (src/npm-install-batch-facet.ts) streams gunzip+tar inside a dynamic-
|
|
112
|
+
// worker isolate with its own 128 MiB envelope and emits one writeBatch
|
|
113
|
+
// RPC per package — the supervisor's heap only sees one inbound RPC
|
|
114
|
+
// payload at a time.
|
|
115
|
+
//
|
|
116
|
+
// `WaveResult` is also gone (no other consumers). `FetchedPackage` is
|
|
117
|
+
// retained because `extractTarballFromResponse` returns a `Files` map
|
|
118
|
+
// that the cache restore path still uses.
|
|
119
|
+
// ── Batch payload construction ──────────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Build a BatchWritePayload from the tarball cache (for packages that were
|
|
122
|
+
* already cached — no fetch needed).
|
|
123
|
+
*/
|
|
124
|
+
export function buildCacheRestorePayload(packages, hoistPlan, nodeModulesDir, cache) {
|
|
125
|
+
const inodes = [];
|
|
126
|
+
const chunks = [];
|
|
127
|
+
const dirs = new Set();
|
|
128
|
+
const mtime = Date.now();
|
|
129
|
+
for (const pkg of packages) {
|
|
130
|
+
const files = cache.getTarballFiles(pkg.name, pkg.version);
|
|
131
|
+
if (files.length === 0)
|
|
132
|
+
continue;
|
|
133
|
+
const pkgDir = hoistPlan.root.has(pkg.name)
|
|
134
|
+
? nodeModulesDir + '/' + pkg.name
|
|
135
|
+
: nodeModulesDir + '/' + pkg.name;
|
|
136
|
+
dirs.add(pkgDir);
|
|
137
|
+
for (const file of files) {
|
|
138
|
+
const filePath = pkgDir + '/' + file.relPath;
|
|
139
|
+
const parts = filePath.split('/');
|
|
140
|
+
for (let i = 1; i < parts.length; i++) {
|
|
141
|
+
dirs.add(parts.slice(0, i).join('/'));
|
|
142
|
+
}
|
|
143
|
+
const chunkCount = file.data.length === 0 ? 0 : Math.ceil(file.data.length / CHUNK_SIZE);
|
|
144
|
+
inodes.push({
|
|
145
|
+
path: filePath,
|
|
146
|
+
parentPath: parentOf(filePath),
|
|
147
|
+
isDir: false,
|
|
148
|
+
size: file.data.length,
|
|
149
|
+
mtime,
|
|
150
|
+
mode: 0o644,
|
|
151
|
+
chunkCount,
|
|
152
|
+
});
|
|
153
|
+
if (file.data.length <= CHUNK_SIZE) {
|
|
154
|
+
if (file.data.length > 0) {
|
|
155
|
+
chunks.push({ path: filePath, chunkId: 0, data: file.data });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
for (let c = 0; c < chunkCount; c++) {
|
|
160
|
+
chunks.push({
|
|
161
|
+
path: filePath,
|
|
162
|
+
chunkId: c,
|
|
163
|
+
data: file.data.slice(c * CHUNK_SIZE, (c + 1) * CHUNK_SIZE),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
for (const dir of dirs) {
|
|
170
|
+
inodes.push({
|
|
171
|
+
path: dir,
|
|
172
|
+
parentPath: parentOf(dir),
|
|
173
|
+
isDir: true,
|
|
174
|
+
size: 0,
|
|
175
|
+
mtime,
|
|
176
|
+
mode: 0o755,
|
|
177
|
+
chunkCount: 0,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
return { inodes, chunks };
|
|
181
|
+
}
|
|
182
|
+
// ── Helpers ─────────────────────────────────────────────────────────────
|
|
183
|
+
function parentOf(path) {
|
|
184
|
+
return path.includes('/') ? path.substring(0, path.lastIndexOf('/')) : '';
|
|
185
|
+
}
|