mirror of
https://github.com/johndoe6345789/low-code-react-app-b.git
synced 2026-04-24 13:44:54 +00:00
158 lines
5.6 KiB
JavaScript
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
|