import createDebug from "debug";
import {
Packet,
PacketType,
} 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 = <SpawnPlayerPacket> packet.c;
} else if (packet.t == PacketType.PlayerList) {
//let p = <PlayerListPacket> packet.c;
} else if (packet.t == PacketType.PlanetPositions) {
//let p = <PlanetPositionsPacket> packet.c;
} else if (packet.t == PacketType.PartPositions) {
//let p = <PartPositionsPacket> packet.c;
} else if (packet.t == PacketType.PlayerLeave) {
//let p = <PlayerLeavePacket> packet.c;
} else {
logger(`unrecognized packet type ${packet.t}`);
}
}
return client;
}
let socket: WebSocket | undefined = undefined;
function _websocket_connect(url: string): Promise<WebSocket> {
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);
};
});
}