84 lines
2.6 KiB
TypeScript
84 lines
2.6 KiB
TypeScript
import { Lobby } from "./model/Lobby";
|
|
import type { ServerMessage } from "./interfaces/generic";
|
|
import { ServerQueryType, ClientQueryType } from "./interfaces/generic";
|
|
import { Query } from "./Query";
|
|
|
|
let socket: WebSocket
|
|
export function setupWebsocket(): Promise<WebSocket> {
|
|
return new Promise<WebSocket>((resolve, reject) => {
|
|
if (socket) {
|
|
if (!socket.OPEN) {
|
|
return reject("socket closed")
|
|
}
|
|
return resolve(socket);
|
|
}
|
|
const config = useRuntimeConfig();
|
|
socket = new WebSocket(config.public.websocketEndpoint);
|
|
|
|
socket.onopen = function (e) {
|
|
if (socket.readyState == 1) {
|
|
resolve(socket);
|
|
}
|
|
console.log("[open] Connection established");
|
|
};
|
|
|
|
socket.onclose = function (event) {
|
|
if (event.wasClean) {
|
|
console.warn(
|
|
`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`
|
|
);
|
|
} else {
|
|
// e.g. server process killed or network down
|
|
// event.code is usually 1006 in this case
|
|
console.error("[close] Connection died");
|
|
}
|
|
};
|
|
|
|
socket.onerror = function (error) {
|
|
console.error(error);
|
|
};
|
|
|
|
socket.onmessage = function (ev: MessageEvent) {
|
|
const data = ev.data as ServerMessage
|
|
const answer_to = ev.data.answer_to
|
|
if (!answer_to) { return }
|
|
const callback = Query.callbacks.get(answer_to)
|
|
if (!callback) { return }
|
|
if (data.type == ServerQueryType.ERROR) {
|
|
callback.reject()
|
|
} else {
|
|
callback.resolve(ev.data)
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
export async function login() {
|
|
const socket = await setupWebsocket()
|
|
|
|
const query = new Query(socket, {
|
|
type: ClientQueryType.LOGIN,
|
|
method: "anon",
|
|
args: { code: "" },
|
|
target: ""
|
|
})
|
|
const loginInfo = await query.send()
|
|
// return new Promise<Lobby>((resolve, reject) => {
|
|
// const handler = ((e: MessageEvent) => {
|
|
// const data = e.data as ServerMessage
|
|
// if (data.type == ServerQueryType.CREATE) {
|
|
// if (data.args.objectType == "Lobby") {
|
|
// const lobby = new Lobby(socket, data.args as any)
|
|
// socket.removeEventListener("message", handler)
|
|
// resolve(lobby)
|
|
// }
|
|
// }
|
|
// })
|
|
// socket.onmessage = handler
|
|
|
|
|
|
// })
|
|
}
|
|
|