@volter/browser-substrate 0.1.120 → 0.1.121
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/cli/catalog-variants.d.ts.map +1 -1
- package/dist/cli/catalog-variants.js +27 -7
- package/dist/cli/catalog-variants.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +10 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/dependency-plan.d.ts +4 -0
- package/dist/dependency-plan.d.ts.map +1 -1
- package/dist/dependency-plan.js +8 -1
- package/dist/dependency-plan.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/shell/assets/{node-execution-worker-08f9a46842d3ea2d.js → node-execution-worker-f95a35f14c4e92be.js} +3 -3
- package/dist/shell/assets/{shell-BchR8dEr.js → shell-kBI0ZgOO.js} +432 -432
- package/dist/shell/index.html +1 -1
- package/dist/shell/node-execution-worker.js +1 -1
- package/package.json +1 -1
|
@@ -6096,11 +6096,11 @@ ${preloadLines(preloads)}`;const program=bootstrap+(printIndex>=0?`console.log($
|
|
|
6096
6096
|
> ${label} ${phase}
|
|
6097
6097
|
> ${command}
|
|
6098
6098
|
|
|
6099
|
-
`;if(phaseHeading)options.onStderr?.(phaseHeading);const result2=await this.options.runShellCommand(command,{...options,env:{...options.env,npm_lifecycle_event:phase,npm_package_name:manifest.name??"",npm_package_version:manifest.version??"",PATH:scriptPath(cwd,options.env?.PATH)}});stdout+=result2.stdout;stderr+=phaseHeading+result2.stderr;if(result2.exitCode!==0)return{...result2,stdout,stderr}}return{stdout,stderr,exitCode:0}}let scriptArgv;try{scriptArgv=parseCommandWords(script)}catch{return this.runContainer(argv,options)}if(scriptArgv[0]!=="vite"&&!(scriptArgv[0]==="next"&&scriptArgv[1]==="dev"))return this.runContainer(argv,options);if(separator>=0)scriptArgv.push(...argv.slice(separator+1));options.onStderr?.(heading);const result=scriptArgv[0]==="next"?await this.runNext(scriptArgv,options):await this.runVite(scriptArgv,options);return{...result,stderr:`${heading}${result.stderr}`}}ensureBunRuntime(){const vfs2=this.container.vfs;if(vfs2.existsSync(BUN_GLOBALS_PATH)&&vfs2.existsSync(BUN_BUILD_PATH))return;vfs2.mkdirSync(BUN_RUNTIME_DIRECTORY,{recursive:true});vfs2.writeFileSync(BUN_GLOBALS_PATH,BUN_GLOBALS_SOURCE);vfs2.writeFileSync(BUN_BUILD_PATH,BUN_BUILD_SOURCE)}nativeBindingPrelude(cwd){const selected=Object.entries(this.options.preparedBindings??{}).filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];const bindings=this.options.preparedBinding?.(cwd)??(selected?Object.fromEntries(Object.entries(selected[1]).map(([source,target])=>[`${selected[0]==="/"?"":selected[0]}/${source}`,`${selected[0]==="/"?"":selected[0]}/${target}`])):{});if(!Object.keys(bindings).length)return"";for(const[source,target]of Object.entries(bindings)){if(!source.startsWith("/")||!source.endsWith(".node")||!target.startsWith("/")||!target.endsWith(".cjs")||normalizeAbsolutePath(source)!==source||normalizeAbsolutePath(target)!==target||!this.container.vfs.existsSync(target))throw new Error(`Prepared native export binding missing/malformed: ${source}`)}return`(() => { const bindings = Object.freeze(${JSON.stringify(bindings)}); const { fileURLToPath, pathToFileURL } = require("node:url"); const { registerHooks } = require("node:module"); if (typeof registerHooks !== "function") throw new Error("Prepared native exports require Node synchronous module hooks; prepare a compatible engine on the host."); registerHooks({ resolve(specifier, context, nextResolve) { const resolved = nextResolve(specifier, context); const
|
|
6099
|
+
`;if(phaseHeading)options.onStderr?.(phaseHeading);const result2=await this.options.runShellCommand(command,{...options,env:{...options.env,npm_lifecycle_event:phase,npm_package_name:manifest.name??"",npm_package_version:manifest.version??"",PATH:scriptPath(cwd,options.env?.PATH)}});stdout+=result2.stdout;stderr+=phaseHeading+result2.stderr;if(result2.exitCode!==0)return{...result2,stdout,stderr}}return{stdout,stderr,exitCode:0}}let scriptArgv;try{scriptArgv=parseCommandWords(script)}catch{return this.runContainer(argv,options)}if(scriptArgv[0]!=="vite"&&!(scriptArgv[0]==="next"&&scriptArgv[1]==="dev"))return this.runContainer(argv,options);if(separator>=0)scriptArgv.push(...argv.slice(separator+1));options.onStderr?.(heading);const result=scriptArgv[0]==="next"?await this.runNext(scriptArgv,options):await this.runVite(scriptArgv,options);return{...result,stderr:`${heading}${result.stderr}`}}ensureBunRuntime(){const vfs2=this.container.vfs;if(vfs2.existsSync(BUN_GLOBALS_PATH)&&vfs2.existsSync(BUN_BUILD_PATH))return;vfs2.mkdirSync(BUN_RUNTIME_DIRECTORY,{recursive:true});vfs2.writeFileSync(BUN_GLOBALS_PATH,BUN_GLOBALS_SOURCE);vfs2.writeFileSync(BUN_BUILD_PATH,BUN_BUILD_SOURCE)}nativeBindingPrelude(cwd){const selected=Object.entries(this.options.preparedBindings??{}).filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];const bindings=this.options.preparedBinding?.(cwd)??(selected?Object.fromEntries(Object.entries(selected[1]).map(([source,target])=>[`${selected[0]==="/"?"":selected[0]}/${source}`,`${selected[0]==="/"?"":selected[0]}/${target}`])):{});const refused=Object.entries(this.options.preparedModuleRefusals??{}).filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];const refusals=this.options.preparedModuleRefusal?.(cwd)??(refused?Object.fromEntries(Object.entries(refused[1]).map(([path3,reason])=>[`${refused[0]==="/"?"":refused[0]}/${path3}`,reason])):{});for(const[path3,reason]of Object.entries(refusals))if(!path3.startsWith("/")||normalizeAbsolutePath(path3)!==path3||!reason.trim())throw new Error(`Prepared module refusal malformed: ${path3}`);if(!Object.keys(bindings).length&&!Object.keys(refusals).length)return"";for(const[source,target]of Object.entries(bindings)){if(!source.startsWith("/")||!source.endsWith(".node")||!target.startsWith("/")||!target.endsWith(".cjs")||normalizeAbsolutePath(source)!==source||normalizeAbsolutePath(target)!==target||!this.container.vfs.existsSync(target))throw new Error(`Prepared native export binding missing/malformed: ${source}`)}return`(() => { const bindings = Object.freeze(${JSON.stringify(bindings)}); const refusals = Object.freeze(${JSON.stringify(refusals)}); const { fileURLToPath, pathToFileURL } = require("node:url"); const { registerHooks } = require("node:module"); if (typeof registerHooks !== "function") throw new Error("Prepared native exports require Node synchronous module hooks; prepare a compatible engine on the host."); registerHooks({ resolve(specifier, context, nextResolve) { const resolved = nextResolve(specifier, context); const path = resolved.url.startsWith("file:") ? fileURLToPath(resolved.url) : undefined; const refused = path && Object.keys(refusals).filter(root => path === root || path.startsWith(root + "/")).sort((a, b) => b.length - a.length)[0]; if (refused) { const error = new Error(refusals[refused]); error.code = "ERR_UNPREPARED_PROVISION"; throw error; } const target = path ? bindings[path] : undefined; return target ? { url: pathToFileURL(target).href, shortCircuit: true } : resolved; } }); })();
|
|
6100
6100
|
`}async runNodeFile(argv,options,preloads=[]){const target=argv[1];if(!target||target.startsWith("-")){return this.runContainer(argv,options)}const cwd=normalizeAbsolutePath(options.cwd??"/");const targetPath=normalizeAbsolutePath(target.startsWith("/")?target:`${cwd}/${target}`);if(!this.container.vfs.existsSync(targetPath))return this.runContainer(argv,options);const nativePrelude=this.nativeBindingPrelude(options.cwd);if(preloads.length===0&&!nativePrelude&&!options.env?.[BUN_ENVIRONMENT_FLAG]){return this.runNodeContainer(argv,options)}const executablePath=targetPath;const temporaryDirectory=preloads.length>0?cwd:"/tmp/browser-runtime-node-entry";const temporaryPath=`${temporaryDirectory==="/"?"":temporaryDirectory}/${preloads.length>0?".browser-runtime-node-entry-":""}${globalThis.crypto.randomUUID()}.cjs`;const runtimeFiles=this.options.runtimeFiles??this.container.vfs;runtimeFiles.mkdirSync(temporaryDirectory,{recursive:true});runtimeFiles.writeFileSync(temporaryPath,[nativePrelude,`Object.assign(process.env, ${JSON.stringify(options.env??{})});`,`process.argv = ${JSON.stringify(["node",targetPath,...argv.slice(2)])};`,...options.env?.[BUN_ENVIRONMENT_FLAG]?[`require(${JSON.stringify(BUN_GLOBALS_PATH)});`]:[],...preloads.length>0?[preloadLines(preloads)]:[],`require("module")._load(${JSON.stringify(executablePath)}, null, true);`,""].join("\n"));try{return await this.runNodeContainer(["node",temporaryPath],options)}finally{if(runtimeFiles.existsSync(temporaryPath))runtimeFiles.unlinkSync(temporaryPath)}}runNext(argv,options){const cli=this.installedBin("next",normalizeAbsolutePath(options.cwd??"/"));if(!cli)return Promise.resolve({stdout:"",stderr:"next: the project has no next installed to run it.\n",exitCode:1});let args=[...argv];if(args[1]==="dev"){const turbo=args.some(arg=>arg==="--turbopack"||arg==="--turbo");args=args.filter(arg=>arg!=="--turbopack"&&arg!=="--turbo");if(this.nextGeneration(normalizeAbsolutePath(options.cwd??"/"))>=16&&!args.includes("--webpack"))args.push("--webpack");if(turbo)options.onStderr?.("next dev: Turbopack is a native binary the tab cannot run; bundling with webpack.\n")}return cli(args,options)}runVite(argv,options){const cli=this.installedBin("vite",normalizeAbsolutePath(options.cwd??"/"));if(cli)return cli(argv,options);return Promise.resolve({stdout:"",stderr:"vite: the project has no vite installed to run it.\n",exitCode:1})}runContainer(argv,options){const environment=Object.entries({...this.options.preparedEnvironment?.(options.cwd)??Object.entries(this.options.preparedEnvironments??{}).filter(([root2])=>(options.cwd??"/workspace/app")===root2||(options.cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0]?.[1]??{},...options.env??{}}).filter(([name])=>EXPORTABLE_NAME.test(name)&&!SHELL_OWNED_NAMES.has(name)).map(([name,value])=>`${name}=${renderCommand([value])}`);const command=[...environment,renderCommand(argv)].join(" ");return this.container.run(command,options)}async runNodeContainer(argv,options){if(nodeProcessHostInstalled())options={...options,held:false};options={...options,env:{...this.options.preparedEnvironment?.(options.cwd)??Object.entries(this.options.preparedEnvironments??{}).filter(([root2])=>(options.cwd??"/workspace/app")===root2||(options.cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0]?.[1]??{},...options.env??{}}};try{await this.rolldown?.prepare(normalizeAbsolutePath(options.cwd??"/"))}catch(error){const stderr=`Rolldown metadata registration failed: ${error instanceof Error?error.message:String(error)}
|
|
6101
6101
|
`;options.onStderr?.(stderr);return{stdout:"",stderr,exitCode:1}}const portsBeforeLaunch=new Set(this.container.serverBridge.getServerPorts());if(!this.container.isolated&&this.nodeFetchDepth===0){this.originalFetch=globalThis.fetch.bind(globalThis);globalThis.fetch=this.loopbackFetch;this.hadOriginalChildProcessExecutor=Reflect.has(globalThis,childProcessExecutorSymbol);this.originalChildProcessExecutor=Reflect.get(globalThis,childProcessExecutorSymbol);const childProcessRunner=this.options.runChildProcessCommand??this.options.runShellCommand;if(childProcessRunner){Reflect.set(globalThis,childProcessExecutorSymbol,{bypass:0,...options.signal?{parentSignal:options.signal}:{},run:async(command,runOptions)=>{const hold2=runOptions.hold??{value:true};this.heldChildren.add(hold2);try{return await childProcessRunner(command,runOptions)}finally{this.heldChildren.delete(hold2)}}})}}const namedToken=options.processToken;const processToken=typeof namedToken==="string"?namedToken:globalThis.crypto.randomUUID();const owner=this.container;const pendingTimers=()=>owner.pendingTimers?.(processToken)??0;const heldBuilds=()=>(Reflect.get(globalThis,"__browserRuntimeHeldWork")?.count??0)+(this.rolldown?.pendingWork??0);const bridgeChildren=()=>Reflect.get(globalThis,childProcessExecutorSymbol)?.pending?.(processToken)??0;const executionController=options.signal?new AbortController:void 0;const stopOnKill=()=>{executionController?.abort();owner.stopProcess?.(processToken)};options.signal?.addEventListener("abort",stopOnKill,{once:true});if(!this.container.isolated)this.nodeFetchDepth+=1;try{let lastOutputAt;const liveStdin=options.stdinStream;let stdinOpen=liveStdin!==void 0;const heldStdin=liveStdin===void 0?void 0:(async function*(){try{for await(const chunk of liveStdin)yield chunk}finally{stdinOpen=false;lastOutputAt=Date.now()}})();const containerOptions=(({signal:_signal,onStdout,onStderr,...rest})=>({...rest,processToken,...heldStdin?{stdinStream:heldStdin}:{},...executionController?{signal:executionController.signal}:{},...onStdout?{onStdout:chunk=>{lastOutputAt=Date.now();onStdout(chunk)}}:{},...onStderr?{onStderr:chunk=>{lastOutputAt=Date.now();onStderr(chunk)}}:{}}))(options);const childProcessBridge=this.container.isolated?void 0:Reflect.get(globalThis,childProcessExecutorSymbol);if(childProcessBridge)childProcessBridge.bypass+=1;const launchedAt=Date.now();const execution=this.runContainer(argv,containerOptions);await nextTask();const portsOwned=()=>owner.processPorts?.(processToken)??this.container.serverBridge.getServerPorts().filter(port2=>!portsBeforeLaunch.has(port2));let ownedPorts=portsOwned();if(options.held!==true)return await execution;const holdSignal=options.signal??new AbortController().signal;if(ownedPorts.length===0){let settled;void execution.then(result2=>{settled=result2});let lastTickAt=Date.now();let quietSince=lastTickAt;while(!holdSignal.aborted){ownedPorts=portsOwned();if(ownedPorts.length>0)break;const now=Date.now();if(now-lastTickAt>150)quietSince=now;lastTickAt=now;const idle=now-Math.max(lastOutputAt??launchedAt,quietSince)>=500;const working=!settled&&stdinOpen||pendingTimers()>0||[...this.heldChildren].some(hold2=>hold2.value)||bridgeChildren()>0||heldBuilds()>0;if(working)quietSince=now;if(settled&&!working&&(liveStdin===void 0||idle))break;if(!settled&&executionController&&!working&&idle){break}await delay(50)}if(ownedPorts.length===0)ownedPorts=portsOwned();if(ownedPorts.length===0){const idleStop2=!settled&&executionController!==void 0&&!holdSignal.aborted;if(!settled)executionController?.abort();const result2=settled??await execution;return holdSignal.aborted?{...result2,exitCode:143}:idleStop2&&result2.exitCode===143?{...result2,exitCode:0}:result2}}while(!holdSignal.aborted&&(owner.processPorts?portsOwned().length>0:ownedPorts.some(port2=>this.container.serverBridge.getServerPorts().includes(port2)))){await delay(50)}if(holdSignal.aborted&&!owner.processPorts){for(const port2 of ownedPorts){if(this.container.serverBridge.getServerPorts().includes(port2)){this.container.serverBridge.unregisterServer(port2)}}}const idleStop=executionController!==void 0&&!holdSignal.aborted;executionController?.abort();const result=await execution;return holdSignal.aborted?{...result,exitCode:143}:idleStop&&result.exitCode===143?{...result,exitCode:0}:result}finally{if(owner.processPorts?.(processToken).length===0)owner.stopProcess?.(processToken);options.signal?.removeEventListener("abort",stopOnKill);if(!this.container.isolated)this.nodeFetchDepth-=1;if(!this.container.isolated&&this.nodeFetchDepth===0){if(this.originalFetch)globalThis.fetch=this.originalFetch;this.originalFetch=void 0;if(this.hadOriginalChildProcessExecutor){Reflect.set(globalThis,childProcessExecutorSymbol,this.originalChildProcessExecutor)}else{Reflect.deleteProperty(globalThis,childProcessExecutorSymbol)}this.hadOriginalChildProcessExecutor=false;this.originalChildProcessExecutor=void 0}}}loopbackFetch=async(input,init)=>{const request=new Request(input,init);const url2=new URL(request.url);const port2=url2.port?Number(url2.port):url2.protocol==="http:"?80:443;const local2=(url2.protocol==="http:"||url2.protocol==="https:")&&(url2.hostname==="127.0.0.1"||url2.hostname==="localhost"||url2.hostname.endsWith(".localhost")||url2.hostname==="[::1]");if(!local2){if(url2.protocol!=="https:")throw new Error("Browser Node external requests require HTTPS.");this.options.authorizeExternalRequest?.(url2);if(!this.originalFetch)throw new Error("Browser fetch is unavailable.");return this.originalFetch(input,init)}if(!this.container.serverBridge.getServerPorts().includes(port2)){const here=globalThis.location;if(here?.host&&url2.host===here.host&&this.originalFetch)return this.originalFetch(input,init);throw new Error(`Virtual loopback port ${port2} is not listening (${url2.href}; this page is ${here?.host??"unknown"}).`)}const headers={};request.headers.forEach((value,name)=>{headers[name]=value});headers.host=url2.host;const body=request.method==="GET"||request.method==="HEAD"?void 0:await request.arrayBuffer();const response=await this.container.serverBridge.handleRequest(port2,request.method,`${url2.pathname}${url2.search}`,headers,body);const responseHeaders=new Headers;for(const[name,value]of Object.entries(response.headers)){for(const item of Array.isArray(value)?value:[value])responseHeaders.append(name,item)}const bodyForbidden=request.method==="HEAD"||[204,205,304].includes(response.statusCode);const responseBody=!bodyForbidden&&response.body?Uint8Array.from(response.body):null;return new Response(responseBody,{status:response.statusCode,statusText:response.statusMessage??"",headers:responseHeaders})}};function nextTask(){return delay(0)}function delay(milliseconds){const nativeSetTimeout=globalThis.__browserRuntimeNativeSetTimeout??globalThis.setTimeout;return new Promise(resolve2=>nativeSetTimeout.call(globalThis,resolve2,milliseconds))}function normalizeAbsolutePath(value){const parts=[];for(const part of`/${value}`.split("/")){if(!part||part===".")continue;if(part==="..")parts.pop();else parts.push(part)}return`/${parts.join("/")}`}function ensureFsAppend(container2){const shim=container2.runtime?.fsShim;if(!shim||typeof shim.writeFileSync!=="function"||typeof shim.appendFileSync==="function")return;const encoder11=new TextEncoder;const bytes2=value=>typeof value==="string"?encoder11.encode(value):value;const appendSync=(path3,data2,options)=>{let existing=new Uint8Array(0);try{existing=bytes2(shim.readFileSync(path3))}catch{}const next2=bytes2(data2);const joined=new Uint8Array(existing.length+next2.length);joined.set(existing);joined.set(next2,existing.length);shim.writeFileSync(path3,joined,options)};shim.appendFileSync=appendSync;shim.appendFile=(path3,data2,optionsOrCallback,callback)=>{const done=typeof optionsOrCallback==="function"?optionsOrCallback:callback;try{appendSync(path3,data2,typeof optionsOrCallback==="function"?void 0:optionsOrCallback);done?.(null)}catch(error){done?.(error)}};if(shim.promises&&typeof shim.promises==="object"){shim.promises.appendFile=async(path3,data2,options)=>appendSync(path3,data2,options)}}function nodePreloads(argv,env){const preloads=[];const take=(words,strip)=>{const kept=[];for(let index2=0;index2<words.length;index2+=1){const word=words[index2];if(word==="--require"||word==="-r"||word==="--import"){const name=words[index2+1];if(name!==void 0){preloads.push(name);index2+=1}continue}const inline=/^--(?:require|import)=(.+)$/u.exec(word);if(inline){preloads.push(inline[1]);continue}if(strip&&!word.startsWith("-")){kept.push(...words.slice(index2));break}kept.push(word)}return kept};const nodeOptions=env.NODE_OPTIONS?.match(/(?:[^\s"]+|"[^"]*")+/gu)?.map(word=>word.replace(/^"|"$/gu,""))??[];take(nodeOptions,false);const[program,...rest]=argv;return{argv:[program,...take(rest,true)],preloads}}function preloadLines(preloads){return preloads.map(name=>`require(${JSON.stringify(name)});`).join("\n")+(preloads.length>0?"\n":"")}function networkProgram(command){const unquote=word=>word.replace(/^(['"])([\s\S]*)\1$/u,"$2");const words=command.trim().split(/\s+/u).map(unquote);let index2=words[0]==="env"?1:0;while(index2<words.length&&/^[A-Za-z_][A-Za-z0-9_]*=/u.test(words[index2]))index2+=1;const executable=words[index2]?.split("/").at(-1)??"node";return/^[A-Za-z0-9._+-]{1,64}$/u.test(executable)?executable:"node"}function programFromCommand(command,executablePath){return networkProgram(executablePath??command)}function programOfPid(pid,runs2,pidOf){for(const[id2,run]of runs2){if(pidOf(String(id2))?.pid===pid)return run.program}return void 0}function inheritedProgram(ppid,runs2,pidOf,processByPid2){const seen=new Set;let current3=ppid;while(current3>0&&!seen.has(current3)){seen.add(current3);const named=programOfPid(current3,runs2,pidOf);if(named)return named;current3=processByPid2(current3)?.ppid??0}return void 0}function owningRun(token,runs2,pidOf,processByPid2){const ids=pidOf(token);if(!ids)return void 0;const runOfPid=pid=>{for(const id2 of runs2.keys())if(pidOf(String(id2))?.pid===pid)return id2;return void 0};const own=runOfPid(ids.pid);if(own!==void 0)return own;const seen=new Set;let current3=ids.ppid;while(current3>0&&!seen.has(current3)){seen.add(current3);const named=runOfPid(current3);if(named!==void 0)return named;current3=processByPid2(current3)?.ppid??0}return void 0}function networkProgramNow(runs2,token,pidOf,processByPid2){const activePrograms=[...new Set([...runs2.values()].map(run=>run.program))];const ids=pidOf(token);if(ids){const own=programOfPid(ids.pid,runs2,pidOf);const program=own??inheritedProgram(ids.ppid,runs2,pidOf,processByPid2);if(program){return{program,attributed:true,activePrograms,...own===void 0?{pid:ids.pid}:{}}}}if(token!==null){const owned=runs2.get(Number(token));if(owned)return{program:owned.program,attributed:true,activePrograms}}let latest;for(const run of runs2.values())if(!latest||run.startedAt>latest.startedAt)latest=run;return{program:latest?.program??"node",attributed:false,activePrograms}}function tabnodeContainerView(container2,vfs2,overrides={}){return new Proxy(container2,{get(target,key){if(key==="vfs")return vfs2;if(key in overrides)return overrides[key];const value=Reflect.get(target,key);return typeof value==="function"?value.bind(target):value}})}var scope3=self;console.log("[boot-trace]",JSON.stringify({event:"worker-module-ready",at:Date.now()}));scope3.addEventListener("error",event=>{const error=event.error;console.error(`[node worker] uncaught: ${event.message} at ${event.filename||"<generated>"}:${event.lineno}:${event.colno}
|
|
6102
|
-
${error?.stack??"(no stack)"}`)});scope3.addEventListener("unhandledrejection",event=>{const reason=event.reason;console.error(`[node worker] unhandled rejection: ${reason?.stack??String(reason)}`)});var executorSymbol=Symbol.for("@volter/browser-runtime/child-process-executor");var port;var container;var packStore;var packStoreProjectId;async function openStoreReads(grant){const clock=new Int32Array(grant.clock);const before=Atomics.load(clock,STORE_CLOCK_EPOCH);let openedAt=before;const began=Date.now();const opening=openPackReader({navigator:scope3.navigator},grant.projectId,grant.seed,grant.imageLine).then(reader=>{if(reader?.seeded()&&grant.seed)openedAt=grant.seed.epoch;processReader=reader;return reader}).catch(cause=>{console.warn(`This process reads the project's files through their owner: its own reader did not open (${cause instanceof Error?cause.message:String(cause)}).`);return void 0});await Promise.race([opening,new Promise(resolve2=>setTimeout(resolve2,STORE_OPEN_BUDGET_MS))]);console.log(`[boot-trace] ${JSON.stringify({event:"store-open",at:Date.now(),ms:Date.now()-began,opened:processReader!==void 0})}`);return{opening,clock:grant.clock,get openedAt(){return openedAt}}}var STORE_OPEN_BUDGET_MS=1500;function storeReadsFor(filesystem){const active2=container;if(!packStore||!packStoreProjectId||!active2||filesystem!==active2.vfs||!(filesystem instanceof PackedVirtualFS))return{};const store=packStore,projectId=packStoreProjectId;return{storeReads:()=>{if(packStore!==store)return void 0;const clock=store.clock();const seed=store.readerSeed({overlays:true});const imageLine=seed?.packagesImage?store.imageLine():void 0;return{projectId,clock,...seed?{seed}:{},...imageLine?{imageLine}:{}}}}}var storeWriteFailure;function reportStoreWriteFailure(){const failure=storeWriteFailure;if(!failure)return;storeWriteFailure=void 0;throw failure}var packages;var packagesFilesystem;var processReader;var imageBlocked=()=>realmBlockedReads.size===0?void 0:Object.fromEntries([...realmBlockedReads].map(([reader,{ranges,ms:ms2}])=>[reader,{ranges,ms:Math.round(ms2)}]));var releasePackagesOpen;var initializationStarted=false;var workerDisposing=false;var portStreams=new Map;var childInputSupported=false;var releaseProject;var bundler;var threads;var workerOptions={};function configureNodeExecutionWorker(options){workerOptions=options}var toolchain;var invocationPolicy;var invocationFiles;var executionConfiguration;var confinedRuns=new Map;var nodeProcesses=new NodeProcessSupervisor;var rootRuntimeFiles;var programs=new Map;var commandResolver;function routeCommand2(command,cwd){if(!toolchain)return void 0;let argv;try{argv=parseCommandWords(command)}catch{return void 0}const env={};while(argv.length){const assignment=/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/su.exec(argv[0]);if(!assignment)break;env[assignment[1]]=assignment[2];argv.shift()}if(argv[0]==="/usr/bin/env"&&argv.length>1)argv.shift();let name=argv[0];if(name===void 0)return void 0;if(name.startsWith("/")&&!programs.has(name)){const basename2=name.slice(name.lastIndexOf("/")+1);if(programs.has(basename2)){name=basename2;argv[0]=basename2}}const runner2=programs.get(name)??commandResolver?.(name,cwd);return runner2?{argv,runner:runner2,env}:void 0}async function runCommand2(command,options){const links=splitShellChain(command);if(links.length===1)return runOneCommand(command,options);let stdout="";let stderr="";let exitCode=0;for(const link2 of links){if(!chainContinues(link2.operator,exitCode))continue;const result=await runOneCommand(link2.command,options);stdout+=result.stdout;stderr+=result.stderr;exitCode=result.exitCode}return{stdout,stderr,exitCode}}function runOneCommand(command,options){assertWorkerActive();options.signal?.throwIfAborted();const shellLine=shellCommandLine(command);if(shellLine!==void 0){const{executablePath:_shell,...lineOptions}=options;return runCommand2(shellLine,lineOptions)}const routed=routeCommand2(command,options.cwd??"/");if(routed)return routed.runner(routed.argv,{...options,env:{...options.env,...routed.env}});return engineRun(requiredContainer(),command,options)}function engineRun(active2,command,options){const bridge=Reflect.get(globalThis,executorSymbol);if(bridge)bridge.bypass+=1;return active2.run(command,options)}function toolchainContainer(active2){return tabnodeContainerView(active2,active2.vfs,{isolated:true,run:(command,options)=>engineRun(active2,command,options)})}var sharedModuleCache;var moduleCacheAnswers=new Map;var nextModuleCacheRequest=1;function askOwnerModuleCache(message){const id2=nextModuleCacheRequest++;return new Promise((resolve2,reject)=>{moduleCacheAnswers.set(id2,{resolve:resolve2,reject});send({...message,id:id2})})}var ownerModuleCache={link:(key,target)=>askOwnerModuleCache({type:"module-cache-link",key,target}),keep:async(key,code3,target)=>{await askOwnerModuleCache({type:"module-cache-keep",key,code:code3,target})}};function moduleCacheOption(vfs2){const moduleCache=projectModuleCache(vfs2);return moduleCache?{moduleCache}:{}}function projectModuleCache(vfs2){if(invocationFiles&&!packages)return ownerModuleCache;if(!packages||!packagesFilesystem||!(vfs2 instanceof PackedVirtualFS))return void 0;sharedModuleCache??=moduleCacheOver(packages,packagesFilesystem,vfs2);return sharedModuleCache}function installToolchain(active2,options){const moduleCache=projectModuleCache(active2.vfs);toolchain=new TabnodeToolchain(toolchainContainer(active2),{baselineCommands:options.baselineCommands??[],...invocationFiles?{runtimeFiles:invocationFiles.runtimeFiles}:rootRuntimeFiles?{runtimeFiles:rootRuntimeFiles}:{},...options.preparedCompilers?{preparedCompilers:Object.fromEntries(Object.entries(options.preparedCompilers).map(([root2,binding2])=>[root2,{...binding2,url:new URL(binding2.url,scope3.location.href).href}]))}:{},...moduleCache?{moduleCache}:{},...options.browserImports?{browserImports:options.browserImports}:{},...options.defaultVitePort!==void 0?{defaultVitePort:options.defaultVitePort}:{},...options.registryScopes?{registryScopes:options.registryScopes}:{},preparedBinding:cwd=>{const selected=[...new Map([...Object.entries(options.preparedBindings??{}),...preparedBindings])].filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];return selected?Object.fromEntries(Object.entries(selected[1]).map(([source,target])=>[`${selected[0]==="/"?"":selected[0]}/${source}`,`${selected[0]==="/"?"":selected[0]}/${target}`])):{}},preparedEnvironment:cwd=>{const selected=[...new Map([...Object.entries(options.preparedEnvironments??{}),...preparedEnvironments])].filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];return selected?.[1]??{}},runShellCommand:runCommand2,runChildProcessCommand:runCommand2,authorizeExternalRequest:()=>void 0});toolchain.register({registerProgram:(name,runner2)=>{programs.set(name,runner2)},registerCommandResolver:resolver=>{commandResolver=resolver}});for(const manager of(options.baselineCommands??[]).filter(manager2=>["yarn","bun","corepack"].includes(manager2)))programs.set(manager,packageManagerAliasRunner(manager,runCommand2))}var suppressFilesystemEvents=false;var importingFilesystemRoot;var activeRuns=new Map;function beginRun(id2,command,extra){console.log(`[boot-trace] ${JSON.stringify({event:"run-start",at:Date.now(),id:id2,program:programFromCommand(command,extra.executablePath)})}`);const{executablePath,...rest}=extra;activeRuns.set(id2,{...rest,program:programFromCommand(command,executablePath),command,startedAt:Date.now()})}function enginePids(){if(!container)return void 0;const engine=container;if(typeof engine.runPid!=="function"||typeof engine.processByPid!=="function")return void 0;return{token:()=>engine.currentProcessToken(),runPid:engine.runPid,processByPid:engine.processByPid}}function attributionNow(){const engine=enginePids();return networkProgramNow(activeRuns,engine?.token()??container?.currentProcessToken()??null,token=>engine?.runPid(token),pid=>engine?.processByPid(pid))}var nextFetchId=1;var pendingFetches=new Map;var responseStreams=new Map;var fetchAbortCleanup=new Map;var fetchActivities=new Map;function pullFetch(id2){const owned=fetchActivities.get(id2);try{if(owned)owned.pulls.push(owned.activity.hold());send({type:"fetch-pull",id:id2})}catch(cause){owned?.cancel();throw cause}}var filesystemForwardingScheduled=false;var settleEngineInitialized;var initialized=new Promise((resolve2,reject)=>{settleEngineInitialized={resolve:resolve2,reject}});void initialized.catch(()=>void 0);publishEngineInitialized(initialized);scope3.addEventListener("message",event=>{if(receiveNodeThread(event))return;if(port||event.data.type!=="attach"||!(event.data.port instanceof MessagePort))return;console.log("[boot-trace]",JSON.stringify({event:"worker-attach-received",at:Date.now()}));port=event.data.port;port.addEventListener("message",message=>void receive(message.data));port.start();send({type:"attached"})});async function receive(message){if(message.type==="module-cache-answer"){const waiter=moduleCacheAnswers.get(message.id);moduleCacheAnswers.delete(message.id);if(message.error)waiter?.reject(new Error(message.error));else waiter?.resolve(message.linked);return}try{if(message.type==="dispose"){if(!workerDisposing)await disposeWorker();return}assertWorkerActive();if(message.type==="init-confined"){if(initializationStarted)throw new Error("Browser Node host initialization has already started.");initializationStarted=true;childInputSupported=message.childInputVersion===1;const processRegistry2=new NodeProcessRegistryClient(message.processRegistry);installProcessRegistry(processRegistry2,message.initialProcess);if(processRegistry2.streams)installNativeStreamTransport(processRegistry2.streams);if(message.nodeProcess){if(!message.initialProcess||message.initialProcess.token!=="1"||!processRegistry2.streams){throw new Error("Node process execution requires its admitted run and native stream channel.")}installNodeEntryBridge(message.initialProcess.token,message.nodeProcess)}if(message.filesystemPolicy===void 0&&!message.nodeProcess)throw new Error("An ordinary Node realm requires process admission.");invocationPolicy=message.filesystemPolicy===void 0?void 0:normalizeProcessFilesystemPolicy(message.filesystemPolicy);if(message.preparedFiles&&!message.nodeProcess)throw new Error("Prepared entries require Node process admission.");const files=nodeInvocationFilesystem(message.filesystem,invocationPolicy,message.nodeProcess?{files:message.preparedFiles??[],limits:message.nodeProcess}:void 0,message.storeReads?await openStoreReads(message.storeReads):void 0);invocationFiles=files;container=createContainer({...message.options,vfs:files.guest});installPortForwarding();if(message.bundler)installBundler(container.vfs,message.bundler);threads=installNodeThreadHost(container.vfs,message.bundler);installToolchain(container,message.toolchain??{});installNetworkBroker();installChildProcessBridge();restrictNodeWorkerAuthority();send({type:"initialized",id:message.id,filesystemPolicyVersion:1,processRegistryVersion:1,...processRegistry2.streams?{nativeStreamVersion:1}:{},...message.nodeProcess?{nodeProcessVersion:1}:{},...typeof container?.signalProcess==="function"?{signalVersion:1}:{},inputBytesVersion:1,store:{opened:false,index:[]}});return}if(message.type==="init"){if(initializationStarted)throw new Error("Browser Node host initialization has already started.");initializationStarted=true;nodeProcesses.prepareWorkers(scope3.location.href);childInputSupported=message.childInputVersion===1;executionConfiguration={options:message.options,...message.bundler?{bundler:message.bundler}:{},...message.toolchain?{toolchain:message.toolchain}:{}};{const handoff2=takeStoreHandoff();const held=handoff2?.held??await holdProjectStores({projectId:String(message.store.projectId),...message.store.limits?{limits:message.store.limits}:{},report:work=>send({type:"initializing",id:message.id,work}),disposing:()=>workerDisposing});releaseProject=held.releaseProject;releasePackagesOpen=held.releasePackagesOpen;packages=held.shared;installPackageStore(held.shared);const store=held.store;packStore=store;for(const plan of held.preparedPlans??[])preparedProjectPlans.set(plan.root,plan.key);packStoreProjectId=String(message.store.projectId);const opened=held.opened;const{startedAt,phases}=held;const phase=(name,since)=>{phases.push(`${name} ${Math.round(performance.now()-since)} ms`);return performance.now()};const at3=performance.now();container=createContainer({...message.options,vfs:new PackedVirtualFS(store)});for(const entry of handoff2?.overlay??[]){if(entry.type==="directory"){if(!container.vfs.existsSync(entry.path))container.vfs.mkdirSync(entry.path,{recursive:true})}else container.vfs.writeFileSync(entry.path,entry.bytes)}{const active3=container;mountContainerProc(active3.vfs,ownerProcessTable,()=>active3.serverBridge.getServerPorts().map(port2=>{const pid=active3.portPid(port2);return{port:port2,...pid?{pid}:{}}}),()=>active3.streamHandles())}phase("engine",at3);console.log(`[worker] started in ${Math.round(performance.now()-startedAt)} ms: ${phases.join(", ")}`);if(message.toolchain?.typeStripperModuleUrl)await installTypeStripper(new URL(message.toolchain.typeStripperModuleUrl,scope3.location.href).href);webSocketRelay=createVirtualWebSocketRelay(relayed=>send({type:"ws",message:relayed}));if(message.bundler)installBundler(container.vfs,message.bundler);threads=installNodeThreadHost(container.vfs,message.bundler,{projectId:String(message.store.projectId),flush:()=>store.flush()});installFilesystemForwarding(container.vfs);installRootNodeEntryBridge();if(message.toolchain)installToolchain(container,message.toolchain);installNetworkBroker();installChildProcessBridge();const index2=[];let sharedIndex;if(!handoff2){if(message.sharedPageIndexVersion===1){store.clock();const seed=store.readerSeed({current:true});if(seed)sharedIndex={buffer:seed.index,roots:PROJECT_ROOTS,bytes:seed.liveBytes+seed.linkedBytes}}if(!sharedIndex)for(const[path3,entry]of store.entries)index2.push([path3,entry.type,entry.length,entry.mode,entry.mtimeMs])}send({type:"initialized",id:message.id,filesystemPolicyVersion:1,inputBytesVersion:1,store:{opened,index:index2,...sharedIndex?{sharedIndex}:{},treeImport:true,limitsVersion:1,entryReadVersion:1}});settleEngineInitialized?.resolve();return}}if(message.type==="fetch-response-start"){const pending=pendingFetches.get(message.id);if(!pending)return;pendingFetches.delete(message.id);try{const id2=message.id;const body=pending.method==="HEAD"||[204,205,304].includes(message.status)?null:new ReadableStream({start(controller){responseStreams.set(id2,controller)},pull(){pullFetch(id2)},cancel(){responseStreams.delete(id2);fetchAbortCleanup.get(id2)?.();fetchAbortCleanup.delete(id2);try{send({type:"fetch-abort",id:id2})}catch{}}},{highWaterMark:0});fetchActivities.get(id2)?.headersDone();pending.resolve({body,status:message.status,statusText:message.statusText,headers:message.headers});if(body===null)pullFetch(id2)}catch(cause){fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);try{send({type:"fetch-abort",id:message.id})}catch{}pending.reject(cause instanceof Error?cause:new Error(String(cause)))}return}if(message.type==="fetch-response-chunk"){fetchActivities.get(message.id)?.pulls.shift()?.();responseStreams.get(message.id)?.enqueue(new Uint8Array(message.body));return}if(message.type==="fetch-response-end"){const stream=responseStreams.get(message.id);responseStreams.delete(message.id);fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);stream?.close();return}if(message.type==="fetch-response"||message.type==="fetch-error"){const pending=pendingFetches.get(message.id);if(message.type==="fetch-error"){if(pending){pendingFetches.delete(message.id);pending.reject(new Error(message.error))}const stream=responseStreams.get(message.id);responseStreams.delete(message.id);fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);stream?.error(new Error(message.error))}else if(!pending)return;else{pendingFetches.delete(message.id);fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);try{pending.resolve({body:pending.method==="HEAD"||[204,205,304].includes(message.status)?null:new ReadableStream({start(controller){controller.enqueue(new Uint8Array(message.body));controller.close()}}),status:message.status,statusText:message.statusText,headers:message.headers})}catch(cause){pending.reject(cause instanceof Error?cause:new Error(String(cause)))}}return}if(message.type==="apply-layers"){try{const result=await applyImageLayers(message.url,message.digest,(parts,total)=>send({type:"applying-layers",id:message.id,parts,total}),message.prepared);send({type:"layers-applied",id:message.id,...result})}catch(cause){send({type:"layers-applied",id:message.id,parts:0,units:0,bytes:0,skipped:false,error:cause instanceof Error?cause.message:String(cause)})}return}if(message.type==="link-program"){try{send({type:"linked-program",id:message.id,...await linkImageProgram(message.source,message.target)})}catch(cause){send({type:"linked-program",id:message.id,linked:false,files:0,error:cause instanceof Error?cause.message:String(cause)})}return}if(message.type==="link-packages"){try{if(!linkPlan)throw new Error("The origin's package store is not open.");const result=await linkPlan(message.root,message.plan,(linked,total,waiting)=>send({type:"linking-packages",id:message.id,linked,total,...waiting?{waiting}:{}}));send({type:"linked-packages",id:message.id,...result})}catch(cause){const described=cause instanceof Error?cause.message?`${cause.name==="Error"?"":`${cause.name}: `}${cause.message}`:cause.name:String(cause);send({type:"linked-packages",id:message.id,linked:0,fetched:0,fromStore:0,error:described})}return}if(message.type==="pack-store-abort"){packStoreOperations.get(message.id)?.abort();return}if(message.type==="pack-store"){const controller=new AbortController;packStoreOperations.set(message.id,controller);try{await answerPackStore(message,controller.signal,{packages,project:packStore,linkShared:(source,target)=>{const vfs2=requiredContainer().vfs;if(!(vfs2 instanceof PackedVirtualFS))throw new Error("The live pack needs the worker's packed filesystem.");vfs2.linkShared(source,target)},send})}finally{packStoreOperations.delete(message.id)}return}if(message.type==="image-file"){const pending=pendingImageFiles.get(message.id);pendingImageFiles.delete(message.id);if(!pending)return;if(message.error!==void 0||message.bytes===void 0)pending.reject(new Error(`The image's file could not be read: ${message.error??"the page answered without it"}`));else pending.resolve({bytes:new Uint8Array(message.bytes),inflated:message.inflated===true});return}if(message.type==="image-pack"){const pending=pendingImagePacks.get(message.id);pendingImagePacks.delete(message.id);if(!pending)return;if(message.error!==void 0||message.text===void 0)pending.reject(new Error(message.error??"the page answered without the pack"));else pending.resolve(message.text);return}if(message.type==="image-packs-expected"){imagePacksKnown??=new Promise(resolve2=>{settleImagePacksKnown=resolve2});return}if(message.type==="image-packs-abandoned"){settleImagePacksKnown?.();imagePacksKnown=settleImagePacksKnown=void 0;return}if(message.type==="image-packs"){try{const packs=readImagePacks(message.keys);settleImagePacksKnown?.();imagePacksKnown=settleImagePacksKnown=void 0;if(message.bodies?.length)await linkPreparedBodies(message.bodies);send({type:"image-packs-read",id:message.id,packs})}catch(cause){send({type:"image-packs-read",id:message.id,packs:0,error:cause instanceof Error?cause.message:String(cause)})}finally{settleImagePacksKnown?.();imagePacksKnown=settleImagePacksKnown=void 0}return}if(message.type==="ws"){webSocketRelay?.receive(message.message);return}if(message.type==="watched-paths"){const vfs2=container?.vfs;const paths=typeof vfs2?.watchedPaths==="function"?vfs2.watchedPaths():vfs2?.watchers?[...vfs2.watchers.entries()].filter(([,entries])=>[...entries].some(entry=>!entry.closed)).map(([path3,entries])=>({path:path3,recursive:[...entries].some(entry=>!entry.closed&&entry.recursive===true)})):[];send({type:"watched-paths",id:message.id,paths});return}if(message.type==="store-stats"){const account=installAccounting();send({type:"store-stats",id:message.id,stats:packStore?{...packStore.stats(),...account?{install:account}:{}}:null});return}if(message.type==="image-startup-set"){send({type:"image-startup-set",id:message.id,ranges:packages?.imageStartupSet()??[]});return}if(message.type==="image-prefetch"){const startedAt=performance.now();const prefetch=packages?.prefetchImage(message.ranges,message.streams)??{queued:0,done:Promise.resolve()};send({type:"image-prefetch",id:message.id,queued:prefetch.queued});if(prefetch.queued>0)void prefetch.done.then(()=>send({type:"image-prefetched",id:message.id,ms:Math.round(performance.now()-startedAt)}));return}if(message.type==="profile-probe"){send({type:"profile-pong",id:message.id});return}if(message.type==="host-ports"){hostPorts=new Set(message.ports.filter(candidate=>Number.isInteger(candidate)&&candidate>0&&candidate<65536));for(const listener of hostPortListeners)listener(hostPorts);return}if(message.type==="listen-net"||message.type==="unlisten-net"||message.type==="net-data"||message.type==="net-end"){handleNetMessage(message);return}if(message.type==="child-input-consumed"){const pending=pendingChildInput.get(message.id);pendingChildInput.delete(message.id);pending?.resolve();return}if(message.type==="child-fd-consumed"){const key=childFdKey(message.id,message.fd);const pending=pendingChildFdInput.get(key);pendingChildFdInput.delete(key);pending?.resolve();return}if(message.type==="child-fd-output"||message.type==="child-fd-close"){const pending=pendingChildren.get(message.id);const descriptor=validChildFd(message.fd)?pending?.descriptors?.[message.fd]:void 0;if(!pending||!descriptor)return;if(message.type==="child-fd-close"){descriptor.end();return}if(!(message.bytes instanceof ArrayBuffer)||message.bytes.byteLength>childChunkBytes){pendingChildren.delete(message.id);try{send({type:"child-abort",id:message.id})}catch{}pending.reject(new Error("Child process descriptor chunks must be at most 64 KiB."));return}descriptor.write(new Uint8Array(message.bytes));return}if(message.type==="child-output"||message.type==="child-result"||message.type==="child-error"){const pending=pendingChildren.get(message.id);if(!pending)return;if(message.type==="child-output"){if(message.stream==="stdout")pending.onStdout?.(message.chunk);else pending.onStderr?.(message.chunk);return}console.log(`[boot-trace] ${JSON.stringify({event:message.type,at:Date.now(),id:message.id,owner:pending.owner})}`);pendingChildren.delete(message.id);if(message.type==="child-error")pending.reject(new Error(message.error));else pending.resolve({stdout:message.stdout,stderr:message.stderr,exitCode:message.exitCode,...message.signal?{signal:message.signal}:{}});return}const active2=requiredContainer();if(message.type==="fs-watch-event"){invocationFiles?.notifyWatch(message.event,message.path);return}if(message.type==="fs-event"){invocationFiles?.notify(message.event,message.path);return}if(message.type==="run"&&message.filesystemPolicy&&!invocationPolicy){if(!executionConfiguration)throw new Error("Confined Node execution has no worker configuration.");const configuration=executionConfiguration;const policy=normalizeProcessFilesystemPolicy(message.filesystemPolicy);const controller=new AbortController;confinedRuns.set(message.id,controller);beginRun(message.id,message.command,{controller,...message.cwd?{cwd:message.cwd}:{},...message.executablePath?{executablePath:message.executablePath}:{}});const liveStdin=message.liveStdin?openLiveStdin(message.id):void 0;const terminal=message.terminal?openTerminal(message.id,message.terminal):void 0;void nodeProcesses.run(message.command,{...message.cwd?{cwd:message.cwd}:{},...message.env?{env:message.env}:{},...message.stdin!==void 0?{stdin:message.stdin}:{},...liveStdin?{stdinStream:liveStdin}:{},...terminal?{terminal}:{},signal:controller.signal,onStdout:chunk=>send({type:"output",id:message.id,stream:"stdout",chunk}),onStderr:chunk=>send({type:"output",id:message.id,stream:"stderr",chunk})},{filesystem:active2.vfs,...storeReadsFor(active2.vfs),policy,workerUrl:scope3.location.href,configuration,serverBridge:active2.serverBridge,net:pageNetHost,hostPorts:hostPortsHost,...moduleCacheOption(active2.vfs),runChild:(command,options,argv)=>requestChild(command,options,message.id,argv),http:request=>brokerHttpOnce(request,{program:programFromCommand(message.command,message.executablePath),attributed:true,activePrograms:[programFromCommand(message.command,message.executablePath)]})}).then(async result=>{await packStore?.flush();flushFilesystemForwarding();sendResult(message.id,result)}).catch(cause=>{flushFilesystemForwarding();sendError(message.id,cause)}).finally(()=>{confinedRuns.delete(message.id);activeRuns.delete(message.id);liveStdins.get(message.id)?.close(true);liveStdins.delete(message.id);terminals.delete(message.id)});return}if(message.type==="run"){const chain=splitShellChain(message.command).length>1;const routed=chain?void 0:routeCommand2(message.command,message.cwd??"/");const controller=new AbortController;beginRun(message.id,message.command,{...controller?{controller}:{},...message.cwd?{cwd:message.cwd}:{},...message.executablePath?{executablePath:message.executablePath}:{}});launchPorts.set(message.id,new Set(vfsServerBridge().getServerPorts()));if(message.interactive)heldRuns.add(message.id);const liveStdin=message.liveStdin?openLiveStdin(message.id):void 0;const terminal=message.terminal?openTerminal(message.id,message.terminal):void 0;const runOptions={...message.cwd?{cwd:message.cwd}:{},...message.env?{env:message.env}:{},...controller?{signal:controller.signal}:{},held:message.interactive,...{processToken:String(message.id)},...message.stdin!==void 0?{stdin:message.stdin}:{},...liveStdin?{stdinStream:liveStdin}:{},...terminal?{terminal}:{},onStdout:chunk=>send({type:"output",id:message.id,stream:"stdout",chunk}),onStderr:chunk=>send({type:"output",id:message.id,stream:"stderr",chunk})};const running=chain?runCommand2(message.command,runOptions):routed?routed.runner(routed.argv,{...runOptions,env:{...runOptions.env,...routed.env}}):engineRun(active2,message.command,runOptions);void running.then(async result=>{console.log(`[boot-trace] ${JSON.stringify({event:"body-return",at:Date.now(),id:message.id,exitCode:result.exitCode,ports:runPorts(message.id),imageBlocked:imageBlocked()})}`);await workSettled(message.id,message.interactive);flushFilesystemForwarding();const aborted=activeRuns.get(message.id)?.controller?.signal.aborted===true;sendResult(message.id,aborted&&result.exitCode===0?{...result,exitCode:143}:result)},cause=>{flushFilesystemForwarding();sendError(message.id,cause)}).finally(()=>{liveStdins.get(message.id)?.close(true);liveStdins.delete(message.id);terminals.delete(message.id);activeRuns.delete(message.id);launchPorts.delete(message.id);heldRuns.delete(message.id)})}else if(message.type==="stdin"){if(message.id!==void 0){const input=liveStdins.get(message.id);if(message.bytes&&input){const id2=message.id;void input.write(new Uint8Array(message.bytes)).then(()=>send({type:"stdin-consumed",id:id2})).catch(cause=>{activeRuns.get(id2)?.controller?.abort(cause);if(!workerDisposing)sendError(id2,cause)})}else if(input)input.push(message.data);else if(message.data!==void 0)active2.sendInput(message.data,String(message.id))}else active2.sendInput(message.data)}else if(message.type==="stdin-end"){liveStdins.get(message.id)?.close();liveStdins.delete(message.id)}else if(message.type==="resize"){terminals.get(message.id)?.resize(message.columns,message.rows)}else if(message.type==="signal"){active2.signalProcess?.(String(message.id),message.signal)}else if(message.type==="abort"){if(heldRuns.has(message.id))closeRunServers(message.id);confinedRuns.get(message.id)?.abort();for(const[childId,child]of pendingChildren){if(child.owner===message.id)send({type:"child-abort",id:childId})}active2.stopProcess?.(String(message.id));liveStdins.get(message.id)?.close(true);liveStdins.delete(message.id);terminals.delete(message.id);activeRuns.get(message.id)?.controller?.abort()}else if(message.type==="fs-apply"){suppressFilesystemEvents=true;try{for(const operation of message.operations){try{applyStoreOperation(active2.vfs,operation)}catch(cause){storeWriteFailure??=cause instanceof Error?cause:new Error(String(cause));const paths=operation.op==="rename"?[operation.from,operation.to]:[operation.path];for(const path3 of paths)queueIndexForwarding(storeEntryOf(active2.vfs,path3));console.error(`The workspace refused ${operation.op} ${paths.join(" -> ")}: ${cause instanceof Error?cause.message:String(cause)}`)}}}finally{suppressFilesystemEvents=false}}else if(message.type==="fs-import"){reportStoreWriteFailure();if(!(active2.vfs instanceof PackedVirtualFS)||!packStore){send({type:"fs-imported",id:message.id,applied:false,changes:[]});return}flushFilesystemForwarding();const root2=normalizeStorePath2(message.tree.root);importingFilesystemRoot=root2;suppressFilesystemEvents=true;let applied;try{applied=active2.vfs.importTree(message.tree)}finally{suppressFilesystemEvents=false;importingFilesystemRoot=void 0}const changes=[];if(applied){changes.push([root2,null]);for(const[path3,entry]of packStore.descendants(root2)){changes.push([path3,entry.type,entry.type==="file"?entry.length:0,entry.mode,entry.mtimeMs])}}send({type:"fs-imported",id:message.id,applied,changes})}else if(message.type==="fs-read"){try{const bytes2=Uint8Array.from(active2.vfs.readFileSync(message.path));const body=bytes2.buffer.slice(bytes2.byteOffset,bytes2.byteOffset+bytes2.byteLength);send({type:"fs-read-result",id:message.id,bytes:body},[body])}catch(cause){sendError(message.id,cause)}}else if(message.type==="fs-entry"){reportStoreWriteFailure();const path3=normalizeStorePath2(message.path);flushFilesystemForwarding();if(!active2.vfs.existsSync(path3)){send({type:"fs-entry-result",id:message.id})}else{const stat2=active2.vfs.statSync(path3);const metadata={path:path3,mode:stat2.mode&4095,mtimeMs:stat2.mtimeMs};if(stat2.isDirectory()){send({type:"fs-entry-result",id:message.id,entry:{...metadata,type:"directory"}})}else{const bytes2=Uint8Array.from(active2.vfs.readFileSync(path3));send({type:"fs-entry-result",id:message.id,entry:{...metadata,type:"file",bytes:bytes2}},[bytes2.buffer])}}}else if(message.type==="fs-flush"){reportStoreWriteFailure();packStore?.flush();send({type:"fs-flushed",id:message.id})}else if(message.type==="port-stream-request"){const stream={abort:new AbortController,pause:()=>void 0,resume:()=>void 0};portStreams.set(message.id,stream);try{const answered=await active2.serverBridge.handleStreamingRequest(message.port,message.method,message.url,message.headers,message.body,{start:(statusCode,statusMessage,headers)=>send({type:"port-stream-head",id:message.id,statusCode,statusMessage,headers}),chunk:chunk=>{const body=Uint8Array.from(chunk).buffer;send({type:"port-stream-chunk",id:message.id,body},[body])},end:()=>send({type:"port-stream-end",id:message.id})},{signal:stream.abort.signal,control:(pause,resume)=>{stream.pause=pause;stream.resume=resume}});if(!answered){send({type:"port-stream-head",id:message.id,statusCode:503,statusMessage:"Service Unavailable",headers:{}});send({type:"port-stream-end",id:message.id})}}finally{portStreams.delete(message.id)}}else if(message.type==="port-stream-control"){const stream=portStreams.get(message.id);if(message.action==="pause")stream?.pause();else if(message.action==="resume")stream?.resume();else stream?.abort.abort()}else if(message.type==="request"){const response=await active2.serverBridge.handleRequest(message.port,message.method,message.url,message.headers,message.body);const bytes2=response.body?Uint8Array.from(response.body):new Uint8Array;const body=bytes2.buffer.slice(bytes2.byteOffset,bytes2.byteOffset+bytes2.byteLength);send({type:"response",id:message.id,statusCode:response.statusCode,statusMessage:response.statusMessage??"",headers:response.headers,body},[body])}}catch(cause){if(message.type==="init")settleEngineInitialized?.reject(cause);if("id"in message&&typeof message.id==="number")sendError(message.id,cause)}}function assertWorkerActive(){if(workerDisposing)throw new Error("Browser Node host is disposed.")}async function disposeWorker(){workerDisposing=true;const reapedProcesses=nodeProcesses.dispose();const failures=[];const release2=operation=>{try{operation()}catch(cause){failures.push(cause)}};for(const controller of confinedRuns.values())release2(()=>controller.abort());confinedRuns.clear();for(const socket of netSockets.values())release2(()=>socket.destroy());netSockets.clear();for(const unlisten of netListeners.values())release2(unlisten);netListeners.clear();netListenerChanges.clear();for(const controller of packStoreOperations.values())controller.abort();packStoreOperations.clear();for(const run of activeRuns.values())release2(()=>run.controller?.abort());for(const input of liveStdins.values())release2(()=>input.close(true));liveStdins.clear();terminals.clear();for(const pending of pendingChildren.values())pending.reject(new Error("Browser Node host was disposed."));pendingChildren.clear();for(const pending of pendingFetches.values())pending.reject(new Error("Browser Node host was disposed."));pendingFetches.clear();for(const stream of responseStreams.values())stream.error(new Error("Browser Node host was disposed."));responseStreams.clear();for(const cleanup of fetchAbortCleanup.values())cleanup();fetchAbortCleanup.clear();await reapedProcesses;release2(()=>threads?.dispose());threads=void 0;try{await toolchain?.dispose()}catch(cause){failures.push(cause)}toolchain=void 0;preparedEnvironments.clear();preparedBindings.clear();release2(()=>bundler?.dispose());bundler=void 0;release2(()=>packStore?.close());packStore=void 0;release2(()=>packages?.close());packages=void 0;release2(()=>releasePackagesOpen?.());releasePackagesOpen=void 0;release2(()=>releaseProject?.());releaseProject=void 0;activeRuns.clear();release2(()=>port?.close());if(failures.length)console.error("Browser Node worker cleanup failed.",new AggregateError(failures));scope3.close()}function installBundler(vfs2,options){bundler=new BrowserBundler(vfs2,options);const shim=esbuildShim;shim.setModuleURL(new URL(options.esbuildModuleUrl,scope3.location.href).href);shim.setWasmURL(new URL(options.esbuildWasmUrl,scope3.location.href).href);if(options.rollupModuleUrl)Reflect.set(globalThis,"__browserRuntimeRollupUrl",new URL(options.rollupModuleUrl,scope3.location.href).href);Reflect.set(globalThis,"__browserRuntimeRollupFs",rollupFsOver(requiredContainer().vfs));bundler.prebundle=vitePrebundleAssembler(vfs2,projectModuleCache(vfs2));shim.useHost(bundler)}function normalizeStorePath2(path3){const parts=[];for(const part of path3.split("/")){if(!part||part===".")continue;if(part==="..")parts.pop();else parts.push(part)}return`/${parts.join("/")}`}var installAccount={packages:0,linkedFromStore:0,downloadMs:0,downloadBytes:0,lockWaitMs:0,extractMs:0,extractHelpers:0,applyMs:0,linkMs:0,announceMs:0,sharedFlushes:0,sharedFlushMs:0,elapsedMs:0,lastAt:0};var packStoreOperations=new Map;function installAccounting(){if(installAccount.packages===0)return void 0;const{firstAt,lastAt,...account}=installAccount;return{...account,elapsedMs:firstAt===void 0?0:Math.round(lastAt-firstAt)}}function installPackageStore(shared){const sharedFilesystem=new PackedVirtualFS(shared,PACKAGES_ROOT);packagesFilesystem=sharedFilesystem;const making=new Map;const ensure=async(key,tarballUrl,integrity,pack)=>{try{return await make(key,tarballUrl,integrity,pack)}finally{making.delete(key)}};const make=async(key,tarballUrl,integrity,pack)=>{const startedAt=performance.now();installAccount.firstAt??=startedAt;if(!pack){installTrap({door:"package extraction",subject:`${key} has no pack; the tab would download and extract ${tarballUrl}`,detail:{key,tarball:tarballUrl,...integrity?{integrity}:{}}})}const digest=pack.artifact.digest;const store=livePackStore(shared);let fetched=false;if(!await store.hasTree(digest)){making.set(key,"receiving");const bytes2=await imageFile(pack.url);const actual=`sha256:${[...new Uint8Array(await crypto.subtle.digest("SHA-256",bytes2))].map(byte=>byte.toString(16).padStart(2,"0")).join("")}`;if(actual!==digest||bytes2.byteLength!==pack.artifact.bytes){installTrap({door:"image pack",subject:`${key}'s pack at ${pack.url} is not the artifact the plan names (${bytes2.byteLength} bytes, ${actual}; the plan names ${pack.artifact.bytes} bytes, ${digest})`,detail:{key}})}installAccount.downloadBytes+=bytes2.byteLength;installAccount.downloadMs+=performance.now()-startedAt;making.set(key,"storing");const stagedAt=performance.now();await store.stageArtifact(digest,bytes2,pack.artifact);installAccount.extractMs+=performance.now()-stagedAt;fetched=true}return{home:browserPackExpandedPath(digest),fetched}};const link2=(vfs2,home,path3,fromStore)=>{if(fromStore)installAccount.linkedFromStore+=1;const linkStartedAt=performance.now();const announcedBefore=vfs2.linkTiming.announceMs;vfs2.linkShared(home,path3);installAccount.linkMs+=performance.now()-linkStartedAt;installAccount.announceMs+=vfs2.linkTiming.announceMs-announcedBefore;installAccount.packages+=1;installAccount.lastAt=performance.now()};const hook=async(name,pkg,pkgPath,vfs2)=>{if(!(vfs2 instanceof PackedVirtualFS))return false;const ensured=await ensure(`${name}@${pkg.version}`,pkg.tarballUrl);if(!ensured)return false;link2(vfs2,ensured.home,pkgPath,!ensured.fetched);return true};Reflect.set(globalThis,Symbol.for("@volter/browser-runtime/package-install"),hook);linkPlan=async(root2,plan,progress)=>{const vfs2=requiredContainer().vfs;if(!(vfs2 instanceof PackedVirtualFS))throw new Error("The image's dependency plan needs the worker's store.");preparedBindings.set(root2,{...plan.nativeBindings??{}});if(executionConfiguration?.toolchain)executionConfiguration.toolchain.preparedBindings=Object.fromEntries(new Map([...Object.entries(executionConfiguration.toolchain.preparedBindings??{}),...preparedBindings]));preparedEnvironments.set(root2,{...plan.environment??{}});const at3=path3=>`${root2==="/"?"":root2}/${path3}`;const phases={};let phaseAt=performance.now();const phase=name=>{const now=performance.now();phases[name]=Math.round(now-phaseAt);phaseAt=now};const total=plan.links.length;let linked=0;let fetched=0;let fromStore=0;let lastReported=performance.now();const checkedAt=performance.now();installAccount.firstAt??=checkedAt;const prelinked=plan.key!==void 0&&preparedProjectPlans.get(root2)===plan.key;if(prelinked)preparedProjectPlans.delete(root2);const held=prelinked?new Set:await livePackStore(shared).presentTrees(plan.packages.flatMap(entry=>entry.pack?[entry.pack.artifact.digest]:[]));installAccount.lockWaitMs+=performance.now()-checkedAt;const homes=new Map;const homeOf=index2=>{let pending=homes.get(index2);if(!pending){const entry=plan.packages[index2];const digest=entry.pack?.artifact.digest;if(digest!==void 0&&held.has(digest)){fromStore+=1;pending=Promise.resolve({home:browserPackExpandedPath(digest),fetched:false});homes.set(index2,pending);return pending}pending=ensure(`${entry.name}@${entry.version}`,entry.tarball,entry.integrity,entry.pack).then(ensured=>{if(!ensured)throw new Error(`${entry.name}@${entry.version}: this thread cannot fetch packages into the store.`);if(ensured.fetched)fetched+=1;else fromStore+=1;return ensured});homes.set(index2,pending)}return pending};const links=[...plan.links].sort((left,right)=>depth3(left.path)-depth3(right.path)||left.path.localeCompare(right.path));const platformFits=new Map;const fitsPlatform=(index2,home)=>{let fits=platformFits.get(index2);if(fits!==void 0)return fits;if(plan.packages[index2]?.placed){platformFits.set(index2,true);return true}const prepared=plan.packages[index2]?.linuxX64;if(prepared!==void 0){platformFits.set(index2,prepared);return prepared}fits=true;try{const store=packagesFilesystem&&packagesFilesystem.existsSync(`${home}/package.json`)?packagesFilesystem:vfs2;const manifest=JSON.parse(store.readFileSync(`${home}/package.json`,"utf8"));const allows=(field,value)=>{if(!Array.isArray(field)||field.length===0)return true;const names2=field.filter(item=>typeof item==="string");const denied=names2.filter(name=>name.startsWith("!")).map(name=>name.slice(1));const allowed=names2.filter(name=>!name.startsWith("!"));if(denied.includes(value))return false;return allowed.length===0||allowed.includes(value)};fits=allows(manifest.os,"linux")&&allows(manifest.cpu,"x64")}catch{}platformFits.set(index2,fits);return fits};const place=async entry=>{const{home,fetched:wasFetched}=await homeOf(entry.package);if(!fitsPlatform(entry.package,home)){const stale=at3(entry.path);try{if(vfs2.existsSync(stale))removeTree2(vfs2,stale)}catch{}}else{link2(vfs2,home,at3(entry.path),!wasFetched)}linked+=1;if(performance.now()-lastReported>500){lastReported=performance.now();progress(linked,total)}};const nested=path3=>{const at4=path3.lastIndexOf("node_modules/");const rest=(at4<0?path3:path3.slice(at4+"node_modules/".length)).split("/").filter(Boolean);const nameLength=rest[0]?.startsWith("@")?2:1;return rest.length>nameLength};const first=links.filter(entry=>!nested(entry.path));const later=links.filter(entry=>nested(entry.path));const concurrency=16;let next2=0;let stopped2=false;let linkedAtLastLook=-1;const watch2=setInterval(()=>{if(linked!==linkedAtLastLook){linkedAtLastLook=linked;return}progress(linked,total,[...making].map(([key,stage])=>`${key} ${stage}`))},STALL_REPORT_MS);try{const placed=await Promise.allSettled(Array.from({length:prelinked?0:Math.min(concurrency,first.length)},async()=>{while(!stopped2){const index2=next2++;if(index2>=first.length)return;try{await place(first[index2])}catch(cause){stopped2=true;throw cause}}}));const failures=placed.filter(result=>result.status==="rejected").map(result=>result.reason);if(failures.length===1)throw failures[0];if(failures.length>1)throw new AggregateError(failures,"Package placement failed.");if(prelinked){linked=total;fromStore=new Set(plan.links.filter(entry=>plan.packages[entry.package]?.placed||plan.packages[entry.package]?.linuxX64!==false).map(entry=>entry.package)).size}else for(const entry of later)await place(entry)}finally{clearInterval(watch2)}phase(prelinked?"prelinkedMs":"linksMs");for(const bin of plan.bins){const path3=at3(bin.path);const directory2=path3.slice(0,path3.lastIndexOf("/"));if(!vfs2.existsSync(directory2))vfs2.mkdirSync(directory2,{recursive:true});vfs2.writeFileSync(path3,`node "${at3(bin.target)}" "$@"
|
|
6103
|
-
`)}for(const entry of plan.entries??[]){const path3=at3(entry.path);const directory2=path3.slice(0,path3.lastIndexOf("/"));if(!vfs2.existsSync(directory2))vfs2.mkdirSync(directory2,{recursive:true});vfs2.writeFileSync(path3,entry.content)}phase("binsMs");if(plan.aliases.length>0)configurePlanAliases(vfs2,root2,plan.aliases);const workspace=discoverPnpmWorkspace(vfs2,root2);if(workspace)configureWorkspaceLinks(vfs2,workspace);phase("aliasesMs");console.log(`[boot-trace] ${JSON.stringify({event:"link-plan",at:Date.now(),root:root2,links:total,bins:plan.bins.length,entries:plan.entries?.length??0,aliases:plan.aliases.length,...phases})}`);progress(linked,total);return{linked,fetched,fromStore}}}function removeTree2(vfs2,path3){const stats=vfs2.lstatSync(path3);if(stats.isDirectory()&&!stats.isSymbolicLink()){for(const name of vfs2.readdirSync(path3))removeTree2(vfs2,`${path3}/${name}`);vfs2.rmdirSync(path3)}else{vfs2.unlinkSync(path3)}}var STALL_REPORT_MS=15e3;var linkPlan;var preparedProjectPlans=new Map;var preparedBindings=new Map;var preparedEnvironments=new Map;async function linkImageProgram(source,target){if(!packages)throw new Error("The origin's package store is not open.");const shared=packages;const vfs2=requiredContainer().vfs;if(!(vfs2 instanceof PackedVirtualFS))throw new Error("A program is linked into the worker's packed filesystem.");if(!source.startsWith("/packages/.programs/"))throw new Error(`${source} is not a program's tree in the shared store.`);return scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"shared"},async()=>{await shared.refresh();if(!shared.entries.has(`${source}/${PROGRAM_ARCHIVE_RECEIPT}`))return{linked:false,files:0};vfs2.linkShared(source,target);return{linked:true,files:shared.descendants(source).length}})}var imagePacks=new Set;var imagePacksKnown;var settleImagePacksKnown;var fetchingPacks=new Map;var PREPARED_BODY_LINK_BATCH=512;function readImagePacks(keys){imagePacks.clear();for(const key of keys)if(typeof key==="string")imagePacks.add(key);return imagePacks.size}async function linkPreparedBodies(keys){const vfs2=container?.vfs;if(!packages||!packagesFilesystem||!(vfs2 instanceof PackedVirtualFS))return;const shared=packages;const sharedFilesystem=packagesFilesystem;if(!vfs2.existsSync(PREPARED_MODULES_DIR))vfs2.mkdirSync(PREPARED_MODULES_DIR,{recursive:true});const present=new Set(vfs2.readdirSync(PREPARED_MODULES_DIR).map(String));const missing=keys.filter(key=>!present.has(key));if(missing.length===0)return;const startedAt=performance.now();let linked=0;let fetched=0;const held=missing.filter(key=>shared.entries.has(`${PACKAGES_ROOT}/.prepared/${key}`));const absent=missing.filter(key=>!shared.entries.has(`${PACKAGES_ROOT}/.prepared/${key}`));for(let offset2=0;offset2<held.length;offset2+=PREPARED_BODY_LINK_BATCH){const batch=held.slice(offset2,offset2+PREPARED_BODY_LINK_BATCH);vfs2.linkSharedBatch(batch.map(key=>({source:`${PACKAGES_ROOT}/.prepared/${key}`,path:`${PREPARED_MODULES_DIR}/${key}`})));linked+=batch.length}let next2=0;await Promise.all(Array.from({length:Math.min(8,absent.length)},async()=>{while(next2<absent.length){const key=absent[next2++];const source=`${PACKAGES_ROOT}/.prepared/${key}`;try{if(!shared.entries.has(source)){const body=await imagePack(key);await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(!shared.entries.has(source))sharedFilesystem.writeFileSync(source,body);if(shared.logBytes>8*1024*1024)await shared.checkpoint()});fetched+=1}vfs2.linkShared(source,`${PREPARED_MODULES_DIR}/${key}`);linked+=1}catch(cause){console.warn(`[modules] the image's prepared body ${key} could not be linked (${cause instanceof Error?cause.message:String(cause)}); the engine prepares that module itself.`)}}}));console.log(`[modules] ${linked} of ${missing.length} prepared bodies linked from the origin's store in ${Math.round(performance.now()-startedAt)} ms (${fetched} fetched from the image)`)}async function applyImageLayers(url2,digest,progress,compact){if(!packages)throw new Error("The origin's package store is not open.");const shared=packages;const applied=imageLayersAppliedPath(digest);const deferred=imageLayersDeferredPath(digest);await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"shared"},()=>shared.refresh());if(shared.entries.has(applied)||shared.entries.has(deferred)||shared.deferredImage===digest)return{parts:0,units:0,bytes:0,skipped:true};if(compact&&shared.packBytes===0&&new URL(url2).origin===scope3.location.origin){const text2=await imageFile(compact.url);const named2=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256",text2)),byte=>byte.toString(16).padStart(2,"0")).join("");if(named2!==compact.digest)throw new Error("The prepared image descriptor is not the one its manifest names.");const descriptor=JSON.parse(new TextDecoder().decode(text2));if(descriptor.kind!=="browser-substrate-prepared-layers"||descriptor.version!==1||!Number.isSafeInteger(descriptor.units)||descriptor.units<0){throw new Error("Malformed prepared image descriptor.")}const prepared=validatePreparedImageIndex(descriptor.prepared);progress(0,2);const metadata=async file2=>{const answer2=await imageFileAnswer(new URL(file2.url,url2).href,file2);if(answer2.inflated)return answer2.bytes;if(answer2.bytes.byteLength!==file2.bytes)throw new Error("The image's metadata has the wrong served size.");return inflateLayerPart(answer2.bytes,file2.raw)};const[json,binary]=await Promise.all([metadata(prepared.json),metadata(prepared.binary)]);const ranges={...prepared.ranges,image:digest};const installed3=await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(shared.entries.has(deferred))return true;if(!await shared.installPreparedImage(prepared,json,binary,ranges))return false;shared.applyNow([{operation:"write",path:deferred,content:new Uint8Array(0),mode:292}],{durable:true});return true});if(installed3){progress(2,2);return{parts:0,units:descriptor.units,bytes:prepared.json.bytes+prepared.binary.bytes,skipped:false}}}const text=await imageFile(url2);const named=[...new Uint8Array(await crypto.subtle.digest("SHA-256",text))].map(byte=>byte.toString(16).padStart(2,"0")).join("");if(!named.startsWith(digest))throw new Error(`The image's layers document at ${url2} is not the one its manifest names.`);const document2=validateImageLayers(JSON.parse(new TextDecoder().decode(text)));const needed=document2.parts.filter(part=>part.units.some(unit=>!shared.entries.has(unit.marker)));let parts=0,units=0,bytes2=0,next2=0;let failed=false;const placedAt=Date.now();progress(0,needed.length);await shared.deferMaintenance(async()=>{const results=await Promise.allSettled(Array.from({length:Math.min(LAYER_PARTS_AT_ONCE,needed.length)},async()=>{while(next2<needed.length&&!failed){const part=needed[next2++];try{const answer2=await imageFileAnswer(new URL(part.url,url2).href,{bytes:part.bytes,raw:part.raw,sha256:part.sha256});let raw=answer2.bytes;if(!answer2.inflated){if(raw.byteLength!==part.bytes)throw new Error(`The image's layer part ${part.url} is ${raw.byteLength} bytes; its document says ${part.bytes}.`);raw=await inflateLayerPart(raw,part.raw);const actual=[...new Uint8Array(await crypto.subtle.digest("SHA-256",raw))].map(byte=>byte.toString(16).padStart(2,"0")).join("");if(actual!==part.sha256)throw new Error(`The image's layer part ${part.url} is not the part its document names.`)}else if(raw.byteLength!==part.raw)throw new Error(`The image's layer part ${part.url} came inflated to ${raw.byteLength} bytes; its document says ${part.raw}.`);await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();const files=[];const slices=[];let size=0;for(const unit of part.units){if(shared.entries.has(unit.marker))continue;let start=Infinity,end=0;for(const[,type2,,offset2,length]of unit.files)if(type2!=="d"){start=Math.min(start,offset2);end=Math.max(end,offset2+length)}if(start===Infinity)start=end=0;const base=size-start;let marked=false;for(const[relative2,type2,mode,offset2,length]of unit.files){const path3=imageLayerPath(unit,relative2);if(path3===unit.marker)marked=true;files.push(type2==="d"?{path:path3,type:"directory",mode,mtimeMs:placedAt}:{path:path3,type:type2==="l"?"symlink":"file",mode,mtimeMs:placedAt,offset:base+offset2,length})}if(!marked)files.push({path:unit.marker,type:"file",mode:292,mtimeMs:placedAt,offset:0,length:0});slices.push(raw.subarray(start,end));size+=end-start;units+=1}if(files.length===0)return;const bytes3=slices.length===1?slices[0]:new Uint8Array(size);if(slices.length>1){let cursor=0;for(const slice of slices){bytes3.set(slice,cursor);cursor+=slice.byteLength}}shared.applyExtentsNow(bytes3,files)});parts+=1;bytes2+=part.bytes;progress(parts,needed.length)}catch(cause){failed=true;throw cause}}}));const rejected=results.find(result=>result.status==="rejected");if(rejected)throw rejected.reason;await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(!shared.entries.has(applied))shared.applyNow([{operation:"write",path:applied,content:new Uint8Array(0),mode:292}]);if(shared.logBytes>0)await shared.checkpoint()})});return{parts,units,bytes:bytes2,skipped:false}}var LAYER_PARTS_AT_ONCE=6;async function inflateLayerPart(served,raw){const reader=new Blob([served]).stream().pipeThrough(new DecompressionStream("gzip")).getReader();const out=new Uint8Array(raw);let offset2=0;for(;;){const{done,value}=await reader.read();if(done)break;if(offset2+value.byteLength>raw)throw new Error("An image layer part inflates past its raw size.");out.set(value,offset2);offset2+=value.byteLength}if(offset2!==raw)throw new Error("An image layer part inflates short of its raw size.");return out}var nextImagePackRead=1;var pendingImagePacks=new Map;var pendingImageFiles=new Map;var nextImageFileRead=1;async function imageFile(url2){return(await imageFileAnswer(url2)).bytes}function imageFileAnswer(url2,part){const id2=nextImageFileRead++;return new Promise((resolve2,reject)=>{pendingImageFiles.set(id2,{resolve:resolve2,reject});send({type:"image-file-read",id:id2,url:url2,...part?{part}:{}})})}function imagePack(key){const id2=nextImagePackRead++;return new Promise((resolve2,reject)=>{pendingImagePacks.set(id2,{resolve:resolve2,reject});send({type:"image-pack-read",id:id2,key})})}function moduleCacheOver(shared,sharedFilesystem,project){const home=key=>`${PACKAGES_ROOT}/.modules/${key}`;const keepShared=async(source,code3)=>{await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(!shared.entries.has(source))sharedFilesystem.writeFileSync(source,code3);else{const now=new Date;sharedFilesystem.utimesSync(source,now,now)}if(shared.logBytes>8*1024*1024){console.warn(`[modules] the shared store checkpoints at ${Math.round(shared.logBytes/1024)} KiB of log, after ${source}`);await shared.checkpoint()}})};const fromImage=(key,source)=>{let pending=fetchingPacks.get(key);if(pending)return pending;pending=(async()=>{try{await keepShared(source,await imagePack(key));return true}catch(cause){if(isInstallRefused(cause))throw cause;const message=cause instanceof Error?cause.message:String(cause);if(/\b4\d\d\b|not found|no pack/iu.test(message))installTrap({door:"image pack",subject:`the image names a pack for ${key} its origin cannot give: ${message}`,detail:{key}});throw new Error(`The image's pack for ${key} could not be read this time (${message}); reloading the page tries again.`)}finally{fetchingPacks.delete(key)}})();fetchingPacks.set(key,pending);return pending};const reportedMisses=new Set;const reportMiss=(key,carried)=>{if(reportedMisses.has(key))return;reportedMisses.add(key);console.log(carried?`[modules] this tab's store has no pack at ${key}; fetching the one the image's index names.`:`[modules] neither this tab's store nor the image has a pack at ${key}; the tab builds it.`)};return{link:async(key,target)=>{const source=home(key);let fetched=false;if(!shared.entries.has(source)&&imagePacksKnown)await imagePacksKnown;if(!shared.entries.has(source)){reportMiss(key,imagePacks.has(key));if(!imagePacks.has(key))return false;if(!await fromImage(key,source))return false;fetched=true}project.linkShared(source,target);if(!project.existsSync(target)){console.warn(`[modules] linked ${key} to ${target} and it is not there: fetched ${fetched}, shared holds ${shared.entries.has(source)}, the project's parent ${project.existsSync(target.slice(0,target.lastIndexOf("/")))}`)}return true},keep:async(key,code3,target)=>{const source=home(key);await keepShared(source,code3);project.linkShared(source,target)}}}function requiredContainer(){if(!container)throw new Error("Browser Node host is not initialized.");return container}function installFilesystemForwarding(vfs2){const suppressed=path3=>{if(!suppressFilesystemEvents)return false;if(importingFilesystemRoot===void 0)return true;const normalized=normalizeStorePath2(path3);return normalized===importingFilesystemRoot||normalized.startsWith(`${importingFilesystemRoot==="/"?"":importingFilesystemRoot}/`)};vfs2.on("change",path3=>{if(suppressed(path3)||!vfs2.existsSync(path3))return;const stat2=vfs2.statSync(path3);queueIndexForwarding([path3,stat2.isDirectory()?"directory":"file",stat2.isDirectory()?0:stat2.size,stat2.mode&4095,stat2.mtimeMs])});vfs2.on("delete",path3=>{if(!suppressed(path3))queueIndexForwarding([path3,null])});installPortForwarding()}function installPortForwarding(){const bridge=vfsServerBridge();const register=bridge.registerServer.bind(bridge);const unregister=bridge.unregisterServer.bind(bridge);bridge.registerServer=((server,serverPort,hostname2)=>{console.log(`[boot-trace] ${JSON.stringify({event:"port-register",at:Date.now(),port:serverPort,token:container?.currentProcessToken(),imageBlocked:imageBlocked()})}`);register(server,serverPort,hostname2);if(netListeners.has(serverPort))return;send({type:"port",action:"open",port:serverPort,...hostname2?{hostname:hostname2}:{}})});bridge.unregisterServer=(serverPort=>{console.log(`[boot-trace] ${JSON.stringify({event:"port-unregister",at:Date.now(),port:serverPort,token:container?.currentProcessToken(),imageBlocked:imageBlocked()})}`);unregister(serverPort);if(netListeners.has(serverPort))return;send({type:"port",action:"close",port:serverPort})})}var pendingIndexForwarding=[];function queueIndexForwarding(change){pendingIndexForwarding.push(change);if(filesystemForwardingScheduled)return;filesystemForwardingScheduled=true;queueMicrotask(flushFilesystemForwarding)}function storeEntryOf(vfs2,path3){if(!vfs2.existsSync(path3))return[path3,null];const stat2=vfs2.lstatSync(path3);const type2=stat2.isDirectory()?"directory":stat2.isSymbolicLink()?"symlink":"file";return[path3,type2,type2==="file"?stat2.size:0,stat2.mode&4095,stat2.mtimeMs]}function applyStoreOperation(vfs2,operation){const withModes=vfs2;if(operation.op==="write"){writeFile(vfs2,operation.path,new Uint8Array(operation.bytes));if(operation.mode!==void 0)withModes.chmodSync?.(operation.path,operation.mode);withModes.utimesSync?.(operation.path,new Date(operation.mtimeMs),new Date(operation.mtimeMs))}else if(operation.op==="mkdir"){if(!vfs2.existsSync(operation.path))vfs2.mkdirSync(operation.path,{recursive:true})}else if(operation.op==="remove"){removePath(vfs2,operation.path)}else if(operation.op==="rename"){vfs2.renameSync(operation.from,operation.to)}else if(operation.op==="chmod"){withModes.chmodSync?.(operation.path,operation.mode)}else if(operation.op==="utimes"){withModes.utimesSync?.(operation.path,new Date(operation.mtimeMs),new Date(operation.mtimeMs))}}function flushFilesystemForwarding(){filesystemForwardingScheduled=false;const changes=pendingIndexForwarding.splice(0);for(let offset2=0;offset2<changes.length;offset2+=4096){send({type:"fs-index",changes:changes.slice(offset2,offset2+4096)})}}function vfsServerBridge(){return requiredContainer().serverBridge}var netListeners=new Map;var netSockets=new Map;var netListenerChanges=new Set;var nextNetSocket=1;var pageNetHost={ports:()=>netListeners.keys(),subscribe:listener=>{netListenerChanges.add(listener);return()=>{netListenerChanges.delete(listener)}},connect:(port2,socket)=>{if(!netListeners.has(port2)){socket.destroy();return}forwardNetSocket(port2,socket)}};function forwardNetSocket(port2,socket){const id2=nextNetSocket++;netSockets.set(id2,socket);socket.on("data",chunk=>{if(!netSockets.has(id2))return;const buffer2=Uint8Array.from(chunk).buffer;send({type:"net-guest-data",socket:id2,chunk:buffer2},[buffer2])});const close2=()=>{if(!netSockets.delete(id2))return;send({type:"net-guest-end",socket:id2})};socket.on("end",close2);socket.on("close",close2);socket.on("error",()=>void 0);send({type:"net-connect",port:port2,socket:id2})}function handleNetMessage(message){if(message.type==="listen-net"){const host2=requiredContainer();if(!host2.listenNet)return;netListeners.get(message.port)?.();netListeners.set(message.port,()=>{});try{const unlisten=host2.listenNet(message.port,socket2=>forwardNetSocket(message.port,socket2));netListeners.set(message.port,unlisten)}catch(error){netListeners.delete(message.port);throw error}for(const listener of netListenerChanges)listener(message.port,true);return}if(message.type==="unlisten-net"){netListeners.get(message.port)?.();netListeners.delete(message.port);for(const listener of netListenerChanges)listener(message.port,false);return}const socket=netSockets.get(message.socket);if(!socket)return;if(message.type==="net-data")socket.write(new Uint8Array(message.chunk),()=>send({type:"net-taken",socket:message.socket}));else{socket.end();netSockets.delete(message.socket)}}var pendingChildren=new Map;var pendingChildInput=new Map;var pendingChildFdInput=new Map;var childFdKey=(id2,fd2)=>`${id2}:${fd2}`;var childChunkBytes=64*1024;function validChildFd(fd2){return typeof fd2==="number"&&Number.isInteger(fd2)&&fd2>=3&&fd2<=63}function childDescriptorNumbers(descriptors){if(descriptors===void 0)return void 0;const fds=Object.keys(descriptors).map(Number);if(!fds.every(validChildFd))throw new Error("Child process descriptors must be integers from 3 through 63.");return fds.length>0?fds.sort((left,right)=>left-right):void 0}var nextChildId=1;var launchPorts=new Map;var heldRuns=new Set;function runPorts(id2){const before=launchPorts.get(id2);if(!before)return[];return vfsServerBridge().getServerPorts().filter(port2=>!before.has(port2))}function closeRunServers(id2){const bridge=vfsServerBridge();for(const port2 of runPorts(id2)){const entry=bridge.servers?.get(port2);try{entry?.server?.close?.()}catch{}try{bridge.unregisterServer(port2)}catch{}}}async function workSettled(id2,held=false){const token=String(id2);const engine=container;const nativeSetTimeout=globalThis.__browserRuntimeNativeSetTimeout??setTimeout;const tick=()=>new Promise(resolve2=>nativeSetTimeout.call(globalThis,resolve2,50));const ports2=()=>Math.max(engine?.processPorts?.(token).length??0,runPorts(id2).length);if(held&&activeRuns.has(id2)){const deadline=Date.now()+500;while(Date.now()<deadline&&ports2()===0&&activeRuns.has(id2))await tick()}const owned=()=>{const timers=engine?.pendingTimers?.(token)??0;if(timers>0)return true;if(held&&ports2()>0)return true;return[...pendingChildren.values()].some(child=>child.owner===id2&&child.hold?.value!==false)};while(owned()&&activeRuns.has(id2))await tick()}function spawnedArgv(options){const given=options.__browserRuntimeSpawnArgs;if(!Array.isArray(given)||given.length===0)return void 0;return given.every(word=>typeof word==="string")?[...given]:void 0}function requestChild(command,options,fixedOwner,fixedArgv,nodeProcess){return new Promise((resolve2,reject)=>{assertWorkerActive();options.signal?.throwIfAborted();const descriptorFds=childDescriptorNumbers(options.descriptors);if(!childInputSupported&&(options.stdin!==void 0||options.stdinStream||options.terminal||options.executablePath!==void 0||descriptorFds)){throw new Error("The holder did not negotiate child-process input and terminal support.")}const id2=nextChildId++;const inputController=new AbortController;let removeResize;let inputFailure;const token=container?.currentProcessToken()??null;let owner=fixedOwner??(token===null?null:Number(token));if(owner!==null&&!activeRuns.has(owner)){const engine=enginePids();owner=(engine?owningRun(token,activeRuns,engine.runPid,engine.processByPid):void 0)??null}if(owner===null){let latest;for(const[id3,run]of activeRuns)if(!latest||run.startedAt>latest.startedAt)latest={id:id3,startedAt:run.startedAt};owner=latest?.id??null}const rejectFdInputs=cause=>{for(const fd2 of descriptorFds??[]){const key=childFdKey(id2,fd2);const input=pendingChildFdInput.get(key);pendingChildFdInput.delete(key);input?.reject(cause)}};const abort=()=>{inputController.abort(options.signal?.reason);const input=pendingChildInput.get(id2);pendingChildInput.delete(id2);input?.reject(inputController.signal.reason);rejectFdInputs(inputController.signal.reason);if(!pendingChildren.has(id2))return;try{send({type:"child-abort",id:id2})}catch(cause){const pending=pendingChildren.get(id2);pendingChildren.delete(id2);pending?.reject(cause instanceof Error?cause:new Error(String(cause)))}};const cleanup=()=>{options.signal?.removeEventListener("abort",abort);inputController.abort();const input=pendingChildInput.get(id2);pendingChildInput.delete(id2);input?.reject(new DOMException("The child process stopped.","AbortError"));rejectFdInputs(new DOMException("The child process stopped.","AbortError"));try{removeResize?.()}catch(cause){console.error("Child terminal subscription cleanup failed.",cause)}removeResize=void 0};console.log(`[boot-trace] ${JSON.stringify({event:"child-start",at:Date.now(),id:id2,owner,token,program:programFromCommand(command),imageBlocked:imageBlocked()})}`);pendingChildren.set(id2,{owner,...options.hold?{hold:options.hold}:{},...options.onStdout?{onStdout:options.onStdout}:{},...options.onStderr?{onStderr:options.onStderr}:{},...descriptorFds&&options.descriptors?{descriptors:options.descriptors}:{},resolve:result=>{cleanup();if(inputFailure)reject(inputFailure);else resolve2(result)},reject:cause=>{cleanup();reject(inputFailure??cause)}});options.signal?.addEventListener("abort",abort,{once:true});const parentCwd=owner!==null?activeRuns.get(owner)?.cwd??"/":"/";const cwd=options.cwd===void 0?parentCwd:options.cwd.startsWith("/")?options.cwd:`${parentCwd.replace(/\/$/u,"")}/${options.cwd}`.replace(/\/\.\//gu,"/");const argv=fixedArgv?[...fixedArgv]:spawnedArgv(options);try{send({type:"child-run",...options.filesystemPolicy?{filesystemPolicy:options.filesystemPolicy}:{},id:id2,owner,command,...argv?{argv}:{},...nodeProcess?{nodeProcess}:{},cwd,...options.executablePath!==void 0?{executablePath:options.executablePath}:{},...options.stdin!==void 0?{stdin:options.stdin}:{},...options.stdinStream?{liveStdin:true}:{},...options.terminal?{terminal:{columns:options.terminal.columns,rows:options.terminal.rows}}:{},...options.env?{env:{...options.env}}:{},...descriptorFds?{descriptors:descriptorFds}:{}});if(options.stdinStream){void forwardBrowserProcessInput(options.stdinStream,async chunk=>{for(let offset2=0;offset2<chunk.byteLength;offset2+=64*1024){inputController.signal.throwIfAborted();const bytes2=Uint8Array.from(chunk.subarray(offset2,offset2+64*1024)).buffer;await new Promise((resolve3,reject2)=>{pendingChildInput.set(id2,{resolve:resolve3,reject:reject2});try{send({type:"child-stdin",id:id2,bytes:bytes2},[bytes2])}catch(cause){pendingChildInput.delete(id2);reject2(cause)}})}},inputController.signal).then(()=>{if(pendingChildren.has(id2)&&!inputController.signal.aborted)send({type:"child-stdin-end",id:id2})}).catch(cause=>{if(inputController.signal.aborted||!pendingChildren.has(id2))return;inputFailure=cause instanceof Error?cause:new Error(String(cause));abort()})}for(const fd2 of descriptorFds??[]){const key=childFdKey(id2,fd2);void forwardBrowserProcessInput(options.descriptors[fd2].input,async chunk=>{for(let offset2=0;offset2<chunk.byteLength;offset2+=childChunkBytes){inputController.signal.throwIfAborted();const bytes2=Uint8Array.from(chunk.subarray(offset2,offset2+childChunkBytes)).buffer;await new Promise((resolve3,reject2)=>{pendingChildFdInput.set(key,{resolve:resolve3,reject:reject2});try{send({type:"child-fd",id:id2,fd:fd2,bytes:bytes2},[bytes2])}catch(cause){pendingChildFdInput.delete(key);reject2(cause)}})}},inputController.signal).then(()=>{if(pendingChildren.has(id2)&&!inputController.signal.aborted)send({type:"child-fd-end",id:id2,fd:fd2})}).catch(cause=>{if(inputController.signal.aborted||!pendingChildren.has(id2))return;inputFailure=cause instanceof Error?cause:new Error(String(cause));abort()})}removeResize=options.terminal?.onResize?.((columns,rows)=>{if(pendingChildren.has(id2)&&!inputController.signal.aborted)send({type:"child-resize",id:id2,columns,rows})})}catch(cause){try{send({type:"child-abort",id:id2})}catch{}const pending=pendingChildren.get(id2);pendingChildren.delete(id2);pending?.reject(cause instanceof Error?cause:new Error(String(cause)))}})}function installChildProcessBridge(){const pending=token=>{const owner=Number(token);let count=0;for(const child of pendingChildren.values())if(child.owner===owner&&child.hold?.value!==false)count+=1;return count};Reflect.set(globalThis,executorSymbol,{bypass:0,run:requestChild,pending})}function installRootNodeEntryBridge(){const preparedLimits=Object.freeze({maxBytes:4*1024*1024,maxEntries:1024});const streamLimits=Object.freeze({maxHandles:1024,maxReadChunkBytes:64*1024,maxQueuedBytes:64*1024,maxQueuedHandles:16,maxPendingWriteBytes:1024*1024});const runtimeFiles=new VirtualFS;rootRuntimeFiles=runtimeFiles;const registry=ownerProcessRegistryScope();installNodeProcessHost({run:launch=>{const active2=requiredContainer();if(launch.inherited.length)throw new Error("A store-owner Node launch cannot inherit guest stream descriptors.");if(!executionConfiguration)throw new Error("Node process execution has no worker configuration.");const engine=enginePids();const owner=activeRuns.has(Number(launch.token))?Number(launch.token):engine?owningRun(launch.token,activeRuns,engine.runPid,engine.processByPid):void 0;if(owner===void 0)throw new Error("Node process execution has no owning command.");const attribution=networkProgramNow(activeRuns,launch.token,token=>engine?.runPid(token),pid=>engine?.processByPid(pid));const streams2=launch.streams;return nodeProcesses.run(renderCommand(["node",...launch.argv]),{cwd:launch.cwd,env:launch.env,...launch.stdin!==void 0?{stdin:launch.stdin}:{},...launch.stdinStream?{stdinStream:launch.stdinStream}:{},...streams2?.signal?{signal:streams2.signal}:{},...streams2?.terminal?{terminal:streams2.terminal}:{},...streams2?.onStdout?{onStdout:streams2.onStdout}:{},...streams2?.onStderr?{onStderr:streams2.onStderr}:{}},{filesystem:launch.filesystem,...storeReadsFor(launch.filesystem),workerUrl:scope3.location.href,configuration:executionConfiguration,...moduleCacheOption(active2.vfs),processAdmission:{source:registry,token:launch.token},nativeStreams:{limits:streamLimits,inherited:[]},nodeProcess:{preparedLimits},preparedFiles:captureNodePreparedFiles(runtimeFiles,preparedLimits),serverBridge:active2.serverBridge,net:pageNetHost,hostPorts:hostPortsHost,runChild:(command,options,argv)=>requestChild(command,options,owner,argv),http:request=>brokerHttpOnce(request,attribution)})}})}function installNodeEntryBridge(localToken2,preparedLimits){installNodeProcessHost({run:launch=>{const argv=["node",...launch.argv];const streams2=launch.streams;return requestChild(renderCommand(argv),{cwd:launch.cwd,env:launch.env,hold:{value:false},...launch.stdin!==void 0?{stdin:launch.stdin}:{},...launch.stdinStream?{stdinStream:launch.stdinStream}:{},...streams2?.signal?{signal:streams2.signal}:{},...streams2?.terminal?{terminal:streams2.terminal}:{},...streams2?.onStdout?{onStdout:streams2.onStdout}:{},...streams2?.onStderr?{onStderr:streams2.onStderr}:{},...invocationPolicy?{filesystemPolicy:invocationPolicy}:{}},Number(localToken2),argv,{token:launch.token,inherited:launch.inherited.map(({fd:fd2,handle})=>({fd:fd2,id:handle.id})),preparedFiles:invocationFiles?captureNodePreparedFiles(invocationFiles.runtimeFiles,preparedLimits):[]})}},localToken2)}async function brokerHttpOnce(request,attribution,context2){assertWorkerActive();request.signal.throwIfAborted();const id2=nextFetchId++;const headers=request.headers;assertWorkerActive();request.signal.throwIfAborted();const result=new Promise((resolve2,reject)=>pendingFetches.set(id2,{method:request.method,resolve:resolve2,reject}));const abort=()=>{const pending=pendingFetches.get(id2);if(pending){pendingFetches.delete(id2);pending.reject(request.signal.reason??new DOMException("The request was cancelled.","AbortError"))}else{const stream=responseStreams.get(id2);if(!stream&&!fetchActivities.has(id2))return;responseStreams.delete(id2);stream?.error(request.signal.reason??new DOMException("The request was cancelled.","AbortError"))}try{send({type:"fetch-abort",id:id2})}catch{}fetchAbortCleanup.get(id2)?.();fetchAbortCleanup.delete(id2)};if(context2){try{const activity2=context2.begin(abort);fetchActivities.set(id2,{activity:activity2,headersDone:activity2.hold(),pulls:[],cancel:abort})}catch(cause){pendingFetches.delete(id2);throw cause}}request.signal.addEventListener("abort",abort,{once:true});fetchAbortCleanup.set(id2,()=>{request.signal.removeEventListener("abort",abort);fetchActivities.get(id2)?.activity.release();fetchActivities.delete(id2)});try{const body=request.body;send({type:"fetch",id:id2,program:attribution.program,attributed:attribution.attributed,activePrograms:attribution.activePrograms,...attribution.pid!==void 0?{pid:attribution.pid}:{},url:request.url,method:request.method,headers,...request.profile?{profile:request.profile}:{},...body?{body}:{}},body instanceof ReadableStream?[body]:[])}catch(cause){pendingFetches.get(id2)?.reject(cause instanceof Error?cause:new Error(String(cause)));pendingFetches.delete(id2);fetchAbortCleanup.get(id2)?.();fetchAbortCleanup.delete(id2)}if(request.signal.aborted)abort();return result}async function brokerFetch(input,init,fixedAttribution,context2){let request=new Request(input,init);const attribution=fixedAttribution??attributionNow();let body=request.body??void 0;if(body&&requestHasStaticBody(request)){let stopped2=false;const activity2=context2?.begin(()=>{stopped2=true});const done=activity2?.hold();try{body=await request.blob();request.signal.throwIfAborted();if(stopped2)throw new DOMException("The requesting process has ended.","AbortError")}finally{done?.();activity2?.release()}}for(let redirects=0;;redirects++){const result=await brokerHttpOnce({url:request.url,method:request.method,headers:[...request.headers.entries()],...body?{body}:{},signal:request.signal},attribution,context2);const response=new Response(result.body,{status:result.status,statusText:result.statusText,headers:result.headers});if(![301,302,303,307,308].includes(response.status))return response;if(request.redirect==="manual")return response;if(request.redirect==="error"){await response.body?.cancel().catch(()=>void 0);throw new TypeError("Redirects are disabled for this request.")}if(redirects>=20){await response.body?.cancel().catch(()=>void 0);throw new TypeError("Too many redirects.")}const location2=response.headers.get("location");if(!location2)return response;const nextUrl=new URL(location2,request.url);let method=request.method;const headers=new Headers(request.headers);if(response.status===303&&method!=="HEAD"||(response.status===301||response.status===302)&&method==="POST"){method="GET";body=void 0;for(const name of["content-encoding","content-language","content-length","content-location","content-type"])headers.delete(name)}else if(body instanceof ReadableStream){await response.body?.cancel().catch(()=>void 0);throw new TypeError("A streamed request body cannot be replayed across a redirect.")}if(new URL(request.url).origin!==nextUrl.origin){for(const name of["authorization","cookie","proxy-authorization"])headers.delete(name)}await response.body?.cancel().catch(()=>void 0);request=new Request(nextUrl,{method,headers,...body?{body}:{},redirect:request.redirect,signal:request.signal})}}var hostPorts=new Set;var hostPortListeners=new Set;var hostPortsHost={current:()=>hostPorts,subscribe:listener=>{hostPortListeners.add(listener);return()=>{hostPortListeners.delete(listener)}}};var RefusedWebSocket=class extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;url;protocol="";extensions="";bufferedAmount=0;binaryType="blob";readyState=0;onopen=null;onmessage=null;onerror=null;onclose=null;constructor(url2,_protocols){super();this.url=new URL(url2).href;queueMicrotask(()=>{if(this.readyState===3)return;this.readyState=3;const error=Object.assign(new Event("error"),{message:`WebSocket to ${this.url} refused: a sandboxed program has no WebSocket egress.`});this.onerror?.(error);this.dispatchEvent(error);const close2=new CloseEvent("close",{code:1006,reason:"",wasClean:false});this.onclose?.(close2);this.dispatchEvent(close2)})}send(){throw new DOMException("The WebSocket is not open.","InvalidStateError")}close(){this.readyState=3}};function installNetworkBroker(){installFetchTransport((input,init,context2)=>brokerFetch(input,init,attributionNow(),context2));installHttpClientTransport(()=>{const attribution=attributionNow();return request=>brokerHttpOnce(request,attribution)},{hostPorts:()=>hostPorts});Object.defineProperty(globalThis,"fetch",{value:brokerFetch,configurable:false,writable:false});for(const name of["XMLHttpRequest","EventSource","BroadcastChannel","SharedWorker"]){try{Object.defineProperty(globalThis,name,{value:void 0,configurable:false,writable:false})}catch{}}try{Object.defineProperty(globalThis,"WebSocket",{value:RefusedWebSocket,configurable:false,writable:false})}catch{}Reflect.set(globalThis,executorSymbol,void 0)}var liveStdins=new Map;async function installTypeStripper(url2){const glue=await import(url2);globalThis.__substrateStripTypes=typeStripperFrom(glue.default).strip}var webSocketRelay;function openLiveStdin(id2){const encoder11=new TextEncoder;const queue=[];let closed=false;let wake;const notify=()=>{const resolve2=wake;wake=void 0;resolve2?.()};const stdin={push:data2=>{if(closed)return;queue.push({bytes:encoder11.encode(data2)});notify()},write:bytes2=>{if(closed)return Promise.reject(new Error("Process input is closed."));if(bytes2.byteLength>64*1024||queue.some(entry=>entry.consumed))return Promise.reject(new Error("Process input requires consumed chunks of at most 64 KiB."));const consumed=new Promise((resolve2,reject)=>{queue.push({bytes:Uint8Array.from(bytes2),consumed:{resolve:resolve2,reject}})});notify();return consumed},close:(discard=false)=>{closed=true;if(discard)for(const entry of queue.splice(0))entry.consumed?.reject(new DOMException("Process input was cancelled.","AbortError"));notify()},async*[Symbol.asyncIterator](){for(;;){if(queue.length>0){const entry=queue.shift();entry.consumed?.resolve();yield entry.bytes;continue}if(closed)return;await new Promise(resolve2=>{wake=resolve2})}}};liveStdins.set(id2,stdin);return stdin}var terminals=new Map;function openTerminal(id2,size){const listeners=new Set;const terminal={columns:size.columns,rows:size.rows,onResize:listener=>{listeners.add(listener);return()=>{listeners.delete(listener)}},resize:(columns,rows)=>{terminal.columns=columns;terminal.rows=rows;for(const listener of listeners)listener(columns,rows)}};terminals.set(id2,terminal);return terminal}function writeFile(vfs2,path3,bytes2){const parent2=path3.slice(0,path3.lastIndexOf("/"))||"/";if(parent2!=="/"&&!vfs2.existsSync(parent2))vfs2.mkdirSync(parent2,{recursive:true});vfs2.writeFileSync(path3,bytes2)}function removePath(vfs2,path3){if(!vfs2.existsSync(path3))return;if(vfs2.statSync(path3).isFile()){vfs2.unlinkSync(path3);return}for(const name of vfs2.readdirSync(path3))removePath(vfs2,`${path3==="/"?"":path3}/${name}`);if(path3!=="/")vfs2.rmdirSync(path3)}function sendResult(id2,result){console.log(`[boot-trace] ${JSON.stringify({event:"run-result",at:Date.now(),id:id2,exitCode:result.exitCode,imageBlocked:imageBlocked()})}`);const signal=result.signal;send({type:"result",id:id2,stdout:result.stdout,stderr:result.stderr,exitCode:result.exitCode,...typeof signal==="string"?{signal}:{}})}function sendError(id2,cause){const error=cause instanceof Error?cause:new Error(String(cause));send({type:"error",id:id2,error:error.message,...error.stack?{stack:error.stack}:{}})}function send(message,transfer2=[]){port?.postMessage(message,transfer2)}function depth3(path3){let segments=1;for(let index2=0;index2<path3.length;index2+=1)if(path3.charCodeAt(index2)===47)segments+=1;return segments}configureNodeExecutionWorker({});
|
|
6102
|
+
${error?.stack??"(no stack)"}`)});scope3.addEventListener("unhandledrejection",event=>{const reason=event.reason;console.error(`[node worker] unhandled rejection: ${reason?.stack??String(reason)}`)});var executorSymbol=Symbol.for("@volter/browser-runtime/child-process-executor");var port;var container;var packStore;var packStoreProjectId;async function openStoreReads(grant){const clock=new Int32Array(grant.clock);const before=Atomics.load(clock,STORE_CLOCK_EPOCH);let openedAt=before;const began=Date.now();const opening=openPackReader({navigator:scope3.navigator},grant.projectId,grant.seed,grant.imageLine).then(reader=>{if(reader?.seeded()&&grant.seed)openedAt=grant.seed.epoch;processReader=reader;return reader}).catch(cause=>{console.warn(`This process reads the project's files through their owner: its own reader did not open (${cause instanceof Error?cause.message:String(cause)}).`);return void 0});await Promise.race([opening,new Promise(resolve2=>setTimeout(resolve2,STORE_OPEN_BUDGET_MS))]);console.log(`[boot-trace] ${JSON.stringify({event:"store-open",at:Date.now(),ms:Date.now()-began,opened:processReader!==void 0})}`);return{opening,clock:grant.clock,get openedAt(){return openedAt}}}var STORE_OPEN_BUDGET_MS=1500;function storeReadsFor(filesystem){const active2=container;if(!packStore||!packStoreProjectId||!active2||filesystem!==active2.vfs||!(filesystem instanceof PackedVirtualFS))return{};const store=packStore,projectId=packStoreProjectId;return{storeReads:()=>{if(packStore!==store)return void 0;const clock=store.clock();const seed=store.readerSeed({overlays:true});const imageLine=seed?.packagesImage?store.imageLine():void 0;return{projectId,clock,...seed?{seed}:{},...imageLine?{imageLine}:{}}}}}var storeWriteFailure;function reportStoreWriteFailure(){const failure=storeWriteFailure;if(!failure)return;storeWriteFailure=void 0;throw failure}var packages;var packagesFilesystem;var processReader;var imageBlocked=()=>realmBlockedReads.size===0?void 0:Object.fromEntries([...realmBlockedReads].map(([reader,{ranges,ms:ms2}])=>[reader,{ranges,ms:Math.round(ms2)}]));var releasePackagesOpen;var initializationStarted=false;var workerDisposing=false;var portStreams=new Map;var childInputSupported=false;var releaseProject;var bundler;var threads;var workerOptions={};function configureNodeExecutionWorker(options){workerOptions=options}var toolchain;var invocationPolicy;var invocationFiles;var executionConfiguration;var confinedRuns=new Map;var nodeProcesses=new NodeProcessSupervisor;var rootRuntimeFiles;var programs=new Map;var commandResolver;function routeCommand2(command,cwd){if(!toolchain)return void 0;let argv;try{argv=parseCommandWords(command)}catch{return void 0}const env={};while(argv.length){const assignment=/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/su.exec(argv[0]);if(!assignment)break;env[assignment[1]]=assignment[2];argv.shift()}if(argv[0]==="/usr/bin/env"&&argv.length>1)argv.shift();let name=argv[0];if(name===void 0)return void 0;if(name.startsWith("/")&&!programs.has(name)){const basename2=name.slice(name.lastIndexOf("/")+1);if(programs.has(basename2)){name=basename2;argv[0]=basename2}}const runner2=programs.get(name)??commandResolver?.(name,cwd);return runner2?{argv,runner:runner2,env}:void 0}async function runCommand2(command,options){const links=splitShellChain(command);if(links.length===1)return runOneCommand(command,options);let stdout="";let stderr="";let exitCode=0;for(const link2 of links){if(!chainContinues(link2.operator,exitCode))continue;const result=await runOneCommand(link2.command,options);stdout+=result.stdout;stderr+=result.stderr;exitCode=result.exitCode}return{stdout,stderr,exitCode}}function runOneCommand(command,options){assertWorkerActive();options.signal?.throwIfAborted();const shellLine=shellCommandLine(command);if(shellLine!==void 0){const{executablePath:_shell,...lineOptions}=options;return runCommand2(shellLine,lineOptions)}const routed=routeCommand2(command,options.cwd??"/");if(routed)return routed.runner(routed.argv,{...options,env:{...options.env,...routed.env}});return engineRun(requiredContainer(),command,options)}function engineRun(active2,command,options){const bridge=Reflect.get(globalThis,executorSymbol);if(bridge)bridge.bypass+=1;return active2.run(command,options)}function toolchainContainer(active2){return tabnodeContainerView(active2,active2.vfs,{isolated:true,run:(command,options)=>engineRun(active2,command,options)})}var sharedModuleCache;var moduleCacheAnswers=new Map;var nextModuleCacheRequest=1;function askOwnerModuleCache(message){const id2=nextModuleCacheRequest++;return new Promise((resolve2,reject)=>{moduleCacheAnswers.set(id2,{resolve:resolve2,reject});send({...message,id:id2})})}var ownerModuleCache={link:(key,target)=>askOwnerModuleCache({type:"module-cache-link",key,target}),keep:async(key,code3,target)=>{await askOwnerModuleCache({type:"module-cache-keep",key,code:code3,target})}};function moduleCacheOption(vfs2){const moduleCache=projectModuleCache(vfs2);return moduleCache?{moduleCache}:{}}function projectModuleCache(vfs2){if(invocationFiles&&!packages)return ownerModuleCache;if(!packages||!packagesFilesystem||!(vfs2 instanceof PackedVirtualFS))return void 0;sharedModuleCache??=moduleCacheOver(packages,packagesFilesystem,vfs2);return sharedModuleCache}function installToolchain(active2,options){const moduleCache=projectModuleCache(active2.vfs);toolchain=new TabnodeToolchain(toolchainContainer(active2),{baselineCommands:options.baselineCommands??[],...invocationFiles?{runtimeFiles:invocationFiles.runtimeFiles}:rootRuntimeFiles?{runtimeFiles:rootRuntimeFiles}:{},...options.preparedCompilers?{preparedCompilers:Object.fromEntries(Object.entries(options.preparedCompilers).map(([root2,binding2])=>[root2,{...binding2,url:new URL(binding2.url,scope3.location.href).href}]))}:{},...moduleCache?{moduleCache}:{},...options.browserImports?{browserImports:options.browserImports}:{},...options.defaultVitePort!==void 0?{defaultVitePort:options.defaultVitePort}:{},...options.registryScopes?{registryScopes:options.registryScopes}:{},preparedBinding:cwd=>{const selected=[...new Map([...Object.entries(options.preparedBindings??{}),...preparedBindings])].filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];return selected?Object.fromEntries(Object.entries(selected[1]).map(([source,target])=>[`${selected[0]==="/"?"":selected[0]}/${source}`,`${selected[0]==="/"?"":selected[0]}/${target}`])):{}},preparedModuleRefusal:cwd=>{const selected=[...new Map([...Object.entries(options.preparedModuleRefusals??{}),...preparedModuleRefusals])].filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];return selected?Object.fromEntries(Object.entries(selected[1]).map(([path3,reason])=>[`${selected[0]==="/"?"":selected[0]}/${path3}`,reason])):{}},preparedEnvironment:cwd=>{const selected=[...new Map([...Object.entries(options.preparedEnvironments??{}),...preparedEnvironments])].filter(([root2])=>(cwd??"/workspace/app")===root2||(cwd??"/workspace/app").startsWith(`${root2}/`)).sort((a,b)=>b[0].length-a[0].length)[0];return selected?.[1]??{}},runShellCommand:runCommand2,runChildProcessCommand:runCommand2,authorizeExternalRequest:()=>void 0});toolchain.register({registerProgram:(name,runner2)=>{programs.set(name,runner2)},registerCommandResolver:resolver=>{commandResolver=resolver}});for(const manager of(options.baselineCommands??[]).filter(manager2=>["yarn","bun","corepack"].includes(manager2)))programs.set(manager,packageManagerAliasRunner(manager,runCommand2))}var suppressFilesystemEvents=false;var importingFilesystemRoot;var activeRuns=new Map;function beginRun(id2,command,extra){console.log(`[boot-trace] ${JSON.stringify({event:"run-start",at:Date.now(),id:id2,program:programFromCommand(command,extra.executablePath)})}`);const{executablePath,...rest}=extra;activeRuns.set(id2,{...rest,program:programFromCommand(command,executablePath),command,startedAt:Date.now()})}function enginePids(){if(!container)return void 0;const engine=container;if(typeof engine.runPid!=="function"||typeof engine.processByPid!=="function")return void 0;return{token:()=>engine.currentProcessToken(),runPid:engine.runPid,processByPid:engine.processByPid}}function attributionNow(){const engine=enginePids();return networkProgramNow(activeRuns,engine?.token()??container?.currentProcessToken()??null,token=>engine?.runPid(token),pid=>engine?.processByPid(pid))}var nextFetchId=1;var pendingFetches=new Map;var responseStreams=new Map;var fetchAbortCleanup=new Map;var fetchActivities=new Map;function pullFetch(id2){const owned=fetchActivities.get(id2);try{if(owned)owned.pulls.push(owned.activity.hold());send({type:"fetch-pull",id:id2})}catch(cause){owned?.cancel();throw cause}}var filesystemForwardingScheduled=false;var settleEngineInitialized;var initialized=new Promise((resolve2,reject)=>{settleEngineInitialized={resolve:resolve2,reject}});void initialized.catch(()=>void 0);publishEngineInitialized(initialized);scope3.addEventListener("message",event=>{if(receiveNodeThread(event))return;if(port||event.data.type!=="attach"||!(event.data.port instanceof MessagePort))return;console.log("[boot-trace]",JSON.stringify({event:"worker-attach-received",at:Date.now()}));port=event.data.port;port.addEventListener("message",message=>void receive(message.data));port.start();send({type:"attached"})});async function receive(message){if(message.type==="module-cache-answer"){const waiter=moduleCacheAnswers.get(message.id);moduleCacheAnswers.delete(message.id);if(message.error)waiter?.reject(new Error(message.error));else waiter?.resolve(message.linked);return}try{if(message.type==="dispose"){if(!workerDisposing)await disposeWorker();return}assertWorkerActive();if(message.type==="init-confined"){if(initializationStarted)throw new Error("Browser Node host initialization has already started.");initializationStarted=true;childInputSupported=message.childInputVersion===1;const processRegistry2=new NodeProcessRegistryClient(message.processRegistry);installProcessRegistry(processRegistry2,message.initialProcess);if(processRegistry2.streams)installNativeStreamTransport(processRegistry2.streams);if(message.nodeProcess){if(!message.initialProcess||message.initialProcess.token!=="1"||!processRegistry2.streams){throw new Error("Node process execution requires its admitted run and native stream channel.")}installNodeEntryBridge(message.initialProcess.token,message.nodeProcess)}if(message.filesystemPolicy===void 0&&!message.nodeProcess)throw new Error("An ordinary Node realm requires process admission.");invocationPolicy=message.filesystemPolicy===void 0?void 0:normalizeProcessFilesystemPolicy(message.filesystemPolicy);if(message.preparedFiles&&!message.nodeProcess)throw new Error("Prepared entries require Node process admission.");const files=nodeInvocationFilesystem(message.filesystem,invocationPolicy,message.nodeProcess?{files:message.preparedFiles??[],limits:message.nodeProcess}:void 0,message.storeReads?await openStoreReads(message.storeReads):void 0);invocationFiles=files;container=createContainer({...message.options,vfs:files.guest});installPortForwarding();if(message.bundler)installBundler(container.vfs,message.bundler);threads=installNodeThreadHost(container.vfs,message.bundler);installToolchain(container,message.toolchain??{});installNetworkBroker();installChildProcessBridge();restrictNodeWorkerAuthority();send({type:"initialized",id:message.id,filesystemPolicyVersion:1,processRegistryVersion:1,...processRegistry2.streams?{nativeStreamVersion:1}:{},...message.nodeProcess?{nodeProcessVersion:1}:{},...typeof container?.signalProcess==="function"?{signalVersion:1}:{},inputBytesVersion:1,store:{opened:false,index:[]}});return}if(message.type==="init"){if(initializationStarted)throw new Error("Browser Node host initialization has already started.");initializationStarted=true;nodeProcesses.prepareWorkers(scope3.location.href);childInputSupported=message.childInputVersion===1;executionConfiguration={options:message.options,...message.bundler?{bundler:message.bundler}:{},...message.toolchain?{toolchain:message.toolchain}:{}};{const handoff2=takeStoreHandoff();const held=handoff2?.held??await holdProjectStores({projectId:String(message.store.projectId),...message.store.limits?{limits:message.store.limits}:{},report:work=>send({type:"initializing",id:message.id,work}),disposing:()=>workerDisposing});releaseProject=held.releaseProject;releasePackagesOpen=held.releasePackagesOpen;packages=held.shared;installPackageStore(held.shared);const store=held.store;packStore=store;for(const plan of held.preparedPlans??[])preparedProjectPlans.set(plan.root,plan.key);packStoreProjectId=String(message.store.projectId);const opened=held.opened;const{startedAt,phases}=held;const phase=(name,since)=>{phases.push(`${name} ${Math.round(performance.now()-since)} ms`);return performance.now()};const at3=performance.now();container=createContainer({...message.options,vfs:new PackedVirtualFS(store)});for(const entry of handoff2?.overlay??[]){if(entry.type==="directory"){if(!container.vfs.existsSync(entry.path))container.vfs.mkdirSync(entry.path,{recursive:true})}else container.vfs.writeFileSync(entry.path,entry.bytes)}{const active3=container;mountContainerProc(active3.vfs,ownerProcessTable,()=>active3.serverBridge.getServerPorts().map(port2=>{const pid=active3.portPid(port2);return{port:port2,...pid?{pid}:{}}}),()=>active3.streamHandles())}phase("engine",at3);console.log(`[worker] started in ${Math.round(performance.now()-startedAt)} ms: ${phases.join(", ")}`);if(message.toolchain?.typeStripperModuleUrl)await installTypeStripper(new URL(message.toolchain.typeStripperModuleUrl,scope3.location.href).href);webSocketRelay=createVirtualWebSocketRelay(relayed=>send({type:"ws",message:relayed}));if(message.bundler)installBundler(container.vfs,message.bundler);threads=installNodeThreadHost(container.vfs,message.bundler,{projectId:String(message.store.projectId),flush:()=>store.flush()});installFilesystemForwarding(container.vfs);installRootNodeEntryBridge();if(message.toolchain)installToolchain(container,message.toolchain);installNetworkBroker();installChildProcessBridge();const index2=[];let sharedIndex;if(!handoff2){if(message.sharedPageIndexVersion===1){store.clock();const seed=store.readerSeed({current:true});if(seed)sharedIndex={buffer:seed.index,roots:PROJECT_ROOTS,bytes:seed.liveBytes+seed.linkedBytes}}if(!sharedIndex)for(const[path3,entry]of store.entries)index2.push([path3,entry.type,entry.length,entry.mode,entry.mtimeMs])}send({type:"initialized",id:message.id,filesystemPolicyVersion:1,inputBytesVersion:1,store:{opened,index:index2,...sharedIndex?{sharedIndex}:{},treeImport:true,limitsVersion:1,entryReadVersion:1}});settleEngineInitialized?.resolve();return}}if(message.type==="fetch-response-start"){const pending=pendingFetches.get(message.id);if(!pending)return;pendingFetches.delete(message.id);try{const id2=message.id;const body=pending.method==="HEAD"||[204,205,304].includes(message.status)?null:new ReadableStream({start(controller){responseStreams.set(id2,controller)},pull(){pullFetch(id2)},cancel(){responseStreams.delete(id2);fetchAbortCleanup.get(id2)?.();fetchAbortCleanup.delete(id2);try{send({type:"fetch-abort",id:id2})}catch{}}},{highWaterMark:0});fetchActivities.get(id2)?.headersDone();pending.resolve({body,status:message.status,statusText:message.statusText,headers:message.headers});if(body===null)pullFetch(id2)}catch(cause){fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);try{send({type:"fetch-abort",id:message.id})}catch{}pending.reject(cause instanceof Error?cause:new Error(String(cause)))}return}if(message.type==="fetch-response-chunk"){fetchActivities.get(message.id)?.pulls.shift()?.();responseStreams.get(message.id)?.enqueue(new Uint8Array(message.body));return}if(message.type==="fetch-response-end"){const stream=responseStreams.get(message.id);responseStreams.delete(message.id);fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);stream?.close();return}if(message.type==="fetch-response"||message.type==="fetch-error"){const pending=pendingFetches.get(message.id);if(message.type==="fetch-error"){if(pending){pendingFetches.delete(message.id);pending.reject(new Error(message.error))}const stream=responseStreams.get(message.id);responseStreams.delete(message.id);fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);stream?.error(new Error(message.error))}else if(!pending)return;else{pendingFetches.delete(message.id);fetchAbortCleanup.get(message.id)?.();fetchAbortCleanup.delete(message.id);try{pending.resolve({body:pending.method==="HEAD"||[204,205,304].includes(message.status)?null:new ReadableStream({start(controller){controller.enqueue(new Uint8Array(message.body));controller.close()}}),status:message.status,statusText:message.statusText,headers:message.headers})}catch(cause){pending.reject(cause instanceof Error?cause:new Error(String(cause)))}}return}if(message.type==="apply-layers"){try{const result=await applyImageLayers(message.url,message.digest,(parts,total)=>send({type:"applying-layers",id:message.id,parts,total}),message.prepared);send({type:"layers-applied",id:message.id,...result})}catch(cause){send({type:"layers-applied",id:message.id,parts:0,units:0,bytes:0,skipped:false,error:cause instanceof Error?cause.message:String(cause)})}return}if(message.type==="link-program"){try{send({type:"linked-program",id:message.id,...await linkImageProgram(message.source,message.target)})}catch(cause){send({type:"linked-program",id:message.id,linked:false,files:0,error:cause instanceof Error?cause.message:String(cause)})}return}if(message.type==="link-packages"){try{if(!linkPlan)throw new Error("The origin's package store is not open.");const result=await linkPlan(message.root,message.plan,(linked,total,waiting)=>send({type:"linking-packages",id:message.id,linked,total,...waiting?{waiting}:{}}));send({type:"linked-packages",id:message.id,...result})}catch(cause){const described=cause instanceof Error?cause.message?`${cause.name==="Error"?"":`${cause.name}: `}${cause.message}`:cause.name:String(cause);send({type:"linked-packages",id:message.id,linked:0,fetched:0,fromStore:0,error:described})}return}if(message.type==="pack-store-abort"){packStoreOperations.get(message.id)?.abort();return}if(message.type==="pack-store"){const controller=new AbortController;packStoreOperations.set(message.id,controller);try{await answerPackStore(message,controller.signal,{packages,project:packStore,linkShared:(source,target)=>{const vfs2=requiredContainer().vfs;if(!(vfs2 instanceof PackedVirtualFS))throw new Error("The live pack needs the worker's packed filesystem.");vfs2.linkShared(source,target)},send})}finally{packStoreOperations.delete(message.id)}return}if(message.type==="image-file"){const pending=pendingImageFiles.get(message.id);pendingImageFiles.delete(message.id);if(!pending)return;if(message.error!==void 0||message.bytes===void 0)pending.reject(new Error(`The image's file could not be read: ${message.error??"the page answered without it"}`));else pending.resolve({bytes:new Uint8Array(message.bytes),inflated:message.inflated===true});return}if(message.type==="image-pack"){const pending=pendingImagePacks.get(message.id);pendingImagePacks.delete(message.id);if(!pending)return;if(message.error!==void 0||message.text===void 0)pending.reject(new Error(message.error??"the page answered without the pack"));else pending.resolve(message.text);return}if(message.type==="image-packs-expected"){imagePacksKnown??=new Promise(resolve2=>{settleImagePacksKnown=resolve2});return}if(message.type==="image-packs-abandoned"){settleImagePacksKnown?.();imagePacksKnown=settleImagePacksKnown=void 0;return}if(message.type==="image-packs"){try{const packs=readImagePacks(message.keys);settleImagePacksKnown?.();imagePacksKnown=settleImagePacksKnown=void 0;if(message.bodies?.length)await linkPreparedBodies(message.bodies);send({type:"image-packs-read",id:message.id,packs})}catch(cause){send({type:"image-packs-read",id:message.id,packs:0,error:cause instanceof Error?cause.message:String(cause)})}finally{settleImagePacksKnown?.();imagePacksKnown=settleImagePacksKnown=void 0}return}if(message.type==="ws"){webSocketRelay?.receive(message.message);return}if(message.type==="watched-paths"){const vfs2=container?.vfs;const paths=typeof vfs2?.watchedPaths==="function"?vfs2.watchedPaths():vfs2?.watchers?[...vfs2.watchers.entries()].filter(([,entries])=>[...entries].some(entry=>!entry.closed)).map(([path3,entries])=>({path:path3,recursive:[...entries].some(entry=>!entry.closed&&entry.recursive===true)})):[];send({type:"watched-paths",id:message.id,paths});return}if(message.type==="store-stats"){const account=installAccounting();send({type:"store-stats",id:message.id,stats:packStore?{...packStore.stats(),...account?{install:account}:{}}:null});return}if(message.type==="image-startup-set"){send({type:"image-startup-set",id:message.id,ranges:packages?.imageStartupSet()??[]});return}if(message.type==="image-prefetch"){const startedAt=performance.now();const prefetch=packages?.prefetchImage(message.ranges,message.streams)??{queued:0,done:Promise.resolve()};send({type:"image-prefetch",id:message.id,queued:prefetch.queued});if(prefetch.queued>0)void prefetch.done.then(()=>send({type:"image-prefetched",id:message.id,ms:Math.round(performance.now()-startedAt)}));return}if(message.type==="profile-probe"){send({type:"profile-pong",id:message.id});return}if(message.type==="host-ports"){hostPorts=new Set(message.ports.filter(candidate=>Number.isInteger(candidate)&&candidate>0&&candidate<65536));for(const listener of hostPortListeners)listener(hostPorts);return}if(message.type==="listen-net"||message.type==="unlisten-net"||message.type==="net-data"||message.type==="net-end"){handleNetMessage(message);return}if(message.type==="child-input-consumed"){const pending=pendingChildInput.get(message.id);pendingChildInput.delete(message.id);pending?.resolve();return}if(message.type==="child-fd-consumed"){const key=childFdKey(message.id,message.fd);const pending=pendingChildFdInput.get(key);pendingChildFdInput.delete(key);pending?.resolve();return}if(message.type==="child-fd-output"||message.type==="child-fd-close"){const pending=pendingChildren.get(message.id);const descriptor=validChildFd(message.fd)?pending?.descriptors?.[message.fd]:void 0;if(!pending||!descriptor)return;if(message.type==="child-fd-close"){descriptor.end();return}if(!(message.bytes instanceof ArrayBuffer)||message.bytes.byteLength>childChunkBytes){pendingChildren.delete(message.id);try{send({type:"child-abort",id:message.id})}catch{}pending.reject(new Error("Child process descriptor chunks must be at most 64 KiB."));return}descriptor.write(new Uint8Array(message.bytes));return}if(message.type==="child-output"||message.type==="child-result"||message.type==="child-error"){const pending=pendingChildren.get(message.id);if(!pending)return;if(message.type==="child-output"){if(message.stream==="stdout")pending.onStdout?.(message.chunk);else pending.onStderr?.(message.chunk);return}console.log(`[boot-trace] ${JSON.stringify({event:message.type,at:Date.now(),id:message.id,owner:pending.owner})}`);pendingChildren.delete(message.id);if(message.type==="child-error")pending.reject(new Error(message.error));else pending.resolve({stdout:message.stdout,stderr:message.stderr,exitCode:message.exitCode,...message.signal?{signal:message.signal}:{}});return}const active2=requiredContainer();if(message.type==="fs-watch-event"){invocationFiles?.notifyWatch(message.event,message.path);return}if(message.type==="fs-event"){invocationFiles?.notify(message.event,message.path);return}if(message.type==="run"&&message.filesystemPolicy&&!invocationPolicy){if(!executionConfiguration)throw new Error("Confined Node execution has no worker configuration.");const configuration=executionConfiguration;const policy=normalizeProcessFilesystemPolicy(message.filesystemPolicy);const controller=new AbortController;confinedRuns.set(message.id,controller);beginRun(message.id,message.command,{controller,...message.cwd?{cwd:message.cwd}:{},...message.executablePath?{executablePath:message.executablePath}:{}});const liveStdin=message.liveStdin?openLiveStdin(message.id):void 0;const terminal=message.terminal?openTerminal(message.id,message.terminal):void 0;void nodeProcesses.run(message.command,{...message.cwd?{cwd:message.cwd}:{},...message.env?{env:message.env}:{},...message.stdin!==void 0?{stdin:message.stdin}:{},...liveStdin?{stdinStream:liveStdin}:{},...terminal?{terminal}:{},signal:controller.signal,onStdout:chunk=>send({type:"output",id:message.id,stream:"stdout",chunk}),onStderr:chunk=>send({type:"output",id:message.id,stream:"stderr",chunk})},{filesystem:active2.vfs,...storeReadsFor(active2.vfs),policy,workerUrl:scope3.location.href,configuration,serverBridge:active2.serverBridge,net:pageNetHost,hostPorts:hostPortsHost,...moduleCacheOption(active2.vfs),runChild:(command,options,argv)=>requestChild(command,options,message.id,argv),http:request=>brokerHttpOnce(request,{program:programFromCommand(message.command,message.executablePath),attributed:true,activePrograms:[programFromCommand(message.command,message.executablePath)]})}).then(async result=>{await packStore?.flush();flushFilesystemForwarding();sendResult(message.id,result)}).catch(cause=>{flushFilesystemForwarding();sendError(message.id,cause)}).finally(()=>{confinedRuns.delete(message.id);activeRuns.delete(message.id);liveStdins.get(message.id)?.close(true);liveStdins.delete(message.id);terminals.delete(message.id)});return}if(message.type==="run"){const chain=splitShellChain(message.command).length>1;const routed=chain?void 0:routeCommand2(message.command,message.cwd??"/");const controller=new AbortController;beginRun(message.id,message.command,{...controller?{controller}:{},...message.cwd?{cwd:message.cwd}:{},...message.executablePath?{executablePath:message.executablePath}:{}});launchPorts.set(message.id,new Set(vfsServerBridge().getServerPorts()));if(message.interactive)heldRuns.add(message.id);const liveStdin=message.liveStdin?openLiveStdin(message.id):void 0;const terminal=message.terminal?openTerminal(message.id,message.terminal):void 0;const runOptions={...message.cwd?{cwd:message.cwd}:{},...message.env?{env:message.env}:{},...controller?{signal:controller.signal}:{},held:message.interactive,...{processToken:String(message.id)},...message.stdin!==void 0?{stdin:message.stdin}:{},...liveStdin?{stdinStream:liveStdin}:{},...terminal?{terminal}:{},onStdout:chunk=>send({type:"output",id:message.id,stream:"stdout",chunk}),onStderr:chunk=>send({type:"output",id:message.id,stream:"stderr",chunk})};const running=chain?runCommand2(message.command,runOptions):routed?routed.runner(routed.argv,{...runOptions,env:{...runOptions.env,...routed.env}}):engineRun(active2,message.command,runOptions);void running.then(async result=>{console.log(`[boot-trace] ${JSON.stringify({event:"body-return",at:Date.now(),id:message.id,exitCode:result.exitCode,ports:runPorts(message.id),imageBlocked:imageBlocked()})}`);await workSettled(message.id,message.interactive);flushFilesystemForwarding();const aborted=activeRuns.get(message.id)?.controller?.signal.aborted===true;sendResult(message.id,aborted&&result.exitCode===0?{...result,exitCode:143}:result)},cause=>{flushFilesystemForwarding();sendError(message.id,cause)}).finally(()=>{liveStdins.get(message.id)?.close(true);liveStdins.delete(message.id);terminals.delete(message.id);activeRuns.delete(message.id);launchPorts.delete(message.id);heldRuns.delete(message.id)})}else if(message.type==="stdin"){if(message.id!==void 0){const input=liveStdins.get(message.id);if(message.bytes&&input){const id2=message.id;void input.write(new Uint8Array(message.bytes)).then(()=>send({type:"stdin-consumed",id:id2})).catch(cause=>{activeRuns.get(id2)?.controller?.abort(cause);if(!workerDisposing)sendError(id2,cause)})}else if(input)input.push(message.data);else if(message.data!==void 0)active2.sendInput(message.data,String(message.id))}else active2.sendInput(message.data)}else if(message.type==="stdin-end"){liveStdins.get(message.id)?.close();liveStdins.delete(message.id)}else if(message.type==="resize"){terminals.get(message.id)?.resize(message.columns,message.rows)}else if(message.type==="signal"){active2.signalProcess?.(String(message.id),message.signal)}else if(message.type==="abort"){if(heldRuns.has(message.id))closeRunServers(message.id);confinedRuns.get(message.id)?.abort();for(const[childId,child]of pendingChildren){if(child.owner===message.id)send({type:"child-abort",id:childId})}active2.stopProcess?.(String(message.id));liveStdins.get(message.id)?.close(true);liveStdins.delete(message.id);terminals.delete(message.id);activeRuns.get(message.id)?.controller?.abort()}else if(message.type==="fs-apply"){suppressFilesystemEvents=true;try{for(const operation of message.operations){try{applyStoreOperation(active2.vfs,operation)}catch(cause){storeWriteFailure??=cause instanceof Error?cause:new Error(String(cause));const paths=operation.op==="rename"?[operation.from,operation.to]:[operation.path];for(const path3 of paths)queueIndexForwarding(storeEntryOf(active2.vfs,path3));console.error(`The workspace refused ${operation.op} ${paths.join(" -> ")}: ${cause instanceof Error?cause.message:String(cause)}`)}}}finally{suppressFilesystemEvents=false}}else if(message.type==="fs-import"){reportStoreWriteFailure();if(!(active2.vfs instanceof PackedVirtualFS)||!packStore){send({type:"fs-imported",id:message.id,applied:false,changes:[]});return}flushFilesystemForwarding();const root2=normalizeStorePath2(message.tree.root);importingFilesystemRoot=root2;suppressFilesystemEvents=true;let applied;try{applied=active2.vfs.importTree(message.tree)}finally{suppressFilesystemEvents=false;importingFilesystemRoot=void 0}const changes=[];if(applied){changes.push([root2,null]);for(const[path3,entry]of packStore.descendants(root2)){changes.push([path3,entry.type,entry.type==="file"?entry.length:0,entry.mode,entry.mtimeMs])}}send({type:"fs-imported",id:message.id,applied,changes})}else if(message.type==="fs-read"){try{const bytes2=Uint8Array.from(active2.vfs.readFileSync(message.path));const body=bytes2.buffer.slice(bytes2.byteOffset,bytes2.byteOffset+bytes2.byteLength);send({type:"fs-read-result",id:message.id,bytes:body},[body])}catch(cause){sendError(message.id,cause)}}else if(message.type==="fs-entry"){reportStoreWriteFailure();const path3=normalizeStorePath2(message.path);flushFilesystemForwarding();if(!active2.vfs.existsSync(path3)){send({type:"fs-entry-result",id:message.id})}else{const stat2=active2.vfs.statSync(path3);const metadata={path:path3,mode:stat2.mode&4095,mtimeMs:stat2.mtimeMs};if(stat2.isDirectory()){send({type:"fs-entry-result",id:message.id,entry:{...metadata,type:"directory"}})}else{const bytes2=Uint8Array.from(active2.vfs.readFileSync(path3));send({type:"fs-entry-result",id:message.id,entry:{...metadata,type:"file",bytes:bytes2}},[bytes2.buffer])}}}else if(message.type==="fs-flush"){reportStoreWriteFailure();packStore?.flush();send({type:"fs-flushed",id:message.id})}else if(message.type==="port-stream-request"){const stream={abort:new AbortController,pause:()=>void 0,resume:()=>void 0};portStreams.set(message.id,stream);try{const answered=await active2.serverBridge.handleStreamingRequest(message.port,message.method,message.url,message.headers,message.body,{start:(statusCode,statusMessage,headers)=>send({type:"port-stream-head",id:message.id,statusCode,statusMessage,headers}),chunk:chunk=>{const body=Uint8Array.from(chunk).buffer;send({type:"port-stream-chunk",id:message.id,body},[body])},end:()=>send({type:"port-stream-end",id:message.id})},{signal:stream.abort.signal,control:(pause,resume)=>{stream.pause=pause;stream.resume=resume}});if(!answered){send({type:"port-stream-head",id:message.id,statusCode:503,statusMessage:"Service Unavailable",headers:{}});send({type:"port-stream-end",id:message.id})}}finally{portStreams.delete(message.id)}}else if(message.type==="port-stream-control"){const stream=portStreams.get(message.id);if(message.action==="pause")stream?.pause();else if(message.action==="resume")stream?.resume();else stream?.abort.abort()}else if(message.type==="request"){const response=await active2.serverBridge.handleRequest(message.port,message.method,message.url,message.headers,message.body);const bytes2=response.body?Uint8Array.from(response.body):new Uint8Array;const body=bytes2.buffer.slice(bytes2.byteOffset,bytes2.byteOffset+bytes2.byteLength);send({type:"response",id:message.id,statusCode:response.statusCode,statusMessage:response.statusMessage??"",headers:response.headers,body},[body])}}catch(cause){if(message.type==="init")settleEngineInitialized?.reject(cause);if("id"in message&&typeof message.id==="number")sendError(message.id,cause)}}function assertWorkerActive(){if(workerDisposing)throw new Error("Browser Node host is disposed.")}async function disposeWorker(){workerDisposing=true;const reapedProcesses=nodeProcesses.dispose();const failures=[];const release2=operation=>{try{operation()}catch(cause){failures.push(cause)}};for(const controller of confinedRuns.values())release2(()=>controller.abort());confinedRuns.clear();for(const socket of netSockets.values())release2(()=>socket.destroy());netSockets.clear();for(const unlisten of netListeners.values())release2(unlisten);netListeners.clear();netListenerChanges.clear();for(const controller of packStoreOperations.values())controller.abort();packStoreOperations.clear();for(const run of activeRuns.values())release2(()=>run.controller?.abort());for(const input of liveStdins.values())release2(()=>input.close(true));liveStdins.clear();terminals.clear();for(const pending of pendingChildren.values())pending.reject(new Error("Browser Node host was disposed."));pendingChildren.clear();for(const pending of pendingFetches.values())pending.reject(new Error("Browser Node host was disposed."));pendingFetches.clear();for(const stream of responseStreams.values())stream.error(new Error("Browser Node host was disposed."));responseStreams.clear();for(const cleanup of fetchAbortCleanup.values())cleanup();fetchAbortCleanup.clear();await reapedProcesses;release2(()=>threads?.dispose());threads=void 0;try{await toolchain?.dispose()}catch(cause){failures.push(cause)}toolchain=void 0;preparedEnvironments.clear();preparedBindings.clear();preparedModuleRefusals.clear();release2(()=>bundler?.dispose());bundler=void 0;release2(()=>packStore?.close());packStore=void 0;release2(()=>packages?.close());packages=void 0;release2(()=>releasePackagesOpen?.());releasePackagesOpen=void 0;release2(()=>releaseProject?.());releaseProject=void 0;activeRuns.clear();release2(()=>port?.close());if(failures.length)console.error("Browser Node worker cleanup failed.",new AggregateError(failures));scope3.close()}function installBundler(vfs2,options){bundler=new BrowserBundler(vfs2,options);const shim=esbuildShim;shim.setModuleURL(new URL(options.esbuildModuleUrl,scope3.location.href).href);shim.setWasmURL(new URL(options.esbuildWasmUrl,scope3.location.href).href);if(options.rollupModuleUrl)Reflect.set(globalThis,"__browserRuntimeRollupUrl",new URL(options.rollupModuleUrl,scope3.location.href).href);Reflect.set(globalThis,"__browserRuntimeRollupFs",rollupFsOver(requiredContainer().vfs));bundler.prebundle=vitePrebundleAssembler(vfs2,projectModuleCache(vfs2));shim.useHost(bundler)}function normalizeStorePath2(path3){const parts=[];for(const part of path3.split("/")){if(!part||part===".")continue;if(part==="..")parts.pop();else parts.push(part)}return`/${parts.join("/")}`}var installAccount={packages:0,linkedFromStore:0,downloadMs:0,downloadBytes:0,lockWaitMs:0,extractMs:0,extractHelpers:0,applyMs:0,linkMs:0,announceMs:0,sharedFlushes:0,sharedFlushMs:0,elapsedMs:0,lastAt:0};var packStoreOperations=new Map;function installAccounting(){if(installAccount.packages===0)return void 0;const{firstAt,lastAt,...account}=installAccount;return{...account,elapsedMs:firstAt===void 0?0:Math.round(lastAt-firstAt)}}function installPackageStore(shared){const sharedFilesystem=new PackedVirtualFS(shared,PACKAGES_ROOT);packagesFilesystem=sharedFilesystem;const making=new Map;const ensure=async(key,tarballUrl,integrity,pack)=>{try{return await make(key,tarballUrl,integrity,pack)}finally{making.delete(key)}};const make=async(key,tarballUrl,integrity,pack)=>{const startedAt=performance.now();installAccount.firstAt??=startedAt;if(!pack){installTrap({door:"package extraction",subject:`${key} has no pack; the tab would download and extract ${tarballUrl}`,detail:{key,tarball:tarballUrl,...integrity?{integrity}:{}}})}const digest=pack.artifact.digest;const store=livePackStore(shared);let fetched=false;if(!await store.hasTree(digest)){making.set(key,"receiving");const bytes2=await imageFile(pack.url);const actual=`sha256:${[...new Uint8Array(await crypto.subtle.digest("SHA-256",bytes2))].map(byte=>byte.toString(16).padStart(2,"0")).join("")}`;if(actual!==digest||bytes2.byteLength!==pack.artifact.bytes){installTrap({door:"image pack",subject:`${key}'s pack at ${pack.url} is not the artifact the plan names (${bytes2.byteLength} bytes, ${actual}; the plan names ${pack.artifact.bytes} bytes, ${digest})`,detail:{key}})}installAccount.downloadBytes+=bytes2.byteLength;installAccount.downloadMs+=performance.now()-startedAt;making.set(key,"storing");const stagedAt=performance.now();await store.stageArtifact(digest,bytes2,pack.artifact);installAccount.extractMs+=performance.now()-stagedAt;fetched=true}return{home:browserPackExpandedPath(digest),fetched}};const link2=(vfs2,home,path3,fromStore)=>{if(fromStore)installAccount.linkedFromStore+=1;const linkStartedAt=performance.now();const announcedBefore=vfs2.linkTiming.announceMs;vfs2.linkShared(home,path3);installAccount.linkMs+=performance.now()-linkStartedAt;installAccount.announceMs+=vfs2.linkTiming.announceMs-announcedBefore;installAccount.packages+=1;installAccount.lastAt=performance.now()};const hook=async(name,pkg,pkgPath,vfs2)=>{if(!(vfs2 instanceof PackedVirtualFS))return false;const ensured=await ensure(`${name}@${pkg.version}`,pkg.tarballUrl);if(!ensured)return false;link2(vfs2,ensured.home,pkgPath,!ensured.fetched);return true};Reflect.set(globalThis,Symbol.for("@volter/browser-runtime/package-install"),hook);linkPlan=async(root2,plan,progress)=>{const vfs2=requiredContainer().vfs;if(!(vfs2 instanceof PackedVirtualFS))throw new Error("The image's dependency plan needs the worker's store.");preparedBindings.set(root2,{...plan.nativeBindings??{}});preparedModuleRefusals.set(root2,{...plan.moduleRefusals??{}});if(executionConfiguration?.toolchain)executionConfiguration.toolchain.preparedModuleRefusals=Object.fromEntries(new Map([...Object.entries(executionConfiguration.toolchain.preparedModuleRefusals??{}),...preparedModuleRefusals]));if(executionConfiguration?.toolchain)executionConfiguration.toolchain.preparedBindings=Object.fromEntries(new Map([...Object.entries(executionConfiguration.toolchain.preparedBindings??{}),...preparedBindings]));preparedEnvironments.set(root2,{...plan.environment??{}});const at3=path3=>`${root2==="/"?"":root2}/${path3}`;const phases={};let phaseAt=performance.now();const phase=name=>{const now=performance.now();phases[name]=Math.round(now-phaseAt);phaseAt=now};const total=plan.links.length;let linked=0;let fetched=0;let fromStore=0;let lastReported=performance.now();const checkedAt=performance.now();installAccount.firstAt??=checkedAt;const prelinked=plan.key!==void 0&&preparedProjectPlans.get(root2)===plan.key;if(prelinked)preparedProjectPlans.delete(root2);const held=prelinked?new Set:await livePackStore(shared).presentTrees(plan.packages.flatMap(entry=>entry.pack?[entry.pack.artifact.digest]:[]));installAccount.lockWaitMs+=performance.now()-checkedAt;const homes=new Map;const homeOf=index2=>{let pending=homes.get(index2);if(!pending){const entry=plan.packages[index2];const digest=entry.pack?.artifact.digest;if(digest!==void 0&&held.has(digest)){fromStore+=1;pending=Promise.resolve({home:browserPackExpandedPath(digest),fetched:false});homes.set(index2,pending);return pending}pending=ensure(`${entry.name}@${entry.version}`,entry.tarball,entry.integrity,entry.pack).then(ensured=>{if(!ensured)throw new Error(`${entry.name}@${entry.version}: this thread cannot fetch packages into the store.`);if(ensured.fetched)fetched+=1;else fromStore+=1;return ensured});homes.set(index2,pending)}return pending};const links=[...plan.links].sort((left,right)=>depth3(left.path)-depth3(right.path)||left.path.localeCompare(right.path));const platformFits=new Map;const fitsPlatform=(index2,home)=>{let fits=platformFits.get(index2);if(fits!==void 0)return fits;if(plan.packages[index2]?.placed){platformFits.set(index2,true);return true}const prepared=plan.packages[index2]?.linuxX64;if(prepared!==void 0){platformFits.set(index2,prepared);return prepared}fits=true;try{const store=packagesFilesystem&&packagesFilesystem.existsSync(`${home}/package.json`)?packagesFilesystem:vfs2;const manifest=JSON.parse(store.readFileSync(`${home}/package.json`,"utf8"));const allows=(field,value)=>{if(!Array.isArray(field)||field.length===0)return true;const names2=field.filter(item=>typeof item==="string");const denied=names2.filter(name=>name.startsWith("!")).map(name=>name.slice(1));const allowed=names2.filter(name=>!name.startsWith("!"));if(denied.includes(value))return false;return allowed.length===0||allowed.includes(value)};fits=allows(manifest.os,"linux")&&allows(manifest.cpu,"x64")}catch{}platformFits.set(index2,fits);return fits};const place=async entry=>{const{home,fetched:wasFetched}=await homeOf(entry.package);if(!fitsPlatform(entry.package,home)){const stale=at3(entry.path);try{if(vfs2.existsSync(stale))removeTree2(vfs2,stale)}catch{}}else{link2(vfs2,home,at3(entry.path),!wasFetched)}linked+=1;if(performance.now()-lastReported>500){lastReported=performance.now();progress(linked,total)}};const nested=path3=>{const at4=path3.lastIndexOf("node_modules/");const rest=(at4<0?path3:path3.slice(at4+"node_modules/".length)).split("/").filter(Boolean);const nameLength=rest[0]?.startsWith("@")?2:1;return rest.length>nameLength};const first=links.filter(entry=>!nested(entry.path));const later=links.filter(entry=>nested(entry.path));const concurrency=16;let next2=0;let stopped2=false;let linkedAtLastLook=-1;const watch2=setInterval(()=>{if(linked!==linkedAtLastLook){linkedAtLastLook=linked;return}progress(linked,total,[...making].map(([key,stage])=>`${key} ${stage}`))},STALL_REPORT_MS);try{const placed=await Promise.allSettled(Array.from({length:prelinked?0:Math.min(concurrency,first.length)},async()=>{while(!stopped2){const index2=next2++;if(index2>=first.length)return;try{await place(first[index2])}catch(cause){stopped2=true;throw cause}}}));const failures=placed.filter(result=>result.status==="rejected").map(result=>result.reason);if(failures.length===1)throw failures[0];if(failures.length>1)throw new AggregateError(failures,"Package placement failed.");if(prelinked){linked=total;fromStore=new Set(plan.links.filter(entry=>plan.packages[entry.package]?.placed||plan.packages[entry.package]?.linuxX64!==false).map(entry=>entry.package)).size}else for(const entry of later)await place(entry)}finally{clearInterval(watch2)}phase(prelinked?"prelinkedMs":"linksMs");for(const bin of plan.bins){const path3=at3(bin.path);const directory2=path3.slice(0,path3.lastIndexOf("/"));if(!vfs2.existsSync(directory2))vfs2.mkdirSync(directory2,{recursive:true});vfs2.writeFileSync(path3,`node "${at3(bin.target)}" "$@"
|
|
6103
|
+
`)}for(const entry of plan.entries??[]){const path3=at3(entry.path);const directory2=path3.slice(0,path3.lastIndexOf("/"));if(!vfs2.existsSync(directory2))vfs2.mkdirSync(directory2,{recursive:true});vfs2.writeFileSync(path3,entry.content)}phase("binsMs");if(plan.aliases.length>0)configurePlanAliases(vfs2,root2,plan.aliases);const workspace=discoverPnpmWorkspace(vfs2,root2);if(workspace)configureWorkspaceLinks(vfs2,workspace);phase("aliasesMs");console.log(`[boot-trace] ${JSON.stringify({event:"link-plan",at:Date.now(),root:root2,links:total,bins:plan.bins.length,entries:plan.entries?.length??0,aliases:plan.aliases.length,...phases})}`);progress(linked,total);return{linked,fetched,fromStore}}}function removeTree2(vfs2,path3){const stats=vfs2.lstatSync(path3);if(stats.isDirectory()&&!stats.isSymbolicLink()){for(const name of vfs2.readdirSync(path3))removeTree2(vfs2,`${path3}/${name}`);vfs2.rmdirSync(path3)}else{vfs2.unlinkSync(path3)}}var STALL_REPORT_MS=15e3;var linkPlan;var preparedProjectPlans=new Map;var preparedBindings=new Map;var preparedModuleRefusals=new Map;var preparedEnvironments=new Map;async function linkImageProgram(source,target){if(!packages)throw new Error("The origin's package store is not open.");const shared=packages;const vfs2=requiredContainer().vfs;if(!(vfs2 instanceof PackedVirtualFS))throw new Error("A program is linked into the worker's packed filesystem.");if(!source.startsWith("/packages/.programs/"))throw new Error(`${source} is not a program's tree in the shared store.`);return scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"shared"},async()=>{await shared.refresh();if(!shared.entries.has(`${source}/${PROGRAM_ARCHIVE_RECEIPT}`))return{linked:false,files:0};vfs2.linkShared(source,target);return{linked:true,files:shared.descendants(source).length}})}var imagePacks=new Set;var imagePacksKnown;var settleImagePacksKnown;var fetchingPacks=new Map;var PREPARED_BODY_LINK_BATCH=512;function readImagePacks(keys){imagePacks.clear();for(const key of keys)if(typeof key==="string")imagePacks.add(key);return imagePacks.size}async function linkPreparedBodies(keys){const vfs2=container?.vfs;if(!packages||!packagesFilesystem||!(vfs2 instanceof PackedVirtualFS))return;const shared=packages;const sharedFilesystem=packagesFilesystem;if(!vfs2.existsSync(PREPARED_MODULES_DIR))vfs2.mkdirSync(PREPARED_MODULES_DIR,{recursive:true});const present=new Set(vfs2.readdirSync(PREPARED_MODULES_DIR).map(String));const missing=keys.filter(key=>!present.has(key));if(missing.length===0)return;const startedAt=performance.now();let linked=0;let fetched=0;const held=missing.filter(key=>shared.entries.has(`${PACKAGES_ROOT}/.prepared/${key}`));const absent=missing.filter(key=>!shared.entries.has(`${PACKAGES_ROOT}/.prepared/${key}`));for(let offset2=0;offset2<held.length;offset2+=PREPARED_BODY_LINK_BATCH){const batch=held.slice(offset2,offset2+PREPARED_BODY_LINK_BATCH);vfs2.linkSharedBatch(batch.map(key=>({source:`${PACKAGES_ROOT}/.prepared/${key}`,path:`${PREPARED_MODULES_DIR}/${key}`})));linked+=batch.length}let next2=0;await Promise.all(Array.from({length:Math.min(8,absent.length)},async()=>{while(next2<absent.length){const key=absent[next2++];const source=`${PACKAGES_ROOT}/.prepared/${key}`;try{if(!shared.entries.has(source)){const body=await imagePack(key);await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(!shared.entries.has(source))sharedFilesystem.writeFileSync(source,body);if(shared.logBytes>8*1024*1024)await shared.checkpoint()});fetched+=1}vfs2.linkShared(source,`${PREPARED_MODULES_DIR}/${key}`);linked+=1}catch(cause){console.warn(`[modules] the image's prepared body ${key} could not be linked (${cause instanceof Error?cause.message:String(cause)}); the engine prepares that module itself.`)}}}));console.log(`[modules] ${linked} of ${missing.length} prepared bodies linked from the origin's store in ${Math.round(performance.now()-startedAt)} ms (${fetched} fetched from the image)`)}async function applyImageLayers(url2,digest,progress,compact){if(!packages)throw new Error("The origin's package store is not open.");const shared=packages;const applied=imageLayersAppliedPath(digest);const deferred=imageLayersDeferredPath(digest);await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"shared"},()=>shared.refresh());if(shared.entries.has(applied)||shared.entries.has(deferred)||shared.deferredImage===digest)return{parts:0,units:0,bytes:0,skipped:true};if(compact&&shared.packBytes===0&&new URL(url2).origin===scope3.location.origin){const text2=await imageFile(compact.url);const named2=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-256",text2)),byte=>byte.toString(16).padStart(2,"0")).join("");if(named2!==compact.digest)throw new Error("The prepared image descriptor is not the one its manifest names.");const descriptor=JSON.parse(new TextDecoder().decode(text2));if(descriptor.kind!=="browser-substrate-prepared-layers"||descriptor.version!==1||!Number.isSafeInteger(descriptor.units)||descriptor.units<0){throw new Error("Malformed prepared image descriptor.")}const prepared=validatePreparedImageIndex(descriptor.prepared);progress(0,2);const metadata=async file2=>{const answer2=await imageFileAnswer(new URL(file2.url,url2).href,file2);if(answer2.inflated)return answer2.bytes;if(answer2.bytes.byteLength!==file2.bytes)throw new Error("The image's metadata has the wrong served size.");return inflateLayerPart(answer2.bytes,file2.raw)};const[json,binary]=await Promise.all([metadata(prepared.json),metadata(prepared.binary)]);const ranges={...prepared.ranges,image:digest};const installed3=await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(shared.entries.has(deferred))return true;if(!await shared.installPreparedImage(prepared,json,binary,ranges))return false;shared.applyNow([{operation:"write",path:deferred,content:new Uint8Array(0),mode:292}],{durable:true});return true});if(installed3){progress(2,2);return{parts:0,units:descriptor.units,bytes:prepared.json.bytes+prepared.binary.bytes,skipped:false}}}const text=await imageFile(url2);const named=[...new Uint8Array(await crypto.subtle.digest("SHA-256",text))].map(byte=>byte.toString(16).padStart(2,"0")).join("");if(!named.startsWith(digest))throw new Error(`The image's layers document at ${url2} is not the one its manifest names.`);const document2=validateImageLayers(JSON.parse(new TextDecoder().decode(text)));const needed=document2.parts.filter(part=>part.units.some(unit=>!shared.entries.has(unit.marker)));let parts=0,units=0,bytes2=0,next2=0;let failed=false;const placedAt=Date.now();progress(0,needed.length);await shared.deferMaintenance(async()=>{const results=await Promise.allSettled(Array.from({length:Math.min(LAYER_PARTS_AT_ONCE,needed.length)},async()=>{while(next2<needed.length&&!failed){const part=needed[next2++];try{const answer2=await imageFileAnswer(new URL(part.url,url2).href,{bytes:part.bytes,raw:part.raw,sha256:part.sha256});let raw=answer2.bytes;if(!answer2.inflated){if(raw.byteLength!==part.bytes)throw new Error(`The image's layer part ${part.url} is ${raw.byteLength} bytes; its document says ${part.bytes}.`);raw=await inflateLayerPart(raw,part.raw);const actual=[...new Uint8Array(await crypto.subtle.digest("SHA-256",raw))].map(byte=>byte.toString(16).padStart(2,"0")).join("");if(actual!==part.sha256)throw new Error(`The image's layer part ${part.url} is not the part its document names.`)}else if(raw.byteLength!==part.raw)throw new Error(`The image's layer part ${part.url} came inflated to ${raw.byteLength} bytes; its document says ${part.raw}.`);await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();const files=[];const slices=[];let size=0;for(const unit of part.units){if(shared.entries.has(unit.marker))continue;let start=Infinity,end=0;for(const[,type2,,offset2,length]of unit.files)if(type2!=="d"){start=Math.min(start,offset2);end=Math.max(end,offset2+length)}if(start===Infinity)start=end=0;const base=size-start;let marked=false;for(const[relative2,type2,mode,offset2,length]of unit.files){const path3=imageLayerPath(unit,relative2);if(path3===unit.marker)marked=true;files.push(type2==="d"?{path:path3,type:"directory",mode,mtimeMs:placedAt}:{path:path3,type:type2==="l"?"symlink":"file",mode,mtimeMs:placedAt,offset:base+offset2,length})}if(!marked)files.push({path:unit.marker,type:"file",mode:292,mtimeMs:placedAt,offset:0,length:0});slices.push(raw.subarray(start,end));size+=end-start;units+=1}if(files.length===0)return;const bytes3=slices.length===1?slices[0]:new Uint8Array(size);if(slices.length>1){let cursor=0;for(const slice of slices){bytes3.set(slice,cursor);cursor+=slice.byteLength}}shared.applyExtentsNow(bytes3,files)});parts+=1;bytes2+=part.bytes;progress(parts,needed.length)}catch(cause){failed=true;throw cause}}}));const rejected=results.find(result=>result.status==="rejected");if(rejected)throw rejected.reason;await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(!shared.entries.has(applied))shared.applyNow([{operation:"write",path:applied,content:new Uint8Array(0),mode:292}]);if(shared.logBytes>0)await shared.checkpoint()})});return{parts,units,bytes:bytes2,skipped:false}}var LAYER_PARTS_AT_ONCE=6;async function inflateLayerPart(served,raw){const reader=new Blob([served]).stream().pipeThrough(new DecompressionStream("gzip")).getReader();const out=new Uint8Array(raw);let offset2=0;for(;;){const{done,value}=await reader.read();if(done)break;if(offset2+value.byteLength>raw)throw new Error("An image layer part inflates past its raw size.");out.set(value,offset2);offset2+=value.byteLength}if(offset2!==raw)throw new Error("An image layer part inflates short of its raw size.");return out}var nextImagePackRead=1;var pendingImagePacks=new Map;var pendingImageFiles=new Map;var nextImageFileRead=1;async function imageFile(url2){return(await imageFileAnswer(url2)).bytes}function imageFileAnswer(url2,part){const id2=nextImageFileRead++;return new Promise((resolve2,reject)=>{pendingImageFiles.set(id2,{resolve:resolve2,reject});send({type:"image-file-read",id:id2,url:url2,...part?{part}:{}})})}function imagePack(key){const id2=nextImagePackRead++;return new Promise((resolve2,reject)=>{pendingImagePacks.set(id2,{resolve:resolve2,reject});send({type:"image-pack-read",id:id2,key})})}function moduleCacheOver(shared,sharedFilesystem,project){const home=key=>`${PACKAGES_ROOT}/.modules/${key}`;const keepShared=async(source,code3)=>{await scope3.navigator.locks.request(PACKAGES_LOCK,{mode:"exclusive"},async()=>{await shared.refresh();if(!shared.entries.has(source))sharedFilesystem.writeFileSync(source,code3);else{const now=new Date;sharedFilesystem.utimesSync(source,now,now)}if(shared.logBytes>8*1024*1024){console.warn(`[modules] the shared store checkpoints at ${Math.round(shared.logBytes/1024)} KiB of log, after ${source}`);await shared.checkpoint()}})};const fromImage=(key,source)=>{let pending=fetchingPacks.get(key);if(pending)return pending;pending=(async()=>{try{await keepShared(source,await imagePack(key));return true}catch(cause){if(isInstallRefused(cause))throw cause;const message=cause instanceof Error?cause.message:String(cause);if(/\b4\d\d\b|not found|no pack/iu.test(message))installTrap({door:"image pack",subject:`the image names a pack for ${key} its origin cannot give: ${message}`,detail:{key}});throw new Error(`The image's pack for ${key} could not be read this time (${message}); reloading the page tries again.`)}finally{fetchingPacks.delete(key)}})();fetchingPacks.set(key,pending);return pending};const reportedMisses=new Set;const reportMiss=(key,carried)=>{if(reportedMisses.has(key))return;reportedMisses.add(key);console.log(carried?`[modules] this tab's store has no pack at ${key}; fetching the one the image's index names.`:`[modules] neither this tab's store nor the image has a pack at ${key}; the tab builds it.`)};return{link:async(key,target)=>{const source=home(key);let fetched=false;if(!shared.entries.has(source)&&imagePacksKnown)await imagePacksKnown;if(!shared.entries.has(source)){reportMiss(key,imagePacks.has(key));if(!imagePacks.has(key))return false;if(!await fromImage(key,source))return false;fetched=true}project.linkShared(source,target);if(!project.existsSync(target)){console.warn(`[modules] linked ${key} to ${target} and it is not there: fetched ${fetched}, shared holds ${shared.entries.has(source)}, the project's parent ${project.existsSync(target.slice(0,target.lastIndexOf("/")))}`)}return true},keep:async(key,code3,target)=>{const source=home(key);await keepShared(source,code3);project.linkShared(source,target)}}}function requiredContainer(){if(!container)throw new Error("Browser Node host is not initialized.");return container}function installFilesystemForwarding(vfs2){const suppressed=path3=>{if(!suppressFilesystemEvents)return false;if(importingFilesystemRoot===void 0)return true;const normalized=normalizeStorePath2(path3);return normalized===importingFilesystemRoot||normalized.startsWith(`${importingFilesystemRoot==="/"?"":importingFilesystemRoot}/`)};vfs2.on("change",path3=>{if(suppressed(path3)||!vfs2.existsSync(path3))return;const stat2=vfs2.statSync(path3);queueIndexForwarding([path3,stat2.isDirectory()?"directory":"file",stat2.isDirectory()?0:stat2.size,stat2.mode&4095,stat2.mtimeMs])});vfs2.on("delete",path3=>{if(!suppressed(path3))queueIndexForwarding([path3,null])});installPortForwarding()}function installPortForwarding(){const bridge=vfsServerBridge();const register=bridge.registerServer.bind(bridge);const unregister=bridge.unregisterServer.bind(bridge);bridge.registerServer=((server,serverPort,hostname2)=>{console.log(`[boot-trace] ${JSON.stringify({event:"port-register",at:Date.now(),port:serverPort,token:container?.currentProcessToken(),imageBlocked:imageBlocked()})}`);register(server,serverPort,hostname2);if(netListeners.has(serverPort))return;send({type:"port",action:"open",port:serverPort,...hostname2?{hostname:hostname2}:{}})});bridge.unregisterServer=(serverPort=>{console.log(`[boot-trace] ${JSON.stringify({event:"port-unregister",at:Date.now(),port:serverPort,token:container?.currentProcessToken(),imageBlocked:imageBlocked()})}`);unregister(serverPort);if(netListeners.has(serverPort))return;send({type:"port",action:"close",port:serverPort})})}var pendingIndexForwarding=[];function queueIndexForwarding(change){pendingIndexForwarding.push(change);if(filesystemForwardingScheduled)return;filesystemForwardingScheduled=true;queueMicrotask(flushFilesystemForwarding)}function storeEntryOf(vfs2,path3){if(!vfs2.existsSync(path3))return[path3,null];const stat2=vfs2.lstatSync(path3);const type2=stat2.isDirectory()?"directory":stat2.isSymbolicLink()?"symlink":"file";return[path3,type2,type2==="file"?stat2.size:0,stat2.mode&4095,stat2.mtimeMs]}function applyStoreOperation(vfs2,operation){const withModes=vfs2;if(operation.op==="write"){writeFile(vfs2,operation.path,new Uint8Array(operation.bytes));if(operation.mode!==void 0)withModes.chmodSync?.(operation.path,operation.mode);withModes.utimesSync?.(operation.path,new Date(operation.mtimeMs),new Date(operation.mtimeMs))}else if(operation.op==="mkdir"){if(!vfs2.existsSync(operation.path))vfs2.mkdirSync(operation.path,{recursive:true})}else if(operation.op==="remove"){removePath(vfs2,operation.path)}else if(operation.op==="rename"){vfs2.renameSync(operation.from,operation.to)}else if(operation.op==="chmod"){withModes.chmodSync?.(operation.path,operation.mode)}else if(operation.op==="utimes"){withModes.utimesSync?.(operation.path,new Date(operation.mtimeMs),new Date(operation.mtimeMs))}}function flushFilesystemForwarding(){filesystemForwardingScheduled=false;const changes=pendingIndexForwarding.splice(0);for(let offset2=0;offset2<changes.length;offset2+=4096){send({type:"fs-index",changes:changes.slice(offset2,offset2+4096)})}}function vfsServerBridge(){return requiredContainer().serverBridge}var netListeners=new Map;var netSockets=new Map;var netListenerChanges=new Set;var nextNetSocket=1;var pageNetHost={ports:()=>netListeners.keys(),subscribe:listener=>{netListenerChanges.add(listener);return()=>{netListenerChanges.delete(listener)}},connect:(port2,socket)=>{if(!netListeners.has(port2)){socket.destroy();return}forwardNetSocket(port2,socket)}};function forwardNetSocket(port2,socket){const id2=nextNetSocket++;netSockets.set(id2,socket);socket.on("data",chunk=>{if(!netSockets.has(id2))return;const buffer2=Uint8Array.from(chunk).buffer;send({type:"net-guest-data",socket:id2,chunk:buffer2},[buffer2])});const close2=()=>{if(!netSockets.delete(id2))return;send({type:"net-guest-end",socket:id2})};socket.on("end",close2);socket.on("close",close2);socket.on("error",()=>void 0);send({type:"net-connect",port:port2,socket:id2})}function handleNetMessage(message){if(message.type==="listen-net"){const host2=requiredContainer();if(!host2.listenNet)return;netListeners.get(message.port)?.();netListeners.set(message.port,()=>{});try{const unlisten=host2.listenNet(message.port,socket2=>forwardNetSocket(message.port,socket2));netListeners.set(message.port,unlisten)}catch(error){netListeners.delete(message.port);throw error}for(const listener of netListenerChanges)listener(message.port,true);return}if(message.type==="unlisten-net"){netListeners.get(message.port)?.();netListeners.delete(message.port);for(const listener of netListenerChanges)listener(message.port,false);return}const socket=netSockets.get(message.socket);if(!socket)return;if(message.type==="net-data")socket.write(new Uint8Array(message.chunk),()=>send({type:"net-taken",socket:message.socket}));else{socket.end();netSockets.delete(message.socket)}}var pendingChildren=new Map;var pendingChildInput=new Map;var pendingChildFdInput=new Map;var childFdKey=(id2,fd2)=>`${id2}:${fd2}`;var childChunkBytes=64*1024;function validChildFd(fd2){return typeof fd2==="number"&&Number.isInteger(fd2)&&fd2>=3&&fd2<=63}function childDescriptorNumbers(descriptors){if(descriptors===void 0)return void 0;const fds=Object.keys(descriptors).map(Number);if(!fds.every(validChildFd))throw new Error("Child process descriptors must be integers from 3 through 63.");return fds.length>0?fds.sort((left,right)=>left-right):void 0}var nextChildId=1;var launchPorts=new Map;var heldRuns=new Set;function runPorts(id2){const before=launchPorts.get(id2);if(!before)return[];return vfsServerBridge().getServerPorts().filter(port2=>!before.has(port2))}function closeRunServers(id2){const bridge=vfsServerBridge();for(const port2 of runPorts(id2)){const entry=bridge.servers?.get(port2);try{entry?.server?.close?.()}catch{}try{bridge.unregisterServer(port2)}catch{}}}async function workSettled(id2,held=false){const token=String(id2);const engine=container;const nativeSetTimeout=globalThis.__browserRuntimeNativeSetTimeout??setTimeout;const tick=()=>new Promise(resolve2=>nativeSetTimeout.call(globalThis,resolve2,50));const ports2=()=>Math.max(engine?.processPorts?.(token).length??0,runPorts(id2).length);if(held&&activeRuns.has(id2)){const deadline=Date.now()+500;while(Date.now()<deadline&&ports2()===0&&activeRuns.has(id2))await tick()}const owned=()=>{const timers=engine?.pendingTimers?.(token)??0;if(timers>0)return true;if(held&&ports2()>0)return true;return[...pendingChildren.values()].some(child=>child.owner===id2&&child.hold?.value!==false)};while(owned()&&activeRuns.has(id2))await tick()}function spawnedArgv(options){const given=options.__browserRuntimeSpawnArgs;if(!Array.isArray(given)||given.length===0)return void 0;return given.every(word=>typeof word==="string")?[...given]:void 0}function requestChild(command,options,fixedOwner,fixedArgv,nodeProcess){return new Promise((resolve2,reject)=>{assertWorkerActive();options.signal?.throwIfAborted();const descriptorFds=childDescriptorNumbers(options.descriptors);if(!childInputSupported&&(options.stdin!==void 0||options.stdinStream||options.terminal||options.executablePath!==void 0||descriptorFds)){throw new Error("The holder did not negotiate child-process input and terminal support.")}const id2=nextChildId++;const inputController=new AbortController;let removeResize;let inputFailure;const token=container?.currentProcessToken()??null;let owner=fixedOwner??(token===null?null:Number(token));if(owner!==null&&!activeRuns.has(owner)){const engine=enginePids();owner=(engine?owningRun(token,activeRuns,engine.runPid,engine.processByPid):void 0)??null}if(owner===null){let latest;for(const[id3,run]of activeRuns)if(!latest||run.startedAt>latest.startedAt)latest={id:id3,startedAt:run.startedAt};owner=latest?.id??null}const rejectFdInputs=cause=>{for(const fd2 of descriptorFds??[]){const key=childFdKey(id2,fd2);const input=pendingChildFdInput.get(key);pendingChildFdInput.delete(key);input?.reject(cause)}};const abort=()=>{inputController.abort(options.signal?.reason);const input=pendingChildInput.get(id2);pendingChildInput.delete(id2);input?.reject(inputController.signal.reason);rejectFdInputs(inputController.signal.reason);if(!pendingChildren.has(id2))return;try{send({type:"child-abort",id:id2})}catch(cause){const pending=pendingChildren.get(id2);pendingChildren.delete(id2);pending?.reject(cause instanceof Error?cause:new Error(String(cause)))}};const cleanup=()=>{options.signal?.removeEventListener("abort",abort);inputController.abort();const input=pendingChildInput.get(id2);pendingChildInput.delete(id2);input?.reject(new DOMException("The child process stopped.","AbortError"));rejectFdInputs(new DOMException("The child process stopped.","AbortError"));try{removeResize?.()}catch(cause){console.error("Child terminal subscription cleanup failed.",cause)}removeResize=void 0};console.log(`[boot-trace] ${JSON.stringify({event:"child-start",at:Date.now(),id:id2,owner,token,program:programFromCommand(command),imageBlocked:imageBlocked()})}`);pendingChildren.set(id2,{owner,...options.hold?{hold:options.hold}:{},...options.onStdout?{onStdout:options.onStdout}:{},...options.onStderr?{onStderr:options.onStderr}:{},...descriptorFds&&options.descriptors?{descriptors:options.descriptors}:{},resolve:result=>{cleanup();if(inputFailure)reject(inputFailure);else resolve2(result)},reject:cause=>{cleanup();reject(inputFailure??cause)}});options.signal?.addEventListener("abort",abort,{once:true});const parentCwd=owner!==null?activeRuns.get(owner)?.cwd??"/":"/";const cwd=options.cwd===void 0?parentCwd:options.cwd.startsWith("/")?options.cwd:`${parentCwd.replace(/\/$/u,"")}/${options.cwd}`.replace(/\/\.\//gu,"/");const argv=fixedArgv?[...fixedArgv]:spawnedArgv(options);try{send({type:"child-run",...options.filesystemPolicy?{filesystemPolicy:options.filesystemPolicy}:{},id:id2,owner,command,...argv?{argv}:{},...nodeProcess?{nodeProcess}:{},cwd,...options.executablePath!==void 0?{executablePath:options.executablePath}:{},...options.stdin!==void 0?{stdin:options.stdin}:{},...options.stdinStream?{liveStdin:true}:{},...options.terminal?{terminal:{columns:options.terminal.columns,rows:options.terminal.rows}}:{},...options.env?{env:{...options.env}}:{},...descriptorFds?{descriptors:descriptorFds}:{}});if(options.stdinStream){void forwardBrowserProcessInput(options.stdinStream,async chunk=>{for(let offset2=0;offset2<chunk.byteLength;offset2+=64*1024){inputController.signal.throwIfAborted();const bytes2=Uint8Array.from(chunk.subarray(offset2,offset2+64*1024)).buffer;await new Promise((resolve3,reject2)=>{pendingChildInput.set(id2,{resolve:resolve3,reject:reject2});try{send({type:"child-stdin",id:id2,bytes:bytes2},[bytes2])}catch(cause){pendingChildInput.delete(id2);reject2(cause)}})}},inputController.signal).then(()=>{if(pendingChildren.has(id2)&&!inputController.signal.aborted)send({type:"child-stdin-end",id:id2})}).catch(cause=>{if(inputController.signal.aborted||!pendingChildren.has(id2))return;inputFailure=cause instanceof Error?cause:new Error(String(cause));abort()})}for(const fd2 of descriptorFds??[]){const key=childFdKey(id2,fd2);void forwardBrowserProcessInput(options.descriptors[fd2].input,async chunk=>{for(let offset2=0;offset2<chunk.byteLength;offset2+=childChunkBytes){inputController.signal.throwIfAborted();const bytes2=Uint8Array.from(chunk.subarray(offset2,offset2+childChunkBytes)).buffer;await new Promise((resolve3,reject2)=>{pendingChildFdInput.set(key,{resolve:resolve3,reject:reject2});try{send({type:"child-fd",id:id2,fd:fd2,bytes:bytes2},[bytes2])}catch(cause){pendingChildFdInput.delete(key);reject2(cause)}})}},inputController.signal).then(()=>{if(pendingChildren.has(id2)&&!inputController.signal.aborted)send({type:"child-fd-end",id:id2,fd:fd2})}).catch(cause=>{if(inputController.signal.aborted||!pendingChildren.has(id2))return;inputFailure=cause instanceof Error?cause:new Error(String(cause));abort()})}removeResize=options.terminal?.onResize?.((columns,rows)=>{if(pendingChildren.has(id2)&&!inputController.signal.aborted)send({type:"child-resize",id:id2,columns,rows})})}catch(cause){try{send({type:"child-abort",id:id2})}catch{}const pending=pendingChildren.get(id2);pendingChildren.delete(id2);pending?.reject(cause instanceof Error?cause:new Error(String(cause)))}})}function installChildProcessBridge(){const pending=token=>{const owner=Number(token);let count=0;for(const child of pendingChildren.values())if(child.owner===owner&&child.hold?.value!==false)count+=1;return count};Reflect.set(globalThis,executorSymbol,{bypass:0,run:requestChild,pending})}function installRootNodeEntryBridge(){const preparedLimits=Object.freeze({maxBytes:4*1024*1024,maxEntries:1024});const streamLimits=Object.freeze({maxHandles:1024,maxReadChunkBytes:64*1024,maxQueuedBytes:64*1024,maxQueuedHandles:16,maxPendingWriteBytes:1024*1024});const runtimeFiles=new VirtualFS;rootRuntimeFiles=runtimeFiles;const registry=ownerProcessRegistryScope();installNodeProcessHost({run:launch=>{const active2=requiredContainer();if(launch.inherited.length)throw new Error("A store-owner Node launch cannot inherit guest stream descriptors.");if(!executionConfiguration)throw new Error("Node process execution has no worker configuration.");const engine=enginePids();const owner=activeRuns.has(Number(launch.token))?Number(launch.token):engine?owningRun(launch.token,activeRuns,engine.runPid,engine.processByPid):void 0;if(owner===void 0)throw new Error("Node process execution has no owning command.");const attribution=networkProgramNow(activeRuns,launch.token,token=>engine?.runPid(token),pid=>engine?.processByPid(pid));const streams2=launch.streams;return nodeProcesses.run(renderCommand(["node",...launch.argv]),{cwd:launch.cwd,env:launch.env,...launch.stdin!==void 0?{stdin:launch.stdin}:{},...launch.stdinStream?{stdinStream:launch.stdinStream}:{},...streams2?.signal?{signal:streams2.signal}:{},...streams2?.terminal?{terminal:streams2.terminal}:{},...streams2?.onStdout?{onStdout:streams2.onStdout}:{},...streams2?.onStderr?{onStderr:streams2.onStderr}:{}},{filesystem:launch.filesystem,...storeReadsFor(launch.filesystem),workerUrl:scope3.location.href,configuration:executionConfiguration,...moduleCacheOption(active2.vfs),processAdmission:{source:registry,token:launch.token},nativeStreams:{limits:streamLimits,inherited:[]},nodeProcess:{preparedLimits},preparedFiles:captureNodePreparedFiles(runtimeFiles,preparedLimits),serverBridge:active2.serverBridge,net:pageNetHost,hostPorts:hostPortsHost,runChild:(command,options,argv)=>requestChild(command,options,owner,argv),http:request=>brokerHttpOnce(request,attribution)})}})}function installNodeEntryBridge(localToken2,preparedLimits){installNodeProcessHost({run:launch=>{const argv=["node",...launch.argv];const streams2=launch.streams;return requestChild(renderCommand(argv),{cwd:launch.cwd,env:launch.env,hold:{value:false},...launch.stdin!==void 0?{stdin:launch.stdin}:{},...launch.stdinStream?{stdinStream:launch.stdinStream}:{},...streams2?.signal?{signal:streams2.signal}:{},...streams2?.terminal?{terminal:streams2.terminal}:{},...streams2?.onStdout?{onStdout:streams2.onStdout}:{},...streams2?.onStderr?{onStderr:streams2.onStderr}:{},...invocationPolicy?{filesystemPolicy:invocationPolicy}:{}},Number(localToken2),argv,{token:launch.token,inherited:launch.inherited.map(({fd:fd2,handle})=>({fd:fd2,id:handle.id})),preparedFiles:invocationFiles?captureNodePreparedFiles(invocationFiles.runtimeFiles,preparedLimits):[]})}},localToken2)}async function brokerHttpOnce(request,attribution,context2){assertWorkerActive();request.signal.throwIfAborted();const id2=nextFetchId++;const headers=request.headers;assertWorkerActive();request.signal.throwIfAborted();const result=new Promise((resolve2,reject)=>pendingFetches.set(id2,{method:request.method,resolve:resolve2,reject}));const abort=()=>{const pending=pendingFetches.get(id2);if(pending){pendingFetches.delete(id2);pending.reject(request.signal.reason??new DOMException("The request was cancelled.","AbortError"))}else{const stream=responseStreams.get(id2);if(!stream&&!fetchActivities.has(id2))return;responseStreams.delete(id2);stream?.error(request.signal.reason??new DOMException("The request was cancelled.","AbortError"))}try{send({type:"fetch-abort",id:id2})}catch{}fetchAbortCleanup.get(id2)?.();fetchAbortCleanup.delete(id2)};if(context2){try{const activity2=context2.begin(abort);fetchActivities.set(id2,{activity:activity2,headersDone:activity2.hold(),pulls:[],cancel:abort})}catch(cause){pendingFetches.delete(id2);throw cause}}request.signal.addEventListener("abort",abort,{once:true});fetchAbortCleanup.set(id2,()=>{request.signal.removeEventListener("abort",abort);fetchActivities.get(id2)?.activity.release();fetchActivities.delete(id2)});try{const body=request.body;send({type:"fetch",id:id2,program:attribution.program,attributed:attribution.attributed,activePrograms:attribution.activePrograms,...attribution.pid!==void 0?{pid:attribution.pid}:{},url:request.url,method:request.method,headers,...request.profile?{profile:request.profile}:{},...body?{body}:{}},body instanceof ReadableStream?[body]:[])}catch(cause){pendingFetches.get(id2)?.reject(cause instanceof Error?cause:new Error(String(cause)));pendingFetches.delete(id2);fetchAbortCleanup.get(id2)?.();fetchAbortCleanup.delete(id2)}if(request.signal.aborted)abort();return result}async function brokerFetch(input,init,fixedAttribution,context2){let request=new Request(input,init);const attribution=fixedAttribution??attributionNow();let body=request.body??void 0;if(body&&requestHasStaticBody(request)){let stopped2=false;const activity2=context2?.begin(()=>{stopped2=true});const done=activity2?.hold();try{body=await request.blob();request.signal.throwIfAborted();if(stopped2)throw new DOMException("The requesting process has ended.","AbortError")}finally{done?.();activity2?.release()}}for(let redirects=0;;redirects++){const result=await brokerHttpOnce({url:request.url,method:request.method,headers:[...request.headers.entries()],...body?{body}:{},signal:request.signal},attribution,context2);const response=new Response(result.body,{status:result.status,statusText:result.statusText,headers:result.headers});if(![301,302,303,307,308].includes(response.status))return response;if(request.redirect==="manual")return response;if(request.redirect==="error"){await response.body?.cancel().catch(()=>void 0);throw new TypeError("Redirects are disabled for this request.")}if(redirects>=20){await response.body?.cancel().catch(()=>void 0);throw new TypeError("Too many redirects.")}const location2=response.headers.get("location");if(!location2)return response;const nextUrl=new URL(location2,request.url);let method=request.method;const headers=new Headers(request.headers);if(response.status===303&&method!=="HEAD"||(response.status===301||response.status===302)&&method==="POST"){method="GET";body=void 0;for(const name of["content-encoding","content-language","content-length","content-location","content-type"])headers.delete(name)}else if(body instanceof ReadableStream){await response.body?.cancel().catch(()=>void 0);throw new TypeError("A streamed request body cannot be replayed across a redirect.")}if(new URL(request.url).origin!==nextUrl.origin){for(const name of["authorization","cookie","proxy-authorization"])headers.delete(name)}await response.body?.cancel().catch(()=>void 0);request=new Request(nextUrl,{method,headers,...body?{body}:{},redirect:request.redirect,signal:request.signal})}}var hostPorts=new Set;var hostPortListeners=new Set;var hostPortsHost={current:()=>hostPorts,subscribe:listener=>{hostPortListeners.add(listener);return()=>{hostPortListeners.delete(listener)}}};var RefusedWebSocket=class extends EventTarget{static CONNECTING=0;static OPEN=1;static CLOSING=2;static CLOSED=3;CONNECTING=0;OPEN=1;CLOSING=2;CLOSED=3;url;protocol="";extensions="";bufferedAmount=0;binaryType="blob";readyState=0;onopen=null;onmessage=null;onerror=null;onclose=null;constructor(url2,_protocols){super();this.url=new URL(url2).href;queueMicrotask(()=>{if(this.readyState===3)return;this.readyState=3;const error=Object.assign(new Event("error"),{message:`WebSocket to ${this.url} refused: a sandboxed program has no WebSocket egress.`});this.onerror?.(error);this.dispatchEvent(error);const close2=new CloseEvent("close",{code:1006,reason:"",wasClean:false});this.onclose?.(close2);this.dispatchEvent(close2)})}send(){throw new DOMException("The WebSocket is not open.","InvalidStateError")}close(){this.readyState=3}};function installNetworkBroker(){installFetchTransport((input,init,context2)=>brokerFetch(input,init,attributionNow(),context2));installHttpClientTransport(()=>{const attribution=attributionNow();return request=>brokerHttpOnce(request,attribution)},{hostPorts:()=>hostPorts});Object.defineProperty(globalThis,"fetch",{value:brokerFetch,configurable:false,writable:false});for(const name of["XMLHttpRequest","EventSource","BroadcastChannel","SharedWorker"]){try{Object.defineProperty(globalThis,name,{value:void 0,configurable:false,writable:false})}catch{}}try{Object.defineProperty(globalThis,"WebSocket",{value:RefusedWebSocket,configurable:false,writable:false})}catch{}Reflect.set(globalThis,executorSymbol,void 0)}var liveStdins=new Map;async function installTypeStripper(url2){const glue=await import(url2);globalThis.__substrateStripTypes=typeStripperFrom(glue.default).strip}var webSocketRelay;function openLiveStdin(id2){const encoder11=new TextEncoder;const queue=[];let closed=false;let wake;const notify=()=>{const resolve2=wake;wake=void 0;resolve2?.()};const stdin={push:data2=>{if(closed)return;queue.push({bytes:encoder11.encode(data2)});notify()},write:bytes2=>{if(closed)return Promise.reject(new Error("Process input is closed."));if(bytes2.byteLength>64*1024||queue.some(entry=>entry.consumed))return Promise.reject(new Error("Process input requires consumed chunks of at most 64 KiB."));const consumed=new Promise((resolve2,reject)=>{queue.push({bytes:Uint8Array.from(bytes2),consumed:{resolve:resolve2,reject}})});notify();return consumed},close:(discard=false)=>{closed=true;if(discard)for(const entry of queue.splice(0))entry.consumed?.reject(new DOMException("Process input was cancelled.","AbortError"));notify()},async*[Symbol.asyncIterator](){for(;;){if(queue.length>0){const entry=queue.shift();entry.consumed?.resolve();yield entry.bytes;continue}if(closed)return;await new Promise(resolve2=>{wake=resolve2})}}};liveStdins.set(id2,stdin);return stdin}var terminals=new Map;function openTerminal(id2,size){const listeners=new Set;const terminal={columns:size.columns,rows:size.rows,onResize:listener=>{listeners.add(listener);return()=>{listeners.delete(listener)}},resize:(columns,rows)=>{terminal.columns=columns;terminal.rows=rows;for(const listener of listeners)listener(columns,rows)}};terminals.set(id2,terminal);return terminal}function writeFile(vfs2,path3,bytes2){const parent2=path3.slice(0,path3.lastIndexOf("/"))||"/";if(parent2!=="/"&&!vfs2.existsSync(parent2))vfs2.mkdirSync(parent2,{recursive:true});vfs2.writeFileSync(path3,bytes2)}function removePath(vfs2,path3){if(!vfs2.existsSync(path3))return;if(vfs2.statSync(path3).isFile()){vfs2.unlinkSync(path3);return}for(const name of vfs2.readdirSync(path3))removePath(vfs2,`${path3==="/"?"":path3}/${name}`);if(path3!=="/")vfs2.rmdirSync(path3)}function sendResult(id2,result){console.log(`[boot-trace] ${JSON.stringify({event:"run-result",at:Date.now(),id:id2,exitCode:result.exitCode,imageBlocked:imageBlocked()})}`);const signal=result.signal;send({type:"result",id:id2,stdout:result.stdout,stderr:result.stderr,exitCode:result.exitCode,...typeof signal==="string"?{signal}:{}})}function sendError(id2,cause){const error=cause instanceof Error?cause:new Error(String(cause));send({type:"error",id:id2,error:error.message,...error.stack?{stack:error.stack}:{}})}function send(message,transfer2=[]){port?.postMessage(message,transfer2)}function depth3(path3){let segments=1;for(let index2=0;index2<path3.length;index2+=1)if(path3.charCodeAt(index2)===47)segments+=1;return segments}configureNodeExecutionWorker({});
|
|
6104
6104
|
/*! Bundled license information:
|
|
6105
6105
|
|
|
6106
6106
|
pako/dist/pako.esm.mjs:
|