Files
enclave/src/app/ws.ts
T
2026-08-26 14:56:11 +02:00

50 lines
1.3 KiB
TypeScript

import { invoke } from "@tauri-apps/api/core";
import { ClientMethod, ServerMethod } from "./protocol";
/**
* A protocol-aware wrapper around the browser `WebSocket`.
*
* Exposes typed protocol methods (`ServerMethod` / `ClientMethod`) rather
* than raw WebSocket messages. Has no concept of channels, messages, or
* app state — `EnclaveServer` builds on top of this to add those.
*/
export default class EnclaveWebSocket {
public websocket: WebSocket;
onOpenQueue: Array<() => void>;
public constructor(hostname: string) {
this.onOpenQueue = new Array();
this.websocket = new WebSocket(hostname);
this.websocket.onclose = () => {
invoke("disconnect_from_vc");
};
this.websocket.onopen = () => {
this.onOpenQueue.forEach((fun) => fun());
};
}
public async send(method: ServerMethod) {
if (this.websocket.readyState !== WebSocket.OPEN) {
return new Promise<void>((ok) => {
this.onOpenQueue.push(() => {
this.websocket.send(JSON.stringify(method));
ok();
});
});
}
this.websocket.send(JSON.stringify(method));
}
public async read(): Promise<ClientMethod> {
return new Promise((ok) => {
this.websocket.onmessage = (msg) => {
const data = JSON.parse(msg.data);
ok(data);
this.websocket.onmessage = null;
};
});
}
}