import util from "./util" import {AdapterState, AdapterData} from "./adapter"; import {Message, Attachment, Author} from "./message" import {Settings} from "./settings" export class DatagramSocket { public static skey: string | null = null; public static conn: WebSocket | null; private static onOpen(e: Event) { console.log("websocket connection opened"); console.log(JSON.stringify(e)); } private static onMsg(e: MessageEvent) { const data = JSON.parse(e.data); console.log(data); if (data.key) { DatagramSocket.skey = data.key; util.authorizedFetch("POST", "/api/adapters", JSON.stringify(Settings._instance.adapters)) .then(r=> { if (r.ok) { // iterate through any components which might want to fetch data const profiles = document.querySelectorAll("underbbs-profile"); profiles.forEach(p=>{ const target = p.getAttribute("data-target"); p.setAttribute("data-target", target ?? ""); }); } }) .catch(e => { util.errMsg(e.message); }); } else { let store = AdapterState._instance.data.get(data.adapter); if (!store) { AdapterState._instance.data.set(data.adapter, new AdapterData(data.protocol)); store = AdapterState._instance.data.get(data.adapter); } if (store) { // typeswitch on the incoming data type and fill the memory switch (data.type) { case "message": store.messages.set(data.id, data); break; case "author": store.profileCache.set(data.id, data); break; default: break; } } console.log(store); // now search for any components with this adapter and target let targets = document.querySelectorAll(`*[data-adapter="${data.adapter}"][data-target="${data.id}"]`); targets.forEach(t=>{ t.setAttribute("data-latest", data.id); }); } } static connect(): void { const wsProto = location.protocol == "https:" ? "wss" : "ws"; const _conn = new WebSocket(`${wsProto}://${location.host}/subscribe`, "underbbs"); _conn.addEventListener("open", DatagramSocket.onOpen); _conn.addEventListener("message", DatagramSocket.onMsg); _conn.addEventListener("error", (e: any) => { console.log("websocket connection error"); console.log(JSON.stringify(e)); }); DatagramSocket.conn = _conn; } }