From df2154e0c5df69e6b90a6a6b52245b8e241dba48 Mon Sep 17 00:00:00 2001 From: d07riv Date: Tue, 13 Aug 2019 05:29:24 +0300 Subject: [PATCH] multiplayer works! --- src/api/websocket.js | 48 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/api/websocket.js diff --git a/src/api/websocket.js b/src/api/websocket.js new file mode 100644 index 0000000..596d26b --- /dev/null +++ b/src/api/websocket.js @@ -0,0 +1,48 @@ +export default async function websocket_open(url, handler) { + const socket = new WebSocket(url); + socket.binaryType = "arraybuffer"; + let versionCbk = null; + socket.addEventListener("message", ({data}) => { + if (versionCbk) { + versionCbk(data); + } + handler(data); + }); + await new Promise((resolve, reject) => { + const onError = err => reject(err); + socket.addEventListener("error", onError); + socket.addEventListener("open", () => { + socket.removeEventListener("error", onError); + resolve(); + }); + }); + await new Promise((resolve, reject) => { + const to = setTimeout(() => { + versionCbk = null; + reject(Error("connection timed out")); + }, 5000); + versionCbk = data => { + clearTimeout(to); + const u8 = new Uint8Array(data); + if (u8[0] === 0x32) { + versionCbk = null; + const version = u8[1] | (u8[2] << 8) | (u8[3] << 16) | (u8[4] << 24); + if (version === 1) { + resolve(); + } else { + reject("server version mismatch"); + } + } + }; + }); + + const vers = process.env.VERSION.match(/(\d+)\.(\d+)\.(\d+)/); + const clientInfo = new Uint8Array(5); + clientInfo[0] = 0x31; + clientInfo[1] = parseInt(vers[3]); + clientInfo[2] = parseInt(vers[2]); + clientInfo[3] = parseInt(vers[1]); + clientInfo[4] = 0; + socket.send(clientInfo); + return socket; +}