Files
johndoe6345789 9a40d3f6ea refactor: move root codegen/ and pastebin/ into frontends/
- codegen/packages/spark-tools → frontends/codegen/packages/spark-tools
- root pastebin/ was subset of frontends/pastebin/, removed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 23:03:11 +00:00

158 lines
5.6 KiB
JavaScript

import { E as EventType } from './heartbeat-event-types-BmKuwNhb.js';
const VERSION = "ec61fa57186e5a2ceb3003a660f42fd762e82193";
const WORKBENCH_ORIGIN = import.meta.env.VITE_WORKBENCH_ORIGIN || "https://github.com";
async function getSourceMapConsumer(sourceMap) {
if (window.sourceMap !== undefined) {
return await new window.sourceMap.SourceMapConsumer(sourceMap);
}
// @ts-ignore
await import('https://unpkg.com/source-map@0.7.3/dist/source-map.js');
window.sourceMap.SourceMapConsumer.initialize({
"lib/mappings.wasm": "https://unpkg.com/source-map@0.7.3/lib/mappings.wasm",
});
return await new window.sourceMap.SourceMapConsumer(sourceMap);
}
async function wait(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
/**
* Check whether the root element of the app exists.
*/
function getRootElement() {
return document.getElementById("root");
}
/**
* Checks if the given element is null or empty.
*/
function isEmptyElement(element) {
if (element === null) {
return true; // Treat missing element as empty
}
return element.textContent?.trim() === "";
}
async function monitorRootElement() {
await wait(200); // Wait a bit for the root element to be rendered
console.info("Root element monitoring enabled");
let checkInterval = 500; // Start with 500 milliseconds
const checkRootElement = () => {
const rootElement = getRootElement();
window.parent.postMessage({
type: EventType.ROOT_ELEMENT_STATUS,
payload: {
timestamp: Date.now(),
isEmpty: isEmptyElement(rootElement),
exists: !!rootElement,
},
}, WORKBENCH_ORIGIN);
clearInterval(intervalId);
checkInterval = 3000;
intervalId = setInterval(checkRootElement, checkInterval);
};
let intervalId = setInterval(checkRootElement, checkInterval);
checkRootElement();
}
// Handle JavaScript errors
function setupErrorListener() {
console.info("Runtime heartbeat enabled");
window.addEventListener("error", (event) => {
const { message, filename, lineno, colno } = event;
fetch(filename)
.then(async (response) => {
if (response.ok) {
const rawFile = await response.text();
const base64SourceMap = rawFile.split("# sourceMappingURL=").pop();
const rawBase64SourceMap = base64SourceMap.split("data:application/json;base64,").pop();
const sourceMap = JSON.parse(atob(rawBase64SourceMap));
const consumer = await getSourceMapConsumer(sourceMap);
const originalPosition = consumer.originalPositionFor({
line: lineno,
column: colno,
});
const payload = {
line: originalPosition.line,
column: originalPosition.column,
path: new URL(filename).pathname,
message,
};
window.parent.postMessage({
type: EventType.SPARK_RUNTIME_ERROR,
payload,
}, WORKBENCH_ORIGIN);
}
})
.catch(() => {
const payload = {
line: lineno,
column: colno,
path: new URL(filename).pathname,
message,
sourceMap: false,
};
window.parent.postMessage({
type: EventType.SPARK_RUNTIME_ERROR,
payload,
}, WORKBENCH_ORIGIN);
});
});
}
function initializeViteHeartbeat() {
const viteServerSessionId = import.meta.env.VITE_SERVER_SESSION_ID || "unset";
console.info("Vite heartbeat enabled. Server session ID:", viteServerSessionId);
import.meta.hot?.on("vite:ws:connect", () => {
console.info("Vite server WebSocket connected");
window.parent.postMessage({
type: EventType.SPARK_VITE_WS_CONNECT,
payload: { timestamp: Date.now(), viteServerSessionId },
}, WORKBENCH_ORIGIN);
});
import.meta.hot?.on("vite:ws:disconnect", () => {
console.info("Vite server WebSocket disconnected");
window.parent.postMessage({
type: EventType.SPARK_VITE_WS_DISCONNECT,
payload: { timestamp: Date.now(), viteServerSessionId },
}, WORKBENCH_ORIGIN);
});
import.meta.hot?.on("vite:error", (error) => {
console.warn("Vite server error:", error);
window.parent.postMessage({
type: EventType.SPARK_VITE_ERROR,
payload: { error, timestamp: Date.now(), viteServerSessionId },
}, WORKBENCH_ORIGIN);
});
import.meta.hot?.on("vite:afterUpdate", (updateInfo) => {
window.parent.postMessage({
type: EventType.SPARK_VITE_AFTER_UPDATE,
payload: { updateInfo, timestamp: Date.now(), viteServerSessionId },
}, WORKBENCH_ORIGIN);
if (isEmptyElement(getRootElement())) {
wait(100).then(() => {
window.location.reload();
});
}
});
}
function heartbeat() {
console.info(`Spark Tools version: ${VERSION}`);
setupErrorListener();
monitorRootElement();
// Tell parent the runtime is ready.
window.parent.postMessage({
type: EventType.SPARK_RUNTIME_PING,
payload: {
version: VERSION,
timestamp: Date.now(),
},
}, WORKBENCH_ORIGIN);
}
heartbeat();
if (import.meta.hot) {
initializeViteHeartbeat();
}
else {
console.error(`Vite HMR is not available`);
}
export { setupErrorListener };
//# sourceMappingURL=heartbeat.js.map