UNPKG

alinea

Version:
76 lines (74 loc) 2.53 kB
import { wrap } from "../../chunks/chunk-RSX2DILK.js"; import "../../chunks/chunk-NZLE2WMY.js"; // src/dashboard/boot/Boot.tsx import { IndexEvent } from "alinea/core/db/IndexEvent"; import { IndexedDBSource } from "alinea/core/source/IndexedDBSource"; import { createRoot } from "react-dom/client"; import { App } from "../App.js"; import { DashboardWorker } from "./DashboardWorker.js"; import { loadWorker } from "./LoadWorker.js"; import { WorkerDB } from "./WorkerDB.js"; import { jsx } from "react/jsx-runtime"; async function boot(gen) { const inWorker = isWorkerScope(); if (inWorker) { loadWorker(gen); } else { let events; let worker; try { ; [events, worker] = createSharedWorker(); } catch (error) { console.warn("Shared worker not supported, falling back to local worker."); const source = new IndexedDBSource(globalThis.indexedDB, "alinea"); events = worker = new DashboardWorker(source); } const scripts = document.getElementsByTagName("script"); const element = scripts[scripts.length - 1]; const into = document.createElement("div"); into.id = "root"; element.parentElement.replaceChild(into, element); const root = createRoot(into); let lastRevision; for await (const batch of gen) { if (batch.local && batch.revision !== lastRevision) { const link = document.querySelector( 'link[href^="/config.css"]' ); const copy = link.cloneNode(); copy.href = `/config.css?${batch.revision}`; copy.onload = () => link.remove(); link.after(copy); } const isLocal = worker instanceof DashboardWorker; if (isLocal) await worker.load(batch.revision, batch.config, batch.client); if (batch.revision !== lastRevision) { const db = new WorkerDB(batch.config, worker, batch.client, events); root.render(/* @__PURE__ */ jsx(App, { db, ...batch })); } lastRevision = batch.revision; } } } function createSharedWorker() { const events = new EventTarget(); const worker = new SharedWorker(import.meta.url, { type: "module", name: "Alinea dashboard" }); worker.port.addEventListener("message", ({ data }) => { if (data.type === IndexEvent.type) { events.dispatchEvent(new IndexEvent(data.data)); } }); return [events, wrap(worker.port)]; } function isWorkerScope() { return typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope; } export { boot };