@nimbus-sh/core 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/dist/_shared/ai-egress.d.ts +73 -0
- package/dist/_shared/ai-egress.d.ts.map +1 -0
- package/dist/_shared/ai-egress.js +88 -0
- package/dist/_shared/byte-stream.d.ts +59 -0
- package/dist/_shared/byte-stream.d.ts.map +1 -0
- package/dist/_shared/byte-stream.js +77 -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 +145 -0
- package/dist/_shared/cache-stats.d.ts.map +1 -0
- package/dist/_shared/cache-stats.js +161 -0
- package/dist/_shared/crypto.d.ts +17 -0
- package/dist/_shared/crypto.d.ts.map +1 -0
- package/dist/_shared/crypto.js +131 -0
- package/dist/_shared/esbuild-facet-shim.d.ts +21 -0
- package/dist/_shared/esbuild-facet-shim.d.ts.map +1 -0
- package/dist/_shared/esbuild-facet-shim.js +22 -0
- package/dist/_shared/exports-resolver.d.ts +74 -0
- package/dist/_shared/exports-resolver.d.ts.map +1 -0
- package/dist/_shared/exports-resolver.js +284 -0
- package/dist/_shared/facet-vfs-cursor.d.ts +48 -0
- package/dist/_shared/facet-vfs-cursor.d.ts.map +1 -0
- package/dist/_shared/facet-vfs-cursor.js +51 -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/lru-map.d.ts +25 -0
- package/dist/_shared/lru-map.d.ts.map +1 -0
- package/dist/_shared/lru-map.js +57 -0
- package/dist/_shared/real-node-imports.d.ts +43 -0
- package/dist/_shared/real-node-imports.d.ts.map +1 -0
- package/dist/_shared/real-node-imports.js +52 -0
- package/dist/_shared/retry.d.ts +92 -0
- package/dist/_shared/retry.d.ts.map +1 -0
- package/dist/_shared/retry.js +155 -0
- package/dist/_shared/rpc-dispose.d.ts +4 -0
- package/dist/_shared/rpc-dispose.d.ts.map +1 -0
- package/dist/_shared/rpc-dispose.js +30 -0
- package/dist/_shared/terminal.d.ts +2 -0
- package/dist/_shared/terminal.d.ts.map +1 -0
- package/dist/_shared/terminal.js +3 -0
- package/dist/_shared/typescript-specifiers.d.ts +58 -0
- package/dist/_shared/typescript-specifiers.d.ts.map +1 -0
- package/dist/_shared/typescript-specifiers.js +84 -0
- package/dist/_shared/untrusted-request.d.ts +34 -0
- package/dist/_shared/untrusted-request.d.ts.map +1 -0
- package/dist/_shared/untrusted-request.js +74 -0
- package/dist/_shared/vfs-write-ledger.d.ts +3 -0
- package/dist/_shared/vfs-write-ledger.d.ts.map +1 -0
- package/dist/_shared/vfs-write-ledger.js +439 -0
- package/dist/_shared/w7-frame.d.ts +79 -0
- package/dist/_shared/w7-frame.d.ts.map +1 -0
- package/dist/_shared/w7-frame.js +839 -0
- package/dist/_shared/weighted-credit-pool.d.ts +61 -0
- package/dist/_shared/weighted-credit-pool.d.ts.map +1 -0
- package/dist/_shared/weighted-credit-pool.js +196 -0
- package/dist/constants.d.ts +64 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +264 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/observability/diag-counters.d.ts +236 -0
- package/dist/observability/diag-counters.d.ts.map +1 -0
- package/dist/observability/diag-counters.js +195 -0
- package/dist/observability/heap-estimate.d.ts +225 -0
- package/dist/observability/heap-estimate.d.ts.map +1 -0
- package/dist/observability/heap-estimate.js +185 -0
- package/dist/observability/heavy-alloc-coord.d.ts +93 -0
- package/dist/observability/heavy-alloc-coord.d.ts.map +1 -0
- package/dist/observability/heavy-alloc-coord.js +181 -0
- package/dist/observability/oom-classify.d.ts +138 -0
- package/dist/observability/oom-classify.d.ts.map +1 -0
- package/dist/observability/oom-classify.js +261 -0
- package/dist/observability/oom-discriminator.d.ts +176 -0
- package/dist/observability/oom-discriminator.d.ts.map +1 -0
- package/dist/observability/oom-discriminator.js +272 -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 +139 -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/bash/preamble.d.ts +2 -0
- package/dist/runtime/bash/preamble.d.ts.map +1 -0
- package/dist/runtime/bash/preamble.js +1849 -0
- package/dist/runtime/bash/types.d.ts +433 -0
- package/dist/runtime/bash/types.d.ts.map +1 -0
- package/dist/runtime/bash/types.js +1 -0
- package/dist/runtime/bundle-profile.d.ts +14 -0
- package/dist/runtime/bundle-profile.d.ts.map +1 -0
- package/dist/runtime/bundle-profile.js +20 -0
- package/dist/runtime/cirrus-vite-config-rewriter.d.ts +2 -0
- package/dist/runtime/cirrus-vite-config-rewriter.d.ts.map +1 -0
- package/dist/runtime/cirrus-vite-config-rewriter.js +28 -0
- package/dist/runtime/cli-flags.d.ts +2 -0
- package/dist/runtime/cli-flags.d.ts.map +1 -0
- package/dist/runtime/cli-flags.js +11 -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/cpython-preamble.d.ts +32 -0
- package/dist/runtime/cpython-preamble.d.ts.map +1 -0
- package/dist/runtime/cpython-preamble.js +296 -0
- package/dist/runtime/esbuild-service.d.ts +242 -0
- package/dist/runtime/esbuild-service.d.ts.map +1 -0
- package/dist/runtime/esbuild-service.js +1452 -0
- package/dist/runtime/framework-detect.d.ts +70 -0
- package/dist/runtime/framework-detect.d.ts.map +1 -0
- package/dist/runtime/framework-detect.js +177 -0
- package/dist/runtime/import-meta-transform.d.ts +3 -0
- package/dist/runtime/import-meta-transform.d.ts.map +1 -0
- package/dist/runtime/import-meta-transform.js +15 -0
- package/dist/runtime/javascript-ast.d.ts +13 -0
- package/dist/runtime/javascript-ast.d.ts.map +1 -0
- package/dist/runtime/javascript-ast.js +57 -0
- package/dist/runtime/long-running-handle.d.ts +119 -0
- package/dist/runtime/long-running-handle.d.ts.map +1 -0
- package/dist/runtime/long-running-handle.js +169 -0
- package/dist/runtime/module-source-rewriter.d.ts +11 -0
- package/dist/runtime/module-source-rewriter.d.ts.map +1 -0
- package/dist/runtime/module-source-rewriter.js +61 -0
- package/dist/runtime/opentui-wasm-backend.d.ts +160 -0
- package/dist/runtime/opentui-wasm-backend.d.ts.map +1 -0
- package/dist/runtime/opentui-wasm-backend.js +416 -0
- package/dist/runtime/os-contracts.d.ts +436 -0
- package/dist/runtime/os-contracts.d.ts.map +1 -0
- package/dist/runtime/os-contracts.js +101 -0
- package/dist/runtime/port-registry.d.ts +100 -0
- package/dist/runtime/port-registry.d.ts.map +1 -0
- package/dist/runtime/port-registry.js +265 -0
- package/dist/runtime/process-input-routing.d.ts +33 -0
- package/dist/runtime/process-input-routing.d.ts.map +1 -0
- package/dist/runtime/process-input-routing.js +59 -0
- package/dist/runtime/process-input.d.ts +39 -0
- package/dist/runtime/process-input.d.ts.map +1 -0
- package/dist/runtime/process-input.js +117 -0
- package/dist/runtime/process-io-protocol.d.ts +90 -0
- package/dist/runtime/process-io-protocol.d.ts.map +1 -0
- package/dist/runtime/process-io-protocol.js +81 -0
- package/dist/runtime/process-logs.d.ts +352 -0
- package/dist/runtime/process-logs.d.ts.map +1 -0
- package/dist/runtime/process-logs.js +750 -0
- package/dist/runtime/process-table.d.ts +101 -0
- package/dist/runtime/process-table.d.ts.map +1 -0
- package/dist/runtime/process-table.js +175 -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-server-adapter.d.ts +33 -0
- package/dist/runtime/python-server-adapter.d.ts.map +1 -0
- package/dist/runtime/python-server-adapter.js +132 -0
- package/dist/runtime/require-resolver.d.ts +44 -0
- package/dist/runtime/require-resolver.d.ts.map +1 -0
- package/dist/runtime/require-resolver.js +698 -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-green-threads.d.ts +136 -0
- package/dist/runtime/ruby-green-threads.d.ts.map +1 -0
- package/dist/runtime/ruby-green-threads.js +904 -0
- package/dist/runtime/ruby-socket-shim.d.ts +2 -0
- package/dist/runtime/ruby-socket-shim.d.ts.map +1 -0
- package/dist/runtime/ruby-socket-shim.js +548 -0
- package/dist/runtime/session-process-supervisor.d.ts +156 -0
- package/dist/runtime/session-process-supervisor.d.ts.map +1 -0
- package/dist/runtime/session-process-supervisor.js +238 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts +70 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.d.ts.map +1 -0
- package/dist/runtime/sqlite-runtime-fs-bridge.js +425 -0
- package/dist/runtime/streams.d.ts +13 -0
- package/dist/runtime/streams.d.ts.map +1 -0
- package/dist/runtime/streams.js +546 -0
- package/dist/runtime/undici-shim.d.ts +62 -0
- package/dist/runtime/undici-shim.d.ts.map +1 -0
- package/dist/runtime/undici-shim.js +516 -0
- package/dist/runtime/vfs-manifest.d.ts +63 -0
- package/dist/runtime/vfs-manifest.d.ts.map +1 -0
- package/dist/runtime/vfs-manifest.js +141 -0
- package/dist/runtime/vfs-snapshot.d.ts +75 -0
- package/dist/runtime/vfs-snapshot.d.ts.map +1 -0
- package/dist/runtime/vfs-snapshot.js +220 -0
- package/dist/runtime/virtual-socket-kernel.d.ts +252 -0
- package/dist/runtime/virtual-socket-kernel.d.ts.map +1 -0
- package/dist/runtime/virtual-socket-kernel.js +1143 -0
- package/dist/runtime/vite-config-parser.d.ts +13 -0
- package/dist/runtime/vite-config-parser.d.ts.map +1 -0
- package/dist/runtime/vite-config-parser.js +258 -0
- package/dist/runtime/wasi/types.d.ts +347 -0
- package/dist/runtime/wasi/types.d.ts.map +1 -0
- package/dist/runtime/wasi/types.js +1 -0
- package/dist/runtime/wasi-instance.d.ts +215 -0
- package/dist/runtime/wasi-instance.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.generated.d.ts +14 -0
- package/dist/runtime/wasi-instance.generated.d.ts.map +1 -0
- package/dist/runtime/wasi-instance.generated.js +13 -0
- package/dist/runtime/wasi-instance.js +179 -0
- package/dist/runtime/wasi-threads.d.ts +169 -0
- package/dist/runtime/wasi-threads.d.ts.map +1 -0
- package/dist/runtime/wasi-threads.js +669 -0
- package/dist/runtime/wasm-memory.d.ts +84 -0
- package/dist/runtime/wasm-memory.d.ts.map +1 -0
- package/dist/runtime/wasm-memory.js +235 -0
- package/dist/shell/elevation-commands.d.ts +5 -0
- package/dist/shell/elevation-commands.d.ts.map +1 -0
- package/dist/shell/elevation-commands.js +109 -0
- package/dist/shell/exec-dispatch.d.ts +57 -0
- package/dist/shell/exec-dispatch.d.ts.map +1 -0
- package/dist/shell/exec-dispatch.js +181 -0
- package/dist/shell/features.d.ts +154 -0
- package/dist/shell/features.d.ts.map +1 -0
- package/dist/shell/features.js +792 -0
- package/dist/shell/shell-entrypoints.d.ts +55 -0
- package/dist/shell/shell-entrypoints.d.ts.map +1 -0
- package/dist/shell/shell-entrypoints.js +230 -0
- package/dist/shell/shell-invocation.d.ts +36 -0
- package/dist/shell/shell-invocation.d.ts.map +1 -0
- package/dist/shell/shell-invocation.js +148 -0
- package/dist/shell/unix-accounts.d.ts +27 -0
- package/dist/shell/unix-accounts.d.ts.map +1 -0
- package/dist/shell/unix-accounts.js +105 -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 +4702 -0
- package/dist/substrate/lifo/commands/archive/gunzip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/gunzip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/gunzip.js +58 -0
- package/dist/substrate/lifo/commands/archive/gzip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/gzip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/gzip.js +73 -0
- package/dist/substrate/lifo/commands/archive/tar.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/tar.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/tar.js +158 -0
- package/dist/substrate/lifo/commands/archive/unzip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/unzip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/unzip.js +114 -0
- package/dist/substrate/lifo/commands/archive/zip.d.ts +4 -0
- package/dist/substrate/lifo/commands/archive/zip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/archive/zip.js +58 -0
- package/dist/substrate/lifo/commands/fs/basename.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/basename.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/basename.js +12 -0
- package/dist/substrate/lifo/commands/fs/cat.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/cat.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/cat.js +52 -0
- package/dist/substrate/lifo/commands/fs/chmod.d.ts +25 -0
- package/dist/substrate/lifo/commands/fs/chmod.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/chmod.js +97 -0
- package/dist/substrate/lifo/commands/fs/chown.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/chown.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/chown.js +41 -0
- package/dist/substrate/lifo/commands/fs/cp.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/cp.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/cp.js +29 -0
- package/dist/substrate/lifo/commands/fs/df.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/df.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/df.js +52 -0
- package/dist/substrate/lifo/commands/fs/dirname.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/dirname.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/dirname.js +12 -0
- package/dist/substrate/lifo/commands/fs/du.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/du.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/du.js +104 -0
- package/dist/substrate/lifo/commands/fs/file.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/file.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/file.js +84 -0
- package/dist/substrate/lifo/commands/fs/find.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/find.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/find.js +72 -0
- package/dist/substrate/lifo/commands/fs/ln.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/ln.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/ln.js +15 -0
- package/dist/substrate/lifo/commands/fs/ls.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/ls.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/ls.js +146 -0
- package/dist/substrate/lifo/commands/fs/mkdir.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/mkdir.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/mkdir.js +31 -0
- package/dist/substrate/lifo/commands/fs/mktemp.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/mktemp.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/mktemp.js +48 -0
- package/dist/substrate/lifo/commands/fs/mv.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/mv.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/mv.js +113 -0
- package/dist/substrate/lifo/commands/fs/realpath.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/realpath.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/realpath.js +27 -0
- package/dist/substrate/lifo/commands/fs/rm.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/rm.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/rm.js +48 -0
- package/dist/substrate/lifo/commands/fs/rmdir.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/rmdir.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/rmdir.js +44 -0
- package/dist/substrate/lifo/commands/fs/stat.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/stat.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/stat.js +35 -0
- package/dist/substrate/lifo/commands/fs/touch.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/touch.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/touch.js +26 -0
- package/dist/substrate/lifo/commands/fs/tree.d.ts +4 -0
- package/dist/substrate/lifo/commands/fs/tree.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/fs/tree.js +69 -0
- package/dist/substrate/lifo/commands/index.d.ts +3 -0
- package/dist/substrate/lifo/commands/index.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/index.js +1 -0
- package/dist/substrate/lifo/commands/io/dd.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/dd.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/dd.js +256 -0
- package/dist/substrate/lifo/commands/io/printf.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/printf.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/printf.js +82 -0
- package/dist/substrate/lifo/commands/io/tee.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/tee.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/tee.js +31 -0
- package/dist/substrate/lifo/commands/io/xargs.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/xargs.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/xargs.js +44 -0
- package/dist/substrate/lifo/commands/io/yes.d.ts +4 -0
- package/dist/substrate/lifo/commands/io/yes.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/io/yes.js +10 -0
- package/dist/substrate/lifo/commands/net/curl.d.ts +6 -0
- package/dist/substrate/lifo/commands/net/curl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/curl.js +617 -0
- package/dist/substrate/lifo/commands/net/dig.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/dig.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/dig.js +77 -0
- package/dist/substrate/lifo/commands/net/forward.d.ts +14 -0
- package/dist/substrate/lifo/commands/net/forward.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/forward.js +80 -0
- package/dist/substrate/lifo/commands/net/host.d.ts +14 -0
- package/dist/substrate/lifo/commands/net/host.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/host.js +160 -0
- package/dist/substrate/lifo/commands/net/ifconfig.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/ifconfig.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ifconfig.js +120 -0
- package/dist/substrate/lifo/commands/net/ip.d.ts +14 -0
- package/dist/substrate/lifo/commands/net/ip.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ip.js +508 -0
- package/dist/substrate/lifo/commands/net/netstat.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/netstat.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/netstat.js +94 -0
- package/dist/substrate/lifo/commands/net/ping.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/ping.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ping.js +64 -0
- package/dist/substrate/lifo/commands/net/ports.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/ports.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/ports.js +36 -0
- package/dist/substrate/lifo/commands/net/route.d.ts +8 -0
- package/dist/substrate/lifo/commands/net/route.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/route.js +128 -0
- package/dist/substrate/lifo/commands/net/tunnel-v2.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/tunnel-v2.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/tunnel-v2.js +141 -0
- package/dist/substrate/lifo/commands/net/tunnel.d.ts +6 -0
- package/dist/substrate/lifo/commands/net/tunnel.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/tunnel.js +232 -0
- package/dist/substrate/lifo/commands/net/wget.d.ts +4 -0
- package/dist/substrate/lifo/commands/net/wget.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/net/wget.js +78 -0
- package/dist/substrate/lifo/commands/registry.d.ts +15 -0
- package/dist/substrate/lifo/commands/registry.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/registry.js +120 -0
- package/dist/substrate/lifo/commands/signal.d.ts +12 -0
- package/dist/substrate/lifo/commands/signal.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/signal.js +47 -0
- package/dist/substrate/lifo/commands/system/bc.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/bc.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/bc.js +243 -0
- package/dist/substrate/lifo/commands/system/cal.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/cal.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/cal.js +81 -0
- package/dist/substrate/lifo/commands/system/date.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/date.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/date.js +79 -0
- package/dist/substrate/lifo/commands/system/env.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/env.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/env.js +7 -0
- package/dist/substrate/lifo/commands/system/fastfetch.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/fastfetch.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/fastfetch.js +385 -0
- package/dist/substrate/lifo/commands/system/free.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/free.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/free.js +36 -0
- package/dist/substrate/lifo/commands/system/help.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/help.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/help.js +46 -0
- package/dist/substrate/lifo/commands/system/hostname.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/hostname.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/hostname.js +6 -0
- package/dist/substrate/lifo/commands/system/kill.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/kill.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/kill.js +76 -0
- package/dist/substrate/lifo/commands/system/lifo.d.ts +41 -0
- package/dist/substrate/lifo/commands/system/lifo.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/lifo.js +446 -0
- package/dist/substrate/lifo/commands/system/logout.d.ts +5 -0
- package/dist/substrate/lifo/commands/system/logout.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/logout.js +15 -0
- package/dist/substrate/lifo/commands/system/man.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/man.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/man.js +144 -0
- package/dist/substrate/lifo/commands/system/node.d.ts +6 -0
- package/dist/substrate/lifo/commands/system/node.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/node.js +1241 -0
- package/dist/substrate/lifo/commands/system/npm.d.ts +26 -0
- package/dist/substrate/lifo/commands/system/npm.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/npm.js +934 -0
- package/dist/substrate/lifo/commands/system/pkg.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/pkg.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/pkg.js +97 -0
- package/dist/substrate/lifo/commands/system/ps.d.ts +5 -0
- package/dist/substrate/lifo/commands/system/ps.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/ps.js +35 -0
- package/dist/substrate/lifo/commands/system/registry-schemas.d.ts +44 -0
- package/dist/substrate/lifo/commands/system/registry-schemas.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/registry-schemas.js +28 -0
- package/dist/substrate/lifo/commands/system/sha256sum.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/sha256sum.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/sha256sum.js +86 -0
- package/dist/substrate/lifo/commands/system/sl.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/sl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/sl.js +204 -0
- package/dist/substrate/lifo/commands/system/sleep.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/sleep.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/sleep.js +27 -0
- package/dist/substrate/lifo/commands/system/stty.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/stty.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/stty.js +61 -0
- package/dist/substrate/lifo/commands/system/systemctl.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/systemctl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/systemctl.js +164 -0
- package/dist/substrate/lifo/commands/system/top.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/top.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/top.js +38 -0
- package/dist/substrate/lifo/commands/system/uname.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/uname.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/uname.js +55 -0
- package/dist/substrate/lifo/commands/system/uptime.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/uptime.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/uptime.js +16 -0
- package/dist/substrate/lifo/commands/system/watch.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/watch.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/watch.js +53 -0
- package/dist/substrate/lifo/commands/system/which.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/which.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/which.js +45 -0
- package/dist/substrate/lifo/commands/system/whoami.d.ts +4 -0
- package/dist/substrate/lifo/commands/system/whoami.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/system/whoami.js +6 -0
- package/dist/substrate/lifo/commands/text/awk.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/awk.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/awk.js +200 -0
- package/dist/substrate/lifo/commands/text/base64.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/base64.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/base64.js +102 -0
- package/dist/substrate/lifo/commands/text/cut.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/cut.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/cut.js +91 -0
- package/dist/substrate/lifo/commands/text/diff.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/diff.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/diff.js +292 -0
- package/dist/substrate/lifo/commands/text/grep.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/grep.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/grep.js +189 -0
- package/dist/substrate/lifo/commands/text/head.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/head.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/head.js +111 -0
- package/dist/substrate/lifo/commands/text/less.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/less.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/less.js +335 -0
- package/dist/substrate/lifo/commands/text/nano.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/nano.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/nano.js +510 -0
- package/dist/substrate/lifo/commands/text/nl.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/nl.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/nl.js +64 -0
- package/dist/substrate/lifo/commands/text/rev.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/rev.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/rev.js +41 -0
- package/dist/substrate/lifo/commands/text/sed.d.ts +21 -0
- package/dist/substrate/lifo/commands/text/sed.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/sed.js +248 -0
- package/dist/substrate/lifo/commands/text/seq.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/seq.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/seq.js +69 -0
- package/dist/substrate/lifo/commands/text/sort.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/sort.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/sort.js +90 -0
- package/dist/substrate/lifo/commands/text/strings.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/strings.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/strings.js +69 -0
- package/dist/substrate/lifo/commands/text/tac.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/tac.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/tac.js +32 -0
- package/dist/substrate/lifo/commands/text/tail.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/tail.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/tail.js +64 -0
- package/dist/substrate/lifo/commands/text/tr.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/tr.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/tr.js +180 -0
- package/dist/substrate/lifo/commands/text/uniq.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/uniq.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/uniq.js +82 -0
- package/dist/substrate/lifo/commands/text/wc.d.ts +4 -0
- package/dist/substrate/lifo/commands/text/wc.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/text/wc.js +107 -0
- package/dist/substrate/lifo/commands/types.d.ts +49 -0
- package/dist/substrate/lifo/commands/types.d.ts.map +1 -0
- package/dist/substrate/lifo/commands/types.js +1 -0
- package/dist/substrate/lifo/index.d.ts +67 -0
- package/dist/substrate/lifo/index.d.ts.map +1 -0
- package/dist/substrate/lifo/index.js +66 -0
- package/dist/substrate/lifo/kernel/ServiceManager.d.ts +51 -0
- package/dist/substrate/lifo/kernel/ServiceManager.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/ServiceManager.js +302 -0
- package/dist/substrate/lifo/kernel/index.d.ts +40 -0
- package/dist/substrate/lifo/kernel/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/index.js +170 -0
- package/dist/substrate/lifo/kernel/network/Bridge.d.ts +110 -0
- package/dist/substrate/lifo/kernel/network/Bridge.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/Bridge.js +278 -0
- package/dist/substrate/lifo/kernel/network/DNSResolver.d.ts +50 -0
- package/dist/substrate/lifo/kernel/network/DNSResolver.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/DNSResolver.js +135 -0
- package/dist/substrate/lifo/kernel/network/NetworkInterface.d.ts +83 -0
- package/dist/substrate/lifo/kernel/network/NetworkInterface.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/NetworkInterface.js +183 -0
- package/dist/substrate/lifo/kernel/network/NetworkNamespace.d.ts +98 -0
- package/dist/substrate/lifo/kernel/network/NetworkNamespace.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/NetworkNamespace.js +149 -0
- package/dist/substrate/lifo/kernel/network/NetworkStack.d.ts +178 -0
- package/dist/substrate/lifo/kernel/network/NetworkStack.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/NetworkStack.js +460 -0
- package/dist/substrate/lifo/kernel/network/PortBridge.d.ts +44 -0
- package/dist/substrate/lifo/kernel/network/PortBridge.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/PortBridge.js +158 -0
- package/dist/substrate/lifo/kernel/network/RoutingTable.d.ts +55 -0
- package/dist/substrate/lifo/kernel/network/RoutingTable.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/RoutingTable.js +167 -0
- package/dist/substrate/lifo/kernel/network/Socket.d.ts +65 -0
- package/dist/substrate/lifo/kernel/network/Socket.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/Socket.js +201 -0
- package/dist/substrate/lifo/kernel/network/index.d.ts +11 -0
- package/dist/substrate/lifo/kernel/network/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/index.js +9 -0
- package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.d.ts +55 -0
- package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/tunnel/BaseTunnel.js +88 -0
- package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.d.ts +71 -0
- package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/tunnel/VETHPair.js +191 -0
- package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.d.ts +89 -0
- package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.js +324 -0
- package/dist/substrate/lifo/kernel/network/types.d.ts +159 -0
- package/dist/substrate/lifo/kernel/network/types.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/network/types.js +5 -0
- package/dist/substrate/lifo/kernel/persistence/PersistenceManager.d.ts +12 -0
- package/dist/substrate/lifo/kernel/persistence/PersistenceManager.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/PersistenceManager.js +47 -0
- package/dist/substrate/lifo/kernel/persistence/backends.d.ts +15 -0
- package/dist/substrate/lifo/kernel/persistence/backends.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/backends.js +18 -0
- package/dist/substrate/lifo/kernel/persistence/index.d.ts +6 -0
- package/dist/substrate/lifo/kernel/persistence/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/index.js +3 -0
- package/dist/substrate/lifo/kernel/persistence/serializer.d.ts +21 -0
- package/dist/substrate/lifo/kernel/persistence/serializer.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/persistence/serializer.js +99 -0
- package/dist/substrate/lifo/kernel/samples.d.ts +3 -0
- package/dist/substrate/lifo/kernel/samples.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/samples.js +930 -0
- package/dist/substrate/lifo/kernel/storage/BlobStore.d.ts +22 -0
- package/dist/substrate/lifo/kernel/storage/BlobStore.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/storage/BlobStore.js +84 -0
- package/dist/substrate/lifo/kernel/storage/ContentStore.d.ts +54 -0
- package/dist/substrate/lifo/kernel/storage/ContentStore.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/storage/ContentStore.js +120 -0
- package/dist/substrate/lifo/kernel/storage/index.d.ts +6 -0
- package/dist/substrate/lifo/kernel/storage/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/storage/index.js +3 -0
- package/dist/substrate/lifo/kernel/unit-parser.d.ts +22 -0
- package/dist/substrate/lifo/kernel/unit-parser.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/unit-parser.js +80 -0
- package/dist/substrate/lifo/kernel/vfs/VFS.d.ts +99 -0
- package/dist/substrate/lifo/kernel/vfs/VFS.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/VFS.js +679 -0
- package/dist/substrate/lifo/kernel/vfs/index.d.ts +8 -0
- package/dist/substrate/lifo/kernel/vfs/index.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/index.js +5 -0
- package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.d.ts +21 -0
- package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/providers/DevProvider.js +137 -0
- package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.d.ts +63 -0
- package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/providers/NativeFsProvider.js +175 -0
- package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.d.ts +14 -0
- package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/providers/ProcProvider.js +126 -0
- package/dist/substrate/lifo/kernel/vfs/types.d.ts +117 -0
- package/dist/substrate/lifo/kernel/vfs/types.d.ts.map +1 -0
- package/dist/substrate/lifo/kernel/vfs/types.js +42 -0
- package/dist/substrate/lifo/node-compat/buffer.d.ts +44 -0
- package/dist/substrate/lifo/node-compat/buffer.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/buffer.js +331 -0
- package/dist/substrate/lifo/node-compat/child_process.d.ts +10 -0
- package/dist/substrate/lifo/node-compat/child_process.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/child_process.js +42 -0
- package/dist/substrate/lifo/node-compat/console.d.ts +21 -0
- package/dist/substrate/lifo/node-compat/console.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/console.js +68 -0
- package/dist/substrate/lifo/node-compat/crypto.d.ts +24 -0
- package/dist/substrate/lifo/node-compat/crypto.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/crypto.js +216 -0
- package/dist/substrate/lifo/node-compat/dns.d.ts +117 -0
- package/dist/substrate/lifo/node-compat/dns.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/dns.js +144 -0
- package/dist/substrate/lifo/node-compat/esbuild.d.ts +10 -0
- package/dist/substrate/lifo/node-compat/esbuild.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/esbuild.js +70 -0
- package/dist/substrate/lifo/node-compat/events.d.ts +19 -0
- package/dist/substrate/lifo/node-compat/events.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/events.js +83 -0
- package/dist/substrate/lifo/node-compat/fs.d.ts +195 -0
- package/dist/substrate/lifo/node-compat/fs.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/fs.js +624 -0
- package/dist/substrate/lifo/node-compat/http.d.ts +133 -0
- package/dist/substrate/lifo/node-compat/http.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/http.js +452 -0
- package/dist/substrate/lifo/node-compat/index.d.ts +20 -0
- package/dist/substrate/lifo/node-compat/index.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/index.js +291 -0
- package/dist/substrate/lifo/node-compat/module.d.ts +55 -0
- package/dist/substrate/lifo/node-compat/module.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/module.js +124 -0
- package/dist/substrate/lifo/node-compat/os.d.ts +39 -0
- package/dist/substrate/lifo/node-compat/os.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/os.js +45 -0
- package/dist/substrate/lifo/node-compat/path.d.ts +86 -0
- package/dist/substrate/lifo/node-compat/path.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/path.js +49 -0
- package/dist/substrate/lifo/node-compat/process.d.ts +127 -0
- package/dist/substrate/lifo/node-compat/process.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/process.js +173 -0
- package/dist/substrate/lifo/node-compat/readline.d.ts +85 -0
- package/dist/substrate/lifo/node-compat/readline.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/readline.js +205 -0
- package/dist/substrate/lifo/node-compat/rimraf.d.ts +30 -0
- package/dist/substrate/lifo/node-compat/rimraf.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/rimraf.js +63 -0
- package/dist/substrate/lifo/node-compat/stream.d.ts +36 -0
- package/dist/substrate/lifo/node-compat/stream.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/stream.js +90 -0
- package/dist/substrate/lifo/node-compat/string_decoder.d.ts +11 -0
- package/dist/substrate/lifo/node-compat/string_decoder.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/string_decoder.js +23 -0
- package/dist/substrate/lifo/node-compat/timers.d.ts +16 -0
- package/dist/substrate/lifo/node-compat/timers.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/timers.js +18 -0
- package/dist/substrate/lifo/node-compat/tty.d.ts +32 -0
- package/dist/substrate/lifo/node-compat/tty.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/tty.js +76 -0
- package/dist/substrate/lifo/node-compat/url.d.ts +37 -0
- package/dist/substrate/lifo/node-compat/url.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/url.js +65 -0
- package/dist/substrate/lifo/node-compat/util.d.ts +42 -0
- package/dist/substrate/lifo/node-compat/util.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/util.js +132 -0
- package/dist/substrate/lifo/node-compat/zlib.d.ts +66 -0
- package/dist/substrate/lifo/node-compat/zlib.d.ts.map +1 -0
- package/dist/substrate/lifo/node-compat/zlib.js +80 -0
- package/dist/substrate/lifo/pkg/PackageManager.d.ts +19 -0
- package/dist/substrate/lifo/pkg/PackageManager.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/PackageManager.js +97 -0
- package/dist/substrate/lifo/pkg/lifo-dev.d.ts +38 -0
- package/dist/substrate/lifo/pkg/lifo-dev.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/lifo-dev.js +98 -0
- package/dist/substrate/lifo/pkg/lifo-runtime.d.ts +44 -0
- package/dist/substrate/lifo/pkg/lifo-runtime.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/lifo-runtime.js +372 -0
- package/dist/substrate/lifo/pkg/loader.d.ts +4 -0
- package/dist/substrate/lifo/pkg/loader.d.ts.map +1 -0
- package/dist/substrate/lifo/pkg/loader.js +24 -0
- package/dist/substrate/lifo/sandbox/HeadlessTerminal.d.ts +18 -0
- package/dist/substrate/lifo/sandbox/HeadlessTerminal.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/HeadlessTerminal.js +28 -0
- package/dist/substrate/lifo/sandbox/Sandbox.d.ts +59 -0
- package/dist/substrate/lifo/sandbox/Sandbox.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/Sandbox.js +234 -0
- package/dist/substrate/lifo/sandbox/SandboxCommands.d.ts +18 -0
- package/dist/substrate/lifo/sandbox/SandboxCommands.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/SandboxCommands.js +64 -0
- package/dist/substrate/lifo/sandbox/SandboxFs.d.ts +43 -0
- package/dist/substrate/lifo/sandbox/SandboxFs.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/SandboxFs.js +136 -0
- package/dist/substrate/lifo/sandbox/index.d.ts +3 -0
- package/dist/substrate/lifo/sandbox/index.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/index.js +1 -0
- package/dist/substrate/lifo/sandbox/types.d.ts +116 -0
- package/dist/substrate/lifo/sandbox/types.d.ts.map +1 -0
- package/dist/substrate/lifo/sandbox/types.js +1 -0
- package/dist/substrate/lifo/shell/ProcessRegistry.d.ts +142 -0
- package/dist/substrate/lifo/shell/ProcessRegistry.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/ProcessRegistry.js +256 -0
- package/dist/substrate/lifo/shell/Shell.d.ts +170 -0
- package/dist/substrate/lifo/shell/Shell.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/Shell.js +1863 -0
- package/dist/substrate/lifo/shell/completer.d.ts +19 -0
- package/dist/substrate/lifo/shell/completer.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/completer.js +164 -0
- package/dist/substrate/lifo/shell/default-shell.d.ts +9 -0
- package/dist/substrate/lifo/shell/default-shell.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/default-shell.js +53 -0
- package/dist/substrate/lifo/shell/expander.d.ts +48 -0
- package/dist/substrate/lifo/shell/expander.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/expander.js +1204 -0
- package/dist/substrate/lifo/shell/history.d.ts +22 -0
- package/dist/substrate/lifo/shell/history.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/history.js +121 -0
- package/dist/substrate/lifo/shell/interpreter.d.ts +257 -0
- package/dist/substrate/lifo/shell/interpreter.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/interpreter.js +1490 -0
- package/dist/substrate/lifo/shell/jobs.d.ts +21 -0
- package/dist/substrate/lifo/shell/jobs.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/jobs.js +48 -0
- package/dist/substrate/lifo/shell/lexer.d.ts +13 -0
- package/dist/substrate/lifo/shell/lexer.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/lexer.js +614 -0
- package/dist/substrate/lifo/shell/parser.d.ts +7 -0
- package/dist/substrate/lifo/shell/parser.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/parser.js +573 -0
- package/dist/substrate/lifo/shell/pipe.d.ts +15 -0
- package/dist/substrate/lifo/shell/pipe.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/pipe.js +86 -0
- package/dist/substrate/lifo/shell/signals.d.ts +11 -0
- package/dist/substrate/lifo/shell/signals.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/signals.js +57 -0
- package/dist/substrate/lifo/shell/terminal-stdin.d.ts +28 -0
- package/dist/substrate/lifo/shell/terminal-stdin.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/terminal-stdin.js +100 -0
- package/dist/substrate/lifo/shell/test-builtin.d.ts +16 -0
- package/dist/substrate/lifo/shell/test-builtin.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/test-builtin.js +237 -0
- package/dist/substrate/lifo/shell/types.d.ts +140 -0
- package/dist/substrate/lifo/shell/types.d.ts.map +1 -0
- package/dist/substrate/lifo/shell/types.js +25 -0
- package/dist/substrate/lifo/terminal/ITerminal.d.ts +10 -0
- package/dist/substrate/lifo/terminal/ITerminal.d.ts.map +1 -0
- package/dist/substrate/lifo/terminal/ITerminal.js +1 -0
- package/dist/substrate/lifo/utils/archive.d.ts +28 -0
- package/dist/substrate/lifo/utils/archive.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/archive.js +323 -0
- package/dist/substrate/lifo/utils/args.d.ts +18 -0
- package/dist/substrate/lifo/utils/args.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/args.js +73 -0
- package/dist/substrate/lifo/utils/colors.d.ts +27 -0
- package/dist/substrate/lifo/utils/colors.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/colors.js +26 -0
- package/dist/substrate/lifo/utils/encoding.d.ts +4 -0
- package/dist/substrate/lifo/utils/encoding.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/encoding.js +18 -0
- package/dist/substrate/lifo/utils/glob.d.ts +12 -0
- package/dist/substrate/lifo/utils/glob.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/glob.js +150 -0
- package/dist/substrate/lifo/utils/mime.d.ts +4 -0
- package/dist/substrate/lifo/utils/mime.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/mime.js +107 -0
- package/dist/substrate/lifo/utils/path.d.ts +12 -0
- package/dist/substrate/lifo/utils/path.d.ts.map +1 -0
- package/dist/substrate/lifo/utils/path.js +82 -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 +46 -0
- package/dist/vfs/path.d.ts.map +1 -0
- package/dist/vfs/path.js +69 -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 +1054 -0
- package/dist/vfs/sqlite-vfs.d.ts +821 -0
- package/dist/vfs/sqlite-vfs.d.ts.map +1 -0
- package/dist/vfs/sqlite-vfs.js +4135 -0
- package/dist/vfs/symlink-registry.d.ts +60 -0
- package/dist/vfs/symlink-registry.d.ts.map +1 -0
- package/dist/vfs/symlink-registry.js +162 -0
- package/dist/workspace/nimbus-workspace.d.ts +94 -0
- package/dist/workspace/nimbus-workspace.d.ts.map +1 -0
- package/dist/workspace/nimbus-workspace.js +167 -0
- package/package.json +69 -0
- package/src/_shared/ai-egress.ts +91 -0
- package/src/_shared/byte-stream.ts +97 -0
- package/src/_shared/bytes.ts +19 -0
- package/src/_shared/cache-stats.ts +231 -0
- package/src/_shared/crypto.ts +184 -0
- package/src/_shared/esbuild-facet-shim.ts +22 -0
- package/src/_shared/exports-resolver.ts +308 -0
- package/src/_shared/facet-vfs-cursor.ts +58 -0
- package/src/_shared/install-phase.ts +56 -0
- package/src/_shared/lru-map.ts +59 -0
- package/src/_shared/real-node-imports.ts +53 -0
- package/src/_shared/retry.ts +202 -0
- package/src/_shared/rpc-dispose.ts +31 -0
- package/src/_shared/terminal.ts +3 -0
- package/src/_shared/typescript-specifiers.ts +86 -0
- package/src/_shared/untrusted-request.ts +75 -0
- package/src/_shared/vfs-write-ledger.ts +440 -0
- package/src/_shared/w7-frame.ts +1012 -0
- package/src/_shared/weighted-credit-pool.ts +244 -0
- package/src/constants.ts +285 -0
- package/src/index.ts +22 -0
- package/src/observability/diag-counters.ts +343 -0
- package/src/observability/heap-estimate.ts +331 -0
- package/src/observability/heavy-alloc-coord.ts +241 -0
- package/src/observability/oom-classify.ts +253 -0
- package/src/observability/oom-discriminator.ts +405 -0
- package/src/runtime/assets-loader.ts +189 -0
- package/src/runtime/barrel-detect.ts +69 -0
- package/src/runtime/bash/preamble.ts +1519 -0
- package/src/runtime/bash/types.ts +497 -0
- package/src/runtime/bundle-profile.ts +32 -0
- package/src/runtime/cirrus-vite-config-rewriter.ts +28 -0
- package/src/runtime/cli-flags.ts +11 -0
- package/src/runtime/comment-strip.ts +73 -0
- package/src/runtime/cpython-preamble.ts +298 -0
- package/src/runtime/esbuild-service.ts +1470 -0
- package/src/runtime/framework-detect.ts +245 -0
- package/src/runtime/import-meta-transform.ts +16 -0
- package/src/runtime/javascript-ast.ts +66 -0
- package/src/runtime/long-running-handle.ts +185 -0
- package/src/runtime/module-source-rewriter.ts +95 -0
- package/src/runtime/opentui-wasm-backend.ts +608 -0
- package/src/runtime/os-contracts.ts +529 -0
- package/src/runtime/port-registry.ts +298 -0
- package/src/runtime/process-input-routing.ts +92 -0
- package/src/runtime/process-input.ts +148 -0
- package/src/runtime/process-io-protocol.ts +97 -0
- package/src/runtime/process-logs.ts +882 -0
- package/src/runtime/process-table.ts +225 -0
- package/src/runtime/project-detect.ts +42 -0
- package/src/runtime/python-server-adapter.ts +133 -0
- package/src/runtime/require-resolver.ts +760 -0
- package/src/runtime/router-basename.ts +279 -0
- package/src/runtime/ruby-green-threads.ts +904 -0
- package/src/runtime/ruby-socket-shim.ts +548 -0
- package/src/runtime/session-process-supervisor.ts +323 -0
- package/src/runtime/sqlite-runtime-fs-bridge.ts +468 -0
- package/src/runtime/streams.ts +547 -0
- package/src/runtime/undici-shim.ts +517 -0
- package/src/runtime/vfs-manifest.ts +170 -0
- package/src/runtime/vfs-snapshot.ts +273 -0
- package/src/runtime/virtual-socket-kernel.ts +1370 -0
- package/src/runtime/vite-config-parser.ts +273 -0
- package/src/runtime/wasi/types.ts +448 -0
- package/src/runtime/wasi-instance.generated.ts +14 -0
- package/src/runtime/wasi-instance.ts +259 -0
- package/src/runtime/wasi-threads.ts +682 -0
- package/src/runtime/wasm-memory.ts +261 -0
- package/src/shell/elevation-commands.ts +117 -0
- package/src/shell/exec-dispatch.ts +201 -0
- package/src/shell/features.ts +870 -0
- package/src/shell/shell-entrypoints.ts +323 -0
- package/src/shell/shell-invocation.ts +181 -0
- package/src/shell/unix-accounts.ts +128 -0
- package/src/shell/unix-commands.ts +4335 -0
- package/src/substrate/lifo/UPSTREAM.md +14 -0
- package/src/substrate/lifo/commands/archive/gunzip.ts +63 -0
- package/src/substrate/lifo/commands/archive/gzip.ts +76 -0
- package/src/substrate/lifo/commands/archive/tar.ts +157 -0
- package/src/substrate/lifo/commands/archive/unzip.ts +112 -0
- package/src/substrate/lifo/commands/archive/zip.ts +70 -0
- package/src/substrate/lifo/commands/fs/basename.ts +16 -0
- package/src/substrate/lifo/commands/fs/cat.ts +54 -0
- package/src/substrate/lifo/commands/fs/chmod.ts +110 -0
- package/src/substrate/lifo/commands/fs/chown.ts +45 -0
- package/src/substrate/lifo/commands/fs/cp.ts +33 -0
- package/src/substrate/lifo/commands/fs/df.ts +56 -0
- package/src/substrate/lifo/commands/fs/dirname.ts +16 -0
- package/src/substrate/lifo/commands/fs/du.ts +100 -0
- package/src/substrate/lifo/commands/fs/file.ts +90 -0
- package/src/substrate/lifo/commands/fs/find.ts +76 -0
- package/src/substrate/lifo/commands/fs/ln.ts +19 -0
- package/src/substrate/lifo/commands/fs/ls.ts +164 -0
- package/src/substrate/lifo/commands/fs/mkdir.ts +37 -0
- package/src/substrate/lifo/commands/fs/mktemp.ts +56 -0
- package/src/substrate/lifo/commands/fs/mv.ts +111 -0
- package/src/substrate/lifo/commands/fs/realpath.ts +31 -0
- package/src/substrate/lifo/commands/fs/rm.ts +53 -0
- package/src/substrate/lifo/commands/fs/rmdir.ts +50 -0
- package/src/substrate/lifo/commands/fs/stat.ts +39 -0
- package/src/substrate/lifo/commands/fs/touch.ts +30 -0
- package/src/substrate/lifo/commands/fs/tree.ts +76 -0
- package/src/substrate/lifo/commands/index.ts +2 -0
- package/src/substrate/lifo/commands/io/dd.ts +289 -0
- package/src/substrate/lifo/commands/io/printf.ts +78 -0
- package/src/substrate/lifo/commands/io/tee.ts +37 -0
- package/src/substrate/lifo/commands/io/xargs.ts +49 -0
- package/src/substrate/lifo/commands/io/yes.ts +15 -0
- package/src/substrate/lifo/commands/net/curl.ts +739 -0
- package/src/substrate/lifo/commands/net/dig.ts +99 -0
- package/src/substrate/lifo/commands/net/forward.ts +90 -0
- package/src/substrate/lifo/commands/net/host.ts +182 -0
- package/src/substrate/lifo/commands/net/ifconfig.ts +139 -0
- package/src/substrate/lifo/commands/net/ip.ts +633 -0
- package/src/substrate/lifo/commands/net/netstat.ts +106 -0
- package/src/substrate/lifo/commands/net/ping.ts +74 -0
- package/src/substrate/lifo/commands/net/ports.ts +45 -0
- package/src/substrate/lifo/commands/net/route.ts +153 -0
- package/src/substrate/lifo/commands/net/tunnel-v2.ts +183 -0
- package/src/substrate/lifo/commands/net/tunnel.ts +272 -0
- package/src/substrate/lifo/commands/net/wget.ts +88 -0
- package/src/substrate/lifo/commands/registry.ts +141 -0
- package/src/substrate/lifo/commands/signal.ts +65 -0
- package/src/substrate/lifo/commands/system/bc.ts +265 -0
- package/src/substrate/lifo/commands/system/cal.ts +90 -0
- package/src/substrate/lifo/commands/system/date.ts +59 -0
- package/src/substrate/lifo/commands/system/env.ts +10 -0
- package/src/substrate/lifo/commands/system/fastfetch.ts +428 -0
- package/src/substrate/lifo/commands/system/free.ts +38 -0
- package/src/substrate/lifo/commands/system/help.ts +53 -0
- package/src/substrate/lifo/commands/system/hostname.ts +9 -0
- package/src/substrate/lifo/commands/system/kill.ts +89 -0
- package/src/substrate/lifo/commands/system/lifo.ts +525 -0
- package/src/substrate/lifo/commands/system/logout.ts +17 -0
- package/src/substrate/lifo/commands/system/man.ts +167 -0
- package/src/substrate/lifo/commands/system/node.ts +1305 -0
- package/src/substrate/lifo/commands/system/npm.ts +1078 -0
- package/src/substrate/lifo/commands/system/pkg.ts +111 -0
- package/src/substrate/lifo/commands/system/ps.ts +46 -0
- package/src/substrate/lifo/commands/system/registry-schemas.ts +33 -0
- package/src/substrate/lifo/commands/system/sha256sum.ts +89 -0
- package/src/substrate/lifo/commands/system/sl.ts +249 -0
- package/src/substrate/lifo/commands/system/sleep.ts +36 -0
- package/src/substrate/lifo/commands/system/stty.ts +69 -0
- package/src/substrate/lifo/commands/system/systemctl.ts +184 -0
- package/src/substrate/lifo/commands/system/top.ts +53 -0
- package/src/substrate/lifo/commands/system/uname.ts +59 -0
- package/src/substrate/lifo/commands/system/uptime.ts +19 -0
- package/src/substrate/lifo/commands/system/watch.ts +67 -0
- package/src/substrate/lifo/commands/system/which.ts +51 -0
- package/src/substrate/lifo/commands/system/whoami.ts +9 -0
- package/src/substrate/lifo/commands/text/awk.ts +210 -0
- package/src/substrate/lifo/commands/text/base64.ts +102 -0
- package/src/substrate/lifo/commands/text/cut.ts +92 -0
- package/src/substrate/lifo/commands/text/diff.ts +314 -0
- package/src/substrate/lifo/commands/text/grep.ts +170 -0
- package/src/substrate/lifo/commands/text/head.ts +95 -0
- package/src/substrate/lifo/commands/text/less.ts +335 -0
- package/src/substrate/lifo/commands/text/nano.ts +513 -0
- package/src/substrate/lifo/commands/text/nl.ts +74 -0
- package/src/substrate/lifo/commands/text/rev.ts +46 -0
- package/src/substrate/lifo/commands/text/sed.ts +297 -0
- package/src/substrate/lifo/commands/text/seq.ts +76 -0
- package/src/substrate/lifo/commands/text/sort.ts +88 -0
- package/src/substrate/lifo/commands/text/strings.ts +73 -0
- package/src/substrate/lifo/commands/text/tac.ts +37 -0
- package/src/substrate/lifo/commands/text/tail.ts +63 -0
- package/src/substrate/lifo/commands/text/tr.ts +192 -0
- package/src/substrate/lifo/commands/text/uniq.ts +77 -0
- package/src/substrate/lifo/commands/text/wc.ts +104 -0
- package/src/substrate/lifo/commands/types.ts +58 -0
- package/src/substrate/lifo/index.ts +173 -0
- package/src/substrate/lifo/kernel/ServiceManager.ts +371 -0
- package/src/substrate/lifo/kernel/index.ts +209 -0
- package/src/substrate/lifo/kernel/network/Bridge.ts +336 -0
- package/src/substrate/lifo/kernel/network/DNSResolver.ts +158 -0
- package/src/substrate/lifo/kernel/network/NetworkInterface.ts +235 -0
- package/src/substrate/lifo/kernel/network/NetworkNamespace.ts +182 -0
- package/src/substrate/lifo/kernel/network/NetworkStack.ts +590 -0
- package/src/substrate/lifo/kernel/network/PortBridge.ts +182 -0
- package/src/substrate/lifo/kernel/network/RoutingTable.ts +209 -0
- package/src/substrate/lifo/kernel/network/Socket.ts +245 -0
- package/src/substrate/lifo/kernel/network/index.ts +29 -0
- package/src/substrate/lifo/kernel/network/tunnel/BaseTunnel.ts +124 -0
- package/src/substrate/lifo/kernel/network/tunnel/VETHPair.ts +227 -0
- package/src/substrate/lifo/kernel/network/tunnel/WebSocketTunnel.ts +387 -0
- package/src/substrate/lifo/kernel/network/types.ts +178 -0
- package/src/substrate/lifo/kernel/persistence/PersistenceManager.ts +50 -0
- package/src/substrate/lifo/kernel/persistence/backends.ts +36 -0
- package/src/substrate/lifo/kernel/persistence/index.ts +5 -0
- package/src/substrate/lifo/kernel/persistence/serializer.ts +127 -0
- package/src/substrate/lifo/kernel/samples.ts +966 -0
- package/src/substrate/lifo/kernel/storage/BlobStore.ts +114 -0
- package/src/substrate/lifo/kernel/storage/ContentStore.ts +150 -0
- package/src/substrate/lifo/kernel/storage/index.ts +5 -0
- package/src/substrate/lifo/kernel/unit-parser.ts +95 -0
- package/src/substrate/lifo/kernel/vfs/VFS.ts +768 -0
- package/src/substrate/lifo/kernel/vfs/index.ts +9 -0
- package/src/substrate/lifo/kernel/vfs/providers/DevProvider.ts +172 -0
- package/src/substrate/lifo/kernel/vfs/providers/NativeFsProvider.ts +198 -0
- package/src/substrate/lifo/kernel/vfs/providers/ProcProvider.ts +144 -0
- package/src/substrate/lifo/kernel/vfs/types.ts +145 -0
- package/src/substrate/lifo/node-compat/buffer.ts +357 -0
- package/src/substrate/lifo/node-compat/child_process.ts +52 -0
- package/src/substrate/lifo/node-compat/console.ts +70 -0
- package/src/substrate/lifo/node-compat/crypto.ts +186 -0
- package/src/substrate/lifo/node-compat/dns.ts +214 -0
- package/src/substrate/lifo/node-compat/esbuild.ts +85 -0
- package/src/substrate/lifo/node-compat/events.ts +94 -0
- package/src/substrate/lifo/node-compat/fs.ts +762 -0
- package/src/substrate/lifo/node-compat/http.ts +561 -0
- package/src/substrate/lifo/node-compat/index.ts +300 -0
- package/src/substrate/lifo/node-compat/module.ts +148 -0
- package/src/substrate/lifo/node-compat/os.ts +44 -0
- package/src/substrate/lifo/node-compat/path.ts +74 -0
- package/src/substrate/lifo/node-compat/process.ts +178 -0
- package/src/substrate/lifo/node-compat/readline.ts +244 -0
- package/src/substrate/lifo/node-compat/rimraf.ts +80 -0
- package/src/substrate/lifo/node-compat/stream.ts +98 -0
- package/src/substrate/lifo/node-compat/string_decoder.ts +26 -0
- package/src/substrate/lifo/node-compat/timers.ts +21 -0
- package/src/substrate/lifo/node-compat/tty.ts +83 -0
- package/src/substrate/lifo/node-compat/url.ts +76 -0
- package/src/substrate/lifo/node-compat/util.ts +133 -0
- package/src/substrate/lifo/node-compat/zlib.ts +94 -0
- package/src/substrate/lifo/pkg/PackageManager.ts +105 -0
- package/src/substrate/lifo/pkg/lifo-dev.ts +130 -0
- package/src/substrate/lifo/pkg/lifo-runtime.ts +473 -0
- package/src/substrate/lifo/pkg/loader.ts +33 -0
- package/src/substrate/lifo/platform-globals.d.ts +41 -0
- package/src/substrate/lifo/sandbox/HeadlessTerminal.ts +38 -0
- package/src/substrate/lifo/sandbox/Sandbox.ts +279 -0
- package/src/substrate/lifo/sandbox/SandboxCommands.ts +74 -0
- package/src/substrate/lifo/sandbox/SandboxFs.ts +160 -0
- package/src/substrate/lifo/sandbox/index.ts +8 -0
- package/src/substrate/lifo/sandbox/types.ts +117 -0
- package/src/substrate/lifo/shell/ProcessRegistry.ts +379 -0
- package/src/substrate/lifo/shell/Shell.ts +2048 -0
- package/src/substrate/lifo/shell/completer.ts +212 -0
- package/src/substrate/lifo/shell/default-shell.ts +63 -0
- package/src/substrate/lifo/shell/expander.ts +1349 -0
- package/src/substrate/lifo/shell/history.ts +138 -0
- package/src/substrate/lifo/shell/interpreter.ts +1754 -0
- package/src/substrate/lifo/shell/jobs.ts +64 -0
- package/src/substrate/lifo/shell/lexer.ts +698 -0
- package/src/substrate/lifo/shell/parser.ts +711 -0
- package/src/substrate/lifo/shell/pipe.ts +92 -0
- package/src/substrate/lifo/shell/signals.ts +70 -0
- package/src/substrate/lifo/shell/terminal-stdin.ts +109 -0
- package/src/substrate/lifo/shell/test-builtin.ts +316 -0
- package/src/substrate/lifo/shell/types.ts +166 -0
- package/src/substrate/lifo/terminal/ITerminal.ts +9 -0
- package/src/substrate/lifo/utils/archive.ts +389 -0
- package/src/substrate/lifo/utils/args.ts +89 -0
- package/src/substrate/lifo/utils/colors.ts +29 -0
- package/src/substrate/lifo/utils/encoding.ts +21 -0
- package/src/substrate/lifo/utils/glob.ts +172 -0
- package/src/substrate/lifo/utils/mime.ts +114 -0
- package/src/substrate/lifo/utils/path.ts +83 -0
- package/src/types/assets.d.ts +4 -0
- package/src/vfs/events.ts +134 -0
- package/src/vfs/path.ts +71 -0
- package/src/vfs/seed-project.ts +1094 -0
- package/src/vfs/sqlite-vfs.ts +5035 -0
- package/src/vfs/symlink-registry.ts +172 -0
- package/src/workspace/nimbus-workspace.ts +213 -0
|
@@ -0,0 +1,1143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* virtual-socket-kernel.ts - shared in-facet loopback socket substrate.
|
|
3
|
+
*
|
|
4
|
+
* The kernel has two halves, and they are mirror images of each other.
|
|
5
|
+
*
|
|
6
|
+
* Inbound (a guest server accepting a connection). The supervisor-facing
|
|
7
|
+
* surface stays the existing PortRegistry: /port/<n>/ and
|
|
8
|
+
* /preview/?port=<n> route a real Worker Request to a facet's
|
|
9
|
+
* handleHttpRequest(Request). Inside the facet this kernel converts that
|
|
10
|
+
* Request into an accepted HTTP/1.1 byte stream so guest runtimes can
|
|
11
|
+
* implement normal socket APIs without Cloudflare inbound TCP support.
|
|
12
|
+
*
|
|
13
|
+
* Outbound (a guest client dialing 127.0.0.1:<port>). connect() hands back
|
|
14
|
+
* a connection whose write side parses the HTTP/1.1 request the guest
|
|
15
|
+
* emits, hands it to the host's loopback router - the same
|
|
16
|
+
* SUPERVISOR.routeLoopback the shell's curl and node's patched fetch use -
|
|
17
|
+
* and streams the Response back as HTTP/1.1 response bytes on the read
|
|
18
|
+
* side. Cloudflare has no outbound TCP to 127.0.0.1, so a loopback client
|
|
19
|
+
* socket can only ever be HTTP-shaped; see the connect() doc comment for
|
|
20
|
+
* exactly what that does and does not support.
|
|
21
|
+
*
|
|
22
|
+
* Runtime adapters (Python socket.py, Ruby socket.rb, future
|
|
23
|
+
* wasm32-wasi-nimbus syscalls) call this shared kernel instead of each
|
|
24
|
+
* implementing their own preview bridge.
|
|
25
|
+
*
|
|
26
|
+
* This file is the typed source of truth. scripts/bundle-facet-workers.mjs
|
|
27
|
+
* bundles it at build time into virtual-socket-kernel.generated.ts as the
|
|
28
|
+
* self-contained VIRTUAL_SOCKET_KERNEL_SRC string that python-runner and
|
|
29
|
+
* ruby-runner splice into dynamic worker module sources. Because that
|
|
30
|
+
* bundle ships as injected source text, this module must stay free of
|
|
31
|
+
* runtime imports - supervisor modules are unreachable from facet isolates.
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_LIMITS = {
|
|
34
|
+
responseTimeoutMs: 30_000,
|
|
35
|
+
maxRequestBodyBytes: 32 * 1024 * 1024,
|
|
36
|
+
maxResponseBufferBytes: 64 * 1024 * 1024,
|
|
37
|
+
};
|
|
38
|
+
const EMPTY_BYTES = new Uint8Array(0);
|
|
39
|
+
class Deferred {
|
|
40
|
+
promise;
|
|
41
|
+
resolve;
|
|
42
|
+
reject;
|
|
43
|
+
constructor() {
|
|
44
|
+
let resolve = () => { };
|
|
45
|
+
let reject = () => { };
|
|
46
|
+
this.promise = new Promise((res, rej) => {
|
|
47
|
+
resolve = res;
|
|
48
|
+
reject = rej;
|
|
49
|
+
});
|
|
50
|
+
this.resolve = resolve;
|
|
51
|
+
this.reject = reject;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function isPyodideProxyLike(value) {
|
|
55
|
+
return (value !== null &&
|
|
56
|
+
typeof value === 'object' &&
|
|
57
|
+
typeof value.toJs === 'function');
|
|
58
|
+
}
|
|
59
|
+
function toBytes(value) {
|
|
60
|
+
if (value instanceof Uint8Array)
|
|
61
|
+
return value;
|
|
62
|
+
if (value instanceof ArrayBuffer)
|
|
63
|
+
return new Uint8Array(value);
|
|
64
|
+
if (ArrayBuffer.isView(value))
|
|
65
|
+
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
|
|
66
|
+
if (Array.isArray(value))
|
|
67
|
+
return Uint8Array.from(value);
|
|
68
|
+
if (typeof value === 'string')
|
|
69
|
+
return new TextEncoder().encode(value);
|
|
70
|
+
if (isPyodideProxyLike(value))
|
|
71
|
+
return toBytes(value.toJs());
|
|
72
|
+
return EMPTY_BYTES;
|
|
73
|
+
}
|
|
74
|
+
function concatBytes(parts) {
|
|
75
|
+
let length = 0;
|
|
76
|
+
for (const part of parts)
|
|
77
|
+
length += part.byteLength;
|
|
78
|
+
const out = new Uint8Array(length);
|
|
79
|
+
let offset = 0;
|
|
80
|
+
for (const part of parts) {
|
|
81
|
+
out.set(part, offset);
|
|
82
|
+
offset += part.byteLength;
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
function responseCanHaveBody(requestMethod, status) {
|
|
87
|
+
if (requestMethod.toUpperCase() === 'HEAD')
|
|
88
|
+
return false;
|
|
89
|
+
return status !== 204 && status !== 205 && status !== 304;
|
|
90
|
+
}
|
|
91
|
+
/** Serialize the Worker Request into HTTP/1.1 request bytes for the guest server. */
|
|
92
|
+
function encodeHttpRequest(request, body) {
|
|
93
|
+
const url = new URL(request.url);
|
|
94
|
+
const path = (url.pathname || '/') + url.search;
|
|
95
|
+
const headers = new Headers(request.headers);
|
|
96
|
+
if (!headers.has('Host'))
|
|
97
|
+
headers.set('Host', url.host || 'nimbus.local');
|
|
98
|
+
if (body.byteLength > 0 && !headers.has('Content-Length')) {
|
|
99
|
+
headers.set('Content-Length', String(body.byteLength));
|
|
100
|
+
}
|
|
101
|
+
const lines = [`${request.method} ${path} HTTP/1.1`];
|
|
102
|
+
headers.forEach((value, key) => lines.push(`${key}: ${value}`));
|
|
103
|
+
lines.push('', '');
|
|
104
|
+
return concatBytes([new TextEncoder().encode(lines.join('\r\n')), body]);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Serialize a Response's head into HTTP/1.1 bytes for a guest client.
|
|
108
|
+
*
|
|
109
|
+
* Bodies always go out chunked rather than with a Content-Length: the
|
|
110
|
+
* loopback Response may be a stream of unknown length (SSE from the AI
|
|
111
|
+
* gateway, a Vite HMR channel), and chunked is the one framing that both
|
|
112
|
+
* delimits the body explicitly and needs no length up front. Every
|
|
113
|
+
* response also carries `Connection: close` - see LoopbackClientConnection
|
|
114
|
+
* for why one connection carries exactly one exchange.
|
|
115
|
+
*/
|
|
116
|
+
function encodeHttpResponseHead(status, statusText, headers, chunkedBody) {
|
|
117
|
+
const lines = [`HTTP/1.1 ${status} ${statusText}`];
|
|
118
|
+
headers.forEach((value, key) => lines.push(`${key}: ${value}`));
|
|
119
|
+
if (chunkedBody)
|
|
120
|
+
lines.push('Transfer-Encoding: chunked');
|
|
121
|
+
lines.push('Connection: close');
|
|
122
|
+
lines.push('', '');
|
|
123
|
+
return new TextEncoder().encode(lines.join('\r\n'));
|
|
124
|
+
}
|
|
125
|
+
function encodeChunkedFrame(bytes) {
|
|
126
|
+
return concatBytes([
|
|
127
|
+
new TextEncoder().encode(`${bytes.byteLength.toString(16)}\r\n`),
|
|
128
|
+
bytes,
|
|
129
|
+
new TextEncoder().encode('\r\n'),
|
|
130
|
+
]);
|
|
131
|
+
}
|
|
132
|
+
const CHUNKED_TERMINATOR = new TextEncoder().encode('0\r\n\r\n');
|
|
133
|
+
/** Response bytes buffered ahead of a slow guest reader before the body pump pauses. */
|
|
134
|
+
const LOOPBACK_READ_HIGH_WATER_BYTES = 1024 * 1024;
|
|
135
|
+
/** Largest slice `connectStream`'s readable hands to one stream read. */
|
|
136
|
+
const LOOPBACK_STREAM_CHUNK_BYTES = 64 * 1024;
|
|
137
|
+
/**
|
|
138
|
+
* Bounded FIFO of byte chunks. One instance carries request bytes from
|
|
139
|
+
* handleHttpRequest to recv() (inbound) and one carries response bytes
|
|
140
|
+
* from send() to the HTTP parser (outbound). Stage 1 fills the inbound
|
|
141
|
+
* queue in one shot and drains the outbound queue synchronously; the
|
|
142
|
+
* async halves are declared on VirtualSocketStreamingStage2.
|
|
143
|
+
*/
|
|
144
|
+
class ByteChunkQueue {
|
|
145
|
+
limitTotalBytes;
|
|
146
|
+
overflowLabel;
|
|
147
|
+
chunks = [];
|
|
148
|
+
headOffset = 0;
|
|
149
|
+
enqueuedTotalBytes = 0;
|
|
150
|
+
undrainedBytes = 0;
|
|
151
|
+
constructor(limitTotalBytes, overflowLabel) {
|
|
152
|
+
this.limitTotalBytes = limitTotalBytes;
|
|
153
|
+
this.overflowLabel = overflowLabel;
|
|
154
|
+
}
|
|
155
|
+
/** Bytes enqueued but not yet read. Drives flow control on streamed queues. */
|
|
156
|
+
get pendingBytes() {
|
|
157
|
+
return this.undrainedBytes;
|
|
158
|
+
}
|
|
159
|
+
enqueue(bytes) {
|
|
160
|
+
if (bytes.byteLength === 0)
|
|
161
|
+
return;
|
|
162
|
+
if (this.enqueuedTotalBytes + bytes.byteLength > this.limitTotalBytes) {
|
|
163
|
+
throw new Error(`Nimbus virtual socket: ${this.overflowLabel} exceeds ${this.limitTotalBytes} bytes`);
|
|
164
|
+
}
|
|
165
|
+
this.enqueuedTotalBytes += bytes.byteLength;
|
|
166
|
+
this.undrainedBytes += bytes.byteLength;
|
|
167
|
+
this.chunks.push(bytes);
|
|
168
|
+
}
|
|
169
|
+
/** Drain up to maxBytes from the head chunk; empty result means no data is queued. */
|
|
170
|
+
readUpTo(maxBytes) {
|
|
171
|
+
const head = this.chunks[0];
|
|
172
|
+
if (!head)
|
|
173
|
+
return EMPTY_BYTES;
|
|
174
|
+
const available = head.byteLength - this.headOffset;
|
|
175
|
+
const take = Math.min(available, Math.max(1, maxBytes));
|
|
176
|
+
const out = head.subarray(this.headOffset, this.headOffset + take);
|
|
177
|
+
this.headOffset += take;
|
|
178
|
+
this.undrainedBytes -= take;
|
|
179
|
+
if (this.headOffset >= head.byteLength) {
|
|
180
|
+
this.chunks.shift();
|
|
181
|
+
this.headOffset = 0;
|
|
182
|
+
}
|
|
183
|
+
return out;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Incremental HTTP/1.1 message parser: start line and headers first, then
|
|
188
|
+
* the body under content-length, chunked, or until-close framing.
|
|
189
|
+
* Completing or failing is monotonic; later input is ignored.
|
|
190
|
+
*
|
|
191
|
+
* Both directions of a loopback connection need exactly this - the server
|
|
192
|
+
* half parses what a guest server writes, the client half parses what a
|
|
193
|
+
* guest client writes - so the framing lives here once and the subclasses
|
|
194
|
+
* supply only what differs: the start line and whether a body is expected.
|
|
195
|
+
*/
|
|
196
|
+
class HttpMessageParser {
|
|
197
|
+
phase = 'headers';
|
|
198
|
+
settled = null;
|
|
199
|
+
headerBuffer = EMPTY_BYTES;
|
|
200
|
+
headerScanOffset = 0;
|
|
201
|
+
headerPairs = [];
|
|
202
|
+
framing = 'none';
|
|
203
|
+
expectedBodyBytes = 0;
|
|
204
|
+
bodyChunks = [];
|
|
205
|
+
bodyByteCount = 0;
|
|
206
|
+
chunkState = 'size';
|
|
207
|
+
chunkSizeLine = [];
|
|
208
|
+
chunkDataRemaining = 0;
|
|
209
|
+
get outcome() {
|
|
210
|
+
return this.settled;
|
|
211
|
+
}
|
|
212
|
+
feed(chunk) {
|
|
213
|
+
if (this.phase === 'done' || chunk.byteLength === 0)
|
|
214
|
+
return;
|
|
215
|
+
if (this.phase === 'headers') {
|
|
216
|
+
this.feedHeaders(chunk);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
this.feedBody(chunk);
|
|
220
|
+
}
|
|
221
|
+
/** EOF from the peer closing the connection (or the request being torn down). */
|
|
222
|
+
finish() {
|
|
223
|
+
if (this.phase === 'done')
|
|
224
|
+
return;
|
|
225
|
+
if (this.phase === 'headers') {
|
|
226
|
+
this.fail(`connection closed before ${this.messageLabel} headers`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (this.framing === 'until-close') {
|
|
230
|
+
this.completeWithBody(concatBytes(this.bodyChunks));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
this.fail(`connection closed before the ${this.messageLabel} completed`);
|
|
234
|
+
}
|
|
235
|
+
feedHeaders(chunk) {
|
|
236
|
+
this.headerBuffer = concatBytes([this.headerBuffer, chunk]);
|
|
237
|
+
const headerEnd = this.findHeaderEnd();
|
|
238
|
+
if (headerEnd < 0) {
|
|
239
|
+
this.headerScanOffset = Math.max(0, this.headerBuffer.byteLength - 3);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const parsed = this.parseHeaderBlock(this.headerBuffer.subarray(0, headerEnd));
|
|
243
|
+
const leftover = this.headerBuffer.subarray(headerEnd);
|
|
244
|
+
this.headerBuffer = EMPTY_BYTES;
|
|
245
|
+
if (!parsed)
|
|
246
|
+
return;
|
|
247
|
+
if (!this.bodyAllowed()) {
|
|
248
|
+
this.completeWithBody(null);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const transferEncoding = this.headerValue('Transfer-Encoding');
|
|
252
|
+
if (transferEncoding !== null && /chunked/i.test(transferEncoding)) {
|
|
253
|
+
this.framing = 'chunked';
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
const contentLength = this.headerValue('Content-Length');
|
|
257
|
+
const expected = contentLength === null ? Number.NaN : parseInt(contentLength, 10);
|
|
258
|
+
if (Number.isFinite(expected) && expected >= 0) {
|
|
259
|
+
this.framing = 'content-length';
|
|
260
|
+
this.expectedBodyBytes = expected;
|
|
261
|
+
if (expected === 0) {
|
|
262
|
+
this.completeWithBody(EMPTY_BYTES);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
this.framing = this.defaultFramingWhenUnframed();
|
|
268
|
+
if (this.framing === 'none') {
|
|
269
|
+
this.completeWithBody(null);
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
this.phase = 'body';
|
|
275
|
+
this.feedBody(leftover);
|
|
276
|
+
}
|
|
277
|
+
feedBody(chunk) {
|
|
278
|
+
if (this.framing === 'chunked') {
|
|
279
|
+
this.feedChunkedBody(chunk);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
if (chunk.byteLength === 0)
|
|
283
|
+
return;
|
|
284
|
+
if (this.framing === 'content-length') {
|
|
285
|
+
const needed = this.expectedBodyBytes - this.bodyByteCount;
|
|
286
|
+
this.appendBody(chunk.subarray(0, Math.min(needed, chunk.byteLength)));
|
|
287
|
+
if (this.bodyByteCount >= this.expectedBodyBytes) {
|
|
288
|
+
this.completeWithBody(concatBytes(this.bodyChunks));
|
|
289
|
+
}
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
this.appendBody(chunk);
|
|
293
|
+
}
|
|
294
|
+
feedChunkedBody(chunk) {
|
|
295
|
+
let i = 0;
|
|
296
|
+
while (i < chunk.byteLength && this.phase === 'body') {
|
|
297
|
+
if (this.chunkState === 'size') {
|
|
298
|
+
const byte = chunk[i++];
|
|
299
|
+
if (byte === 10) {
|
|
300
|
+
const line = new TextDecoder().decode(Uint8Array.from(this.chunkSizeLine)).trim();
|
|
301
|
+
this.chunkSizeLine.length = 0;
|
|
302
|
+
const size = parseInt(line.split(';', 1)[0], 16);
|
|
303
|
+
if (!Number.isFinite(size) || size < 0) {
|
|
304
|
+
this.fail('malformed chunked transfer encoding');
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
if (size === 0) {
|
|
308
|
+
this.completeWithBody(concatBytes(this.bodyChunks));
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
this.chunkState = 'data';
|
|
312
|
+
this.chunkDataRemaining = size;
|
|
313
|
+
}
|
|
314
|
+
else if (byte !== 13) {
|
|
315
|
+
this.chunkSizeLine.push(byte);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else if (this.chunkState === 'data') {
|
|
319
|
+
const take = Math.min(this.chunkDataRemaining, chunk.byteLength - i);
|
|
320
|
+
this.appendBody(chunk.subarray(i, i + take));
|
|
321
|
+
i += take;
|
|
322
|
+
this.chunkDataRemaining -= take;
|
|
323
|
+
if (this.chunkDataRemaining === 0)
|
|
324
|
+
this.chunkState = 'data-end';
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
const byte = chunk[i++];
|
|
328
|
+
if (byte === 10) {
|
|
329
|
+
this.chunkState = 'size';
|
|
330
|
+
}
|
|
331
|
+
else if (byte !== 13) {
|
|
332
|
+
this.fail('malformed chunked transfer encoding');
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
appendBody(bytes) {
|
|
339
|
+
if (bytes.byteLength === 0)
|
|
340
|
+
return;
|
|
341
|
+
this.bodyChunks.push(bytes);
|
|
342
|
+
this.bodyByteCount += bytes.byteLength;
|
|
343
|
+
}
|
|
344
|
+
findHeaderEnd() {
|
|
345
|
+
const bytes = this.headerBuffer;
|
|
346
|
+
for (let i = this.headerScanOffset; i + 3 < bytes.byteLength; i++) {
|
|
347
|
+
if (bytes[i] === 13 && bytes[i + 1] === 10 && bytes[i + 2] === 13 && bytes[i + 3] === 10) {
|
|
348
|
+
return i + 4;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return -1;
|
|
352
|
+
}
|
|
353
|
+
/** Returns false when the start line is malformed (the parser has already failed). */
|
|
354
|
+
parseHeaderBlock(headerBytes) {
|
|
355
|
+
const headerText = new TextDecoder().decode(headerBytes);
|
|
356
|
+
const lines = headerText.replace(/\r\n/g, '\n').split('\n').filter((line) => line.length > 0);
|
|
357
|
+
const startLine = lines.shift() ?? '';
|
|
358
|
+
if (!this.parseStartLine(startLine))
|
|
359
|
+
return false;
|
|
360
|
+
for (const line of lines) {
|
|
361
|
+
const separator = line.indexOf(':');
|
|
362
|
+
if (separator <= 0)
|
|
363
|
+
continue;
|
|
364
|
+
this.headerPairs.push([line.slice(0, separator), line.slice(separator + 1).trimStart()]);
|
|
365
|
+
}
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
headerValue(name) {
|
|
369
|
+
const target = name.toLowerCase();
|
|
370
|
+
for (const [key, value] of this.headerPairs) {
|
|
371
|
+
if (key.toLowerCase() === target)
|
|
372
|
+
return value;
|
|
373
|
+
}
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
completeWithBody(body) {
|
|
377
|
+
this.phase = 'done';
|
|
378
|
+
this.settled = { kind: 'message', message: this.buildMessage(body) };
|
|
379
|
+
}
|
|
380
|
+
fail(message) {
|
|
381
|
+
this.phase = 'done';
|
|
382
|
+
this.settled = { kind: 'failed', message };
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Parses the response a guest server writes onto an accepted connection.
|
|
387
|
+
* An unframed response reads until the guest closes the connection, which
|
|
388
|
+
* is how HTTP/1.0-style handlers signal end-of-body.
|
|
389
|
+
*/
|
|
390
|
+
class HttpResponseParser extends HttpMessageParser {
|
|
391
|
+
requestMethod;
|
|
392
|
+
status = 200;
|
|
393
|
+
statusText = '';
|
|
394
|
+
constructor(requestMethod) {
|
|
395
|
+
super();
|
|
396
|
+
this.requestMethod = requestMethod;
|
|
397
|
+
}
|
|
398
|
+
get messageLabel() {
|
|
399
|
+
return 'response';
|
|
400
|
+
}
|
|
401
|
+
parseStartLine(line) {
|
|
402
|
+
const match = /^HTTP\/\d(?:\.\d)?\s+(\d{3})(?:\s+(.*))?$/.exec(line || 'HTTP/1.1 200 OK');
|
|
403
|
+
this.status = match ? parseInt(match[1], 10) : 200;
|
|
404
|
+
this.statusText = match?.[2] ?? '';
|
|
405
|
+
return true;
|
|
406
|
+
}
|
|
407
|
+
bodyAllowed() {
|
|
408
|
+
return responseCanHaveBody(this.requestMethod, this.status);
|
|
409
|
+
}
|
|
410
|
+
defaultFramingWhenUnframed() {
|
|
411
|
+
return 'until-close';
|
|
412
|
+
}
|
|
413
|
+
buildMessage(body) {
|
|
414
|
+
return { status: this.status, statusText: this.statusText, headerPairs: this.headerPairs, body };
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Parses the request a guest client writes onto a loopback connection.
|
|
419
|
+
* An unframed request has no body - unlike a response, a request may not
|
|
420
|
+
* use connection close to delimit one, since the peer still has to reply.
|
|
421
|
+
*/
|
|
422
|
+
class HttpRequestParser extends HttpMessageParser {
|
|
423
|
+
method = 'GET';
|
|
424
|
+
target = '/';
|
|
425
|
+
get messageLabel() {
|
|
426
|
+
return 'request';
|
|
427
|
+
}
|
|
428
|
+
parseStartLine(line) {
|
|
429
|
+
const match = /^([A-Za-z]+)\s+(\S+)\s+HTTP\/\d(?:\.\d)?$/.exec(line);
|
|
430
|
+
if (!match) {
|
|
431
|
+
this.fail(`malformed HTTP request line: ${JSON.stringify(line.slice(0, 120))}`);
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
this.method = match[1].toUpperCase();
|
|
435
|
+
this.target = match[2];
|
|
436
|
+
return true;
|
|
437
|
+
}
|
|
438
|
+
bodyAllowed() {
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
defaultFramingWhenUnframed() {
|
|
442
|
+
return 'none';
|
|
443
|
+
}
|
|
444
|
+
buildMessage(body) {
|
|
445
|
+
return { method: this.method, target: this.target, headerPairs: this.headerPairs, body };
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
function errorResponse(status, message) {
|
|
449
|
+
return {
|
|
450
|
+
status,
|
|
451
|
+
statusText: '',
|
|
452
|
+
headerPairs: [['content-type', 'text/plain; charset=utf-8']],
|
|
453
|
+
body: new TextEncoder().encode(`Nimbus virtual socket: ${message}`),
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
function toResponse(settled) {
|
|
457
|
+
const headers = new Headers();
|
|
458
|
+
for (const [key, value] of settled.headerPairs)
|
|
459
|
+
headers.append(key, value);
|
|
460
|
+
return new Response(settled.body, {
|
|
461
|
+
status: settled.status,
|
|
462
|
+
statusText: settled.statusText,
|
|
463
|
+
headers,
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
class VirtualConnection {
|
|
467
|
+
id;
|
|
468
|
+
/** Request bytes the guest server reads; filled in one shot in stage 1. */
|
|
469
|
+
inbound;
|
|
470
|
+
/** Response bytes the guest server writes; drained into the parser. */
|
|
471
|
+
outbound;
|
|
472
|
+
parser;
|
|
473
|
+
responseReady = new Deferred();
|
|
474
|
+
settled = false;
|
|
475
|
+
closed = false;
|
|
476
|
+
constructor(id, requestMethod, requestBytes, limits) {
|
|
477
|
+
this.id = id;
|
|
478
|
+
this.inbound = new ByteChunkQueue(requestBytes.byteLength, 'request buffer');
|
|
479
|
+
this.inbound.enqueue(requestBytes);
|
|
480
|
+
this.outbound = new ByteChunkQueue(limits.maxResponseBufferBytes, 'response buffer');
|
|
481
|
+
this.parser = new HttpResponseParser(requestMethod);
|
|
482
|
+
}
|
|
483
|
+
read(maxBytes) {
|
|
484
|
+
return Array.from(this.inbound.readUpTo(Math.max(1, maxBytes | 0)));
|
|
485
|
+
}
|
|
486
|
+
/** The whole request is buffered before the connection is accepted, so nothing is ever awaited. */
|
|
487
|
+
readAsync(maxBytes) {
|
|
488
|
+
return Promise.resolve(this.read(maxBytes));
|
|
489
|
+
}
|
|
490
|
+
readBytesAsync(maxBytes) {
|
|
491
|
+
return Promise.resolve(this.inbound.readUpTo(Math.max(1, maxBytes | 0)));
|
|
492
|
+
}
|
|
493
|
+
/** Same reason: an empty read on an accepted connection is always genuine EOF. */
|
|
494
|
+
atEof() {
|
|
495
|
+
return true;
|
|
496
|
+
}
|
|
497
|
+
write(bytesLike) {
|
|
498
|
+
const bytes = toBytes(bytesLike);
|
|
499
|
+
if (bytes.byteLength === 0 || this.settled || this.closed)
|
|
500
|
+
return bytes.byteLength;
|
|
501
|
+
// Copy once: Pyodide/ruby.wasm callers reuse their transfer buffers.
|
|
502
|
+
this.outbound.enqueue(bytes.slice());
|
|
503
|
+
this.pumpParser();
|
|
504
|
+
return bytes.byteLength;
|
|
505
|
+
}
|
|
506
|
+
/** EOF from the server side (or request teardown); completes until-close bodies. */
|
|
507
|
+
close() {
|
|
508
|
+
if (this.closed)
|
|
509
|
+
return;
|
|
510
|
+
this.closed = true;
|
|
511
|
+
if (this.settled)
|
|
512
|
+
return;
|
|
513
|
+
this.parser.finish();
|
|
514
|
+
this.pumpParser();
|
|
515
|
+
}
|
|
516
|
+
/** Abort propagation: settle the pending preview request with a terminal status. */
|
|
517
|
+
abort(message, status) {
|
|
518
|
+
this.closed = true;
|
|
519
|
+
this.settle(errorResponse(status, message));
|
|
520
|
+
}
|
|
521
|
+
async response(timeoutMs) {
|
|
522
|
+
const timer = setTimeout(() => {
|
|
523
|
+
this.settle(errorResponse(504, 'timed out waiting for response'));
|
|
524
|
+
}, Math.max(1, timeoutMs));
|
|
525
|
+
try {
|
|
526
|
+
return toResponse(await this.responseReady.promise);
|
|
527
|
+
}
|
|
528
|
+
finally {
|
|
529
|
+
clearTimeout(timer);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
pumpParser() {
|
|
533
|
+
for (;;) {
|
|
534
|
+
const chunk = this.outbound.readUpTo(Number.MAX_SAFE_INTEGER);
|
|
535
|
+
if (chunk.byteLength === 0)
|
|
536
|
+
break;
|
|
537
|
+
this.parser.feed(chunk);
|
|
538
|
+
}
|
|
539
|
+
const outcome = this.parser.outcome;
|
|
540
|
+
if (!outcome)
|
|
541
|
+
return;
|
|
542
|
+
if (outcome.kind === 'failed') {
|
|
543
|
+
this.settle(errorResponse(502, outcome.message));
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
const { status, statusText, headerPairs, body } = outcome.message;
|
|
547
|
+
this.settle({
|
|
548
|
+
status,
|
|
549
|
+
statusText,
|
|
550
|
+
// The framing is consumed here; the Worker Response re-frames the body itself.
|
|
551
|
+
headerPairs: headerPairs.filter(([key]) => !/^transfer-encoding$/i.test(key)),
|
|
552
|
+
body,
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
settle(response) {
|
|
556
|
+
if (this.settled)
|
|
557
|
+
return;
|
|
558
|
+
this.settled = true;
|
|
559
|
+
this.responseReady.resolve(response);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* A guest client's connection to an in-session loopback port - the mirror
|
|
564
|
+
* of VirtualConnection.
|
|
565
|
+
*
|
|
566
|
+
* The guest writes an HTTP/1.1 request; once it parses, the kernel hands
|
|
567
|
+
* the resulting Request to the host's loopback router and streams the
|
|
568
|
+
* Response back as response bytes the guest reads. That is the whole of
|
|
569
|
+
* it, and it is HTTP-only by construction: Cloudflare gives a Worker no
|
|
570
|
+
* outbound TCP to 127.0.0.1, so the only thing a loopback client socket
|
|
571
|
+
* can carry is a request/response exchange. A guest that writes a non-HTTP
|
|
572
|
+
* protocol (Redis, Postgres, a bare `nc` pipe) gets a parse failure rather
|
|
573
|
+
* than a silent hang.
|
|
574
|
+
*
|
|
575
|
+
* One connection carries exactly one exchange. Every response is marked
|
|
576
|
+
* `Connection: close`, which is the signal every HTTP client understands
|
|
577
|
+
* to stop reusing the socket, so pooling clients (urllib3, httpcore) open
|
|
578
|
+
* a fresh connection per request instead of pipelining onto a dead one.
|
|
579
|
+
*/
|
|
580
|
+
class LoopbackClientConnection {
|
|
581
|
+
id;
|
|
582
|
+
port;
|
|
583
|
+
route;
|
|
584
|
+
limits;
|
|
585
|
+
parser = new HttpRequestParser();
|
|
586
|
+
/** Response bytes the guest client reads. */
|
|
587
|
+
inbound = new ByteChunkQueue(Number.MAX_SAFE_INTEGER, 'loopback response buffer');
|
|
588
|
+
readable = null;
|
|
589
|
+
drained = null;
|
|
590
|
+
dispatched = false;
|
|
591
|
+
eof = false;
|
|
592
|
+
closed = false;
|
|
593
|
+
constructor(id, port, route, limits) {
|
|
594
|
+
this.id = id;
|
|
595
|
+
this.port = port;
|
|
596
|
+
this.route = route;
|
|
597
|
+
this.limits = limits;
|
|
598
|
+
}
|
|
599
|
+
write(bytesLike) {
|
|
600
|
+
const bytes = toBytes(bytesLike);
|
|
601
|
+
if (bytes.byteLength === 0 || this.closed)
|
|
602
|
+
return bytes.byteLength;
|
|
603
|
+
if (this.dispatched) {
|
|
604
|
+
throw new Error(`Nimbus loopback socket: port ${this.port} answered with "Connection: close"; ` +
|
|
605
|
+
'open a new connection for the next request');
|
|
606
|
+
}
|
|
607
|
+
// Copy once: Pyodide/ruby.wasm callers reuse their transfer buffers.
|
|
608
|
+
this.parser.feed(bytes.slice());
|
|
609
|
+
const outcome = this.parser.outcome;
|
|
610
|
+
if (!outcome)
|
|
611
|
+
return bytes.byteLength;
|
|
612
|
+
this.dispatched = true;
|
|
613
|
+
if (outcome.kind === 'failed')
|
|
614
|
+
this.failWith(400, outcome.message);
|
|
615
|
+
else
|
|
616
|
+
void this.dispatch(outcome.message);
|
|
617
|
+
return bytes.byteLength;
|
|
618
|
+
}
|
|
619
|
+
read(maxBytes) {
|
|
620
|
+
return Array.from(this.readBytes(maxBytes));
|
|
621
|
+
}
|
|
622
|
+
/** Byte-array read. The fd-backed path uses this so a stream never round-trips through number[]. */
|
|
623
|
+
readBytes(maxBytes) {
|
|
624
|
+
const out = this.inbound.readUpTo(Math.max(1, maxBytes | 0));
|
|
625
|
+
if (this.drained && this.inbound.pendingBytes <= LOOPBACK_READ_HIGH_WATER_BYTES) {
|
|
626
|
+
const waiter = this.drained;
|
|
627
|
+
this.drained = null;
|
|
628
|
+
waiter.resolve();
|
|
629
|
+
}
|
|
630
|
+
return out;
|
|
631
|
+
}
|
|
632
|
+
atEof() {
|
|
633
|
+
return (this.eof || this.closed) && this.inbound.pendingBytes === 0;
|
|
634
|
+
}
|
|
635
|
+
/** Blocks the guest until response bytes arrive; an empty result is EOF. */
|
|
636
|
+
async readAsync(maxBytes) {
|
|
637
|
+
return Array.from(await this.readBytesAsync(maxBytes));
|
|
638
|
+
}
|
|
639
|
+
async readBytesAsync(maxBytes) {
|
|
640
|
+
for (;;) {
|
|
641
|
+
const chunk = this.readBytes(maxBytes);
|
|
642
|
+
if (chunk.byteLength > 0)
|
|
643
|
+
return chunk;
|
|
644
|
+
if (this.eof || this.closed)
|
|
645
|
+
return EMPTY_BYTES;
|
|
646
|
+
if (!this.dispatched) {
|
|
647
|
+
throw new Error('Nimbus loopback socket: read before a complete HTTP request was written ' +
|
|
648
|
+
'(loopback sockets carry HTTP requests, not arbitrary byte streams)');
|
|
649
|
+
}
|
|
650
|
+
const waiter = (this.readable ??= new Deferred());
|
|
651
|
+
await waiter.promise;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
close() {
|
|
655
|
+
if (this.closed)
|
|
656
|
+
return;
|
|
657
|
+
this.closed = true;
|
|
658
|
+
this.wakeReader();
|
|
659
|
+
if (this.drained) {
|
|
660
|
+
const waiter = this.drained;
|
|
661
|
+
this.drained = null;
|
|
662
|
+
waiter.resolve();
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
async dispatch(parsed) {
|
|
666
|
+
let request;
|
|
667
|
+
try {
|
|
668
|
+
request = this.buildRequest(parsed);
|
|
669
|
+
}
|
|
670
|
+
catch (error) {
|
|
671
|
+
this.failWith(400, describeError(error));
|
|
672
|
+
return;
|
|
673
|
+
}
|
|
674
|
+
let response;
|
|
675
|
+
try {
|
|
676
|
+
response = await this.withTimeout(this.route(this.port, request));
|
|
677
|
+
}
|
|
678
|
+
catch (error) {
|
|
679
|
+
this.failWith(502, describeError(error));
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
682
|
+
await this.streamResponse(request.method, response);
|
|
683
|
+
}
|
|
684
|
+
buildRequest(parsed) {
|
|
685
|
+
const headers = new Headers();
|
|
686
|
+
let authority = `127.0.0.1:${this.port}`;
|
|
687
|
+
for (const [key, value] of parsed.headerPairs) {
|
|
688
|
+
if (/^host$/i.test(key)) {
|
|
689
|
+
authority = value;
|
|
690
|
+
continue;
|
|
691
|
+
}
|
|
692
|
+
// Hop-by-hop framing is re-derived by the Request itself.
|
|
693
|
+
if (/^(transfer-encoding|connection|content-length|keep-alive)$/i.test(key))
|
|
694
|
+
continue;
|
|
695
|
+
headers.append(key, value);
|
|
696
|
+
}
|
|
697
|
+
const target = parsed.target.startsWith('/') ? parsed.target : `/${parsed.target}`;
|
|
698
|
+
const url = /^https?:\/\//i.test(parsed.target) ? parsed.target : `http://${authority}${target}`;
|
|
699
|
+
const body = parsed.body && parsed.body.byteLength > 0 ? parsed.body : null;
|
|
700
|
+
const methodTakesBody = parsed.method !== 'GET' && parsed.method !== 'HEAD';
|
|
701
|
+
return new Request(url, {
|
|
702
|
+
method: parsed.method,
|
|
703
|
+
headers,
|
|
704
|
+
body: methodTakesBody ? body : null,
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
async streamResponse(method, response) {
|
|
708
|
+
const withBody = responseCanHaveBody(method, response.status) && response.body !== null;
|
|
709
|
+
const headers = new Headers(response.headers);
|
|
710
|
+
for (const hopByHop of ['transfer-encoding', 'content-length', 'connection', 'keep-alive']) {
|
|
711
|
+
headers.delete(hopByHop);
|
|
712
|
+
}
|
|
713
|
+
this.pushBytes(encodeHttpResponseHead(response.status, response.statusText, headers, withBody));
|
|
714
|
+
if (!withBody || !response.body) {
|
|
715
|
+
this.finishStream();
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
718
|
+
const reader = response.body.getReader();
|
|
719
|
+
try {
|
|
720
|
+
for (;;) {
|
|
721
|
+
const { value, done } = await reader.read();
|
|
722
|
+
if (done)
|
|
723
|
+
break;
|
|
724
|
+
if (this.closed)
|
|
725
|
+
return;
|
|
726
|
+
const bytes = value instanceof Uint8Array ? value : new Uint8Array(value);
|
|
727
|
+
if (bytes.byteLength === 0)
|
|
728
|
+
continue;
|
|
729
|
+
this.pushBytes(encodeChunkedFrame(bytes));
|
|
730
|
+
await this.awaitDrain();
|
|
731
|
+
}
|
|
732
|
+
this.pushBytes(CHUNKED_TERMINATOR);
|
|
733
|
+
}
|
|
734
|
+
catch {
|
|
735
|
+
// A truncated body is what a real peer would deliver on a mid-stream
|
|
736
|
+
// failure: stop here and let the guest see the short read.
|
|
737
|
+
}
|
|
738
|
+
finally {
|
|
739
|
+
try {
|
|
740
|
+
await reader.cancel();
|
|
741
|
+
}
|
|
742
|
+
catch { }
|
|
743
|
+
this.finishStream();
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
/** Synthesize a complete response so the guest sees an HTTP error, never a hang. */
|
|
747
|
+
failWith(status, detail) {
|
|
748
|
+
const body = new TextEncoder().encode(`Nimbus loopback socket: ${detail}`);
|
|
749
|
+
const headers = new Headers({
|
|
750
|
+
'content-type': 'text/plain; charset=utf-8',
|
|
751
|
+
'content-length': String(body.byteLength),
|
|
752
|
+
});
|
|
753
|
+
this.pushBytes(encodeHttpResponseHead(status, '', headers, false));
|
|
754
|
+
this.pushBytes(body);
|
|
755
|
+
this.finishStream();
|
|
756
|
+
}
|
|
757
|
+
pushBytes(bytes) {
|
|
758
|
+
if (this.closed)
|
|
759
|
+
return;
|
|
760
|
+
this.inbound.enqueue(bytes);
|
|
761
|
+
this.wakeReader();
|
|
762
|
+
}
|
|
763
|
+
finishStream() {
|
|
764
|
+
this.eof = true;
|
|
765
|
+
this.wakeReader();
|
|
766
|
+
}
|
|
767
|
+
wakeReader() {
|
|
768
|
+
const waiter = this.readable;
|
|
769
|
+
if (!waiter)
|
|
770
|
+
return;
|
|
771
|
+
this.readable = null;
|
|
772
|
+
waiter.resolve();
|
|
773
|
+
}
|
|
774
|
+
/** Pause the body pump while the guest is behind, so a big stream cannot grow unbounded. */
|
|
775
|
+
awaitDrain() {
|
|
776
|
+
if (this.inbound.pendingBytes <= LOOPBACK_READ_HIGH_WATER_BYTES)
|
|
777
|
+
return Promise.resolve();
|
|
778
|
+
return (this.drained ??= new Deferred()).promise;
|
|
779
|
+
}
|
|
780
|
+
withTimeout(promise) {
|
|
781
|
+
let timer = null;
|
|
782
|
+
const timeout = new Promise((_resolve, reject) => {
|
|
783
|
+
timer = setTimeout(() => reject(new Error(`port ${this.port} did not respond within ${this.limits.responseTimeoutMs}ms`)), Math.max(1, this.limits.responseTimeoutMs));
|
|
784
|
+
});
|
|
785
|
+
return Promise.race([promise, timeout]).finally(() => {
|
|
786
|
+
if (timer !== null)
|
|
787
|
+
clearTimeout(timer);
|
|
788
|
+
});
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
function describeError(error) {
|
|
792
|
+
return error instanceof Error ? error.message : String(error);
|
|
793
|
+
}
|
|
794
|
+
function socketStreamFor(conn) {
|
|
795
|
+
return {
|
|
796
|
+
// Neither direction has a handshake: an accepted connection already holds
|
|
797
|
+
// the request, and a dialed one starts its exchange on the first write.
|
|
798
|
+
opened: Promise.resolve(),
|
|
799
|
+
readable: new ReadableStream({
|
|
800
|
+
async pull(controller) {
|
|
801
|
+
const bytes = await conn.readBytesAsync(LOOPBACK_STREAM_CHUNK_BYTES);
|
|
802
|
+
if (bytes.byteLength === 0)
|
|
803
|
+
controller.close();
|
|
804
|
+
else
|
|
805
|
+
controller.enqueue(bytes);
|
|
806
|
+
},
|
|
807
|
+
cancel() {
|
|
808
|
+
conn.close();
|
|
809
|
+
},
|
|
810
|
+
},
|
|
811
|
+
// highWaterMark 0 so the stream never pulls speculatively. A default
|
|
812
|
+
// strategy pulls once at construction, which on a client connection
|
|
813
|
+
// means reading before the guest has written its request.
|
|
814
|
+
{ highWaterMark: 0 }),
|
|
815
|
+
writable: new WritableStream({
|
|
816
|
+
write(chunk) {
|
|
817
|
+
conn.write(chunk);
|
|
818
|
+
},
|
|
819
|
+
abort() {
|
|
820
|
+
conn.close();
|
|
821
|
+
},
|
|
822
|
+
}),
|
|
823
|
+
close() {
|
|
824
|
+
conn.close();
|
|
825
|
+
return Promise.resolve();
|
|
826
|
+
},
|
|
827
|
+
};
|
|
828
|
+
}
|
|
829
|
+
class VirtualListener {
|
|
830
|
+
port;
|
|
831
|
+
queue = [];
|
|
832
|
+
acceptWaiters = [];
|
|
833
|
+
constructor(port) {
|
|
834
|
+
this.port = port;
|
|
835
|
+
}
|
|
836
|
+
push(conn) {
|
|
837
|
+
const waiter = this.acceptWaiters.shift();
|
|
838
|
+
if (waiter)
|
|
839
|
+
waiter.resolve(conn);
|
|
840
|
+
else
|
|
841
|
+
this.queue.push(conn);
|
|
842
|
+
}
|
|
843
|
+
accept() {
|
|
844
|
+
const queued = this.queue.shift();
|
|
845
|
+
if (queued)
|
|
846
|
+
return Promise.resolve(queued);
|
|
847
|
+
const waiter = new Deferred();
|
|
848
|
+
this.acceptWaiters.push(waiter);
|
|
849
|
+
return waiter.promise;
|
|
850
|
+
}
|
|
851
|
+
take() {
|
|
852
|
+
return this.queue.shift() ?? null;
|
|
853
|
+
}
|
|
854
|
+
pending() {
|
|
855
|
+
return this.queue.length;
|
|
856
|
+
}
|
|
857
|
+
drainQueued() {
|
|
858
|
+
return this.queue.splice(0);
|
|
859
|
+
}
|
|
860
|
+
rejectPendingAccepts(error) {
|
|
861
|
+
for (const waiter of this.acceptWaiters.splice(0))
|
|
862
|
+
waiter.reject(error);
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
export class VirtualSocketKernel {
|
|
866
|
+
host;
|
|
867
|
+
/** Public: runner glue inspects listeners.keys() for the default preview port. */
|
|
868
|
+
listeners = new Map();
|
|
869
|
+
connections = new Map();
|
|
870
|
+
limits;
|
|
871
|
+
nextConnectionId = 1;
|
|
872
|
+
nextEphemeralPort = 49152;
|
|
873
|
+
listenWaiters = [];
|
|
874
|
+
readableWaiters = new Set();
|
|
875
|
+
constructor(host, limits) {
|
|
876
|
+
this.host = host;
|
|
877
|
+
this.limits = { ...DEFAULT_LIMITS, ...limits };
|
|
878
|
+
}
|
|
879
|
+
listen(port) {
|
|
880
|
+
let n = Number(port);
|
|
881
|
+
if (!Number.isInteger(n) || n < 0 || n >= 65536)
|
|
882
|
+
throw new Error(`invalid port: ${port}`);
|
|
883
|
+
if (n === 0) {
|
|
884
|
+
while (this.listeners.has(this.nextEphemeralPort)) {
|
|
885
|
+
this.nextEphemeralPort++;
|
|
886
|
+
if (this.nextEphemeralPort >= 65535)
|
|
887
|
+
this.nextEphemeralPort = 49152;
|
|
888
|
+
}
|
|
889
|
+
n = this.nextEphemeralPort++;
|
|
890
|
+
if (this.nextEphemeralPort >= 65535)
|
|
891
|
+
this.nextEphemeralPort = 49152;
|
|
892
|
+
}
|
|
893
|
+
if (!this.listeners.has(n)) {
|
|
894
|
+
this.listeners.set(n, new VirtualListener(n));
|
|
895
|
+
try {
|
|
896
|
+
this.host.__nimbusVirtualSocketDidListen?.(n);
|
|
897
|
+
}
|
|
898
|
+
catch { }
|
|
899
|
+
for (const waiter of this.listenWaiters.splice(0))
|
|
900
|
+
waiter.resolve(n);
|
|
901
|
+
}
|
|
902
|
+
return n;
|
|
903
|
+
}
|
|
904
|
+
closeListener(port) {
|
|
905
|
+
const n = Number(port);
|
|
906
|
+
const listener = this.listeners.get(n);
|
|
907
|
+
if (!listener)
|
|
908
|
+
return;
|
|
909
|
+
this.listeners.delete(n);
|
|
910
|
+
for (const conn of listener.drainQueued()) {
|
|
911
|
+
this.connections.delete(conn.id);
|
|
912
|
+
conn.abort(`listener closed on port ${n}`, 502);
|
|
913
|
+
}
|
|
914
|
+
listener.rejectPendingAccepts(new Error(`port is not listening: ${n}`));
|
|
915
|
+
}
|
|
916
|
+
async accept(port) {
|
|
917
|
+
const listener = this.listeners.get(Number(port));
|
|
918
|
+
if (!listener)
|
|
919
|
+
throw new Error(`port is not listening: ${port}`);
|
|
920
|
+
const conn = await listener.accept();
|
|
921
|
+
return { id: conn.id, host: '127.0.0.1', port: 0 };
|
|
922
|
+
}
|
|
923
|
+
acceptNow(port) {
|
|
924
|
+
const listener = this.listeners.get(Number(port));
|
|
925
|
+
if (!listener)
|
|
926
|
+
throw new Error(`port is not listening: ${port}`);
|
|
927
|
+
const conn = listener.take();
|
|
928
|
+
return conn ? { id: conn.id, host: '127.0.0.1', port: 0 } : null;
|
|
929
|
+
}
|
|
930
|
+
/**
|
|
931
|
+
* Open a client connection to `port` on the session's loopback.
|
|
932
|
+
*
|
|
933
|
+
* The returned id is an ordinary connection id: send() writes the
|
|
934
|
+
* request, recv()/recvAsync() read the response, close() releases it.
|
|
935
|
+
* Only HTTP/1.1 crosses a loopback connection - see
|
|
936
|
+
* LoopbackClientConnection for why - and each one carries a single
|
|
937
|
+
* request/response exchange.
|
|
938
|
+
*/
|
|
939
|
+
connect(port) {
|
|
940
|
+
const conn = this.openLoopbackClient(port);
|
|
941
|
+
this.connections.set(conn.id, conn);
|
|
942
|
+
return conn.id;
|
|
943
|
+
}
|
|
944
|
+
/**
|
|
945
|
+
* The same client connection as `connect`, handed back in Cloudflare's
|
|
946
|
+
* `Socket` shape.
|
|
947
|
+
*
|
|
948
|
+
* Guests whose sockets are real WASI file descriptors (ruby.wasm, and any
|
|
949
|
+
* future wasm32-wasi program) reach loopback through this: the WASI shim
|
|
950
|
+
* stores it in exactly the fd slot a `cloudflare:sockets` connection would
|
|
951
|
+
* occupy, so `fd_read` on an in-session port is the same suspending read as
|
|
952
|
+
* `fd_read` on a remote host.
|
|
953
|
+
*/
|
|
954
|
+
connectStream(port) {
|
|
955
|
+
return socketStreamFor(this.openLoopbackClient(port));
|
|
956
|
+
}
|
|
957
|
+
/**
|
|
958
|
+
* An already-accepted connection in the same `Socket` shape, so a server's
|
|
959
|
+
* accepted socket is the same kind of file descriptor as a client's dialed
|
|
960
|
+
* one. `accept`/`acceptNow` still hand out the connection id, because accept
|
|
961
|
+
* itself stays on the cooperative pump - this only binds the result.
|
|
962
|
+
*/
|
|
963
|
+
streamFor(id) {
|
|
964
|
+
const conn = this.connections.get(Number(id));
|
|
965
|
+
if (!conn)
|
|
966
|
+
throw new Error(`connection is closed: ${id}`);
|
|
967
|
+
return socketStreamFor(conn);
|
|
968
|
+
}
|
|
969
|
+
openLoopbackClient(port) {
|
|
970
|
+
const n = Number(port);
|
|
971
|
+
if (!Number.isInteger(n) || n <= 0 || n >= 65536)
|
|
972
|
+
throw new Error(`invalid port: ${port}`);
|
|
973
|
+
const route = this.host.__nimbusVirtualSocketRouteLoopback;
|
|
974
|
+
if (typeof route !== 'function') {
|
|
975
|
+
throw new Error('Nimbus loopback sockets are unavailable in this runtime');
|
|
976
|
+
}
|
|
977
|
+
return new LoopbackClientConnection(this.nextConnectionId++, n, route, this.limits);
|
|
978
|
+
}
|
|
979
|
+
/** Plain number array: Pyodide bytes() and the ruby.wasm base64 bridge both consume it. */
|
|
980
|
+
recv(id, maxBytes) {
|
|
981
|
+
const conn = this.connections.get(Number(id));
|
|
982
|
+
if (!conn)
|
|
983
|
+
return [];
|
|
984
|
+
return conn.read(Number(maxBytes));
|
|
985
|
+
}
|
|
986
|
+
/**
|
|
987
|
+
* Suspending read. A client connection has nothing to hand back until
|
|
988
|
+
* the loopback response arrives, so guests that can suspend (Pyodide
|
|
989
|
+
* `run_sync`, a JSPI-suspending WASI call) await this instead of
|
|
990
|
+
* spinning on recv(). An empty result is EOF.
|
|
991
|
+
*/
|
|
992
|
+
async recvAsync(id, maxBytes) {
|
|
993
|
+
const conn = this.connections.get(Number(id));
|
|
994
|
+
if (!conn)
|
|
995
|
+
return [];
|
|
996
|
+
return conn.readAsync(Number(maxBytes));
|
|
997
|
+
}
|
|
998
|
+
/**
|
|
999
|
+
* Whether an empty recv() means end-of-response rather than "not yet".
|
|
1000
|
+
* Guests that poll instead of suspending (ruby.wasm, whose JS bridge is
|
|
1001
|
+
* synchronous) need the two apart to avoid truncating a response.
|
|
1002
|
+
*/
|
|
1003
|
+
atEof(id) {
|
|
1004
|
+
const conn = this.connections.get(Number(id));
|
|
1005
|
+
return conn ? conn.atEof() : true;
|
|
1006
|
+
}
|
|
1007
|
+
send(id, bytesLike) {
|
|
1008
|
+
const conn = this.connections.get(Number(id));
|
|
1009
|
+
if (!conn)
|
|
1010
|
+
throw new Error(`connection is closed: ${id}`);
|
|
1011
|
+
return conn.write(bytesLike);
|
|
1012
|
+
}
|
|
1013
|
+
close(id) {
|
|
1014
|
+
const conn = this.connections.get(Number(id));
|
|
1015
|
+
if (!conn)
|
|
1016
|
+
return;
|
|
1017
|
+
conn.close();
|
|
1018
|
+
this.connections.delete(Number(id));
|
|
1019
|
+
}
|
|
1020
|
+
pending(port) {
|
|
1021
|
+
return this.listeners.get(Number(port))?.pending() ?? 0;
|
|
1022
|
+
}
|
|
1023
|
+
firstListeningPort() {
|
|
1024
|
+
for (const port of this.listeners.keys())
|
|
1025
|
+
return port;
|
|
1026
|
+
return null;
|
|
1027
|
+
}
|
|
1028
|
+
/** select()-style readiness: resolves ports with queued connections, [] on timeout. */
|
|
1029
|
+
waitReadable(ports, timeoutSeconds) {
|
|
1030
|
+
const normalized = (Array.isArray(ports) ? ports : [])
|
|
1031
|
+
.map((p) => Number(p))
|
|
1032
|
+
.filter((p) => Number.isInteger(p));
|
|
1033
|
+
const readyNow = normalized.filter((port) => this.pending(port) > 0);
|
|
1034
|
+
if (readyNow.length > 0)
|
|
1035
|
+
return Promise.resolve(readyNow);
|
|
1036
|
+
const timeoutMs = timeoutSeconds == null
|
|
1037
|
+
? this.limits.responseTimeoutMs
|
|
1038
|
+
: Math.max(0, Number(timeoutSeconds) * 1000);
|
|
1039
|
+
const deferred = new Deferred();
|
|
1040
|
+
const waiter = {
|
|
1041
|
+
ports: normalized,
|
|
1042
|
+
deferred,
|
|
1043
|
+
timer: setTimeout(() => {
|
|
1044
|
+
this.readableWaiters.delete(waiter);
|
|
1045
|
+
deferred.resolve([]);
|
|
1046
|
+
}, timeoutMs),
|
|
1047
|
+
};
|
|
1048
|
+
this.readableWaiters.add(waiter);
|
|
1049
|
+
return deferred.promise;
|
|
1050
|
+
}
|
|
1051
|
+
async waitForListen(timeoutMs) {
|
|
1052
|
+
const existing = this.firstListeningPort();
|
|
1053
|
+
if (existing)
|
|
1054
|
+
return existing;
|
|
1055
|
+
const waiter = new Deferred();
|
|
1056
|
+
this.listenWaiters.push(waiter);
|
|
1057
|
+
let timer = null;
|
|
1058
|
+
const timeout = new Promise((resolve) => {
|
|
1059
|
+
timer = setTimeout(() => resolve(null), Math.max(1, timeoutMs ?? 5_000));
|
|
1060
|
+
});
|
|
1061
|
+
try {
|
|
1062
|
+
return await Promise.race([waiter.promise, timeout]);
|
|
1063
|
+
}
|
|
1064
|
+
finally {
|
|
1065
|
+
if (timer !== null)
|
|
1066
|
+
clearTimeout(timer);
|
|
1067
|
+
}
|
|
1068
|
+
}
|
|
1069
|
+
async handleHttpRequest(port, request) {
|
|
1070
|
+
const n = Number(port);
|
|
1071
|
+
let listener = this.listeners.get(n);
|
|
1072
|
+
if (!listener) {
|
|
1073
|
+
try {
|
|
1074
|
+
await this.host.__nimbusVirtualSocketEnsureListener?.(n);
|
|
1075
|
+
}
|
|
1076
|
+
catch { }
|
|
1077
|
+
listener = this.listeners.get(n);
|
|
1078
|
+
}
|
|
1079
|
+
if (!listener) {
|
|
1080
|
+
return new Response(`Nimbus virtual socket: no listener on port ${port}`, { status: 502 });
|
|
1081
|
+
}
|
|
1082
|
+
const body = request.method === 'GET' || request.method === 'HEAD'
|
|
1083
|
+
? EMPTY_BYTES
|
|
1084
|
+
: new Uint8Array(await request.arrayBuffer());
|
|
1085
|
+
if (body.byteLength > this.limits.maxRequestBodyBytes) {
|
|
1086
|
+
return new Response(`Nimbus virtual socket: request body exceeds ${this.limits.maxRequestBodyBytes} bytes`, { status: 413 });
|
|
1087
|
+
}
|
|
1088
|
+
const id = this.nextConnectionId++;
|
|
1089
|
+
const conn = new VirtualConnection(id, request.method, encodeHttpRequest(request, body), this.limits);
|
|
1090
|
+
this.connections.set(id, conn);
|
|
1091
|
+
listener.push(conn);
|
|
1092
|
+
this.notifyReadable(n);
|
|
1093
|
+
const signal = request.signal;
|
|
1094
|
+
const onAbort = () => conn.abort('client aborted the request', 499);
|
|
1095
|
+
if (signal?.aborted)
|
|
1096
|
+
onAbort();
|
|
1097
|
+
else
|
|
1098
|
+
signal?.addEventListener('abort', onAbort);
|
|
1099
|
+
try {
|
|
1100
|
+
try {
|
|
1101
|
+
const accepted = await this.host.__nimbusVirtualSocketRequestQueued?.(n);
|
|
1102
|
+
if (accepted === false) {
|
|
1103
|
+
const detail = typeof this.host.__nimbusVirtualSocketLastError === 'string'
|
|
1104
|
+
? this.host.__nimbusVirtualSocketLastError.trim()
|
|
1105
|
+
: '';
|
|
1106
|
+
const suffix = detail ? `: ${detail}` : '';
|
|
1107
|
+
return new Response(`Nimbus virtual socket: runtime handler did not accept the request${suffix}`, { status: 502 });
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
catch { }
|
|
1111
|
+
return await conn.response(this.limits.responseTimeoutMs);
|
|
1112
|
+
}
|
|
1113
|
+
finally {
|
|
1114
|
+
signal?.removeEventListener('abort', onAbort);
|
|
1115
|
+
conn.close();
|
|
1116
|
+
this.connections.delete(id);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
notifyReadable(port) {
|
|
1120
|
+
for (const waiter of Array.from(this.readableWaiters)) {
|
|
1121
|
+
if (!waiter.ports.includes(port))
|
|
1122
|
+
continue;
|
|
1123
|
+
const ready = waiter.ports.filter((p) => this.pending(p) > 0);
|
|
1124
|
+
if (ready.length === 0)
|
|
1125
|
+
continue;
|
|
1126
|
+
clearTimeout(waiter.timer);
|
|
1127
|
+
this.readableWaiters.delete(waiter);
|
|
1128
|
+
waiter.deferred.resolve(ready);
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Install the kernel on the facet global scope. The generated injection
|
|
1134
|
+
* bundle (VIRTUAL_SOCKET_KERNEL_SRC) is exactly this call against
|
|
1135
|
+
* globalThis, wrapped in an IIFE so no identifiers leak into the dynamic
|
|
1136
|
+
* worker module scope.
|
|
1137
|
+
*/
|
|
1138
|
+
export function installVirtualSocketKernel(scope = globalThis) {
|
|
1139
|
+
if (!scope.__nimbusVirtualSockets) {
|
|
1140
|
+
scope.__nimbusVirtualSockets = new VirtualSocketKernel(scope);
|
|
1141
|
+
}
|
|
1142
|
+
return scope.__nimbusVirtualSockets;
|
|
1143
|
+
}
|