import createDebug from "debug"; import { Packet, PacketType, PartPositionsPacket, PlanetPositionsPacket, PlayerLeavePacket, PlayerListPacket, SpawnPlayerPacket } from "./protocol.ts"; import {appendPacket} from "./packet_ui.ts"; const logger = createDebug("hub"); export interface ClientHub { socket: WebSocket; } export function sendPacket(client: ClientHub, packet: Packet) { client.socket.send(JSON.stringify(packet)); appendPacket(packet); } export async function hub_connect(url: string, username: string) { logger("connecting to client hub at " + url) let ws = await _websocket_connect(url); logger("connected to client hub, sending username and auth details"); let client: ClientHub = { socket: ws }; let packet: Packet = { t: PacketType.ClientLogin, c: { username, jwt: null } }; sendPacket(client, packet); ws.onmessage = (e) => { let packet: Packet = JSON.parse(e.data); appendPacket(packet); if (packet.t == PacketType.SpawnPlayer) { let p = packet.c; } else if (packet.t == PacketType.PlayerList) { let p = packet.c; } else if (packet.t == PacketType.PlanetPositions) { let p = packet.c; } else if (packet.t == PacketType.PartPositions) { let p = packet.c; } else if (packet.t == PacketType.PlayerLeave) { let p = packet.c; } else { logger(`unrecognized packet type ${packet.t}`); } } return client; } let socket: WebSocket | undefined = undefined; function _websocket_connect(url: string): Promise { if (socket && socket.readyState < 2) { // reuse socket connection return Promise.resolve(socket); } return new Promise((resolve, reject) => { socket = new WebSocket(url); socket.onopen = () => { resolve(socket!); }; socket.onerror = (err) => { reject(err); }; }); }