cubicjs/client/dest/network.js
2024-12-22 01:29:44 +03:00

71 lines
1.7 KiB
JavaScript

class Packet {
constructor(id, data) {
this.id = id;
this.data = data;
}
getId() { return this.id; }
getData() { return this.data; }
static fromString(data) {
return new Packet(data[0], data.slice(1).split("\n"));
}
}
class JoinPacket extends Packet {
constructor(name) {
super("J", [name]);
}
}
class MessagePacket extends Packet {
constructor(message) {
super("M", [message]);
}
}
class KeyPacket extends Packet {
constructor(key, pressed) {
super("K", [key, pressed ? "1" : "0"]);
}
}
class PlaceBlockPacket extends Packet {
constructor(x, y, type) {
super("P", [x.toString(), y.toString(), type]);
}
}
class DestroyBlockPacket extends Packet {
constructor(x, y) {
super("D", [x.toString(), y.toString()]);
}
}
class PositionPacket extends Packet {
constructor(x, y) {
super("X", [x.toString(), y.toString()]);
}
}
class VelocityPacket extends Packet {
constructor(x, y) {
super("V", [x.toString(), y.toString()]);
}
}
class Connection {
constructor(address, on_packet, on_close) {
this.socket = new WebSocket("ws://" + address, "cubic");
this.on_packet = on_packet;
this.on_close = on_close;
this.socket.onmessage = this._on_message;
this.socket.onclose = this._on_close;
this.socket.onerror = this._on_error;
}
_on_message(event) {
this.on_packet(Packet.fromString(event.data));
}
_on_close(event) {
this.on_close(null);
}
_on_error(event) {
this.on_close(event.toString());
}
close() {
this.socket.close();
}
send(packet) {
this.socket.send(packet.getId() + packet.getData());
}
}