alinea
Version:
Headless git-based CMS
76 lines (74 loc) • 2.53 kB
JavaScript
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
};