@ox-content/code-play 3.0.0-alpha.7 → 3.0.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/browser.mjs +176 -25
- package/dist/client.mjs +176 -25
- package/dist/client.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,9 +72,10 @@ run.timing;
|
|
|
72
72
|
visitor-supplied snippets as `play`.
|
|
73
73
|
|
|
74
74
|
- No sample is executed during Markdown transform or SSG.
|
|
75
|
-
- JavaScript and TypeScript run in `node:vm` on Node, or in
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
- JavaScript and TypeScript run in `node:vm` on Node, or in a Web Worker in the
|
|
76
|
+
browser. Browsers without Worker support fall back to
|
|
77
|
+
`<iframe sandbox="allow-scripts">` with no `allow-same-origin`. Snippets are
|
|
78
|
+
never run with page-origin `Function`.
|
|
78
79
|
- Published widgets hide **Typecheck** unless `endpoints.typecheck` is set.
|
|
79
80
|
**Cancel** appears while a run is in flight.
|
|
80
81
|
- Framework previews use the same iframe flags and load runtimes from esm.sh.
|
package/dist/browser.mjs
CHANGED
|
@@ -692,10 +692,115 @@ function buildJavaScriptSandboxDocument(code, messageId) {
|
|
|
692
692
|
})();
|
|
693
693
|
<\/script></body></html>`;
|
|
694
694
|
}
|
|
695
|
+
function buildJavaScriptWorkerSource() {
|
|
696
|
+
return `
|
|
697
|
+
(function () {
|
|
698
|
+
function format(args) {
|
|
699
|
+
return Array.prototype.map.call(args, function (value) {
|
|
700
|
+
if (typeof value === "string") return value;
|
|
701
|
+
if (value === undefined) return "undefined";
|
|
702
|
+
if (value === null) return "null";
|
|
703
|
+
try { return JSON.stringify(value); } catch (error) { return String(value); }
|
|
704
|
+
}).join(" ") + "\\n";
|
|
705
|
+
}
|
|
706
|
+
self.onmessage = function (event) {
|
|
707
|
+
var data = event.data || {};
|
|
708
|
+
if (!data.id) return;
|
|
709
|
+
var stdout = [];
|
|
710
|
+
var stderr = [];
|
|
711
|
+
var consoleLike = {
|
|
712
|
+
log: function () { stdout.push(format(arguments)); },
|
|
713
|
+
info: function () { stdout.push(format(arguments)); },
|
|
714
|
+
warn: function () { stderr.push(format(arguments)); },
|
|
715
|
+
error: function () { stderr.push(format(arguments)); }
|
|
716
|
+
};
|
|
717
|
+
try {
|
|
718
|
+
var run = new Function("console", '"use strict";\\n' + String(data.code || ""));
|
|
719
|
+
var value = run(consoleLike);
|
|
720
|
+
self.postMessage({
|
|
721
|
+
id: data.id,
|
|
722
|
+
stdout: stdout,
|
|
723
|
+
stderr: stderr,
|
|
724
|
+
value: value === undefined ? undefined : String(value)
|
|
725
|
+
});
|
|
726
|
+
} catch (error) {
|
|
727
|
+
var message = error && error.message ? String(error.message) : String(error);
|
|
728
|
+
self.postMessage({ id: data.id, stdout: stdout, stderr: stderr, error: message });
|
|
729
|
+
}
|
|
730
|
+
};
|
|
731
|
+
})();
|
|
732
|
+
`;
|
|
733
|
+
}
|
|
695
734
|
function applySandboxStreams(stdio, message) {
|
|
696
735
|
for (const text of message.stdout ?? []) stdio.push("stdout", text);
|
|
697
736
|
for (const text of message.stderr ?? []) stdio.push("stderr", text);
|
|
698
737
|
}
|
|
738
|
+
var WORKER_UNAVAILABLE_CODE = "ERR_SCRIPT_WORKER_UNAVAILABLE";
|
|
739
|
+
function workerUnavailableError(error) {
|
|
740
|
+
const message = error instanceof Error && error.message ? error.message : "JavaScript worker sandbox is unavailable.";
|
|
741
|
+
return Object.assign(new Error(message), { code: WORKER_UNAVAILABLE_CODE });
|
|
742
|
+
}
|
|
743
|
+
function isSandboxWorkerUnavailable(error) {
|
|
744
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === WORKER_UNAVAILABLE_CODE);
|
|
745
|
+
}
|
|
746
|
+
function canUseSandboxWorker() {
|
|
747
|
+
return typeof Worker !== "undefined" && typeof Blob !== "undefined" && typeof URL !== "undefined" && typeof URL.createObjectURL === "function" && typeof URL.revokeObjectURL === "function";
|
|
748
|
+
}
|
|
749
|
+
async function executeInSandboxWorker(code, timeoutMs, stdio, signal) {
|
|
750
|
+
if (!canUseSandboxWorker()) throw workerUnavailableError(/* @__PURE__ */ new Error("JavaScript worker sandbox needs Worker, Blob, and object URLs."));
|
|
751
|
+
if (signal?.aborted) throw abortError();
|
|
752
|
+
const messageId = `ox-code-play-${Math.random().toString(36).slice(2)}`;
|
|
753
|
+
const url = URL.createObjectURL(new Blob([buildJavaScriptWorkerSource()], { type: "text/javascript" }));
|
|
754
|
+
let worker;
|
|
755
|
+
try {
|
|
756
|
+
worker = new Worker(url);
|
|
757
|
+
} catch (error) {
|
|
758
|
+
URL.revokeObjectURL(url);
|
|
759
|
+
throw workerUnavailableError(error);
|
|
760
|
+
}
|
|
761
|
+
return new Promise((resolve, reject) => {
|
|
762
|
+
let settled = false;
|
|
763
|
+
const cleanup = () => {
|
|
764
|
+
if (settled) return;
|
|
765
|
+
settled = true;
|
|
766
|
+
clearTimeout(timer);
|
|
767
|
+
signal?.removeEventListener("abort", onAbort);
|
|
768
|
+
worker.onmessage = null;
|
|
769
|
+
worker.onerror = null;
|
|
770
|
+
worker.terminate();
|
|
771
|
+
URL.revokeObjectURL(url);
|
|
772
|
+
};
|
|
773
|
+
const onAbort = () => {
|
|
774
|
+
cleanup();
|
|
775
|
+
reject(abortError());
|
|
776
|
+
};
|
|
777
|
+
const onMessage = (event) => {
|
|
778
|
+
if (event.data?.id !== messageId) return;
|
|
779
|
+
cleanup();
|
|
780
|
+
applySandboxStreams(stdio, event.data);
|
|
781
|
+
if (event.data.error) {
|
|
782
|
+
reject(new Error(event.data.error));
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
resolve(event.data.value);
|
|
786
|
+
};
|
|
787
|
+
const onError = (event) => {
|
|
788
|
+
cleanup();
|
|
789
|
+
reject(workerUnavailableError(new Error(event.message || "JavaScript worker sandbox failed.")));
|
|
790
|
+
};
|
|
791
|
+
const timer = setTimeout(() => {
|
|
792
|
+
cleanup();
|
|
793
|
+
reject(Object.assign(/* @__PURE__ */ new Error("JavaScript execution timed out."), { code: "ERR_SCRIPT_EXECUTION_TIMEOUT" }));
|
|
794
|
+
}, timeoutMs);
|
|
795
|
+
worker.onmessage = onMessage;
|
|
796
|
+
worker.onerror = onError;
|
|
797
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
798
|
+
worker.postMessage({
|
|
799
|
+
id: messageId,
|
|
800
|
+
code
|
|
801
|
+
});
|
|
802
|
+
});
|
|
803
|
+
}
|
|
699
804
|
async function executeInSandboxIframe(code, timeoutMs, stdio, signal) {
|
|
700
805
|
if (typeof document === "undefined" || typeof window === "undefined") throw new Error("JavaScript sandbox iframe needs a document.");
|
|
701
806
|
if (signal?.aborted) throw abortError();
|
|
@@ -747,24 +852,23 @@ async function runJavaScript(request) {
|
|
|
747
852
|
const tracker = new PhaseTracker();
|
|
748
853
|
tracker.start("execute", "Execute");
|
|
749
854
|
const stdio = new StdioBuffer(tracker.startedAt);
|
|
750
|
-
const
|
|
751
|
-
|
|
752
|
-
runtime: hasNodeVm() ? "node:vm" : "iframe",
|
|
753
|
-
sandbox: hasNodeVm() ? "vm" : "srcdoc"
|
|
754
|
-
} };
|
|
855
|
+
const runtime = currentJavaScriptRuntime();
|
|
856
|
+
let executedRuntime = runtime;
|
|
755
857
|
try {
|
|
756
|
-
const
|
|
858
|
+
const result = await executeScriptWithRuntime(request.code, request.timeoutMs, stdio, request.signal, runtime);
|
|
859
|
+
executedRuntime = result.runtime;
|
|
757
860
|
tracker.stop();
|
|
758
861
|
return {
|
|
759
862
|
status: "ok",
|
|
760
863
|
stdio: stdio.snapshot(),
|
|
761
864
|
diagnostics: [],
|
|
762
|
-
provenance,
|
|
865
|
+
provenance: { execute: javascriptRuntimeProvenance(executedRuntime) },
|
|
763
866
|
timing: tracker.report(),
|
|
764
|
-
value: value === void 0 ? void 0 : String(value)
|
|
867
|
+
value: result.value === void 0 ? void 0 : String(result.value)
|
|
765
868
|
};
|
|
766
869
|
} catch (error) {
|
|
767
870
|
if (isAbortError(error) || request.signal?.aborted) throw error;
|
|
871
|
+
executedRuntime = executionRuntimeFromError(error) ?? executedRuntime;
|
|
768
872
|
tracker.stop();
|
|
769
873
|
const diagnostic = toDiagnostic(error);
|
|
770
874
|
stdio.push("stderr", `${diagnostic.message}\n`);
|
|
@@ -772,12 +876,30 @@ async function runJavaScript(request) {
|
|
|
772
876
|
status: isTimeout(error) ? "timeout" : "error",
|
|
773
877
|
stdio: stdio.snapshot(),
|
|
774
878
|
diagnostics: [diagnostic],
|
|
775
|
-
provenance,
|
|
879
|
+
provenance: { execute: javascriptRuntimeProvenance(executedRuntime) },
|
|
776
880
|
timing: tracker.report()
|
|
777
881
|
};
|
|
778
882
|
}
|
|
779
883
|
}
|
|
780
|
-
async function
|
|
884
|
+
async function executeScriptWithRuntime(code, timeoutMs, stdio, signal, runtime = currentJavaScriptRuntime()) {
|
|
885
|
+
try {
|
|
886
|
+
return {
|
|
887
|
+
value: await executeScriptInRuntime(code, timeoutMs, stdio, signal, runtime),
|
|
888
|
+
runtime
|
|
889
|
+
};
|
|
890
|
+
} catch (error) {
|
|
891
|
+
if (runtime === "worker" && isSandboxWorkerUnavailable(error) && typeof document !== "undefined") try {
|
|
892
|
+
return {
|
|
893
|
+
value: await executeScriptInRuntime(code, timeoutMs, stdio, signal, "iframe"),
|
|
894
|
+
runtime: "iframe"
|
|
895
|
+
};
|
|
896
|
+
} catch (fallbackError) {
|
|
897
|
+
throw withExecutionRuntime(fallbackError, "iframe");
|
|
898
|
+
}
|
|
899
|
+
throw withExecutionRuntime(error, runtime);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
async function executeScriptInRuntime(code, timeoutMs, stdio, signal, runtime) {
|
|
781
903
|
const consoleLike = {
|
|
782
904
|
log: (...args) => stdio.push("stdout", formatConsoleArgs(args)),
|
|
783
905
|
info: (...args) => stdio.push("stdout", formatConsoleArgs(args)),
|
|
@@ -785,7 +907,7 @@ async function executeScript(code, timeoutMs, stdio, signal) {
|
|
|
785
907
|
error: (...args) => stdio.push("stderr", formatConsoleArgs(args))
|
|
786
908
|
};
|
|
787
909
|
if (signal?.aborted) throw abortError();
|
|
788
|
-
if (
|
|
910
|
+
if (runtime === "vm") {
|
|
789
911
|
const vm = await import("node:vm");
|
|
790
912
|
const context = vm.createContext({ console: consoleLike });
|
|
791
913
|
return vm.runInContext(code, context, {
|
|
@@ -793,12 +915,45 @@ async function executeScript(code, timeoutMs, stdio, signal) {
|
|
|
793
915
|
displayErrors: true
|
|
794
916
|
});
|
|
795
917
|
}
|
|
918
|
+
if (runtime === "worker") return executeInSandboxWorker(code, timeoutMs, stdio, signal);
|
|
796
919
|
return executeInSandboxIframe(code, timeoutMs, stdio, signal);
|
|
797
920
|
}
|
|
798
|
-
function
|
|
921
|
+
function currentJavaScriptRuntime() {
|
|
922
|
+
return javascriptExecuteRuntime(hasNodeVm(), canUseSandboxWorker(), typeof document !== "undefined");
|
|
923
|
+
}
|
|
924
|
+
function javascriptExecuteRuntime(hasVm, hasWorker, hasDocument) {
|
|
799
925
|
if (hasVm) return "vm";
|
|
926
|
+
if (hasWorker) return "worker";
|
|
800
927
|
if (hasDocument) return "iframe";
|
|
801
|
-
throw new Error("JavaScript execute needs node:vm or a document for the sandbox iframe.");
|
|
928
|
+
throw new Error("JavaScript execute needs node:vm, a browser worker sandbox, or a document for the sandbox iframe.");
|
|
929
|
+
}
|
|
930
|
+
function javascriptRuntimeProvenance(runtime) {
|
|
931
|
+
if (runtime === "vm") return {
|
|
932
|
+
host: "local",
|
|
933
|
+
runtime: "node:vm",
|
|
934
|
+
sandbox: "vm"
|
|
935
|
+
};
|
|
936
|
+
if (runtime === "worker") return {
|
|
937
|
+
host: "local",
|
|
938
|
+
runtime: "web-worker",
|
|
939
|
+
sandbox: "worker"
|
|
940
|
+
};
|
|
941
|
+
return {
|
|
942
|
+
host: "local",
|
|
943
|
+
runtime: "iframe",
|
|
944
|
+
sandbox: "srcdoc"
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
function withExecutionRuntime(error, runtime) {
|
|
948
|
+
if (error instanceof Error) return Object.assign(error, { executionRuntime: runtime });
|
|
949
|
+
if (isErrorLike(error)) return Object.assign(error, { executionRuntime: runtime });
|
|
950
|
+
return Object.assign(new Error(String(error)), { executionRuntime: runtime });
|
|
951
|
+
}
|
|
952
|
+
function executionRuntimeFromError(error) {
|
|
953
|
+
if (error && typeof error === "object" && "executionRuntime" in error && isJavaScriptExecutionRuntime(error.executionRuntime)) return error.executionRuntime;
|
|
954
|
+
}
|
|
955
|
+
function isJavaScriptExecutionRuntime(value) {
|
|
956
|
+
return value === "vm" || value === "worker" || value === "iframe";
|
|
802
957
|
}
|
|
803
958
|
function isTimeout(error) {
|
|
804
959
|
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ERR_SCRIPT_EXECUTION_TIMEOUT");
|
|
@@ -1042,6 +1197,7 @@ async function typecheckTypeScript(request) {
|
|
|
1042
1197
|
};
|
|
1043
1198
|
} catch (error) {
|
|
1044
1199
|
if (isAbortError(error) || request.signal?.aborted) throw error;
|
|
1200
|
+
executedRuntime = executionRuntimeFromError(error) ?? executedRuntime;
|
|
1045
1201
|
tracker.stop();
|
|
1046
1202
|
const message = error instanceof Error ? error.message : String(error);
|
|
1047
1203
|
return {
|
|
@@ -1065,9 +1221,12 @@ async function runTypeScript(request) {
|
|
|
1065
1221
|
const stdio = new StdioBuffer(tracker.startedAt);
|
|
1066
1222
|
tracker.start("compile", "Strip types");
|
|
1067
1223
|
const javascript = stripTypeScript(request.code);
|
|
1224
|
+
const runtime = currentJavaScriptRuntime();
|
|
1225
|
+
let executedRuntime = runtime;
|
|
1068
1226
|
tracker.start("execute", "Execute");
|
|
1069
1227
|
try {
|
|
1070
|
-
const
|
|
1228
|
+
const result = await executeScriptWithRuntime(javascript, request.timeoutMs, stdio, request.signal, runtime);
|
|
1229
|
+
executedRuntime = result.runtime;
|
|
1071
1230
|
tracker.stop();
|
|
1072
1231
|
return {
|
|
1073
1232
|
status: "ok",
|
|
@@ -1078,14 +1237,10 @@ async function runTypeScript(request) {
|
|
|
1078
1237
|
host: "local",
|
|
1079
1238
|
runtime: "strip-types"
|
|
1080
1239
|
},
|
|
1081
|
-
execute:
|
|
1082
|
-
host: "local",
|
|
1083
|
-
runtime: hasNodeVm() ? "node:vm" : "iframe",
|
|
1084
|
-
sandbox: hasNodeVm() ? "vm" : "srcdoc"
|
|
1085
|
-
}
|
|
1240
|
+
execute: javascriptRuntimeProvenance(executedRuntime)
|
|
1086
1241
|
},
|
|
1087
1242
|
timing: tracker.report(),
|
|
1088
|
-
value: value === void 0 ? void 0 : String(value)
|
|
1243
|
+
value: result.value === void 0 ? void 0 : String(result.value)
|
|
1089
1244
|
};
|
|
1090
1245
|
} catch (error) {
|
|
1091
1246
|
if (isAbortError(error) || request.signal?.aborted) throw error;
|
|
@@ -1105,11 +1260,7 @@ async function runTypeScript(request) {
|
|
|
1105
1260
|
host: "local",
|
|
1106
1261
|
runtime: "strip-types"
|
|
1107
1262
|
},
|
|
1108
|
-
execute:
|
|
1109
|
-
host: "local",
|
|
1110
|
-
runtime: hasNodeVm() ? "node:vm" : "iframe",
|
|
1111
|
-
sandbox: hasNodeVm() ? "vm" : "srcdoc"
|
|
1112
|
-
}
|
|
1263
|
+
execute: javascriptRuntimeProvenance(executedRuntime)
|
|
1113
1264
|
},
|
|
1114
1265
|
timing: tracker.report()
|
|
1115
1266
|
};
|
package/dist/client.mjs
CHANGED
|
@@ -336,10 +336,115 @@ function buildJavaScriptSandboxDocument(code, messageId) {
|
|
|
336
336
|
})();
|
|
337
337
|
<\/script></body></html>`;
|
|
338
338
|
}
|
|
339
|
+
function buildJavaScriptWorkerSource() {
|
|
340
|
+
return `
|
|
341
|
+
(function () {
|
|
342
|
+
function format(args) {
|
|
343
|
+
return Array.prototype.map.call(args, function (value) {
|
|
344
|
+
if (typeof value === "string") return value;
|
|
345
|
+
if (value === undefined) return "undefined";
|
|
346
|
+
if (value === null) return "null";
|
|
347
|
+
try { return JSON.stringify(value); } catch (error) { return String(value); }
|
|
348
|
+
}).join(" ") + "\\n";
|
|
349
|
+
}
|
|
350
|
+
self.onmessage = function (event) {
|
|
351
|
+
var data = event.data || {};
|
|
352
|
+
if (!data.id) return;
|
|
353
|
+
var stdout = [];
|
|
354
|
+
var stderr = [];
|
|
355
|
+
var consoleLike = {
|
|
356
|
+
log: function () { stdout.push(format(arguments)); },
|
|
357
|
+
info: function () { stdout.push(format(arguments)); },
|
|
358
|
+
warn: function () { stderr.push(format(arguments)); },
|
|
359
|
+
error: function () { stderr.push(format(arguments)); }
|
|
360
|
+
};
|
|
361
|
+
try {
|
|
362
|
+
var run = new Function("console", '"use strict";\\n' + String(data.code || ""));
|
|
363
|
+
var value = run(consoleLike);
|
|
364
|
+
self.postMessage({
|
|
365
|
+
id: data.id,
|
|
366
|
+
stdout: stdout,
|
|
367
|
+
stderr: stderr,
|
|
368
|
+
value: value === undefined ? undefined : String(value)
|
|
369
|
+
});
|
|
370
|
+
} catch (error) {
|
|
371
|
+
var message = error && error.message ? String(error.message) : String(error);
|
|
372
|
+
self.postMessage({ id: data.id, stdout: stdout, stderr: stderr, error: message });
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
})();
|
|
376
|
+
`;
|
|
377
|
+
}
|
|
339
378
|
function applySandboxStreams(stdio, message) {
|
|
340
379
|
for (const text of message.stdout ?? []) stdio.push("stdout", text);
|
|
341
380
|
for (const text of message.stderr ?? []) stdio.push("stderr", text);
|
|
342
381
|
}
|
|
382
|
+
const WORKER_UNAVAILABLE_CODE = "ERR_SCRIPT_WORKER_UNAVAILABLE";
|
|
383
|
+
function workerUnavailableError(error) {
|
|
384
|
+
const message = error instanceof Error && error.message ? error.message : "JavaScript worker sandbox is unavailable.";
|
|
385
|
+
return Object.assign(new Error(message), { code: WORKER_UNAVAILABLE_CODE });
|
|
386
|
+
}
|
|
387
|
+
function isSandboxWorkerUnavailable(error) {
|
|
388
|
+
return Boolean(error && typeof error === "object" && "code" in error && error.code === WORKER_UNAVAILABLE_CODE);
|
|
389
|
+
}
|
|
390
|
+
function canUseSandboxWorker() {
|
|
391
|
+
return typeof Worker !== "undefined" && typeof Blob !== "undefined" && typeof URL !== "undefined" && typeof URL.createObjectURL === "function" && typeof URL.revokeObjectURL === "function";
|
|
392
|
+
}
|
|
393
|
+
async function executeInSandboxWorker(code, timeoutMs, stdio, signal) {
|
|
394
|
+
if (!canUseSandboxWorker()) throw workerUnavailableError(/* @__PURE__ */ new Error("JavaScript worker sandbox needs Worker, Blob, and object URLs."));
|
|
395
|
+
if (signal?.aborted) throw abortError();
|
|
396
|
+
const messageId = `ox-code-play-${Math.random().toString(36).slice(2)}`;
|
|
397
|
+
const url = URL.createObjectURL(new Blob([buildJavaScriptWorkerSource()], { type: "text/javascript" }));
|
|
398
|
+
let worker;
|
|
399
|
+
try {
|
|
400
|
+
worker = new Worker(url);
|
|
401
|
+
} catch (error) {
|
|
402
|
+
URL.revokeObjectURL(url);
|
|
403
|
+
throw workerUnavailableError(error);
|
|
404
|
+
}
|
|
405
|
+
return new Promise((resolve, reject) => {
|
|
406
|
+
let settled = false;
|
|
407
|
+
const cleanup = () => {
|
|
408
|
+
if (settled) return;
|
|
409
|
+
settled = true;
|
|
410
|
+
clearTimeout(timer);
|
|
411
|
+
signal?.removeEventListener("abort", onAbort);
|
|
412
|
+
worker.onmessage = null;
|
|
413
|
+
worker.onerror = null;
|
|
414
|
+
worker.terminate();
|
|
415
|
+
URL.revokeObjectURL(url);
|
|
416
|
+
};
|
|
417
|
+
const onAbort = () => {
|
|
418
|
+
cleanup();
|
|
419
|
+
reject(abortError());
|
|
420
|
+
};
|
|
421
|
+
const onMessage = (event) => {
|
|
422
|
+
if (event.data?.id !== messageId) return;
|
|
423
|
+
cleanup();
|
|
424
|
+
applySandboxStreams(stdio, event.data);
|
|
425
|
+
if (event.data.error) {
|
|
426
|
+
reject(new Error(event.data.error));
|
|
427
|
+
return;
|
|
428
|
+
}
|
|
429
|
+
resolve(event.data.value);
|
|
430
|
+
};
|
|
431
|
+
const onError = (event) => {
|
|
432
|
+
cleanup();
|
|
433
|
+
reject(workerUnavailableError(new Error(event.message || "JavaScript worker sandbox failed.")));
|
|
434
|
+
};
|
|
435
|
+
const timer = setTimeout(() => {
|
|
436
|
+
cleanup();
|
|
437
|
+
reject(Object.assign(/* @__PURE__ */ new Error("JavaScript execution timed out."), { code: "ERR_SCRIPT_EXECUTION_TIMEOUT" }));
|
|
438
|
+
}, timeoutMs);
|
|
439
|
+
worker.onmessage = onMessage;
|
|
440
|
+
worker.onerror = onError;
|
|
441
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
442
|
+
worker.postMessage({
|
|
443
|
+
id: messageId,
|
|
444
|
+
code
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
}
|
|
343
448
|
async function executeInSandboxIframe(code, timeoutMs, stdio, signal) {
|
|
344
449
|
if (typeof document === "undefined" || typeof window === "undefined") throw new Error("JavaScript sandbox iframe needs a document.");
|
|
345
450
|
if (signal?.aborted) throw abortError();
|
|
@@ -391,24 +496,23 @@ async function runJavaScript(request) {
|
|
|
391
496
|
const tracker = new PhaseTracker();
|
|
392
497
|
tracker.start("execute", "Execute");
|
|
393
498
|
const stdio = new StdioBuffer(tracker.startedAt);
|
|
394
|
-
const
|
|
395
|
-
|
|
396
|
-
runtime: hasNodeVm() ? "node:vm" : "iframe",
|
|
397
|
-
sandbox: hasNodeVm() ? "vm" : "srcdoc"
|
|
398
|
-
} };
|
|
499
|
+
const runtime = currentJavaScriptRuntime();
|
|
500
|
+
let executedRuntime = runtime;
|
|
399
501
|
try {
|
|
400
|
-
const
|
|
502
|
+
const result = await executeScriptWithRuntime(request.code, request.timeoutMs, stdio, request.signal, runtime);
|
|
503
|
+
executedRuntime = result.runtime;
|
|
401
504
|
tracker.stop();
|
|
402
505
|
return {
|
|
403
506
|
status: "ok",
|
|
404
507
|
stdio: stdio.snapshot(),
|
|
405
508
|
diagnostics: [],
|
|
406
|
-
provenance,
|
|
509
|
+
provenance: { execute: javascriptRuntimeProvenance(executedRuntime) },
|
|
407
510
|
timing: tracker.report(),
|
|
408
|
-
value: value === void 0 ? void 0 : String(value)
|
|
511
|
+
value: result.value === void 0 ? void 0 : String(result.value)
|
|
409
512
|
};
|
|
410
513
|
} catch (error) {
|
|
411
514
|
if (isAbortError(error) || request.signal?.aborted) throw error;
|
|
515
|
+
executedRuntime = executionRuntimeFromError(error) ?? executedRuntime;
|
|
412
516
|
tracker.stop();
|
|
413
517
|
const diagnostic = toDiagnostic(error);
|
|
414
518
|
stdio.push("stderr", `${diagnostic.message}\n`);
|
|
@@ -416,12 +520,30 @@ async function runJavaScript(request) {
|
|
|
416
520
|
status: isTimeout(error) ? "timeout" : "error",
|
|
417
521
|
stdio: stdio.snapshot(),
|
|
418
522
|
diagnostics: [diagnostic],
|
|
419
|
-
provenance,
|
|
523
|
+
provenance: { execute: javascriptRuntimeProvenance(executedRuntime) },
|
|
420
524
|
timing: tracker.report()
|
|
421
525
|
};
|
|
422
526
|
}
|
|
423
527
|
}
|
|
424
|
-
async function
|
|
528
|
+
async function executeScriptWithRuntime(code, timeoutMs, stdio, signal, runtime = currentJavaScriptRuntime()) {
|
|
529
|
+
try {
|
|
530
|
+
return {
|
|
531
|
+
value: await executeScriptInRuntime(code, timeoutMs, stdio, signal, runtime),
|
|
532
|
+
runtime
|
|
533
|
+
};
|
|
534
|
+
} catch (error) {
|
|
535
|
+
if (runtime === "worker" && isSandboxWorkerUnavailable(error) && typeof document !== "undefined") try {
|
|
536
|
+
return {
|
|
537
|
+
value: await executeScriptInRuntime(code, timeoutMs, stdio, signal, "iframe"),
|
|
538
|
+
runtime: "iframe"
|
|
539
|
+
};
|
|
540
|
+
} catch (fallbackError) {
|
|
541
|
+
throw withExecutionRuntime(fallbackError, "iframe");
|
|
542
|
+
}
|
|
543
|
+
throw withExecutionRuntime(error, runtime);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
async function executeScriptInRuntime(code, timeoutMs, stdio, signal, runtime) {
|
|
425
547
|
const consoleLike = {
|
|
426
548
|
log: (...args) => stdio.push("stdout", formatConsoleArgs(args)),
|
|
427
549
|
info: (...args) => stdio.push("stdout", formatConsoleArgs(args)),
|
|
@@ -429,7 +551,7 @@ async function executeScript(code, timeoutMs, stdio, signal) {
|
|
|
429
551
|
error: (...args) => stdio.push("stderr", formatConsoleArgs(args))
|
|
430
552
|
};
|
|
431
553
|
if (signal?.aborted) throw abortError();
|
|
432
|
-
if (
|
|
554
|
+
if (runtime === "vm") {
|
|
433
555
|
const vm = await import("node:vm");
|
|
434
556
|
const context = vm.createContext({ console: consoleLike });
|
|
435
557
|
return vm.runInContext(code, context, {
|
|
@@ -437,12 +559,45 @@ async function executeScript(code, timeoutMs, stdio, signal) {
|
|
|
437
559
|
displayErrors: true
|
|
438
560
|
});
|
|
439
561
|
}
|
|
562
|
+
if (runtime === "worker") return executeInSandboxWorker(code, timeoutMs, stdio, signal);
|
|
440
563
|
return executeInSandboxIframe(code, timeoutMs, stdio, signal);
|
|
441
564
|
}
|
|
442
|
-
function
|
|
565
|
+
function currentJavaScriptRuntime() {
|
|
566
|
+
return javascriptExecuteRuntime(hasNodeVm(), canUseSandboxWorker(), typeof document !== "undefined");
|
|
567
|
+
}
|
|
568
|
+
function javascriptExecuteRuntime(hasVm, hasWorker, hasDocument) {
|
|
443
569
|
if (hasVm) return "vm";
|
|
570
|
+
if (hasWorker) return "worker";
|
|
444
571
|
if (hasDocument) return "iframe";
|
|
445
|
-
throw new Error("JavaScript execute needs node:vm or a document for the sandbox iframe.");
|
|
572
|
+
throw new Error("JavaScript execute needs node:vm, a browser worker sandbox, or a document for the sandbox iframe.");
|
|
573
|
+
}
|
|
574
|
+
function javascriptRuntimeProvenance(runtime) {
|
|
575
|
+
if (runtime === "vm") return {
|
|
576
|
+
host: "local",
|
|
577
|
+
runtime: "node:vm",
|
|
578
|
+
sandbox: "vm"
|
|
579
|
+
};
|
|
580
|
+
if (runtime === "worker") return {
|
|
581
|
+
host: "local",
|
|
582
|
+
runtime: "web-worker",
|
|
583
|
+
sandbox: "worker"
|
|
584
|
+
};
|
|
585
|
+
return {
|
|
586
|
+
host: "local",
|
|
587
|
+
runtime: "iframe",
|
|
588
|
+
sandbox: "srcdoc"
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
function withExecutionRuntime(error, runtime) {
|
|
592
|
+
if (error instanceof Error) return Object.assign(error, { executionRuntime: runtime });
|
|
593
|
+
if (isErrorLike(error)) return Object.assign(error, { executionRuntime: runtime });
|
|
594
|
+
return Object.assign(new Error(String(error)), { executionRuntime: runtime });
|
|
595
|
+
}
|
|
596
|
+
function executionRuntimeFromError(error) {
|
|
597
|
+
if (error && typeof error === "object" && "executionRuntime" in error && isJavaScriptExecutionRuntime(error.executionRuntime)) return error.executionRuntime;
|
|
598
|
+
}
|
|
599
|
+
function isJavaScriptExecutionRuntime(value) {
|
|
600
|
+
return value === "vm" || value === "worker" || value === "iframe";
|
|
446
601
|
}
|
|
447
602
|
function isTimeout(error) {
|
|
448
603
|
return Boolean(error && typeof error === "object" && "code" in error && error.code === "ERR_SCRIPT_EXECUTION_TIMEOUT");
|
|
@@ -686,6 +841,7 @@ async function typecheckTypeScript(request) {
|
|
|
686
841
|
};
|
|
687
842
|
} catch (error) {
|
|
688
843
|
if (isAbortError(error) || request.signal?.aborted) throw error;
|
|
844
|
+
executedRuntime = executionRuntimeFromError(error) ?? executedRuntime;
|
|
689
845
|
tracker.stop();
|
|
690
846
|
const message = error instanceof Error ? error.message : String(error);
|
|
691
847
|
return {
|
|
@@ -709,9 +865,12 @@ async function runTypeScript(request) {
|
|
|
709
865
|
const stdio = new StdioBuffer(tracker.startedAt);
|
|
710
866
|
tracker.start("compile", "Strip types");
|
|
711
867
|
const javascript = stripTypeScript(request.code);
|
|
868
|
+
const runtime = currentJavaScriptRuntime();
|
|
869
|
+
let executedRuntime = runtime;
|
|
712
870
|
tracker.start("execute", "Execute");
|
|
713
871
|
try {
|
|
714
|
-
const
|
|
872
|
+
const result = await executeScriptWithRuntime(javascript, request.timeoutMs, stdio, request.signal, runtime);
|
|
873
|
+
executedRuntime = result.runtime;
|
|
715
874
|
tracker.stop();
|
|
716
875
|
return {
|
|
717
876
|
status: "ok",
|
|
@@ -722,14 +881,10 @@ async function runTypeScript(request) {
|
|
|
722
881
|
host: "local",
|
|
723
882
|
runtime: "strip-types"
|
|
724
883
|
},
|
|
725
|
-
execute:
|
|
726
|
-
host: "local",
|
|
727
|
-
runtime: hasNodeVm() ? "node:vm" : "iframe",
|
|
728
|
-
sandbox: hasNodeVm() ? "vm" : "srcdoc"
|
|
729
|
-
}
|
|
884
|
+
execute: javascriptRuntimeProvenance(executedRuntime)
|
|
730
885
|
},
|
|
731
886
|
timing: tracker.report(),
|
|
732
|
-
value: value === void 0 ? void 0 : String(value)
|
|
887
|
+
value: result.value === void 0 ? void 0 : String(result.value)
|
|
733
888
|
};
|
|
734
889
|
} catch (error) {
|
|
735
890
|
if (isAbortError(error) || request.signal?.aborted) throw error;
|
|
@@ -749,11 +904,7 @@ async function runTypeScript(request) {
|
|
|
749
904
|
host: "local",
|
|
750
905
|
runtime: "strip-types"
|
|
751
906
|
},
|
|
752
|
-
execute:
|
|
753
|
-
host: "local",
|
|
754
|
-
runtime: hasNodeVm() ? "node:vm" : "iframe",
|
|
755
|
-
sandbox: hasNodeVm() ? "vm" : "srcdoc"
|
|
756
|
-
}
|
|
907
|
+
execute: javascriptRuntimeProvenance(executedRuntime)
|
|
757
908
|
},
|
|
758
909
|
timing: tracker.report()
|
|
759
910
|
};
|
package/dist/client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.mjs","names":["parseResponse","hostFromUrl","parseResponse","hostFromUrl","hostFromUrl"],"sources":["../src/timing.ts","../src/framework.ts","../src/stdio.ts","../src/go.ts","../src/transport.ts","../src/javascript-sandbox.ts","../src/runtime-host.ts","../src/javascript.ts","../src/remote.ts","../src/rust.ts","../src/strip-typescript.ts","../src/typescript.ts","../src/adapters.ts","../src/result.ts","../src/session.ts","../src/client.ts"],"sourcesContent":["import type { TimingPhase, TimingReport } from \"./types\";\n\nexport class PhaseTracker {\n readonly startedAt: number;\n private readonly phases: TimingPhase[] = [];\n private current: { id: string; label: string; startMs: number } | undefined;\n\n constructor(now: () => number = nowMs) {\n this.now = now;\n this.startedAt = now();\n }\n\n private readonly now: () => number;\n\n start(id: string, label: string): void {\n this.stop();\n this.current = { id, label, startMs: this.now() - this.startedAt };\n }\n\n stop(): void {\n if (!this.current) {\n return;\n }\n const durationMs = Math.max(0, this.now() - this.startedAt - this.current.startMs);\n this.phases.push({\n id: this.current.id,\n label: this.current.label,\n startMs: this.current.startMs,\n durationMs,\n });\n this.current = undefined;\n }\n\n report(): TimingReport {\n this.stop();\n return {\n totalMs: Math.max(0, this.now() - this.startedAt),\n phases: this.phases.slice(),\n };\n }\n}\n\nexport function nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nexport function emptyTiming(): TimingReport {\n return { totalMs: 0, phases: [] };\n}\n","import { escapeHtml } from \"./escape\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, FrameworkId } from \"./types\";\n\nconst RUNTIMES: Record<FrameworkId, { specifier: string; cdn: string }> = {\n vue: { specifier: \"vue\", cdn: \"https://esm.sh/vue@3\" },\n react: { specifier: \"react\", cdn: \"https://esm.sh/react@19\" },\n svelte: { specifier: \"svelte\", cdn: \"https://esm.sh/svelte@5\" },\n solid: { specifier: \"solid-js\", cdn: \"https://esm.sh/solid-js@1\" },\n};\n\nexport async function runFramework(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n tracker.start(\"compile\", \"Compile preview\");\n const framework = request.definition.framework ?? \"vue\";\n const html = buildPreviewDocument(framework, request.code);\n tracker.stop();\n return {\n status: \"ok\",\n stdio: [],\n diagnostics: [],\n provenance: {\n compile: { host: \"local\", runtime: `${framework}-preview` },\n execute: { host: \"iframe\", runtime: framework, sandbox: \"srcdoc\" },\n },\n timing: tracker.report(),\n preview: { kind: \"html\", html },\n };\n}\n\nexport function buildPreviewDocument(framework: FrameworkId, code: string): string {\n const runtime = RUNTIMES[framework];\n return `<!doctype html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>${escapeHtml(framework)} preview</title>\n <script type=\"importmap\">${JSON.stringify({ imports: { [runtime.specifier]: runtime.cdn } })}</script>\n <style>html,body{margin:0;padding:1rem;font:14px/1.5 system-ui,sans-serif;}</style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\">\n${indentPreview(code)}\n </script>\n</body>\n</html>\n`;\n}\n\nfunction indentPreview(code: string): string {\n return code\n .replace(/<\\/script/gi, \"<\\\\/script\")\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n","import type { StdioEvent, StdioStream } from \"./types\";\n\nexport class StdioBuffer {\n readonly events: StdioEvent[] = [];\n private readonly startedAt: number;\n\n constructor(startedAt = 0) {\n this.startedAt = startedAt;\n }\n\n push(stream: StdioStream, text: string, timestampMs = elapsed(this.startedAt)): StdioEvent {\n const event: StdioEvent = { stream, text, timestampMs };\n this.events.push(event);\n return event;\n }\n\n snapshot(): StdioEvent[] {\n return this.events.slice();\n }\n}\n\nexport function joinStream(events: StdioEvent[], stream: StdioStream): string {\n return events\n .filter((event) => event.stream === stream)\n .map((event) => event.text)\n .join(\"\");\n}\n\nexport function selectStream(events: StdioEvent[], stream: StdioStream): StdioEvent[] {\n return events.filter((event) => event.stream === stream);\n}\n\nexport function withStdioText<T extends { stdio: StdioEvent[] }>(\n result: T,\n): T & { stdout: string; stderr: string } {\n return {\n ...result,\n stdout: joinStream(result.stdio, \"stdout\"),\n stderr: joinStream(result.stdio, \"stderr\"),\n };\n}\n\nexport function formatConsoleArgs(args: unknown[]): string {\n return `${args.map(formatConsoleArg).join(\" \")}\\n`;\n}\n\nfunction formatConsoleArg(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n try {\n return JSON.stringify(value);\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction elapsed(startedAt: number): number {\n const now = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n return Math.max(0, now - startedAt);\n}\n","import { StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, Diagnostic } from \"./types\";\n\ninterface GoPlaygroundEvent {\n Message?: string;\n Kind?: string;\n Delay?: number;\n}\n\ninterface GoPlaygroundResponse {\n Errors?: string;\n Events?: GoPlaygroundEvent[];\n VetErrors?: string;\n}\n\nexport async function runGo(\n request: AdapterRequest,\n mode: \"execute\" | \"typecheck\",\n): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n const params = new URLSearchParams({\n version: \"2\",\n body: request.code,\n withVet: request.config.withVet === false ? \"false\" : \"true\",\n });\n\n tracker.start(\n mode === \"typecheck\" ? \"typecheck\" : \"compile\",\n mode === \"typecheck\" ? \"Typecheck\" : \"Compile\",\n );\n const response = await request.transport.request({\n url: request.endpoints.go,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.toString(),\n signal: request.signal,\n });\n tracker.start(\"collect\", \"Collect output\");\n\n const parsed = parseResponse(response.text);\n const diagnostics = [\n ...parseGoErrors(parsed.Errors ?? \"\", \"go\"),\n ...parseGoErrors(parsed.VetErrors ?? \"\", \"vet\"),\n ];\n for (const event of parsed.Events ?? []) {\n const stream = event.Kind === \"stderr\" ? \"stderr\" : \"stdout\";\n stdio.push(stream, event.Message ?? \"\");\n }\n if (parsed.Errors) {\n stdio.push(\"stderr\", parsed.Errors);\n }\n\n tracker.stop();\n const failed = diagnostics.some((item) => item.severity === \"error\") || !response.ok;\n return {\n status: failed ? \"error\" : \"ok\",\n stdio: stdio.snapshot(),\n diagnostics,\n provenance: {\n compile: {\n host: hostFromUrl(request.endpoints.go),\n runtime: \"go\",\n },\n execute:\n mode === \"execute\"\n ? {\n host: hostFromUrl(request.endpoints.go),\n runtime: \"go-playground\",\n sandbox: \"playground\",\n }\n : undefined,\n },\n timing: tracker.report(),\n };\n}\n\nfunction parseResponse(text: string): GoPlaygroundResponse {\n try {\n return JSON.parse(text) as GoPlaygroundResponse;\n } catch {\n return { Errors: text };\n }\n}\n\nexport function parseGoErrors(output: string, source: string): Diagnostic[] {\n if (!output.trim()) {\n return [];\n }\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const match = /^(?:prog\\.go:)?(\\d+)(?::(\\d+))?:\\s*(.*)$/.exec(line);\n return {\n message: match?.[3] ?? line,\n severity: \"error\" as const,\n line: match?.[1] ? Number(match[1]) : undefined,\n column: match?.[2] ? Number(match[2]) : undefined,\n source,\n };\n });\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","import type { CodePlayTransport, TransportRequest, TransportResponse } from \"./types\";\n\nexport function createFetchTransport(fetchImpl: typeof fetch = fetch): CodePlayTransport {\n return {\n async request(input: TransportRequest): Promise<TransportResponse> {\n const response = await fetchImpl(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body,\n signal: input.signal,\n });\n return {\n ok: response.ok,\n status: response.status,\n text: await response.text(),\n };\n },\n };\n}\n\nexport function createMemoryTransport(\n handler: (input: TransportRequest) => TransportResponse | Promise<TransportResponse>,\n): CodePlayTransport {\n return {\n async request(input) {\n if (input.signal?.aborted) {\n throw abortError();\n }\n return handler(input);\n },\n };\n}\n\nexport class MissingTransportError extends Error {\n constructor(host: string) {\n super(`No Code Play transport is configured for ${host}.`);\n this.name = \"MissingTransportError\";\n }\n}\n\nexport function abortError(): Error {\n const error = new Error(\"The Code Play run was cancelled.\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return Boolean(\n error && typeof error === \"object\" && \"name\" in error && error.name === \"AbortError\",\n );\n}\n\nexport function createUnavailableTransport(): CodePlayTransport {\n return {\n request(input) {\n if (input.signal?.aborted) {\n return Promise.reject(abortError());\n }\n return Promise.reject(new MissingTransportError(input.url));\n },\n };\n}\n","import type { StdioBuffer } from \"./stdio\";\nimport { abortError } from \"./transport\";\n\nexport const JS_SANDBOX_FLAGS = \"allow-scripts\";\n\nexport function embedJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nexport function buildJavaScriptSandboxDocument(code: string, messageId: string): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><script>\n(function () {\n var id = ${embedJson(messageId)};\n var stdout = [];\n var stderr = [];\n function format(args) {\n return Array.prototype.map.call(args, function (value) {\n if (typeof value === \"string\") return value;\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try { return JSON.stringify(value); } catch (error) { return String(value); }\n }).join(\" \") + \"\\\\n\";\n }\n var consoleLike = {\n log: function () { stdout.push(format(arguments)); },\n info: function () { stdout.push(format(arguments)); },\n warn: function () { stderr.push(format(arguments)); },\n error: function () { stderr.push(format(arguments)); }\n };\n try {\n var run = new Function(\"console\", ${embedJson(`\"use strict\";\\n${code}`)});\n var value = run(consoleLike);\n parent.postMessage({\n id: id,\n stdout: stdout,\n stderr: stderr,\n value: value === undefined ? undefined : String(value)\n }, \"*\");\n } catch (error) {\n var message = error && error.message ? String(error.message) : String(error);\n parent.postMessage({ id: id, stdout: stdout, stderr: stderr, error: message }, \"*\");\n }\n})();\n</script></body></html>`;\n}\n\nexport interface SandboxMessage {\n id?: string;\n stdout?: string[];\n stderr?: string[];\n value?: string;\n error?: string;\n}\n\nexport function applySandboxStreams(stdio: StdioBuffer, message: SandboxMessage): void {\n for (const text of message.stdout ?? []) {\n stdio.push(\"stdout\", text);\n }\n for (const text of message.stderr ?? []) {\n stdio.push(\"stderr\", text);\n }\n}\n\nexport async function executeInSandboxIframe(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal?: AbortSignal,\n): Promise<unknown> {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n throw new Error(\"JavaScript sandbox iframe needs a document.\");\n }\n if (signal?.aborted) {\n throw abortError();\n }\n const messageId = `ox-code-play-${Math.random().toString(36).slice(2)}`;\n return new Promise((resolve, reject) => {\n const frame = document.createElement(\"iframe\");\n frame.setAttribute(\"sandbox\", JS_SANDBOX_FLAGS);\n frame.setAttribute(\"title\", \"Code Play JavaScript sandbox\");\n frame.hidden = true;\n const cleanup = () => {\n window.clearTimeout(timer);\n window.removeEventListener(\"message\", onMessage);\n signal?.removeEventListener(\"abort\", onAbort);\n frame.remove();\n };\n const onAbort = () => {\n cleanup();\n reject(abortError());\n };\n const onMessage = (event: MessageEvent<SandboxMessage>) => {\n if (event.source !== frame.contentWindow || event.data?.id !== messageId) {\n return;\n }\n cleanup();\n applySandboxStreams(stdio, event.data);\n if (event.data.error) {\n reject(new Error(event.data.error));\n return;\n }\n resolve(event.data.value);\n };\n const timer = window.setTimeout(() => {\n cleanup();\n reject(\n Object.assign(new Error(\"JavaScript execution timed out.\"), {\n code: \"ERR_SCRIPT_EXECUTION_TIMEOUT\",\n }),\n );\n }, timeoutMs);\n window.addEventListener(\"message\", onMessage);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n frame.srcdoc = buildJavaScriptSandboxDocument(code, messageId);\n document.body.append(frame);\n });\n}\n","/** True when the current isolate can load `node:vm`. */\nexport function hasNodeVm(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node);\n}\n","import { executeInSandboxIframe } from \"./javascript-sandbox\";\nimport { hasNodeVm } from \"./runtime-host\";\nimport { formatConsoleArgs, StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport { abortError, isAbortError } from \"./transport\";\nimport type { AdapterRequest, AdapterResult, Diagnostic } from \"./types\";\n\nexport async function runJavaScript(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n tracker.start(\"execute\", \"Execute\");\n const stdio = new StdioBuffer(tracker.startedAt);\n const provenance = {\n execute: {\n host: \"local\",\n runtime: hasNodeVm() ? \"node:vm\" : \"iframe\",\n sandbox: hasNodeVm() ? \"vm\" : \"srcdoc\",\n },\n };\n\n try {\n const value = await executeScript(request.code, request.timeoutMs, stdio, request.signal);\n tracker.stop();\n return {\n status: \"ok\",\n stdio: stdio.snapshot(),\n diagnostics: [],\n provenance,\n timing: tracker.report(),\n value: value === undefined ? undefined : String(value),\n };\n } catch (error) {\n if (isAbortError(error) || request.signal?.aborted) {\n throw error;\n }\n tracker.stop();\n const diagnostic = toDiagnostic(error);\n stdio.push(\"stderr\", `${diagnostic.message}\\n`);\n return {\n status: isTimeout(error) ? \"timeout\" : \"error\",\n stdio: stdio.snapshot(),\n diagnostics: [diagnostic],\n provenance,\n timing: tracker.report(),\n };\n }\n}\n\nexport async function executeScript(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal?: AbortSignal,\n): Promise<unknown> {\n const consoleLike = {\n log: (...args: unknown[]) => stdio.push(\"stdout\", formatConsoleArgs(args)),\n info: (...args: unknown[]) => stdio.push(\"stdout\", formatConsoleArgs(args)),\n warn: (...args: unknown[]) => stdio.push(\"stderr\", formatConsoleArgs(args)),\n error: (...args: unknown[]) => stdio.push(\"stderr\", formatConsoleArgs(args)),\n };\n\n if (signal?.aborted) {\n throw abortError();\n }\n\n const runtime = javascriptExecuteRuntime(hasNodeVm(), typeof document !== \"undefined\");\n if (runtime === \"vm\") {\n const vm = await import(\"node:vm\");\n const context = vm.createContext({ console: consoleLike });\n return vm.runInContext(code, context, { timeout: timeoutMs, displayErrors: true });\n }\n\n return executeInSandboxIframe(code, timeoutMs, stdio, signal);\n}\n\nexport function javascriptExecuteRuntime(hasVm: boolean, hasDocument: boolean): \"vm\" | \"iframe\" {\n if (hasVm) {\n return \"vm\";\n }\n if (hasDocument) {\n return \"iframe\";\n }\n throw new Error(\"JavaScript execute needs node:vm or a document for the sandbox iframe.\");\n}\n\nfunction isTimeout(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ERR_SCRIPT_EXECUTION_TIMEOUT\",\n );\n}\n\nfunction toDiagnostic(error: unknown): Diagnostic {\n if (isErrorLike(error)) {\n return { message: error.message, severity: \"error\", source: \"javascript\" };\n }\n return { message: String(error), severity: \"error\", source: \"javascript\" };\n}\n\nfunction isErrorLike(error: unknown): error is { message: string } {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n error.message.length > 0,\n );\n}\n","import { StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult } from \"./types\";\n\ninterface PistonExecuteResponse {\n compile?: { stdout?: string; stderr?: string; code?: number };\n run?: { stdout?: string; stderr?: string; code?: number; signal?: string | null };\n message?: string;\n}\n\nexport async function runRemote(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n const endpoint = request.enabled.endpoint;\n const language = request.definition.remote?.pistonLanguage ?? request.definition.id;\n\n if (!endpoint) {\n tracker.stop();\n return {\n status: \"unsupported\",\n stdio: [],\n diagnostics: [\n {\n message:\n `${request.definition.name} execution needs a configured HTTP executor. ` +\n `Pass languages.${request.definition.id}.endpoint (Piston-compatible).`,\n severity: \"error\",\n source: \"code-play\",\n },\n ],\n provenance: {},\n timing: tracker.report(),\n };\n }\n\n tracker.start(\"queue\", \"Queue\");\n tracker.start(\"compile\", \"Compile / execute\");\n const response = await request.transport.request({\n url: joinEndpoint(endpoint, \"execute\"),\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n language,\n version: request.config.version ?? request.definition.remote?.pistonVersion ?? \"*\",\n files: [{ content: request.code }],\n }),\n signal: request.signal,\n });\n tracker.start(\"collect\", \"Collect output\");\n\n const parsed = parseResponse(response.text);\n if (parsed.compile?.stdout) {\n stdio.push(\"stdout\", parsed.compile.stdout);\n }\n if (parsed.compile?.stderr) {\n stdio.push(\"stderr\", parsed.compile.stderr);\n }\n if (parsed.run?.stdout) {\n stdio.push(\"stdout\", parsed.run.stdout);\n }\n if (parsed.run?.stderr) {\n stdio.push(\"stderr\", parsed.run.stderr);\n }\n if (parsed.message && !parsed.run && !parsed.compile) {\n stdio.push(\"stderr\", `${parsed.message}\\n`);\n }\n\n const compileFailed = (parsed.compile?.code ?? 0) !== 0;\n const runFailed = (parsed.run?.code ?? 0) !== 0 || Boolean(parsed.run?.signal);\n const failed =\n !response.ok || compileFailed || runFailed || Boolean(parsed.message && !parsed.run);\n tracker.stop();\n\n return {\n status: failed ? \"error\" : \"ok\",\n stdio: stdio.snapshot(),\n diagnostics: failed\n ? [\n {\n message:\n parsed.message ??\n parsed.run?.stderr ??\n parsed.compile?.stderr ??\n \"Remote execution failed.\",\n severity: \"error\",\n source: language,\n },\n ]\n : [],\n provenance: {\n compile: parsed.compile\n ? { host: hostFromUrl(endpoint), runtime: language, sandbox: \"piston\" }\n : undefined,\n execute: { host: hostFromUrl(endpoint), runtime: language, sandbox: \"piston\" },\n },\n timing: tracker.report(),\n };\n}\n\nfunction parseResponse(text: string): PistonExecuteResponse {\n try {\n return JSON.parse(text) as PistonExecuteResponse;\n } catch {\n return { message: text };\n }\n}\n\nfunction joinEndpoint(endpoint: string, action: string): string {\n const trimmed = endpoint.replace(/\\/+$/, \"\");\n return trimmed.endsWith(action) ? trimmed : `${trimmed}/${action}`;\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","import { StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, Diagnostic } from \"./types\";\n\ninterface RustPlaygroundResponse {\n success?: boolean;\n stdout?: string;\n stderr?: string;\n error?: string;\n}\n\nexport async function runRust(\n request: AdapterRequest,\n mode: \"execute\" | \"typecheck\",\n): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n const crateType = resolveCrateType(request.code, String(request.config.crateType ?? \"auto\"));\n const body = {\n channel: request.config.channel ?? \"stable\",\n mode: request.config.mode ?? \"debug\",\n edition: String(request.config.edition ?? \"2024\"),\n crateType,\n tests: false,\n code: request.code,\n backtrace: false,\n };\n\n tracker.start(\n mode === \"typecheck\" ? \"typecheck\" : \"compile\",\n mode === \"typecheck\" ? \"Typecheck\" : \"Compile\",\n );\n const response = await request.transport.request({\n url: request.endpoints.rust,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: request.signal,\n });\n tracker.start(\"collect\", \"Collect output\");\n\n const parsed = parseResponse(response.text);\n const diagnostics = parseRustcDiagnostics(parsed.stderr ?? parsed.error ?? \"\");\n if (parsed.stdout) {\n stdio.push(\"stdout\", parsed.stdout);\n }\n if (parsed.stderr) {\n stdio.push(\"stderr\", parsed.stderr);\n }\n if (parsed.error && !parsed.stderr) {\n stdio.push(\"stderr\", parsed.error);\n }\n\n const success = parsed.success === true && response.ok;\n const compileFailed = diagnostics.some((item) => item.severity === \"error\") || !success;\n tracker.stop();\n\n return {\n status: compileFailed ? \"error\" : \"ok\",\n stdio: stdio.snapshot(),\n diagnostics,\n provenance: {\n compile: {\n host: hostFromUrl(request.endpoints.rust),\n runtime: \"rustc\",\n version: String(request.config.channel ?? \"stable\"),\n target: crateType,\n },\n execute:\n mode === \"execute\"\n ? {\n host: hostFromUrl(request.endpoints.rust),\n runtime: \"rust-playground\",\n sandbox: \"playground\",\n }\n : undefined,\n },\n timing: tracker.report(),\n };\n}\n\nfunction resolveCrateType(code: string, configured: string): \"bin\" | \"lib\" {\n if (configured === \"bin\" || configured === \"lib\") {\n return configured;\n }\n return /(?:^|\\b)(?:async\\s+)?fn\\s+main\\s*\\(/.test(code) ? \"bin\" : \"lib\";\n}\n\nfunction parseResponse(text: string): RustPlaygroundResponse {\n try {\n return JSON.parse(text) as RustPlaygroundResponse;\n } catch {\n return { success: false, error: text };\n }\n}\n\nexport function parseRustcDiagnostics(stderr: string): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const pattern = /^(error|warning|note)(?:\\[([^\\]]+)\\])?:\\s+(.*)$/gm;\n for (const match of stderr.matchAll(pattern)) {\n const severity = match[1] === \"warning\" ? \"warning\" : match[1] === \"note\" ? \"info\" : \"error\";\n diagnostics.push({\n message: match[3] ?? \"\",\n severity,\n source: match[2] ? `rustc ${match[2]}` : \"rustc\",\n });\n }\n return diagnostics;\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","/**\n * Conservative TypeScript-to-JavaScript stripper for documentation samples.\n * Full checking goes through tsgo; this path only needs to run the snippet.\n */\nexport function stripTypeScript(code: string): string {\n return code\n .replace(/^\\s*import\\s+type\\s+.*$/gm, \"\")\n .replace(/^\\s*export\\s+type\\s+\\w[\\s\\S]*?;\\s*$/gm, \"\")\n .replace(/^\\s*type\\s+\\w[\\s\\S]*?;\\s*$/gm, \"\")\n .replace(/^\\s*(?:export\\s+)?interface\\s+\\w[\\s\\S]*?\\{[\\s\\S]*?\\n\\}\\s*$/gm, \"\")\n .replace(/\\s+as\\s+const\\b/g, \"\")\n .replace(/\\s+as\\s+[^=,;)\\n]+/g, \"\")\n .replace(/\\s+satisfies\\s+[^=,;)\\n]+/g, \"\")\n .replace(/\\)\\s*:\\s*[^{;=\\n]+/g, \")\")\n .replace(/([?]?)\\s*:\\s*[^,)=;{\\n]+/g, \"$1\");\n}\n","import { executeScript } from \"./javascript\";\nimport { hasNodeVm } from \"./runtime-host\";\nimport { isAbortError } from \"./transport\";\nimport { StdioBuffer } from \"./stdio\";\nimport { stripTypeScript } from \"./strip-typescript\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, Diagnostic, TransportResponse } from \"./types\";\n\nexport type TypecheckBackend = \"endpoint\" | \"tsgo\" | \"unavailable\";\n\nexport function resolveTypecheckBackend(\n hasVm: boolean,\n typecheckUrl: string | undefined,\n): TypecheckBackend {\n if (typecheckUrl && !hasVm) {\n return \"endpoint\";\n }\n if (!hasVm) {\n return \"unavailable\";\n }\n return \"tsgo\";\n}\n\nexport async function typecheckTypeScript(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n tracker.start(\"typecheck\", \"Typecheck\");\n const backend = resolveTypecheckBackend(hasNodeVm(), request.endpoints.typecheck);\n\n if (backend === \"endpoint\") {\n return typecheckViaEndpoint(request, tracker);\n }\n if (backend === \"unavailable\") {\n tracker.stop();\n return {\n status: \"unsupported\",\n stdio: [],\n diagnostics: [\n {\n message:\n \"Typecheck needs a reachable endpoints.typecheck. The Vite /__ox-code-play/typecheck proxy exists only during vite dev.\",\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: \"local\", runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n\n try {\n const diagnostics = await typecheckWithTsgo(\n request.code,\n String(request.config.tsgoCommand ?? \"tsgo\"),\n );\n tracker.stop();\n return {\n status: diagnostics.some((item) => item.severity === \"error\") ? \"error\" : \"ok\",\n stdio: [],\n diagnostics,\n provenance: { compile: { host: \"local\", runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n } catch (error) {\n if (isAbortError(error) || request.signal?.aborted) {\n throw error;\n }\n tracker.stop();\n const message = error instanceof Error ? error.message : String(error);\n return {\n status: message.includes(\"ENOENT\") ? \"unsupported\" : \"error\",\n stdio: [],\n diagnostics: [\n {\n message: message.includes(\"ENOENT\")\n ? \"tsgo is not available. Install @typescript/native-preview or set languages.typescript.config.tsgoCommand.\"\n : message,\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: \"local\", runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n}\n\nexport async function runTypeScript(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n tracker.start(\"compile\", \"Strip types\");\n const javascript = stripTypeScript(request.code);\n tracker.start(\"execute\", \"Execute\");\n try {\n const value = await executeScript(javascript, request.timeoutMs, stdio, request.signal);\n tracker.stop();\n return {\n status: \"ok\",\n stdio: stdio.snapshot(),\n diagnostics: [],\n provenance: {\n compile: { host: \"local\", runtime: \"strip-types\" },\n execute: {\n host: \"local\",\n runtime: hasNodeVm() ? \"node:vm\" : \"iframe\",\n sandbox: hasNodeVm() ? \"vm\" : \"srcdoc\",\n },\n },\n timing: tracker.report(),\n value: value === undefined ? undefined : String(value),\n };\n } catch (error) {\n if (isAbortError(error) || request.signal?.aborted) {\n throw error;\n }\n tracker.stop();\n const message = error instanceof Error ? error.message : String(error);\n stdio.push(\"stderr\", `${message}\\n`);\n return {\n status: \"error\",\n stdio: stdio.snapshot(),\n diagnostics: [{ message, severity: \"error\", source: \"javascript\" }],\n provenance: {\n compile: { host: \"local\", runtime: \"strip-types\" },\n execute: {\n host: \"local\",\n runtime: hasNodeVm() ? \"node:vm\" : \"iframe\",\n sandbox: hasNodeVm() ? \"vm\" : \"srcdoc\",\n },\n },\n timing: tracker.report(),\n };\n }\n}\n\nasync function typecheckViaEndpoint(\n request: AdapterRequest,\n tracker: PhaseTracker,\n): Promise<AdapterResult> {\n const url = request.endpoints.typecheck ?? \"\";\n const response = await request.transport.request({\n url,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ language: \"typescript\", code: request.code, config: request.config }),\n signal: request.signal,\n });\n tracker.stop();\n return adapterResultFromTypecheckResponse(response, url, tracker);\n}\n\nexport function typecheckEndpointFailureMessage(status: number, text: string): string {\n if (status === 404 || status === 405) {\n return \"Typecheck needs a reachable endpoints.typecheck. The Vite /__ox-code-play/typecheck proxy exists only during vite dev.\";\n }\n const trimmed = text.trim();\n return trimmed || \"Typecheck endpoint failed.\";\n}\n\nexport function adapterResultFromTypecheckResponse(\n response: TransportResponse,\n url: string,\n tracker: PhaseTracker,\n): AdapterResult {\n if (!response.ok) {\n return {\n status: \"error\",\n stdio: [],\n diagnostics: [\n {\n message: typecheckEndpointFailureMessage(response.status, response.text),\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: hostFromUrl(url), runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n try {\n return JSON.parse(response.text) as AdapterResult;\n } catch {\n return {\n status: \"error\",\n stdio: [],\n diagnostics: [\n {\n message: response.text || \"Typecheck endpoint failed.\",\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: hostFromUrl(url), runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n}\n\nexport async function typecheckWithTsgo(code: string, command = \"tsgo\"): Promise<Diagnostic[]> {\n const [{ mkdtemp, rm, writeFile }, { tmpdir }, { join }, { execFile }, { promisify }] =\n await Promise.all([\n import(\"node:fs/promises\"),\n import(\"node:os\"),\n import(\"node:path\"),\n import(\"node:child_process\"),\n import(\"node:util\"),\n ]);\n const execFileAsync = promisify(execFile);\n const dir = await mkdtemp(join(tmpdir(), \"ox-code-play-\"));\n const file = join(dir, \"snippet.ts\");\n await writeFile(file, code);\n try {\n await execFileAsync(command, [\"--noEmit\", \"--pretty\", \"false\", \"--strict\", file], {\n cwd: dir,\n maxBuffer: 1024 * 1024,\n });\n return [];\n } catch (error) {\n const output = commandOutput(error);\n if ((error as { code?: string }).code === \"ENOENT\") {\n throw error;\n }\n return parseTsgoOutput(output);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\nexport function parseTsgoOutput(output: string): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const pattern =\n /^(?:.*[\\\\/])?snippet\\.ts\\((\\d+),(\\d+)\\):\\s+(error|warning|info)\\s+TS\\d+:\\s+(.*)$/gm;\n for (const match of output.matchAll(pattern)) {\n diagnostics.push({\n message: match[4] ?? output,\n severity: match[3] === \"warning\" ? \"warning\" : match[3] === \"info\" ? \"info\" : \"error\",\n line: Number(match[1]),\n column: Number(match[2]),\n source: \"tsgo\",\n });\n }\n if (diagnostics.length === 0 && output.trim()) {\n diagnostics.push({ message: output.trim(), severity: \"error\", source: \"tsgo\" });\n }\n return diagnostics;\n}\n\nfunction commandOutput(error: unknown): string {\n if (!error || typeof error !== \"object\") {\n return String(error);\n }\n const value = error as { stdout?: unknown; stderr?: unknown; message?: unknown };\n return [value.stdout, value.stderr, value.message]\n .filter((part): part is string => typeof part === \"string\" && part.trim().length > 0)\n .join(\"\\n\")\n .trim();\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","import { runFramework } from \"./framework\";\nimport { runGo } from \"./go\";\nimport { runJavaScript } from \"./javascript\";\nimport { runRemote } from \"./remote\";\nimport { runRust } from \"./rust\";\nimport { runTypeScript, typecheckTypeScript } from \"./typescript\";\nimport type { AdapterRequest, AdapterResult } from \"./types\";\n\nexport async function executeAdapter(request: AdapterRequest): Promise<AdapterResult> {\n if (!request.enabled.execute) {\n return capabilityDisabled(request, \"execute\");\n }\n switch (request.definition.backend) {\n case \"javascript\":\n return runJavaScript(request);\n case \"typescript\":\n return runTypeScript(request);\n case \"framework\":\n return runFramework(request);\n case \"rust-playground\":\n return runRust(request, \"execute\");\n case \"go-playground\":\n return runGo(request, \"execute\");\n case \"remote\":\n return runRemote(request);\n default:\n return capabilityDisabled(request, \"execute\");\n }\n}\n\nexport async function typecheckAdapter(request: AdapterRequest): Promise<AdapterResult> {\n if (!request.enabled.typecheck || !request.definition.capabilities.typecheck) {\n return capabilityDisabled(request, \"typecheck\");\n }\n switch (request.definition.backend) {\n case \"typescript\":\n return typecheckTypeScript(request);\n case \"rust-playground\":\n return runRust(request, \"typecheck\");\n case \"go-playground\":\n return runGo(request, \"typecheck\");\n default:\n return capabilityDisabled(request, \"typecheck\");\n }\n}\n\nfunction capabilityDisabled(\n request: AdapterRequest,\n action: \"execute\" | \"typecheck\",\n): AdapterResult {\n return {\n status: \"unsupported\",\n stdio: [],\n diagnostics: [\n {\n message: `${request.definition.name} ${action} is not enabled.`,\n severity: \"error\",\n source: \"code-play\",\n },\n ],\n provenance: {},\n timing: { totalMs: 0, phases: [] },\n };\n}\n","import { withStdioText } from \"./stdio\";\nimport { emptyTiming } from \"./timing\";\nimport type { RunResult, RunStatus } from \"./types\";\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : String(error);\n}\n\nexport function friendlyTransportMessage(error: unknown): string {\n const message = errorMessage(error);\n const typeError =\n error instanceof TypeError || (error instanceof Error && error.name === \"TypeError\");\n if (\n typeError &&\n /failed to fetch|networkerror|load failed|network request failed/i.test(message)\n ) {\n return \"The executor could not be reached from this page (often CORS). Set endpoints to a host that allows browser POST, or use the Vite dev proxy.\";\n }\n return message;\n}\n\nexport function errorResult(\n message: string,\n source = \"code-play\",\n status: RunStatus = \"error\",\n): RunResult {\n return withStdioText({\n status,\n stdio: [],\n diagnostics: [\n {\n message,\n severity: status === \"cancelled\" ? \"info\" : \"error\",\n source,\n },\n ],\n provenance: {},\n timing: emptyTiming(),\n });\n}\n","import { executeAdapter, typecheckAdapter } from \"./adapters\";\nimport { mergeConfig } from \"./config\";\nimport { friendlyTransportMessage, errorResult } from \"./result\";\nimport { withStdioText } from \"./stdio\";\nimport { isAbortError } from \"./transport\";\nimport type {\n AdapterRequest,\n CodePlayTransport,\n PlaygroundEndpoints,\n ResolvedLanguageEnable,\n RunResult,\n SessionEventMap,\n SessionEventName,\n SessionInput,\n TypeScriptLike,\n} from \"./types\";\nimport type { LanguageDefinition } from \"./types\";\n\ntype Listener<T> = (value: T) => void;\n\nexport class CodePlaySession {\n readonly language: LanguageDefinition;\n code: string;\n config: Record<string, unknown>;\n lastResult: RunResult | undefined;\n\n /** Last run's concatenated stdout (same as `lastResult.stdout`). */\n get stdout(): string {\n return this.lastResult?.stdout ?? \"\";\n }\n\n /** Last run's concatenated stderr (same as `lastResult.stderr`). */\n get stderr(): string {\n return this.lastResult?.stderr ?? \"\";\n }\n\n private readonly enabled: ResolvedLanguageEnable;\n private readonly timeoutMs: number;\n private readonly transport: CodePlayTransport;\n private readonly endpoints: PlaygroundEndpoints;\n private readonly loadTypeScript?: () => Promise<TypeScriptLike | undefined>;\n private readonly listeners = new Map<SessionEventName, Set<Listener<unknown>>>();\n private abort: AbortController | undefined;\n\n constructor(input: SessionConstructorInput) {\n this.language = input.definition;\n this.enabled = input.enabled;\n this.code = input.code;\n this.config = mergeConfig(input.definition.id, input.enabled, input.config);\n this.timeoutMs = input.timeoutMs;\n this.transport = input.transport;\n this.endpoints = input.endpoints;\n this.loadTypeScript = input.loadTypeScript;\n }\n\n on<K extends SessionEventName>(event: K, listener: Listener<SessionEventMap[K]>): () => void {\n const bucket = this.listeners.get(event) ?? new Set();\n bucket.add(listener as Listener<unknown>);\n this.listeners.set(event, bucket);\n return () => bucket.delete(listener as Listener<unknown>);\n }\n\n setCode(code: string): void {\n this.code = code;\n }\n\n setConfig(config: Record<string, unknown>): void {\n this.config = { ...this.config, ...config };\n this.emit(\"config\", this.config);\n }\n\n async run(): Promise<RunResult> {\n return this.dispatch(\"execute\");\n }\n\n async typecheck(): Promise<RunResult> {\n return this.dispatch(\"typecheck\");\n }\n\n cancel(): void {\n this.abort?.abort();\n }\n\n private async dispatch(action: \"execute\" | \"typecheck\"): Promise<RunResult> {\n this.abort?.abort();\n this.abort = new AbortController();\n const { signal } = this.abort;\n const request: AdapterRequest = {\n definition: this.language,\n enabled: this.enabled,\n code: this.code,\n config: this.config,\n timeoutMs: this.timeoutMs,\n transport: this.transport,\n loadTypeScript: this.loadTypeScript,\n endpoints: this.endpoints,\n signal,\n };\n try {\n const result = withStdioText(\n action === \"typecheck\" ? await typecheckAdapter(request) : await executeAdapter(request),\n );\n return this.finish(result);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n return this.finish(errorResult(\"Run cancelled.\", \"code-play\", \"cancelled\"));\n }\n return this.finish(errorResult(friendlyTransportMessage(error)));\n }\n }\n\n private finish(result: RunResult): RunResult {\n this.lastResult = result;\n for (const event of result.stdio) {\n this.emit(\"stdio\", event);\n }\n this.emit(\"result\", result);\n return result;\n }\n\n private emit<K extends SessionEventName>(event: K, value: SessionEventMap[K]): void {\n for (const listener of this.listeners.get(event) ?? []) {\n listener(value);\n }\n }\n}\n\nexport interface SessionConstructorInput extends SessionInput {\n definition: LanguageDefinition;\n enabled: ResolvedLanguageEnable;\n timeoutMs: number;\n transport: CodePlayTransport;\n endpoints: PlaygroundEndpoints;\n loadTypeScript?: () => Promise<TypeScriptLike | undefined>;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport {\n resolveCodePlayOptions,\n type RawCodePlayOptions,\n type ResolvedCodePlayOptions,\n} from \"./config\";\nimport { CodePlaySession } from \"./session\";\nimport { createFetchTransport, createUnavailableTransport } from \"./transport\";\nimport type { CodePlayTransport, SessionInput, TypeScriptLike } from \"./types\";\n\nexport interface CodePlayClientOptions extends RawCodePlayOptions {\n transport?: CodePlayTransport;\n loadTypeScript?: () => Promise<TypeScriptLike | undefined>;\n}\n\nexport interface CodePlayClient {\n readonly options: ResolvedCodePlayOptions;\n createSession(input: SessionInput): CodePlaySession;\n hasLanguage(language: string): boolean;\n}\n\nexport function createCodePlay(options: CodePlayClientOptions = {}): CodePlayClient {\n const resolved = resolveCodePlayOptions(options);\n const transport = options.transport ?? defaultTransport();\n return {\n options: resolved,\n hasLanguage(language: string) {\n const definition = resolveLanguage(language);\n return Boolean(definition && resolved.languages.has(definition.id));\n },\n createSession(input: SessionInput) {\n const definition = resolveLanguage(input.language);\n if (!definition) {\n throw new Error(`Unknown Code Play language: ${input.language}.`);\n }\n const enabled = resolved.languages.get(definition.id);\n if (!enabled) {\n throw new Error(\n `${definition.name} is not enabled. Pass languages.${definition.id}: true to createCodePlay().`,\n );\n }\n return new CodePlaySession({\n ...input,\n definition,\n enabled,\n timeoutMs: resolved.timeoutMs,\n transport,\n endpoints: resolved.endpoints,\n loadTypeScript: options.loadTypeScript,\n });\n },\n };\n}\n\nfunction defaultTransport(): CodePlayTransport {\n if (typeof fetch === \"function\") {\n return createFetchTransport();\n }\n return createUnavailableTransport();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.mjs","names":["parseResponse","hostFromUrl","parseResponse","hostFromUrl","hostFromUrl"],"sources":["../src/timing.ts","../src/framework.ts","../src/stdio.ts","../src/go.ts","../src/transport.ts","../src/javascript-sandbox.ts","../src/runtime-host.ts","../src/javascript.ts","../src/remote.ts","../src/rust.ts","../src/strip-typescript.ts","../src/typescript.ts","../src/adapters.ts","../src/result.ts","../src/session.ts","../src/client.ts"],"sourcesContent":["import type { TimingPhase, TimingReport } from \"./types\";\n\nexport class PhaseTracker {\n readonly startedAt: number;\n private readonly phases: TimingPhase[] = [];\n private current: { id: string; label: string; startMs: number } | undefined;\n\n constructor(now: () => number = nowMs) {\n this.now = now;\n this.startedAt = now();\n }\n\n private readonly now: () => number;\n\n start(id: string, label: string): void {\n this.stop();\n this.current = { id, label, startMs: this.now() - this.startedAt };\n }\n\n stop(): void {\n if (!this.current) {\n return;\n }\n const durationMs = Math.max(0, this.now() - this.startedAt - this.current.startMs);\n this.phases.push({\n id: this.current.id,\n label: this.current.label,\n startMs: this.current.startMs,\n durationMs,\n });\n this.current = undefined;\n }\n\n report(): TimingReport {\n this.stop();\n return {\n totalMs: Math.max(0, this.now() - this.startedAt),\n phases: this.phases.slice(),\n };\n }\n}\n\nexport function nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n\nexport function emptyTiming(): TimingReport {\n return { totalMs: 0, phases: [] };\n}\n","import { escapeHtml } from \"./escape\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, FrameworkId } from \"./types\";\n\nconst RUNTIMES: Record<FrameworkId, { specifier: string; cdn: string }> = {\n vue: { specifier: \"vue\", cdn: \"https://esm.sh/vue@3\" },\n react: { specifier: \"react\", cdn: \"https://esm.sh/react@19\" },\n svelte: { specifier: \"svelte\", cdn: \"https://esm.sh/svelte@5\" },\n solid: { specifier: \"solid-js\", cdn: \"https://esm.sh/solid-js@1\" },\n};\n\nexport async function runFramework(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n tracker.start(\"compile\", \"Compile preview\");\n const framework = request.definition.framework ?? \"vue\";\n const html = buildPreviewDocument(framework, request.code);\n tracker.stop();\n return {\n status: \"ok\",\n stdio: [],\n diagnostics: [],\n provenance: {\n compile: { host: \"local\", runtime: `${framework}-preview` },\n execute: { host: \"iframe\", runtime: framework, sandbox: \"srcdoc\" },\n },\n timing: tracker.report(),\n preview: { kind: \"html\", html },\n };\n}\n\nexport function buildPreviewDocument(framework: FrameworkId, code: string): string {\n const runtime = RUNTIMES[framework];\n return `<!doctype html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>${escapeHtml(framework)} preview</title>\n <script type=\"importmap\">${JSON.stringify({ imports: { [runtime.specifier]: runtime.cdn } })}</script>\n <style>html,body{margin:0;padding:1rem;font:14px/1.5 system-ui,sans-serif;}</style>\n</head>\n<body>\n <div id=\"app\"></div>\n <script type=\"module\">\n${indentPreview(code)}\n </script>\n</body>\n</html>\n`;\n}\n\nfunction indentPreview(code: string): string {\n return code\n .replace(/<\\/script/gi, \"<\\\\/script\")\n .split(\"\\n\")\n .map((line) => ` ${line}`)\n .join(\"\\n\");\n}\n","import type { StdioEvent, StdioStream } from \"./types\";\n\nexport class StdioBuffer {\n readonly events: StdioEvent[] = [];\n private readonly startedAt: number;\n\n constructor(startedAt = 0) {\n this.startedAt = startedAt;\n }\n\n push(stream: StdioStream, text: string, timestampMs = elapsed(this.startedAt)): StdioEvent {\n const event: StdioEvent = { stream, text, timestampMs };\n this.events.push(event);\n return event;\n }\n\n snapshot(): StdioEvent[] {\n return this.events.slice();\n }\n}\n\nexport function joinStream(events: StdioEvent[], stream: StdioStream): string {\n return events\n .filter((event) => event.stream === stream)\n .map((event) => event.text)\n .join(\"\");\n}\n\nexport function selectStream(events: StdioEvent[], stream: StdioStream): StdioEvent[] {\n return events.filter((event) => event.stream === stream);\n}\n\nexport function withStdioText<T extends { stdio: StdioEvent[] }>(\n result: T,\n): T & { stdout: string; stderr: string } {\n return {\n ...result,\n stdout: joinStream(result.stdio, \"stdout\"),\n stderr: joinStream(result.stdio, \"stderr\"),\n };\n}\n\nexport function formatConsoleArgs(args: unknown[]): string {\n return `${args.map(formatConsoleArg).join(\" \")}\\n`;\n}\n\nfunction formatConsoleArg(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return String(value);\n }\n if (value === undefined) {\n return \"undefined\";\n }\n if (value === null) {\n return \"null\";\n }\n try {\n return JSON.stringify(value);\n } catch {\n return Object.prototype.toString.call(value);\n }\n}\n\nfunction elapsed(startedAt: number): number {\n const now = typeof performance !== \"undefined\" ? performance.now() : Date.now();\n return Math.max(0, now - startedAt);\n}\n","import { StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, Diagnostic } from \"./types\";\n\ninterface GoPlaygroundEvent {\n Message?: string;\n Kind?: string;\n Delay?: number;\n}\n\ninterface GoPlaygroundResponse {\n Errors?: string;\n Events?: GoPlaygroundEvent[];\n VetErrors?: string;\n}\n\nexport async function runGo(\n request: AdapterRequest,\n mode: \"execute\" | \"typecheck\",\n): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n const params = new URLSearchParams({\n version: \"2\",\n body: request.code,\n withVet: request.config.withVet === false ? \"false\" : \"true\",\n });\n\n tracker.start(\n mode === \"typecheck\" ? \"typecheck\" : \"compile\",\n mode === \"typecheck\" ? \"Typecheck\" : \"Compile\",\n );\n const response = await request.transport.request({\n url: request.endpoints.go,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.toString(),\n signal: request.signal,\n });\n tracker.start(\"collect\", \"Collect output\");\n\n const parsed = parseResponse(response.text);\n const diagnostics = [\n ...parseGoErrors(parsed.Errors ?? \"\", \"go\"),\n ...parseGoErrors(parsed.VetErrors ?? \"\", \"vet\"),\n ];\n for (const event of parsed.Events ?? []) {\n const stream = event.Kind === \"stderr\" ? \"stderr\" : \"stdout\";\n stdio.push(stream, event.Message ?? \"\");\n }\n if (parsed.Errors) {\n stdio.push(\"stderr\", parsed.Errors);\n }\n\n tracker.stop();\n const failed = diagnostics.some((item) => item.severity === \"error\") || !response.ok;\n return {\n status: failed ? \"error\" : \"ok\",\n stdio: stdio.snapshot(),\n diagnostics,\n provenance: {\n compile: {\n host: hostFromUrl(request.endpoints.go),\n runtime: \"go\",\n },\n execute:\n mode === \"execute\"\n ? {\n host: hostFromUrl(request.endpoints.go),\n runtime: \"go-playground\",\n sandbox: \"playground\",\n }\n : undefined,\n },\n timing: tracker.report(),\n };\n}\n\nfunction parseResponse(text: string): GoPlaygroundResponse {\n try {\n return JSON.parse(text) as GoPlaygroundResponse;\n } catch {\n return { Errors: text };\n }\n}\n\nexport function parseGoErrors(output: string, source: string): Diagnostic[] {\n if (!output.trim()) {\n return [];\n }\n return output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => {\n const match = /^(?:prog\\.go:)?(\\d+)(?::(\\d+))?:\\s*(.*)$/.exec(line);\n return {\n message: match?.[3] ?? line,\n severity: \"error\" as const,\n line: match?.[1] ? Number(match[1]) : undefined,\n column: match?.[2] ? Number(match[2]) : undefined,\n source,\n };\n });\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","import type { CodePlayTransport, TransportRequest, TransportResponse } from \"./types\";\n\nexport function createFetchTransport(fetchImpl: typeof fetch = fetch): CodePlayTransport {\n return {\n async request(input: TransportRequest): Promise<TransportResponse> {\n const response = await fetchImpl(input.url, {\n method: input.method,\n headers: input.headers,\n body: input.body,\n signal: input.signal,\n });\n return {\n ok: response.ok,\n status: response.status,\n text: await response.text(),\n };\n },\n };\n}\n\nexport function createMemoryTransport(\n handler: (input: TransportRequest) => TransportResponse | Promise<TransportResponse>,\n): CodePlayTransport {\n return {\n async request(input) {\n if (input.signal?.aborted) {\n throw abortError();\n }\n return handler(input);\n },\n };\n}\n\nexport class MissingTransportError extends Error {\n constructor(host: string) {\n super(`No Code Play transport is configured for ${host}.`);\n this.name = \"MissingTransportError\";\n }\n}\n\nexport function abortError(): Error {\n const error = new Error(\"The Code Play run was cancelled.\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function isAbortError(error: unknown): boolean {\n return Boolean(\n error && typeof error === \"object\" && \"name\" in error && error.name === \"AbortError\",\n );\n}\n\nexport function createUnavailableTransport(): CodePlayTransport {\n return {\n request(input) {\n if (input.signal?.aborted) {\n return Promise.reject(abortError());\n }\n return Promise.reject(new MissingTransportError(input.url));\n },\n };\n}\n","import type { StdioBuffer } from \"./stdio\";\nimport { abortError } from \"./transport\";\n\nexport const JS_SANDBOX_FLAGS = \"allow-scripts\";\n\nexport function embedJson(value: unknown): string {\n return JSON.stringify(value).replace(/</g, \"\\\\u003c\");\n}\n\nexport function buildJavaScriptSandboxDocument(code: string, messageId: string): string {\n return `<!doctype html><html><head><meta charset=\"utf-8\"></head><body><script>\n(function () {\n var id = ${embedJson(messageId)};\n var stdout = [];\n var stderr = [];\n function format(args) {\n return Array.prototype.map.call(args, function (value) {\n if (typeof value === \"string\") return value;\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try { return JSON.stringify(value); } catch (error) { return String(value); }\n }).join(\" \") + \"\\\\n\";\n }\n var consoleLike = {\n log: function () { stdout.push(format(arguments)); },\n info: function () { stdout.push(format(arguments)); },\n warn: function () { stderr.push(format(arguments)); },\n error: function () { stderr.push(format(arguments)); }\n };\n try {\n var run = new Function(\"console\", ${embedJson(`\"use strict\";\\n${code}`)});\n var value = run(consoleLike);\n parent.postMessage({\n id: id,\n stdout: stdout,\n stderr: stderr,\n value: value === undefined ? undefined : String(value)\n }, \"*\");\n } catch (error) {\n var message = error && error.message ? String(error.message) : String(error);\n parent.postMessage({ id: id, stdout: stdout, stderr: stderr, error: message }, \"*\");\n }\n})();\n</script></body></html>`;\n}\n\nexport function buildJavaScriptWorkerSource(): string {\n return `\n(function () {\n function format(args) {\n return Array.prototype.map.call(args, function (value) {\n if (typeof value === \"string\") return value;\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try { return JSON.stringify(value); } catch (error) { return String(value); }\n }).join(\" \") + \"\\\\n\";\n }\n self.onmessage = function (event) {\n var data = event.data || {};\n if (!data.id) return;\n var stdout = [];\n var stderr = [];\n var consoleLike = {\n log: function () { stdout.push(format(arguments)); },\n info: function () { stdout.push(format(arguments)); },\n warn: function () { stderr.push(format(arguments)); },\n error: function () { stderr.push(format(arguments)); }\n };\n try {\n var run = new Function(\"console\", '\"use strict\";\\\\n' + String(data.code || \"\"));\n var value = run(consoleLike);\n self.postMessage({\n id: data.id,\n stdout: stdout,\n stderr: stderr,\n value: value === undefined ? undefined : String(value)\n });\n } catch (error) {\n var message = error && error.message ? String(error.message) : String(error);\n self.postMessage({ id: data.id, stdout: stdout, stderr: stderr, error: message });\n }\n };\n})();\n`;\n}\n\nexport interface SandboxMessage {\n id?: string;\n stdout?: string[];\n stderr?: string[];\n value?: string;\n error?: string;\n}\n\nexport function applySandboxStreams(stdio: StdioBuffer, message: SandboxMessage): void {\n for (const text of message.stdout ?? []) {\n stdio.push(\"stdout\", text);\n }\n for (const text of message.stderr ?? []) {\n stdio.push(\"stderr\", text);\n }\n}\n\nconst WORKER_UNAVAILABLE_CODE = \"ERR_SCRIPT_WORKER_UNAVAILABLE\";\n\nfunction workerUnavailableError(error: unknown): Error {\n const message =\n error instanceof Error && error.message\n ? error.message\n : \"JavaScript worker sandbox is unavailable.\";\n return Object.assign(new Error(message), { code: WORKER_UNAVAILABLE_CODE });\n}\n\nexport function isSandboxWorkerUnavailable(error: unknown): boolean {\n return Boolean(\n error && typeof error === \"object\" && \"code\" in error && error.code === WORKER_UNAVAILABLE_CODE,\n );\n}\n\nexport function canUseSandboxWorker(): boolean {\n return (\n typeof Worker !== \"undefined\" &&\n typeof Blob !== \"undefined\" &&\n typeof URL !== \"undefined\" &&\n typeof URL.createObjectURL === \"function\" &&\n typeof URL.revokeObjectURL === \"function\"\n );\n}\n\nexport async function executeInSandboxWorker(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal?: AbortSignal,\n): Promise<unknown> {\n if (!canUseSandboxWorker()) {\n throw workerUnavailableError(\n new Error(\"JavaScript worker sandbox needs Worker, Blob, and object URLs.\"),\n );\n }\n if (signal?.aborted) {\n throw abortError();\n }\n\n const messageId = `ox-code-play-${Math.random().toString(36).slice(2)}`;\n const url = URL.createObjectURL(\n new Blob([buildJavaScriptWorkerSource()], { type: \"text/javascript\" }),\n );\n\n let worker: Worker;\n try {\n worker = new Worker(url);\n } catch (error) {\n URL.revokeObjectURL(url);\n throw workerUnavailableError(error);\n }\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n worker.onmessage = null;\n worker.onerror = null;\n worker.terminate();\n URL.revokeObjectURL(url);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError());\n };\n const onMessage = (event: MessageEvent<SandboxMessage>) => {\n if (event.data?.id !== messageId) {\n return;\n }\n cleanup();\n applySandboxStreams(stdio, event.data);\n if (event.data.error) {\n reject(new Error(event.data.error));\n return;\n }\n resolve(event.data.value);\n };\n const onError = (event: ErrorEvent) => {\n cleanup();\n reject(\n workerUnavailableError(new Error(event.message || \"JavaScript worker sandbox failed.\")),\n );\n };\n const timer = setTimeout(() => {\n cleanup();\n reject(\n Object.assign(new Error(\"JavaScript execution timed out.\"), {\n code: \"ERR_SCRIPT_EXECUTION_TIMEOUT\",\n }),\n );\n }, timeoutMs);\n worker.onmessage = onMessage;\n worker.onerror = onError;\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n worker.postMessage({ id: messageId, code });\n });\n}\n\nexport async function executeInSandboxIframe(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal?: AbortSignal,\n): Promise<unknown> {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n throw new Error(\"JavaScript sandbox iframe needs a document.\");\n }\n if (signal?.aborted) {\n throw abortError();\n }\n const messageId = `ox-code-play-${Math.random().toString(36).slice(2)}`;\n return new Promise((resolve, reject) => {\n const frame = document.createElement(\"iframe\");\n frame.setAttribute(\"sandbox\", JS_SANDBOX_FLAGS);\n frame.setAttribute(\"title\", \"Code Play JavaScript sandbox\");\n frame.hidden = true;\n const cleanup = () => {\n window.clearTimeout(timer);\n window.removeEventListener(\"message\", onMessage);\n signal?.removeEventListener(\"abort\", onAbort);\n frame.remove();\n };\n const onAbort = () => {\n cleanup();\n reject(abortError());\n };\n const onMessage = (event: MessageEvent<SandboxMessage>) => {\n if (event.source !== frame.contentWindow || event.data?.id !== messageId) {\n return;\n }\n cleanup();\n applySandboxStreams(stdio, event.data);\n if (event.data.error) {\n reject(new Error(event.data.error));\n return;\n }\n resolve(event.data.value);\n };\n const timer = window.setTimeout(() => {\n cleanup();\n reject(\n Object.assign(new Error(\"JavaScript execution timed out.\"), {\n code: \"ERR_SCRIPT_EXECUTION_TIMEOUT\",\n }),\n );\n }, timeoutMs);\n window.addEventListener(\"message\", onMessage);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n frame.srcdoc = buildJavaScriptSandboxDocument(code, messageId);\n document.body.append(frame);\n });\n}\n","/** True when the current isolate can load `node:vm`. */\nexport function hasNodeVm(): boolean {\n return typeof process !== \"undefined\" && Boolean(process.versions?.node);\n}\n","import {\n canUseSandboxWorker,\n executeInSandboxIframe,\n executeInSandboxWorker,\n isSandboxWorkerUnavailable,\n} from \"./javascript-sandbox\";\nimport { hasNodeVm } from \"./runtime-host\";\nimport { formatConsoleArgs, StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport { abortError, isAbortError } from \"./transport\";\nimport type { AdapterRequest, AdapterResult, Diagnostic, RuntimeLocation } from \"./types\";\n\nexport type JavaScriptExecutionRuntime = \"vm\" | \"worker\" | \"iframe\";\n\nexport interface JavaScriptExecutionResult {\n value: unknown;\n runtime: JavaScriptExecutionRuntime;\n}\n\nexport async function runJavaScript(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n tracker.start(\"execute\", \"Execute\");\n const stdio = new StdioBuffer(tracker.startedAt);\n const runtime = currentJavaScriptRuntime();\n let executedRuntime = runtime;\n\n try {\n const result = await executeScriptWithRuntime(\n request.code,\n request.timeoutMs,\n stdio,\n request.signal,\n runtime,\n );\n executedRuntime = result.runtime;\n tracker.stop();\n return {\n status: \"ok\",\n stdio: stdio.snapshot(),\n diagnostics: [],\n provenance: {\n execute: javascriptRuntimeProvenance(executedRuntime),\n },\n timing: tracker.report(),\n value: result.value === undefined ? undefined : String(result.value),\n };\n } catch (error) {\n if (isAbortError(error) || request.signal?.aborted) {\n throw error;\n }\n executedRuntime = executionRuntimeFromError(error) ?? executedRuntime;\n tracker.stop();\n const diagnostic = toDiagnostic(error);\n stdio.push(\"stderr\", `${diagnostic.message}\\n`);\n return {\n status: isTimeout(error) ? \"timeout\" : \"error\",\n stdio: stdio.snapshot(),\n diagnostics: [diagnostic],\n provenance: {\n execute: javascriptRuntimeProvenance(executedRuntime),\n },\n timing: tracker.report(),\n };\n }\n}\n\nexport async function executeScript(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal?: AbortSignal,\n runtime = currentJavaScriptRuntime(),\n): Promise<unknown> {\n const result = await executeScriptWithRuntime(code, timeoutMs, stdio, signal, runtime);\n return result.value;\n}\n\nexport async function executeScriptWithRuntime(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal?: AbortSignal,\n runtime = currentJavaScriptRuntime(),\n): Promise<JavaScriptExecutionResult> {\n try {\n return {\n value: await executeScriptInRuntime(code, timeoutMs, stdio, signal, runtime),\n runtime,\n };\n } catch (error) {\n if (\n runtime === \"worker\" &&\n isSandboxWorkerUnavailable(error) &&\n typeof document !== \"undefined\"\n ) {\n try {\n return {\n value: await executeScriptInRuntime(code, timeoutMs, stdio, signal, \"iframe\"),\n runtime: \"iframe\",\n };\n } catch (fallbackError) {\n throw withExecutionRuntime(fallbackError, \"iframe\");\n }\n }\n throw withExecutionRuntime(error, runtime);\n }\n}\n\nasync function executeScriptInRuntime(\n code: string,\n timeoutMs: number,\n stdio: StdioBuffer,\n signal: AbortSignal | undefined,\n runtime: JavaScriptExecutionRuntime,\n): Promise<unknown> {\n const consoleLike = {\n log: (...args: unknown[]) => stdio.push(\"stdout\", formatConsoleArgs(args)),\n info: (...args: unknown[]) => stdio.push(\"stdout\", formatConsoleArgs(args)),\n warn: (...args: unknown[]) => stdio.push(\"stderr\", formatConsoleArgs(args)),\n error: (...args: unknown[]) => stdio.push(\"stderr\", formatConsoleArgs(args)),\n };\n\n if (signal?.aborted) {\n throw abortError();\n }\n\n if (runtime === \"vm\") {\n const vm = await import(\"node:vm\");\n const context = vm.createContext({ console: consoleLike });\n return vm.runInContext(code, context, { timeout: timeoutMs, displayErrors: true });\n }\n if (runtime === \"worker\") {\n return executeInSandboxWorker(code, timeoutMs, stdio, signal);\n }\n\n return executeInSandboxIframe(code, timeoutMs, stdio, signal);\n}\n\nexport function currentJavaScriptRuntime(): JavaScriptExecutionRuntime {\n return javascriptExecuteRuntime(\n hasNodeVm(),\n canUseSandboxWorker(),\n typeof document !== \"undefined\",\n );\n}\n\nexport function javascriptExecuteRuntime(\n hasVm: boolean,\n hasWorker: boolean,\n hasDocument: boolean,\n): JavaScriptExecutionRuntime {\n if (hasVm) {\n return \"vm\";\n }\n if (hasWorker) {\n return \"worker\";\n }\n if (hasDocument) {\n return \"iframe\";\n }\n throw new Error(\n \"JavaScript execute needs node:vm, a browser worker sandbox, or a document for the sandbox iframe.\",\n );\n}\n\nexport function javascriptRuntimeProvenance(runtime: JavaScriptExecutionRuntime): RuntimeLocation {\n if (runtime === \"vm\") {\n return { host: \"local\", runtime: \"node:vm\", sandbox: \"vm\" };\n }\n if (runtime === \"worker\") {\n return { host: \"local\", runtime: \"web-worker\", sandbox: \"worker\" };\n }\n return { host: \"local\", runtime: \"iframe\", sandbox: \"srcdoc\" };\n}\n\nfunction withExecutionRuntime(\n error: unknown,\n runtime: JavaScriptExecutionRuntime,\n): Error & { executionRuntime: JavaScriptExecutionRuntime } {\n if (error instanceof Error) {\n return Object.assign(error, { executionRuntime: runtime });\n }\n if (isErrorLike(error)) {\n return Object.assign(error, { executionRuntime: runtime }) as Error & {\n executionRuntime: JavaScriptExecutionRuntime;\n };\n }\n return Object.assign(new Error(String(error)), { executionRuntime: runtime });\n}\n\nexport function executionRuntimeFromError(error: unknown): JavaScriptExecutionRuntime | undefined {\n if (\n error &&\n typeof error === \"object\" &&\n \"executionRuntime\" in error &&\n isJavaScriptExecutionRuntime(error.executionRuntime)\n ) {\n return error.executionRuntime;\n }\n return undefined;\n}\n\nfunction isJavaScriptExecutionRuntime(value: unknown): value is JavaScriptExecutionRuntime {\n return value === \"vm\" || value === \"worker\" || value === \"iframe\";\n}\n\nfunction isTimeout(error: unknown): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n error.code === \"ERR_SCRIPT_EXECUTION_TIMEOUT\",\n );\n}\n\nfunction toDiagnostic(error: unknown): Diagnostic {\n if (isErrorLike(error)) {\n return { message: error.message, severity: \"error\", source: \"javascript\" };\n }\n return { message: String(error), severity: \"error\", source: \"javascript\" };\n}\n\nfunction isErrorLike(error: unknown): error is { message: string } {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"message\" in error &&\n typeof error.message === \"string\" &&\n error.message.length > 0,\n );\n}\n","import { StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult } from \"./types\";\n\ninterface PistonExecuteResponse {\n compile?: { stdout?: string; stderr?: string; code?: number };\n run?: { stdout?: string; stderr?: string; code?: number; signal?: string | null };\n message?: string;\n}\n\nexport async function runRemote(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n const endpoint = request.enabled.endpoint;\n const language = request.definition.remote?.pistonLanguage ?? request.definition.id;\n\n if (!endpoint) {\n tracker.stop();\n return {\n status: \"unsupported\",\n stdio: [],\n diagnostics: [\n {\n message:\n `${request.definition.name} execution needs a configured HTTP executor. ` +\n `Pass languages.${request.definition.id}.endpoint (Piston-compatible).`,\n severity: \"error\",\n source: \"code-play\",\n },\n ],\n provenance: {},\n timing: tracker.report(),\n };\n }\n\n tracker.start(\"queue\", \"Queue\");\n tracker.start(\"compile\", \"Compile / execute\");\n const response = await request.transport.request({\n url: joinEndpoint(endpoint, \"execute\"),\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n language,\n version: request.config.version ?? request.definition.remote?.pistonVersion ?? \"*\",\n files: [{ content: request.code }],\n }),\n signal: request.signal,\n });\n tracker.start(\"collect\", \"Collect output\");\n\n const parsed = parseResponse(response.text);\n if (parsed.compile?.stdout) {\n stdio.push(\"stdout\", parsed.compile.stdout);\n }\n if (parsed.compile?.stderr) {\n stdio.push(\"stderr\", parsed.compile.stderr);\n }\n if (parsed.run?.stdout) {\n stdio.push(\"stdout\", parsed.run.stdout);\n }\n if (parsed.run?.stderr) {\n stdio.push(\"stderr\", parsed.run.stderr);\n }\n if (parsed.message && !parsed.run && !parsed.compile) {\n stdio.push(\"stderr\", `${parsed.message}\\n`);\n }\n\n const compileFailed = (parsed.compile?.code ?? 0) !== 0;\n const runFailed = (parsed.run?.code ?? 0) !== 0 || Boolean(parsed.run?.signal);\n const failed =\n !response.ok || compileFailed || runFailed || Boolean(parsed.message && !parsed.run);\n tracker.stop();\n\n return {\n status: failed ? \"error\" : \"ok\",\n stdio: stdio.snapshot(),\n diagnostics: failed\n ? [\n {\n message:\n parsed.message ??\n parsed.run?.stderr ??\n parsed.compile?.stderr ??\n \"Remote execution failed.\",\n severity: \"error\",\n source: language,\n },\n ]\n : [],\n provenance: {\n compile: parsed.compile\n ? { host: hostFromUrl(endpoint), runtime: language, sandbox: \"piston\" }\n : undefined,\n execute: { host: hostFromUrl(endpoint), runtime: language, sandbox: \"piston\" },\n },\n timing: tracker.report(),\n };\n}\n\nfunction parseResponse(text: string): PistonExecuteResponse {\n try {\n return JSON.parse(text) as PistonExecuteResponse;\n } catch {\n return { message: text };\n }\n}\n\nfunction joinEndpoint(endpoint: string, action: string): string {\n const trimmed = endpoint.replace(/\\/+$/, \"\");\n return trimmed.endsWith(action) ? trimmed : `${trimmed}/${action}`;\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","import { StdioBuffer } from \"./stdio\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, Diagnostic } from \"./types\";\n\ninterface RustPlaygroundResponse {\n success?: boolean;\n stdout?: string;\n stderr?: string;\n error?: string;\n}\n\nexport async function runRust(\n request: AdapterRequest,\n mode: \"execute\" | \"typecheck\",\n): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n const crateType = resolveCrateType(request.code, String(request.config.crateType ?? \"auto\"));\n const body = {\n channel: request.config.channel ?? \"stable\",\n mode: request.config.mode ?? \"debug\",\n edition: String(request.config.edition ?? \"2024\"),\n crateType,\n tests: false,\n code: request.code,\n backtrace: false,\n };\n\n tracker.start(\n mode === \"typecheck\" ? \"typecheck\" : \"compile\",\n mode === \"typecheck\" ? \"Typecheck\" : \"Compile\",\n );\n const response = await request.transport.request({\n url: request.endpoints.rust,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: request.signal,\n });\n tracker.start(\"collect\", \"Collect output\");\n\n const parsed = parseResponse(response.text);\n const diagnostics = parseRustcDiagnostics(parsed.stderr ?? parsed.error ?? \"\");\n if (parsed.stdout) {\n stdio.push(\"stdout\", parsed.stdout);\n }\n if (parsed.stderr) {\n stdio.push(\"stderr\", parsed.stderr);\n }\n if (parsed.error && !parsed.stderr) {\n stdio.push(\"stderr\", parsed.error);\n }\n\n const success = parsed.success === true && response.ok;\n const compileFailed = diagnostics.some((item) => item.severity === \"error\") || !success;\n tracker.stop();\n\n return {\n status: compileFailed ? \"error\" : \"ok\",\n stdio: stdio.snapshot(),\n diagnostics,\n provenance: {\n compile: {\n host: hostFromUrl(request.endpoints.rust),\n runtime: \"rustc\",\n version: String(request.config.channel ?? \"stable\"),\n target: crateType,\n },\n execute:\n mode === \"execute\"\n ? {\n host: hostFromUrl(request.endpoints.rust),\n runtime: \"rust-playground\",\n sandbox: \"playground\",\n }\n : undefined,\n },\n timing: tracker.report(),\n };\n}\n\nfunction resolveCrateType(code: string, configured: string): \"bin\" | \"lib\" {\n if (configured === \"bin\" || configured === \"lib\") {\n return configured;\n }\n return /(?:^|\\b)(?:async\\s+)?fn\\s+main\\s*\\(/.test(code) ? \"bin\" : \"lib\";\n}\n\nfunction parseResponse(text: string): RustPlaygroundResponse {\n try {\n return JSON.parse(text) as RustPlaygroundResponse;\n } catch {\n return { success: false, error: text };\n }\n}\n\nexport function parseRustcDiagnostics(stderr: string): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const pattern = /^(error|warning|note)(?:\\[([^\\]]+)\\])?:\\s+(.*)$/gm;\n for (const match of stderr.matchAll(pattern)) {\n const severity = match[1] === \"warning\" ? \"warning\" : match[1] === \"note\" ? \"info\" : \"error\";\n diagnostics.push({\n message: match[3] ?? \"\",\n severity,\n source: match[2] ? `rustc ${match[2]}` : \"rustc\",\n });\n }\n return diagnostics;\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","/**\n * Conservative TypeScript-to-JavaScript stripper for documentation samples.\n * Full checking goes through tsgo; this path only needs to run the snippet.\n */\nexport function stripTypeScript(code: string): string {\n return code\n .replace(/^\\s*import\\s+type\\s+.*$/gm, \"\")\n .replace(/^\\s*export\\s+type\\s+\\w[\\s\\S]*?;\\s*$/gm, \"\")\n .replace(/^\\s*type\\s+\\w[\\s\\S]*?;\\s*$/gm, \"\")\n .replace(/^\\s*(?:export\\s+)?interface\\s+\\w[\\s\\S]*?\\{[\\s\\S]*?\\n\\}\\s*$/gm, \"\")\n .replace(/\\s+as\\s+const\\b/g, \"\")\n .replace(/\\s+as\\s+[^=,;)\\n]+/g, \"\")\n .replace(/\\s+satisfies\\s+[^=,;)\\n]+/g, \"\")\n .replace(/\\)\\s*:\\s*[^{;=\\n]+/g, \")\")\n .replace(/([?]?)\\s*:\\s*[^,)=;{\\n]+/g, \"$1\");\n}\n","import {\n currentJavaScriptRuntime,\n executeScriptWithRuntime,\n executionRuntimeFromError,\n javascriptRuntimeProvenance,\n} from \"./javascript\";\nimport { hasNodeVm } from \"./runtime-host\";\nimport { isAbortError } from \"./transport\";\nimport { StdioBuffer } from \"./stdio\";\nimport { stripTypeScript } from \"./strip-typescript\";\nimport { PhaseTracker } from \"./timing\";\nimport type { AdapterRequest, AdapterResult, Diagnostic, TransportResponse } from \"./types\";\n\nexport type TypecheckBackend = \"endpoint\" | \"tsgo\" | \"unavailable\";\n\nexport function resolveTypecheckBackend(\n hasVm: boolean,\n typecheckUrl: string | undefined,\n): TypecheckBackend {\n if (typecheckUrl && !hasVm) {\n return \"endpoint\";\n }\n if (!hasVm) {\n return \"unavailable\";\n }\n return \"tsgo\";\n}\n\nexport async function typecheckTypeScript(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n tracker.start(\"typecheck\", \"Typecheck\");\n const backend = resolveTypecheckBackend(hasNodeVm(), request.endpoints.typecheck);\n\n if (backend === \"endpoint\") {\n return typecheckViaEndpoint(request, tracker);\n }\n if (backend === \"unavailable\") {\n tracker.stop();\n return {\n status: \"unsupported\",\n stdio: [],\n diagnostics: [\n {\n message:\n \"Typecheck needs a reachable endpoints.typecheck. The Vite /__ox-code-play/typecheck proxy exists only during vite dev.\",\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: \"local\", runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n\n try {\n const diagnostics = await typecheckWithTsgo(\n request.code,\n String(request.config.tsgoCommand ?? \"tsgo\"),\n );\n tracker.stop();\n return {\n status: diagnostics.some((item) => item.severity === \"error\") ? \"error\" : \"ok\",\n stdio: [],\n diagnostics,\n provenance: { compile: { host: \"local\", runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n } catch (error) {\n if (isAbortError(error) || request.signal?.aborted) {\n throw error;\n }\n executedRuntime = executionRuntimeFromError(error) ?? executedRuntime;\n tracker.stop();\n const message = error instanceof Error ? error.message : String(error);\n return {\n status: message.includes(\"ENOENT\") ? \"unsupported\" : \"error\",\n stdio: [],\n diagnostics: [\n {\n message: message.includes(\"ENOENT\")\n ? \"tsgo is not available. Install @typescript/native-preview or set languages.typescript.config.tsgoCommand.\"\n : message,\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: \"local\", runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n}\n\nexport async function runTypeScript(request: AdapterRequest): Promise<AdapterResult> {\n const tracker = new PhaseTracker();\n const stdio = new StdioBuffer(tracker.startedAt);\n tracker.start(\"compile\", \"Strip types\");\n const javascript = stripTypeScript(request.code);\n const runtime = currentJavaScriptRuntime();\n let executedRuntime = runtime;\n tracker.start(\"execute\", \"Execute\");\n try {\n const result = await executeScriptWithRuntime(\n javascript,\n request.timeoutMs,\n stdio,\n request.signal,\n runtime,\n );\n executedRuntime = result.runtime;\n tracker.stop();\n return {\n status: \"ok\",\n stdio: stdio.snapshot(),\n diagnostics: [],\n provenance: {\n compile: { host: \"local\", runtime: \"strip-types\" },\n execute: javascriptRuntimeProvenance(executedRuntime),\n },\n timing: tracker.report(),\n value: result.value === undefined ? undefined : String(result.value),\n };\n } catch (error) {\n if (isAbortError(error) || request.signal?.aborted) {\n throw error;\n }\n tracker.stop();\n const message = error instanceof Error ? error.message : String(error);\n stdio.push(\"stderr\", `${message}\\n`);\n return {\n status: \"error\",\n stdio: stdio.snapshot(),\n diagnostics: [{ message, severity: \"error\", source: \"javascript\" }],\n provenance: {\n compile: { host: \"local\", runtime: \"strip-types\" },\n execute: javascriptRuntimeProvenance(executedRuntime),\n },\n timing: tracker.report(),\n };\n }\n}\n\nasync function typecheckViaEndpoint(\n request: AdapterRequest,\n tracker: PhaseTracker,\n): Promise<AdapterResult> {\n const url = request.endpoints.typecheck ?? \"\";\n const response = await request.transport.request({\n url,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ language: \"typescript\", code: request.code, config: request.config }),\n signal: request.signal,\n });\n tracker.stop();\n return adapterResultFromTypecheckResponse(response, url, tracker);\n}\n\nexport function typecheckEndpointFailureMessage(status: number, text: string): string {\n if (status === 404 || status === 405) {\n return \"Typecheck needs a reachable endpoints.typecheck. The Vite /__ox-code-play/typecheck proxy exists only during vite dev.\";\n }\n const trimmed = text.trim();\n return trimmed || \"Typecheck endpoint failed.\";\n}\n\nexport function adapterResultFromTypecheckResponse(\n response: TransportResponse,\n url: string,\n tracker: PhaseTracker,\n): AdapterResult {\n if (!response.ok) {\n return {\n status: \"error\",\n stdio: [],\n diagnostics: [\n {\n message: typecheckEndpointFailureMessage(response.status, response.text),\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: hostFromUrl(url), runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n try {\n return JSON.parse(response.text) as AdapterResult;\n } catch {\n return {\n status: \"error\",\n stdio: [],\n diagnostics: [\n {\n message: response.text || \"Typecheck endpoint failed.\",\n severity: \"error\",\n source: \"tsgo\",\n },\n ],\n provenance: { compile: { host: hostFromUrl(url), runtime: \"tsgo\" } },\n timing: tracker.report(),\n };\n }\n}\n\nexport async function typecheckWithTsgo(code: string, command = \"tsgo\"): Promise<Diagnostic[]> {\n const [{ mkdtemp, rm, writeFile }, { tmpdir }, { join }, { execFile }, { promisify }] =\n await Promise.all([\n import(\"node:fs/promises\"),\n import(\"node:os\"),\n import(\"node:path\"),\n import(\"node:child_process\"),\n import(\"node:util\"),\n ]);\n const execFileAsync = promisify(execFile);\n const dir = await mkdtemp(join(tmpdir(), \"ox-code-play-\"));\n const file = join(dir, \"snippet.ts\");\n await writeFile(file, code);\n try {\n await execFileAsync(command, [\"--noEmit\", \"--pretty\", \"false\", \"--strict\", file], {\n cwd: dir,\n maxBuffer: 1024 * 1024,\n });\n return [];\n } catch (error) {\n const output = commandOutput(error);\n if ((error as { code?: string }).code === \"ENOENT\") {\n throw error;\n }\n return parseTsgoOutput(output);\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\nexport function parseTsgoOutput(output: string): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const pattern =\n /^(?:.*[\\\\/])?snippet\\.ts\\((\\d+),(\\d+)\\):\\s+(error|warning|info)\\s+TS\\d+:\\s+(.*)$/gm;\n for (const match of output.matchAll(pattern)) {\n diagnostics.push({\n message: match[4] ?? output,\n severity: match[3] === \"warning\" ? \"warning\" : match[3] === \"info\" ? \"info\" : \"error\",\n line: Number(match[1]),\n column: Number(match[2]),\n source: \"tsgo\",\n });\n }\n if (diagnostics.length === 0 && output.trim()) {\n diagnostics.push({ message: output.trim(), severity: \"error\", source: \"tsgo\" });\n }\n return diagnostics;\n}\n\nfunction commandOutput(error: unknown): string {\n if (!error || typeof error !== \"object\") {\n return String(error);\n }\n const value = error as { stdout?: unknown; stderr?: unknown; message?: unknown };\n return [value.stdout, value.stderr, value.message]\n .filter((part): part is string => typeof part === \"string\" && part.trim().length > 0)\n .join(\"\\n\")\n .trim();\n}\n\nfunction hostFromUrl(url: string): string {\n try {\n return new URL(url, \"https://code-play.local\").host || url;\n } catch {\n return url;\n }\n}\n","import { runFramework } from \"./framework\";\nimport { runGo } from \"./go\";\nimport { runJavaScript } from \"./javascript\";\nimport { runRemote } from \"./remote\";\nimport { runRust } from \"./rust\";\nimport { runTypeScript, typecheckTypeScript } from \"./typescript\";\nimport type { AdapterRequest, AdapterResult } from \"./types\";\n\nexport async function executeAdapter(request: AdapterRequest): Promise<AdapterResult> {\n if (!request.enabled.execute) {\n return capabilityDisabled(request, \"execute\");\n }\n switch (request.definition.backend) {\n case \"javascript\":\n return runJavaScript(request);\n case \"typescript\":\n return runTypeScript(request);\n case \"framework\":\n return runFramework(request);\n case \"rust-playground\":\n return runRust(request, \"execute\");\n case \"go-playground\":\n return runGo(request, \"execute\");\n case \"remote\":\n return runRemote(request);\n default:\n return capabilityDisabled(request, \"execute\");\n }\n}\n\nexport async function typecheckAdapter(request: AdapterRequest): Promise<AdapterResult> {\n if (!request.enabled.typecheck || !request.definition.capabilities.typecheck) {\n return capabilityDisabled(request, \"typecheck\");\n }\n switch (request.definition.backend) {\n case \"typescript\":\n return typecheckTypeScript(request);\n case \"rust-playground\":\n return runRust(request, \"typecheck\");\n case \"go-playground\":\n return runGo(request, \"typecheck\");\n default:\n return capabilityDisabled(request, \"typecheck\");\n }\n}\n\nfunction capabilityDisabled(\n request: AdapterRequest,\n action: \"execute\" | \"typecheck\",\n): AdapterResult {\n return {\n status: \"unsupported\",\n stdio: [],\n diagnostics: [\n {\n message: `${request.definition.name} ${action} is not enabled.`,\n severity: \"error\",\n source: \"code-play\",\n },\n ],\n provenance: {},\n timing: { totalMs: 0, phases: [] },\n };\n}\n","import { withStdioText } from \"./stdio\";\nimport { emptyTiming } from \"./timing\";\nimport type { RunResult, RunStatus } from \"./types\";\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : String(error);\n}\n\nexport function friendlyTransportMessage(error: unknown): string {\n const message = errorMessage(error);\n const typeError =\n error instanceof TypeError || (error instanceof Error && error.name === \"TypeError\");\n if (\n typeError &&\n /failed to fetch|networkerror|load failed|network request failed/i.test(message)\n ) {\n return \"The executor could not be reached from this page (often CORS). Set endpoints to a host that allows browser POST, or use the Vite dev proxy.\";\n }\n return message;\n}\n\nexport function errorResult(\n message: string,\n source = \"code-play\",\n status: RunStatus = \"error\",\n): RunResult {\n return withStdioText({\n status,\n stdio: [],\n diagnostics: [\n {\n message,\n severity: status === \"cancelled\" ? \"info\" : \"error\",\n source,\n },\n ],\n provenance: {},\n timing: emptyTiming(),\n });\n}\n","import { executeAdapter, typecheckAdapter } from \"./adapters\";\nimport { mergeConfig } from \"./config\";\nimport { friendlyTransportMessage, errorResult } from \"./result\";\nimport { withStdioText } from \"./stdio\";\nimport { isAbortError } from \"./transport\";\nimport type {\n AdapterRequest,\n CodePlayTransport,\n PlaygroundEndpoints,\n ResolvedLanguageEnable,\n RunResult,\n SessionEventMap,\n SessionEventName,\n SessionInput,\n TypeScriptLike,\n} from \"./types\";\nimport type { LanguageDefinition } from \"./types\";\n\ntype Listener<T> = (value: T) => void;\n\nexport class CodePlaySession {\n readonly language: LanguageDefinition;\n code: string;\n config: Record<string, unknown>;\n lastResult: RunResult | undefined;\n\n /** Last run's concatenated stdout (same as `lastResult.stdout`). */\n get stdout(): string {\n return this.lastResult?.stdout ?? \"\";\n }\n\n /** Last run's concatenated stderr (same as `lastResult.stderr`). */\n get stderr(): string {\n return this.lastResult?.stderr ?? \"\";\n }\n\n private readonly enabled: ResolvedLanguageEnable;\n private readonly timeoutMs: number;\n private readonly transport: CodePlayTransport;\n private readonly endpoints: PlaygroundEndpoints;\n private readonly loadTypeScript?: () => Promise<TypeScriptLike | undefined>;\n private readonly listeners = new Map<SessionEventName, Set<Listener<unknown>>>();\n private abort: AbortController | undefined;\n\n constructor(input: SessionConstructorInput) {\n this.language = input.definition;\n this.enabled = input.enabled;\n this.code = input.code;\n this.config = mergeConfig(input.definition.id, input.enabled, input.config);\n this.timeoutMs = input.timeoutMs;\n this.transport = input.transport;\n this.endpoints = input.endpoints;\n this.loadTypeScript = input.loadTypeScript;\n }\n\n on<K extends SessionEventName>(event: K, listener: Listener<SessionEventMap[K]>): () => void {\n const bucket = this.listeners.get(event) ?? new Set();\n bucket.add(listener as Listener<unknown>);\n this.listeners.set(event, bucket);\n return () => bucket.delete(listener as Listener<unknown>);\n }\n\n setCode(code: string): void {\n this.code = code;\n }\n\n setConfig(config: Record<string, unknown>): void {\n this.config = { ...this.config, ...config };\n this.emit(\"config\", this.config);\n }\n\n async run(): Promise<RunResult> {\n return this.dispatch(\"execute\");\n }\n\n async typecheck(): Promise<RunResult> {\n return this.dispatch(\"typecheck\");\n }\n\n cancel(): void {\n this.abort?.abort();\n }\n\n private async dispatch(action: \"execute\" | \"typecheck\"): Promise<RunResult> {\n this.abort?.abort();\n this.abort = new AbortController();\n const { signal } = this.abort;\n const request: AdapterRequest = {\n definition: this.language,\n enabled: this.enabled,\n code: this.code,\n config: this.config,\n timeoutMs: this.timeoutMs,\n transport: this.transport,\n loadTypeScript: this.loadTypeScript,\n endpoints: this.endpoints,\n signal,\n };\n try {\n const result = withStdioText(\n action === \"typecheck\" ? await typecheckAdapter(request) : await executeAdapter(request),\n );\n return this.finish(result);\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n return this.finish(errorResult(\"Run cancelled.\", \"code-play\", \"cancelled\"));\n }\n return this.finish(errorResult(friendlyTransportMessage(error)));\n }\n }\n\n private finish(result: RunResult): RunResult {\n this.lastResult = result;\n for (const event of result.stdio) {\n this.emit(\"stdio\", event);\n }\n this.emit(\"result\", result);\n return result;\n }\n\n private emit<K extends SessionEventName>(event: K, value: SessionEventMap[K]): void {\n for (const listener of this.listeners.get(event) ?? []) {\n listener(value);\n }\n }\n}\n\nexport interface SessionConstructorInput extends SessionInput {\n definition: LanguageDefinition;\n enabled: ResolvedLanguageEnable;\n timeoutMs: number;\n transport: CodePlayTransport;\n endpoints: PlaygroundEndpoints;\n loadTypeScript?: () => Promise<TypeScriptLike | undefined>;\n}\n","import { resolveLanguage } from \"./catalog\";\nimport {\n resolveCodePlayOptions,\n type RawCodePlayOptions,\n type ResolvedCodePlayOptions,\n} from \"./config\";\nimport { CodePlaySession } from \"./session\";\nimport { createFetchTransport, createUnavailableTransport } from \"./transport\";\nimport type { CodePlayTransport, SessionInput, TypeScriptLike } from \"./types\";\n\nexport interface CodePlayClientOptions extends RawCodePlayOptions {\n transport?: CodePlayTransport;\n loadTypeScript?: () => Promise<TypeScriptLike | undefined>;\n}\n\nexport interface CodePlayClient {\n readonly options: ResolvedCodePlayOptions;\n createSession(input: SessionInput): CodePlaySession;\n hasLanguage(language: string): boolean;\n}\n\nexport function createCodePlay(options: CodePlayClientOptions = {}): CodePlayClient {\n const resolved = resolveCodePlayOptions(options);\n const transport = options.transport ?? defaultTransport();\n return {\n options: resolved,\n hasLanguage(language: string) {\n const definition = resolveLanguage(language);\n return Boolean(definition && resolved.languages.has(definition.id));\n },\n createSession(input: SessionInput) {\n const definition = resolveLanguage(input.language);\n if (!definition) {\n throw new Error(`Unknown Code Play language: ${input.language}.`);\n }\n const enabled = resolved.languages.get(definition.id);\n if (!enabled) {\n throw new Error(\n `${definition.name} is not enabled. Pass languages.${definition.id}: true to createCodePlay().`,\n );\n }\n return new CodePlaySession({\n ...input,\n definition,\n enabled,\n timeoutMs: resolved.timeoutMs,\n transport,\n endpoints: resolved.endpoints,\n loadTypeScript: options.loadTypeScript,\n });\n },\n };\n}\n\nfunction defaultTransport(): CodePlayTransport {\n if (typeof fetch === \"function\") {\n return createFetchTransport();\n }\n return createUnavailableTransport();\n}\n"],"mappings":"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"}
|