@x5e/gink
Version:
an eventually consistent database
51 lines (43 loc) • 1.62 kB
text/typescript
import {
connection as WebSocketConnection,
Message as WebSocketMessage,
} from "websocket";
import { AbstractConnection } from "./AbstractConnection";
export class ServerConnection extends AbstractConnection {
private onData: (data: Uint8Array) => Promise<void>;
private onClose: () => void;
private websocketConnection: WebSocketConnection;
constructor(args: {
onClose: () => void;
onData: (data: Uint8Array) => Promise<void>;
websocketConnection: WebSocketConnection;
}) {
super();
const { onData, onClose, websocketConnection } = args;
this.onData = onData;
this.onClose = onClose;
this.websocketConnection = websocketConnection;
this.websocketConnection.on("message", this.onMessage.bind(this));
this.websocketConnection.on("close", this.onClose.bind(this));
this.websocketConnection.on("error", this.onClose.bind(this));
}
send(data: Uint8Array) {
this.websocketConnection.sendBytes(Buffer.from(data));
}
close() {
this.websocketConnection.close();
}
private onMessage(message: WebSocketMessage) {
if (message.type === "utf8") {
console.error(`Received Text Message: ${message.utf8Data}`);
} else if (message.type === "binary") {
this.onData(message.binaryData).catch((reason) => {
console.error("something went wrong receiving data\n", reason);
this.close();
});
}
}
get connected(): boolean {
return this.websocketConnection.connected;
}
}