@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,136 @@
|
|
|
1
|
+
export interface RegistryCacheEntry {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
tarballUrl: string;
|
|
5
|
+
integrity: string;
|
|
6
|
+
depsJson: string;
|
|
7
|
+
/**
|
|
8
|
+
* JSON-encoded REQUIRED peerDependencies (X.5-F R2).
|
|
9
|
+
*
|
|
10
|
+
* Optional peers — those marked `peerDependenciesMeta.<name>.optional
|
|
11
|
+
* === true` in the source packument — are filtered out before this
|
|
12
|
+
* field is written. Storing only the required subset means downstream
|
|
13
|
+
* lockfile-validity checks can ask "is this peer in the tree?"
|
|
14
|
+
* without having to consult the meta field again.
|
|
15
|
+
*
|
|
16
|
+
* Defaults to '{}' for entries written by pre-X.5-F builds (the
|
|
17
|
+
* column was added via ALTER TABLE, see ensureSchema).
|
|
18
|
+
*/
|
|
19
|
+
peerDepsJson?: string;
|
|
20
|
+
exportsJson: string;
|
|
21
|
+
main: string;
|
|
22
|
+
moduleField: string;
|
|
23
|
+
binJson: string;
|
|
24
|
+
fetchedAt: number;
|
|
25
|
+
}
|
|
26
|
+
export interface TarballCacheFile {
|
|
27
|
+
relPath: string;
|
|
28
|
+
data: Uint8Array;
|
|
29
|
+
size: number;
|
|
30
|
+
}
|
|
31
|
+
export interface LockfileEntry {
|
|
32
|
+
name: string;
|
|
33
|
+
resolvedVer: string;
|
|
34
|
+
integrity: string;
|
|
35
|
+
depsJson: string;
|
|
36
|
+
hoistedPath: string;
|
|
37
|
+
}
|
|
38
|
+
export interface EsmBundleEntry {
|
|
39
|
+
specifier: string;
|
|
40
|
+
bundleHash: string;
|
|
41
|
+
esmCode: string;
|
|
42
|
+
builtAt: number;
|
|
43
|
+
inputHash: string;
|
|
44
|
+
}
|
|
45
|
+
export declare class NpmCache {
|
|
46
|
+
private sql;
|
|
47
|
+
private initialized;
|
|
48
|
+
constructor(sql: SqlStorage);
|
|
49
|
+
ensureSchema(): void;
|
|
50
|
+
/** Get cached registry metadata for a specific name@version.
|
|
51
|
+
*
|
|
52
|
+
* L1 observability: bumps cache-stats L1.packument hit/miss. Bytes
|
|
53
|
+
* on hit = approximate size of the deserialized RegistryCacheEntry,
|
|
54
|
+
* computed as sum of major-string lengths (depsJson + peerDepsJson +
|
|
55
|
+
* exportsJson + binJson + a few tens of bytes overhead). This is a
|
|
56
|
+
* good proxy for "how much L1 data did we save fetching" — not the
|
|
57
|
+
* exact SQLite blob byte count (which would require a separate
|
|
58
|
+
* SELECT). */
|
|
59
|
+
getRegistryEntry(name: string, version: string): RegistryCacheEntry | null;
|
|
60
|
+
/**
|
|
61
|
+
* Bulk read of cached registry entries — used by the resolver-facet
|
|
62
|
+
* dispatcher to pre-load cached metadata it can ship across to the
|
|
63
|
+
* facet at phase start. Caller passes a hard cap; we LIMIT in SQL so
|
|
64
|
+
* a pathologically warm cache doesn't OOM the supervisor reading its
|
|
65
|
+
* own cache.
|
|
66
|
+
*
|
|
67
|
+
* Order: most-recently-fetched first, so when the cap truncates we
|
|
68
|
+
* keep the freshest entries (most likely to satisfy current ranges).
|
|
69
|
+
*/
|
|
70
|
+
dumpRegistryEntries(maxRows: number): RegistryCacheEntry[];
|
|
71
|
+
/** Get all cached versions for a package name. */
|
|
72
|
+
getRegistryVersions(name: string): RegistryCacheEntry[];
|
|
73
|
+
/** Store registry metadata for a resolved package version. */
|
|
74
|
+
putRegistryEntry(entry: RegistryCacheEntry): void;
|
|
75
|
+
/**
|
|
76
|
+
* Bulk-write registry entries in ONE call. Used by the resolver-facet
|
|
77
|
+
* to flush a wave of resolved packages back to the supervisor in a
|
|
78
|
+
* single RPC round-trip; one-RPC-per-entry across ~456 transitive
|
|
79
|
+
* deps would multiply RPC overhead by 100×.
|
|
80
|
+
*
|
|
81
|
+
* Each row is one prepared statement; we loop rather than building a
|
|
82
|
+
* giant multi-row INSERT because workerd's SqlStorage `.exec()` is
|
|
83
|
+
* already transaction-batched at the storage layer when called within
|
|
84
|
+
* the same DO event loop turn (no explicit BEGIN/COMMIT needed for
|
|
85
|
+
* atomicity of the batch — see Cloudflare DO SQLite docs). If a
|
|
86
|
+
* single row fails (malformed data), it's logged and the rest still
|
|
87
|
+
* commit; resolver correctness depends on cache being best-effort.
|
|
88
|
+
*/
|
|
89
|
+
putRegistryEntries(entries: RegistryCacheEntry[]): {
|
|
90
|
+
written: number;
|
|
91
|
+
failed: number;
|
|
92
|
+
};
|
|
93
|
+
/** Check if a package version's files are cached. */
|
|
94
|
+
hasTarballCache(name: string, version: string): boolean;
|
|
95
|
+
/** Get all cached files for a package version.
|
|
96
|
+
*
|
|
97
|
+
* L1 observability: hit when rows > 0; miss when empty. Bytes on
|
|
98
|
+
* hit = sum of file sizes from the SIZE column (cheaper than
|
|
99
|
+
* measuring blob lengths after decode; SIZE is the source-of-truth
|
|
100
|
+
* stored at write time). */
|
|
101
|
+
getTarballFiles(name: string, version: string): TarballCacheFile[];
|
|
102
|
+
/** Max individual file size for tarball cache (DO SQLite blob limit). */
|
|
103
|
+
static readonly MAX_CACHEABLE_FILE = 1000000;
|
|
104
|
+
/** Max total package size for tarball cache. */
|
|
105
|
+
static readonly MAX_CACHEABLE_PACKAGE = 5000000;
|
|
106
|
+
/**
|
|
107
|
+
* Store extracted tarball files for a package version.
|
|
108
|
+
* Skips packages that exceed the SQLite blob size limit (SQLITE_TOOBIG).
|
|
109
|
+
* Large packages (date-fns, lucide-react) will be re-fetched on reinstall.
|
|
110
|
+
*/
|
|
111
|
+
putTarballFiles(name: string, version: string, files: Map<string, Uint8Array>, ctx?: DurableObjectState): void;
|
|
112
|
+
/** Count cached files for a package version. */
|
|
113
|
+
getTarballFileCount(name: string, version: string): number;
|
|
114
|
+
/** Read the lockfile for a project. Returns null if not found. */
|
|
115
|
+
readLockfile(projectPath: string): Map<string, LockfileEntry> | null;
|
|
116
|
+
/** Write/overwrite the lockfile for a project. Atomic via transaction. */
|
|
117
|
+
writeLockfile(projectPath: string, entries: Map<string, LockfileEntry>, ctx?: DurableObjectState): void;
|
|
118
|
+
/** Delete lockfile for a project (e.g., after package.json changes). */
|
|
119
|
+
deleteLockfile(projectPath: string): void;
|
|
120
|
+
/** Get a pre-bundled ESM module. */
|
|
121
|
+
getEsmBundle(specifier: string): EsmBundleEntry | null;
|
|
122
|
+
/** Store a pre-bundled ESM module. */
|
|
123
|
+
putEsmBundle(entry: EsmBundleEntry): void;
|
|
124
|
+
/** Delete a pre-bundled ESM module (e.g., after package update). */
|
|
125
|
+
deleteEsmBundle(specifier: string): void;
|
|
126
|
+
/** Delete all ESM bundles (e.g., after full reinstall). */
|
|
127
|
+
clearEsmBundles(): void;
|
|
128
|
+
getStats(): {
|
|
129
|
+
registryEntries: number;
|
|
130
|
+
cachedPackages: number;
|
|
131
|
+
cachedFiles: number;
|
|
132
|
+
lockfileProjects: number;
|
|
133
|
+
esmBundles: number;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/npm/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* npm-cache.ts — SQLite-backed package cache for Nimbus npm v2.
|
|
3
|
+
*
|
|
4
|
+
* Four tables:
|
|
5
|
+
* 1. pkg_registry_cache — packument metadata (avoids re-fetching full JSON)
|
|
6
|
+
* 2. pkg_tarball_cache — extracted file contents per name@version
|
|
7
|
+
* 3. pkg_lockfile — resolved dependency graph per project
|
|
8
|
+
* 4. pkg_esm_bundles — pre-bundled ESM for /@modules/ serving
|
|
9
|
+
*
|
|
10
|
+
* All tables live in the same DO SQLite as the VFS. Schema is created lazily
|
|
11
|
+
* on first use (not at VFS init, to avoid penalizing sessions that don't npm install).
|
|
12
|
+
*
|
|
13
|
+
* L1 cache observability (cache-observability wave):
|
|
14
|
+
* getRegistryEntry / getTarballFiles bump per-tier counters via
|
|
15
|
+
* src/_shared/cache-stats.ts. Hit = row(s) returned with size > 0;
|
|
16
|
+
* miss = empty result set. Callers fall through to L2/L3/L4 on miss.
|
|
17
|
+
*/
|
|
18
|
+
import { recordHit as _l1RecordHit, recordMiss as _l1RecordMiss } from '../_shared/cache-stats.js';
|
|
19
|
+
// ── NpmCache ────────────────────────────────────────────────────────────
|
|
20
|
+
export class NpmCache {
|
|
21
|
+
sql;
|
|
22
|
+
initialized = false;
|
|
23
|
+
constructor(sql) {
|
|
24
|
+
this.sql = sql;
|
|
25
|
+
}
|
|
26
|
+
// ── Schema ────────────────────────────────────────────────────────────
|
|
27
|
+
ensureSchema() {
|
|
28
|
+
if (this.initialized)
|
|
29
|
+
return;
|
|
30
|
+
this.sql.exec(`CREATE TABLE IF NOT EXISTS pkg_registry_cache (
|
|
31
|
+
name TEXT NOT NULL,
|
|
32
|
+
version TEXT NOT NULL,
|
|
33
|
+
tarball_url TEXT NOT NULL,
|
|
34
|
+
integrity TEXT NOT NULL DEFAULT '',
|
|
35
|
+
deps_json TEXT NOT NULL DEFAULT '{}',
|
|
36
|
+
peer_deps_json TEXT NOT NULL DEFAULT '{}',
|
|
37
|
+
exports_json TEXT NOT NULL DEFAULT '{}',
|
|
38
|
+
main TEXT NOT NULL DEFAULT '',
|
|
39
|
+
module_field TEXT NOT NULL DEFAULT '',
|
|
40
|
+
bin_json TEXT NOT NULL DEFAULT '{}',
|
|
41
|
+
fetched_at INTEGER NOT NULL DEFAULT 0,
|
|
42
|
+
PRIMARY KEY (name, version)
|
|
43
|
+
)`);
|
|
44
|
+
// X.5-F R2: peer_deps_json column added in this wave. Older tenants
|
|
45
|
+
// have a registry cache table without it — ALTER TABLE adds it
|
|
46
|
+
// with the same NOT NULL DEFAULT '{}' the CREATE specifies. SQLite
|
|
47
|
+
// ignores ADD COLUMN if the column already exists in newer setups
|
|
48
|
+
// — except it doesn't, it errors. So we probe via PRAGMA first.
|
|
49
|
+
let hasPeerCol = false;
|
|
50
|
+
try {
|
|
51
|
+
const cols = [...this.sql.exec(`PRAGMA table_info(pkg_registry_cache)`)];
|
|
52
|
+
hasPeerCol = cols.some((r) => String(r.name) === 'peer_deps_json');
|
|
53
|
+
}
|
|
54
|
+
catch { /* PRAGMA failed — fall through and ATTEMPT, swallow on error */ }
|
|
55
|
+
if (!hasPeerCol) {
|
|
56
|
+
try {
|
|
57
|
+
this.sql.exec(`ALTER TABLE pkg_registry_cache ADD COLUMN peer_deps_json TEXT NOT NULL DEFAULT '{}'`);
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
// Race or pre-existing — non-fatal; the column might already
|
|
61
|
+
// exist if the CREATE just ran above on a fresh tenant.
|
|
62
|
+
const msg = e?.message || String(e);
|
|
63
|
+
if (!/duplicate column/i.test(msg)) {
|
|
64
|
+
console.error('[npm-cache] peer_deps_json migration failed:', msg);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
this.sql.exec(`CREATE TABLE IF NOT EXISTS pkg_tarball_cache (
|
|
69
|
+
name TEXT NOT NULL,
|
|
70
|
+
version TEXT NOT NULL,
|
|
71
|
+
rel_path TEXT NOT NULL,
|
|
72
|
+
data BLOB NOT NULL,
|
|
73
|
+
size INTEGER NOT NULL DEFAULT 0,
|
|
74
|
+
PRIMARY KEY (name, version, rel_path)
|
|
75
|
+
)`);
|
|
76
|
+
this.sql.exec(`CREATE INDEX IF NOT EXISTS idx_pkg_tarball_nv ON pkg_tarball_cache(name, version)`);
|
|
77
|
+
this.sql.exec(`CREATE TABLE IF NOT EXISTS pkg_lockfile (
|
|
78
|
+
project_path TEXT NOT NULL,
|
|
79
|
+
name TEXT NOT NULL,
|
|
80
|
+
resolved_ver TEXT NOT NULL,
|
|
81
|
+
integrity TEXT NOT NULL DEFAULT '',
|
|
82
|
+
deps_json TEXT NOT NULL DEFAULT '{}',
|
|
83
|
+
hoisted_path TEXT NOT NULL DEFAULT '',
|
|
84
|
+
PRIMARY KEY (project_path, name)
|
|
85
|
+
)`);
|
|
86
|
+
this.sql.exec(`CREATE TABLE IF NOT EXISTS pkg_esm_bundles (
|
|
87
|
+
specifier TEXT PRIMARY KEY,
|
|
88
|
+
bundle_hash TEXT NOT NULL,
|
|
89
|
+
esm_code TEXT NOT NULL,
|
|
90
|
+
built_at INTEGER NOT NULL DEFAULT 0,
|
|
91
|
+
input_hash TEXT NOT NULL DEFAULT ''
|
|
92
|
+
)`);
|
|
93
|
+
this.initialized = true;
|
|
94
|
+
}
|
|
95
|
+
// ── Registry cache ────────────────────────────────────────────────────
|
|
96
|
+
/** Get cached registry metadata for a specific name@version.
|
|
97
|
+
*
|
|
98
|
+
* L1 observability: bumps cache-stats L1.packument hit/miss. Bytes
|
|
99
|
+
* on hit = approximate size of the deserialized RegistryCacheEntry,
|
|
100
|
+
* computed as sum of major-string lengths (depsJson + peerDepsJson +
|
|
101
|
+
* exportsJson + binJson + a few tens of bytes overhead). This is a
|
|
102
|
+
* good proxy for "how much L1 data did we save fetching" — not the
|
|
103
|
+
* exact SQLite blob byte count (which would require a separate
|
|
104
|
+
* SELECT). */
|
|
105
|
+
getRegistryEntry(name, version) {
|
|
106
|
+
this.ensureSchema();
|
|
107
|
+
const rows = [...this.sql.exec(`SELECT name, version, tarball_url, integrity, deps_json, peer_deps_json, exports_json, main, module_field, bin_json, fetched_at
|
|
108
|
+
FROM pkg_registry_cache WHERE name = ? AND version = ?`, name, version)];
|
|
109
|
+
if (rows.length === 0) {
|
|
110
|
+
_l1RecordMiss('L1', 'packument');
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const r = rows[0];
|
|
114
|
+
const entry = {
|
|
115
|
+
name: String(r.name),
|
|
116
|
+
version: String(r.version),
|
|
117
|
+
tarballUrl: String(r.tarball_url),
|
|
118
|
+
integrity: String(r.integrity),
|
|
119
|
+
depsJson: String(r.deps_json),
|
|
120
|
+
peerDepsJson: String(r.peer_deps_json ?? '{}'),
|
|
121
|
+
exportsJson: String(r.exports_json),
|
|
122
|
+
main: String(r.main),
|
|
123
|
+
moduleField: String(r.module_field),
|
|
124
|
+
binJson: String(r.bin_json),
|
|
125
|
+
fetchedAt: Number(r.fetched_at),
|
|
126
|
+
};
|
|
127
|
+
// Approximate hit-bytes: sum of variable-length string fields.
|
|
128
|
+
// The fixed-cost fields (name, version, integrity, etc.) add ~150
|
|
129
|
+
// bytes on average; the variable fields can be tens of KB for
|
|
130
|
+
// packages with large exports maps. Skip the constant overhead so
|
|
131
|
+
// bytes correlates with the dominant cost.
|
|
132
|
+
const bytes = entry.depsJson.length +
|
|
133
|
+
entry.peerDepsJson.length +
|
|
134
|
+
entry.exportsJson.length +
|
|
135
|
+
entry.binJson.length;
|
|
136
|
+
_l1RecordHit('L1', 'packument', bytes);
|
|
137
|
+
return entry;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Bulk read of cached registry entries — used by the resolver-facet
|
|
141
|
+
* dispatcher to pre-load cached metadata it can ship across to the
|
|
142
|
+
* facet at phase start. Caller passes a hard cap; we LIMIT in SQL so
|
|
143
|
+
* a pathologically warm cache doesn't OOM the supervisor reading its
|
|
144
|
+
* own cache.
|
|
145
|
+
*
|
|
146
|
+
* Order: most-recently-fetched first, so when the cap truncates we
|
|
147
|
+
* keep the freshest entries (most likely to satisfy current ranges).
|
|
148
|
+
*/
|
|
149
|
+
dumpRegistryEntries(maxRows) {
|
|
150
|
+
this.ensureSchema();
|
|
151
|
+
const rows = [...this.sql.exec(`SELECT name, version, tarball_url, integrity, deps_json, peer_deps_json, exports_json, main, module_field, bin_json, fetched_at
|
|
152
|
+
FROM pkg_registry_cache ORDER BY fetched_at DESC LIMIT ?`, maxRows)];
|
|
153
|
+
return rows.map((r) => ({
|
|
154
|
+
name: String(r.name),
|
|
155
|
+
version: String(r.version),
|
|
156
|
+
tarballUrl: String(r.tarball_url),
|
|
157
|
+
integrity: String(r.integrity),
|
|
158
|
+
depsJson: String(r.deps_json),
|
|
159
|
+
peerDepsJson: String(r.peer_deps_json ?? '{}'),
|
|
160
|
+
exportsJson: String(r.exports_json),
|
|
161
|
+
main: String(r.main),
|
|
162
|
+
moduleField: String(r.module_field),
|
|
163
|
+
binJson: String(r.bin_json),
|
|
164
|
+
fetchedAt: Number(r.fetched_at),
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
/** Get all cached versions for a package name. */
|
|
168
|
+
getRegistryVersions(name) {
|
|
169
|
+
this.ensureSchema();
|
|
170
|
+
const rows = [...this.sql.exec(`SELECT name, version, tarball_url, integrity, deps_json, peer_deps_json, exports_json, main, module_field, bin_json, fetched_at
|
|
171
|
+
FROM pkg_registry_cache WHERE name = ?`, name)];
|
|
172
|
+
return rows.map(r => ({
|
|
173
|
+
name: String(r.name),
|
|
174
|
+
version: String(r.version),
|
|
175
|
+
tarballUrl: String(r.tarball_url),
|
|
176
|
+
integrity: String(r.integrity),
|
|
177
|
+
depsJson: String(r.deps_json),
|
|
178
|
+
peerDepsJson: String(r.peer_deps_json ?? '{}'),
|
|
179
|
+
exportsJson: String(r.exports_json),
|
|
180
|
+
main: String(r.main),
|
|
181
|
+
moduleField: String(r.module_field),
|
|
182
|
+
binJson: String(r.bin_json),
|
|
183
|
+
fetchedAt: Number(r.fetched_at),
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
/** Store registry metadata for a resolved package version. */
|
|
187
|
+
putRegistryEntry(entry) {
|
|
188
|
+
this.ensureSchema();
|
|
189
|
+
this.sql.exec(`INSERT OR REPLACE INTO pkg_registry_cache
|
|
190
|
+
(name, version, tarball_url, integrity, deps_json, peer_deps_json, exports_json, main, module_field, bin_json, fetched_at)
|
|
191
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, entry.name, entry.version, entry.tarballUrl, entry.integrity, entry.depsJson, entry.peerDepsJson || '{}', entry.exportsJson, entry.main, entry.moduleField, entry.binJson, entry.fetchedAt);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Bulk-write registry entries in ONE call. Used by the resolver-facet
|
|
195
|
+
* to flush a wave of resolved packages back to the supervisor in a
|
|
196
|
+
* single RPC round-trip; one-RPC-per-entry across ~456 transitive
|
|
197
|
+
* deps would multiply RPC overhead by 100×.
|
|
198
|
+
*
|
|
199
|
+
* Each row is one prepared statement; we loop rather than building a
|
|
200
|
+
* giant multi-row INSERT because workerd's SqlStorage `.exec()` is
|
|
201
|
+
* already transaction-batched at the storage layer when called within
|
|
202
|
+
* the same DO event loop turn (no explicit BEGIN/COMMIT needed for
|
|
203
|
+
* atomicity of the batch — see Cloudflare DO SQLite docs). If a
|
|
204
|
+
* single row fails (malformed data), it's logged and the rest still
|
|
205
|
+
* commit; resolver correctness depends on cache being best-effort.
|
|
206
|
+
*/
|
|
207
|
+
putRegistryEntries(entries) {
|
|
208
|
+
this.ensureSchema();
|
|
209
|
+
let written = 0;
|
|
210
|
+
let failed = 0;
|
|
211
|
+
for (const entry of entries) {
|
|
212
|
+
try {
|
|
213
|
+
this.sql.exec(`INSERT OR REPLACE INTO pkg_registry_cache
|
|
214
|
+
(name, version, tarball_url, integrity, deps_json, peer_deps_json, exports_json, main, module_field, bin_json, fetched_at)
|
|
215
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, entry.name, entry.version, entry.tarballUrl, entry.integrity, entry.depsJson, entry.peerDepsJson || '{}', entry.exportsJson, entry.main, entry.moduleField, entry.binJson, entry.fetchedAt);
|
|
216
|
+
written++;
|
|
217
|
+
}
|
|
218
|
+
catch (e) {
|
|
219
|
+
console.error(`[npm-cache] bulk putRegistryEntry failed for ${entry.name}@${entry.version}:`, e?.message);
|
|
220
|
+
failed++;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return { written, failed };
|
|
224
|
+
}
|
|
225
|
+
// ── Tarball cache ─────────────────────────────────────────────────────
|
|
226
|
+
/** Check if a package version's files are cached. */
|
|
227
|
+
hasTarballCache(name, version) {
|
|
228
|
+
this.ensureSchema();
|
|
229
|
+
const rows = [...this.sql.exec(`SELECT 1 FROM pkg_tarball_cache WHERE name = ? AND version = ? LIMIT 1`, name, version)];
|
|
230
|
+
return rows.length > 0;
|
|
231
|
+
}
|
|
232
|
+
/** Get all cached files for a package version.
|
|
233
|
+
*
|
|
234
|
+
* L1 observability: hit when rows > 0; miss when empty. Bytes on
|
|
235
|
+
* hit = sum of file sizes from the SIZE column (cheaper than
|
|
236
|
+
* measuring blob lengths after decode; SIZE is the source-of-truth
|
|
237
|
+
* stored at write time). */
|
|
238
|
+
getTarballFiles(name, version) {
|
|
239
|
+
this.ensureSchema();
|
|
240
|
+
const rows = [...this.sql.exec(`SELECT rel_path, data, size FROM pkg_tarball_cache WHERE name = ? AND version = ?`, name, version)];
|
|
241
|
+
if (rows.length === 0) {
|
|
242
|
+
_l1RecordMiss('L1', 'tarball');
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
const out = rows.map(r => ({
|
|
246
|
+
relPath: String(r.rel_path),
|
|
247
|
+
data: blobToUint8Array(r.data),
|
|
248
|
+
size: Number(r.size),
|
|
249
|
+
}));
|
|
250
|
+
let totalBytes = 0;
|
|
251
|
+
for (const f of out)
|
|
252
|
+
totalBytes += f.size;
|
|
253
|
+
_l1RecordHit('L1', 'tarball', totalBytes);
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
256
|
+
/** Max individual file size for tarball cache (DO SQLite blob limit). */
|
|
257
|
+
static MAX_CACHEABLE_FILE = 1_000_000; // 1MB
|
|
258
|
+
/** Max total package size for tarball cache. */
|
|
259
|
+
static MAX_CACHEABLE_PACKAGE = 5_000_000; // 5MB
|
|
260
|
+
/**
|
|
261
|
+
* Store extracted tarball files for a package version.
|
|
262
|
+
* Skips packages that exceed the SQLite blob size limit (SQLITE_TOOBIG).
|
|
263
|
+
* Large packages (date-fns, lucide-react) will be re-fetched on reinstall.
|
|
264
|
+
*/
|
|
265
|
+
putTarballFiles(name, version, files, ctx) {
|
|
266
|
+
this.ensureSchema();
|
|
267
|
+
// Check total package size — skip caching if too large
|
|
268
|
+
let totalSize = 0;
|
|
269
|
+
for (const [, data] of files)
|
|
270
|
+
totalSize += data.length;
|
|
271
|
+
if (totalSize > NpmCache.MAX_CACHEABLE_PACKAGE) {
|
|
272
|
+
console.log(`[npm-cache] skipping cache for ${name}@${version} (${(totalSize / 1e6).toFixed(1)}MB > 5MB limit)`);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// Filter out individual files that exceed the blob limit
|
|
276
|
+
const entries = [...files.entries()].filter(([relPath, data]) => {
|
|
277
|
+
if (data.length > NpmCache.MAX_CACHEABLE_FILE) {
|
|
278
|
+
console.log(`[npm-cache] skipping large file ${relPath} (${(data.length / 1e6).toFixed(1)}MB)`);
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
return true;
|
|
282
|
+
});
|
|
283
|
+
if (entries.length === 0)
|
|
284
|
+
return;
|
|
285
|
+
const doTx = (fn) => {
|
|
286
|
+
if (ctx?.storage?.transactionSync) {
|
|
287
|
+
ctx.storage.transactionSync(fn);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
fn();
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
doTx(() => {
|
|
294
|
+
// Delete old entries for this package version (if re-caching)
|
|
295
|
+
this.sql.exec(`DELETE FROM pkg_tarball_cache WHERE name = ? AND version = ?`, name, version);
|
|
296
|
+
// Batch insert: DO SQLite has a low bind-parameter limit (~100 vars).
|
|
297
|
+
// 5 columns per row → max 19 rows per statement (19×5=95).
|
|
298
|
+
const BATCH = 19;
|
|
299
|
+
for (let i = 0; i < entries.length; i += BATCH) {
|
|
300
|
+
const batch = entries.slice(i, i + BATCH);
|
|
301
|
+
const placeholders = batch.map(() => '(?,?,?,?,?)').join(',');
|
|
302
|
+
const values = [];
|
|
303
|
+
for (const [relPath, data] of batch) {
|
|
304
|
+
values.push(name, version, relPath, data, data.length);
|
|
305
|
+
}
|
|
306
|
+
this.sql.exec(`INSERT INTO pkg_tarball_cache (name, version, rel_path, data, size) VALUES ${placeholders}`, ...values);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
/** Count cached files for a package version. */
|
|
311
|
+
getTarballFileCount(name, version) {
|
|
312
|
+
this.ensureSchema();
|
|
313
|
+
const rows = [...this.sql.exec(`SELECT COUNT(*) as cnt FROM pkg_tarball_cache WHERE name = ? AND version = ?`, name, version)];
|
|
314
|
+
return rows.length > 0 ? Number(rows[0].cnt) : 0;
|
|
315
|
+
}
|
|
316
|
+
// ── Lockfile ──────────────────────────────────────────────────────────
|
|
317
|
+
/** Read the lockfile for a project. Returns null if not found. */
|
|
318
|
+
readLockfile(projectPath) {
|
|
319
|
+
this.ensureSchema();
|
|
320
|
+
const rows = [...this.sql.exec(`SELECT name, resolved_ver, integrity, deps_json, hoisted_path
|
|
321
|
+
FROM pkg_lockfile WHERE project_path = ?`, projectPath)];
|
|
322
|
+
if (rows.length === 0)
|
|
323
|
+
return null;
|
|
324
|
+
const result = new Map();
|
|
325
|
+
for (const r of rows) {
|
|
326
|
+
result.set(String(r.name), {
|
|
327
|
+
name: String(r.name),
|
|
328
|
+
resolvedVer: String(r.resolved_ver),
|
|
329
|
+
integrity: String(r.integrity),
|
|
330
|
+
depsJson: String(r.deps_json),
|
|
331
|
+
hoistedPath: String(r.hoisted_path),
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
return result;
|
|
335
|
+
}
|
|
336
|
+
/** Write/overwrite the lockfile for a project. Atomic via transaction. */
|
|
337
|
+
writeLockfile(projectPath, entries, ctx) {
|
|
338
|
+
this.ensureSchema();
|
|
339
|
+
const doTx = (fn) => {
|
|
340
|
+
if (ctx?.storage?.transactionSync) {
|
|
341
|
+
ctx.storage.transactionSync(fn);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
fn();
|
|
345
|
+
}
|
|
346
|
+
};
|
|
347
|
+
doTx(() => {
|
|
348
|
+
// Clear existing lockfile for this project
|
|
349
|
+
this.sql.exec(`DELETE FROM pkg_lockfile WHERE project_path = ?`, projectPath);
|
|
350
|
+
// Batch insert: DO SQLite ~100 var limit. 6 cols → max 16 rows (16×6=96).
|
|
351
|
+
const entryList = [...entries.values()];
|
|
352
|
+
const BATCH = 16;
|
|
353
|
+
for (let i = 0; i < entryList.length; i += BATCH) {
|
|
354
|
+
const batch = entryList.slice(i, i + BATCH);
|
|
355
|
+
const placeholders = batch.map(() => '(?,?,?,?,?,?)').join(',');
|
|
356
|
+
const values = [];
|
|
357
|
+
for (const e of batch) {
|
|
358
|
+
values.push(projectPath, e.name, e.resolvedVer, e.integrity, e.depsJson, e.hoistedPath);
|
|
359
|
+
}
|
|
360
|
+
this.sql.exec(`INSERT INTO pkg_lockfile (project_path, name, resolved_ver, integrity, deps_json, hoisted_path) VALUES ${placeholders}`, ...values);
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
/** Delete lockfile for a project (e.g., after package.json changes). */
|
|
365
|
+
deleteLockfile(projectPath) {
|
|
366
|
+
this.ensureSchema();
|
|
367
|
+
this.sql.exec(`DELETE FROM pkg_lockfile WHERE project_path = ?`, projectPath);
|
|
368
|
+
}
|
|
369
|
+
// ── ESM bundles ───────────────────────────────────────────────────────
|
|
370
|
+
/** Get a pre-bundled ESM module. */
|
|
371
|
+
getEsmBundle(specifier) {
|
|
372
|
+
this.ensureSchema();
|
|
373
|
+
const rows = [...this.sql.exec(`SELECT specifier, bundle_hash, esm_code, built_at, input_hash
|
|
374
|
+
FROM pkg_esm_bundles WHERE specifier = ?`, specifier)];
|
|
375
|
+
if (rows.length === 0)
|
|
376
|
+
return null;
|
|
377
|
+
const r = rows[0];
|
|
378
|
+
return {
|
|
379
|
+
specifier: String(r.specifier),
|
|
380
|
+
bundleHash: String(r.bundle_hash),
|
|
381
|
+
esmCode: String(r.esm_code),
|
|
382
|
+
builtAt: Number(r.built_at),
|
|
383
|
+
inputHash: String(r.input_hash),
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/** Store a pre-bundled ESM module. */
|
|
387
|
+
putEsmBundle(entry) {
|
|
388
|
+
this.ensureSchema();
|
|
389
|
+
this.sql.exec(`INSERT OR REPLACE INTO pkg_esm_bundles (specifier, bundle_hash, esm_code, built_at, input_hash)
|
|
390
|
+
VALUES (?, ?, ?, ?, ?)`, entry.specifier, entry.bundleHash, entry.esmCode, entry.builtAt, entry.inputHash);
|
|
391
|
+
}
|
|
392
|
+
/** Delete a pre-bundled ESM module (e.g., after package update). */
|
|
393
|
+
deleteEsmBundle(specifier) {
|
|
394
|
+
this.ensureSchema();
|
|
395
|
+
this.sql.exec(`DELETE FROM pkg_esm_bundles WHERE specifier = ?`, specifier);
|
|
396
|
+
}
|
|
397
|
+
/** Delete all ESM bundles (e.g., after full reinstall). */
|
|
398
|
+
clearEsmBundles() {
|
|
399
|
+
this.ensureSchema();
|
|
400
|
+
this.sql.exec(`DELETE FROM pkg_esm_bundles`);
|
|
401
|
+
}
|
|
402
|
+
// ── Stats ─────────────────────────────────────────────────────────────
|
|
403
|
+
getStats() {
|
|
404
|
+
this.ensureSchema();
|
|
405
|
+
const reg = [...this.sql.exec(`SELECT COUNT(*) as cnt FROM pkg_registry_cache`)];
|
|
406
|
+
const pkgs = [...this.sql.exec(`SELECT COUNT(DISTINCT name || '@' || version) as cnt FROM pkg_tarball_cache`)];
|
|
407
|
+
const files = [...this.sql.exec(`SELECT COUNT(*) as cnt FROM pkg_tarball_cache`)];
|
|
408
|
+
const locks = [...this.sql.exec(`SELECT COUNT(DISTINCT project_path) as cnt FROM pkg_lockfile`)];
|
|
409
|
+
const esm = [...this.sql.exec(`SELECT COUNT(*) as cnt FROM pkg_esm_bundles`)];
|
|
410
|
+
return {
|
|
411
|
+
registryEntries: Number(reg[0]?.cnt ?? 0),
|
|
412
|
+
cachedPackages: Number(pkgs[0]?.cnt ?? 0),
|
|
413
|
+
cachedFiles: Number(files[0]?.cnt ?? 0),
|
|
414
|
+
lockfileProjects: Number(locks[0]?.cnt ?? 0),
|
|
415
|
+
esmBundles: Number(esm[0]?.cnt ?? 0),
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
420
|
+
function blobToUint8Array(blob) {
|
|
421
|
+
if (blob instanceof Uint8Array)
|
|
422
|
+
return blob;
|
|
423
|
+
if (blob instanceof ArrayBuffer)
|
|
424
|
+
return new Uint8Array(blob);
|
|
425
|
+
if (ArrayBuffer.isView(blob)) {
|
|
426
|
+
return new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength);
|
|
427
|
+
}
|
|
428
|
+
return new Uint8Array(0);
|
|
429
|
+
}
|