Files
plainleaf/webapp/src/plugins/browser_system.ts
T

57 lines
1.4 KiB
TypeScript

import { PluginLoader, System } from "./runtime";
import { Manifest } from "./types";
import { sleep } from "../util";
export class BrowserLoader implements PluginLoader {
readonly pathPrefix: string;
constructor(pathPrefix: string) {
this.pathPrefix = pathPrefix;
}
async load(name: string, manifest: Manifest): Promise<void> {
await fetch(`${this.pathPrefix}/${name}`, {
method: "PUT",
body: JSON.stringify(manifest),
});
}
}
export class BrowserSystem extends System {
constructor(pathPrefix: string) {
super(new BrowserLoader(pathPrefix), pathPrefix);
}
// Service worker stuff
async pollServiceWorkerActive() {
for (let i = 0; i < 25; i++) {
try {
console.log("Pinging...", `${this.pathPrefix}/$ping`);
let ping = await fetch(`${this.pathPrefix}/$ping`);
let text = await ping.text();
if (ping.status === 200 && text === "ok") {
return;
}
} catch (e) {
console.log("Not yet");
}
await sleep(100);
}
// Alright, something's messed up
throw new Error("Worker not successfully activated");
}
async bootServiceWorker() {
// @ts-ignore
let reg = navigator.serviceWorker.register(
new URL("../plugin_sw.ts", import.meta.url),
{
type: "module",
}
);
console.log("Service worker registered successfully");
await this.pollServiceWorkerActive();
}
}