


























@@ -578,102 +578,113 @@ function waitingResult(params: {
578578};
579579}
580580581-async function runExec(input: Extract<CodeModeWorkerInput, { kind: "exec" }>) {
582-const pendingRequests: PendingBridgeRequest[] = [];
583-const { vm, didTimeout } = await createVm({
584-catalog: input.catalog,
585-apiFiles: input.apiFiles ?? [],
586-namespaces: input.namespaces,
587-config: input.config,
588- pendingRequests,
589-});
581+async function runVmExecution(params: {
582+vm: QuickJS;
583+didTimeout: () => boolean;
584+pendingRequests: PendingBridgeRequest[];
585+config: CodeModeConfig;
586+prepare: () => void;
587+}): Promise<CodeModeWorkerResult> {
590588let output: unknown[] = [];
591589try {
592-vm.evalCode(
593-buildUserSource(input.source),
594-"openclaw-code-mode:user.js",
595-EvalFlags.ASYNC,
596-).dispose();
597-drainPendingJobs(vm);
598-output = takeOutput(vm);
599-const resultHandle = getResultHandle(vm);
590+params.prepare();
591+drainPendingJobs(params.vm);
592+output = takeOutput(params.vm);
593+const resultHandle = getResultHandle(params.vm);
600594try {
601-if (pendingRequests.length > 0) {
595+if (params.pendingRequests.length > 0) {
602596// Pending host work suspends the VM instead of blocking in-worker; the
603597// host resumes with settled bridge results via runResume.
604-return waitingResult({ vm, pendingRequests, output, config: input.config });
598+return waitingResult({
599+vm: params.vm,
600+pendingRequests: params.pendingRequests,
601+ output,
602+config: params.config,
603+});
605604}
606605if (resultHandle.isPromise && resultHandle.promiseState === 0) {
607606throw new Error("code mode promise is pending without host work");
608607}
609608return {
610-status: "completed" as const,
611-value: await readCompletedResult(vm, resultHandle),
609+status: "completed",
610+value: await readCompletedResult(params.vm, resultHandle),
612611 output,
613612};
614613} finally {
615614resultHandle.dispose();
616615}
617616} catch (error) {
618-return throwWorkerFailureWithOutput({ error, didTimeout, output, vm });
617+return throwWorkerFailureWithOutput({
618+ error,
619+didTimeout: params.didTimeout,
620+ output,
621+vm: params.vm,
622+});
619623} finally {
620-vm.dispose();
624+params.vm.dispose();
621625}
622626}
623627628+async function runExec(input: Extract<CodeModeWorkerInput, { kind: "exec" }>) {
629+const pendingRequests: PendingBridgeRequest[] = [];
630+const { vm, didTimeout } = await createVm({
631+catalog: input.catalog,
632+apiFiles: input.apiFiles ?? [],
633+namespaces: input.namespaces,
634+config: input.config,
635+ pendingRequests,
636+});
637+return runVmExecution({
638+ vm,
639+ didTimeout,
640+ pendingRequests,
641+config: input.config,
642+prepare: () => {
643+vm.evalCode(
644+buildUserSource(input.source),
645+"openclaw-code-mode:user.js",
646+EvalFlags.ASYNC,
647+).dispose();
648+},
649+});
650+}
651+624652async function runResume(input: Extract<CodeModeWorkerInput, { kind: "resume" }>) {
625653const pendingRequests: PendingBridgeRequest[] = [];
626654const { vm, didTimeout } = await restoreVm({
627655snapshotBytes: input.snapshotBytes,
628656config: input.config,
629657 pendingRequests,
630658});
631-let output: unknown[] = [];
632-try {
633-const settle = vm.global.getProp("__openclawSettleBridge");
634-try {
635-for (const request of input.settledRequests) {
636-const id = vm.newString(request.id);
637-const payload = vm.newString(JSON.stringify(request.ok ? request.value : request.error));
638-try {
639-vm.callFunction(
640-settle,
641-vm.undefined,
642-id,
643-request.ok ? vm.true : vm.false,
644-payload,
645-).dispose();
646-} finally {
647-id.dispose();
648-payload.dispose();
659+return runVmExecution({
660+ vm,
661+ didTimeout,
662+ pendingRequests,
663+config: input.config,
664+prepare: () => {
665+const settle = vm.global.getProp("__openclawSettleBridge");
666+try {
667+for (const request of input.settledRequests) {
668+const id = vm.newString(request.id);
669+const payload = vm.newString(JSON.stringify(request.ok ? request.value : request.error));
670+try {
671+vm.callFunction(
672+settle,
673+vm.undefined,
674+id,
675+request.ok ? vm.true : vm.false,
676+payload,
677+).dispose();
678+} finally {
679+id.dispose();
680+payload.dispose();
681+}
649682}
683+} finally {
684+settle.dispose();
650685}
651-} finally {
652-settle.dispose();
653-}
654-drainPendingJobs(vm);
655-output = takeOutput(vm);
656-const resultHandle = getResultHandle(vm);
657-try {
658-if (pendingRequests.length > 0) {
659-return waitingResult({ vm, pendingRequests, output, config: input.config });
660-}
661-if (resultHandle.isPromise && resultHandle.promiseState === 0) {
662-throw new Error("code mode promise is pending without host work");
663-}
664-return {
665-status: "completed" as const,
666-value: await readCompletedResult(vm, resultHandle),
667- output,
668-};
669-} finally {
670-resultHandle.dispose();
671-}
672-} catch (error) {
673-return throwWorkerFailureWithOutput({ error, didTimeout, output, vm });
674-} finally {
675-vm.dispose();
676-}
686+},
687+});
677688}
678689679690async function main(): Promise<CodeModeWorkerResult> {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。