106 lines
2.2 KiB
JavaScript
106 lines
2.2 KiB
JavaScript
import {
|
|
refreshMachineSessionControlPage,
|
|
} from "./control-page-refresh-workflow.js";
|
|
import {
|
|
loadMachineSessionForControlPageWorkflow,
|
|
} from "./control-page-session-workflow.js";
|
|
import {
|
|
readMachineSessionReadonlyStatus,
|
|
} from "./readonly-status-api.js";
|
|
|
|
export function createMachineSessionControlPageController({
|
|
panelFrame,
|
|
statusNode,
|
|
viewNode,
|
|
renderControlView,
|
|
pollMs = 200,
|
|
setIntervalFn = globalThis.setInterval,
|
|
} = {}) {
|
|
if (!panelFrame) {
|
|
throw new Error("A panel iframe is required.");
|
|
}
|
|
if (!statusNode) {
|
|
throw new Error("A control page status node is required.");
|
|
}
|
|
if (!viewNode) {
|
|
throw new Error("A control page view node is required.");
|
|
}
|
|
if (typeof renderControlView !== "function") {
|
|
throw new Error("A control view renderer is required.");
|
|
}
|
|
|
|
let refreshTimer = null;
|
|
|
|
function getPanelWindow() {
|
|
return panelFrame.contentWindow ?? null;
|
|
}
|
|
|
|
function getPanelApi() {
|
|
return getPanelWindow()?.linuxCncIniPanelApi ?? null;
|
|
}
|
|
|
|
function getControlView() {
|
|
return getPanelApi()?.getMachineSessionControlView?.() ?? null;
|
|
}
|
|
|
|
function render() {
|
|
return refresh().renderResult;
|
|
}
|
|
|
|
function refresh() {
|
|
return refreshMachineSessionControlPage({
|
|
getControlView,
|
|
statusNode,
|
|
viewNode,
|
|
renderControlView,
|
|
});
|
|
}
|
|
|
|
function loadSessionState() {
|
|
return loadMachineSessionForControlPageWorkflow({
|
|
getPanelWindow,
|
|
getPanelApi,
|
|
getControlView,
|
|
});
|
|
}
|
|
|
|
function readStatus() {
|
|
return readMachineSessionReadonlyStatus({
|
|
getPanelApi,
|
|
getControlView,
|
|
});
|
|
}
|
|
|
|
function startPolling() {
|
|
if (!refreshTimer) {
|
|
refreshTimer = setIntervalFn(render, pollMs);
|
|
}
|
|
return refreshTimer;
|
|
}
|
|
|
|
function mount({ panelSrc = "./index.html" } = {}) {
|
|
panelFrame.addEventListener("load", () => {
|
|
render();
|
|
startPolling();
|
|
});
|
|
panelFrame.src = panelSrc;
|
|
render();
|
|
startPolling();
|
|
return controller;
|
|
}
|
|
|
|
const controller = {
|
|
getControlView,
|
|
getPanelApi,
|
|
getPanelWindow,
|
|
loadSessionState,
|
|
mount,
|
|
readStatus,
|
|
refresh,
|
|
render,
|
|
startPolling,
|
|
};
|
|
|
|
return controller;
|
|
}
|