75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
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) {
|
|
const tabbar = document.querySelector("underbbs-tabbar");
|
|
if (tabbar) {
|
|
tabbar.setAttribute("data-adapters", Settings._instance.adapters.map(a=>a.nickname).join(","));
|
|
}
|
|
}
|
|
})
|
|
.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);
|
|
} else {
|
|
// typeswitch on the incoming data type and fill the memory
|
|
switch (data.type) {
|
|
case "message":
|
|
store.messages.set(data.id, <Message>data);
|
|
break;
|
|
case "author":
|
|
store.profileCache.set(data.id, <Author>data);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
// if the adapter is active signal it that there's new data
|
|
let adapter = util.$(`adapter_${data.adapter}`);
|
|
if (adapter) {
|
|
adapter.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;
|
|
}
|
|
}
|
|
|