Skip to content

Commit a3b3c56

Browse files
committed
WIP: convert socket.io to plain websockets
1 parent eff88a3 commit a3b3c56

File tree

5 files changed

+112
-44
lines changed

5 files changed

+112
-44
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ node_modules
22
src/client/dist
33
src/client/assets/blocks
44
src/client/assets/items
5-
src/assets/pack
5+
src/assets/pack
6+
7+
yarn.lock

launcher_profiles.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"postinstall": "node src/postinstall.js"
1414
},
1515
"dependencies": {
16+
"@msgpack/msgpack": "^2.4.1",
1617
"@tweenjs/tween.js": "^18.6.4",
1718
"ansi-to-html": "^0.6.14",
1819
"axios": "^0.21.1",
@@ -35,10 +36,9 @@
3536
"popper.js": "^1.16.1",
3637
"prismarine-block": "^1.7.3",
3738
"prismarine-chunk": "^1.22.0",
39+
"qs": "^6.9.6",
3840
"replace-color": "^2.3.0",
3941
"rimraf": "^3.0.2",
40-
"socket.io": "^2.3.0",
41-
"socket.io-client": "^2.3.0",
4242
"stats-js": "^1.0.1",
4343
"sweetalert": "^2.1.2",
4444
"three": "^0.125.0",

src/client/scripts/Setup.js

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as THREE from "three";
22
import TWEEN from "@tweenjs/tween.js";
33
import Stats from "stats-js";
44
import * as dat from "dat.gui";
5-
import io from "socket.io-client";
5+
import { encode, decode, decodeAsync } from "@msgpack/msgpack";
66
import { DistanceBasedFog } from "./DistanceBasedFog.js";
77
import { UrlParams } from "./UrlParams.js";
88
import { gpuInfo } from "./gpuInfo.js";
@@ -15,6 +15,14 @@ import { BlockBreak } from "./BlockBreak.js";
1515
import { BlockPlace } from "./BlockPlace.js";
1616
import { EventHandler } from "./EventHandler.js";
1717

18+
async function decodeFromBlob(blob) {
19+
if (blob.stream) {
20+
return await decodeAsync(blob.stream());
21+
}
22+
23+
return decode(await blob.arrayBuffer());
24+
}
25+
1826
async function Setup(game) {
1927
return new Promise((resolve) => {
2028
game.canvas = document.querySelector("#c");
@@ -43,23 +51,46 @@ async function Setup(game) {
4351
game.distanceBasedFog = new DistanceBasedFog(game);
4452
UrlParams(game, (password) => {
4553
console.warn(gpuInfo());
46-
game.socket = io({
47-
query: {
48-
nick: game.nick,
49-
server: game.server,
50-
port: game.serverPort,
51-
password,
52-
premium: game.premium,
53-
},
54-
});
54+
const ws = new WebSocket(
55+
`ws://localhost:8080?nick=${game.nick}&server=${game.server}&port=${game.serverPort}&password=${password}&premium=${game.premium}`
56+
);
57+
58+
const handlers = new Map();
59+
60+
ws.emit = (type, ...data) => {
61+
ws.send(
62+
encode([
63+
type,
64+
...data.filter((d) => typeof d !== "function"), // Temp solution
65+
])
66+
);
67+
};
68+
69+
ws.on = (type, handler) => {
70+
handlers.set(type, handler);
71+
};
72+
73+
ws.onmessage = async (message) => {
74+
try {
75+
const [type, ...data] = await decodeFromBlob(message.data);
76+
77+
const handler = handlers.get(type);
78+
79+
handler && handler(...data);
80+
} catch (err) {
81+
console.log(err);
82+
}
83+
};
84+
85+
game.socket = ws;
86+
5587
game.pii = new PlayerInInventory(game);
5688
game.bb = new BlockBreak(game);
5789
game.bp = new BlockPlace(game);
5890
game.world = new World(game);
5991
game.ent = new Entities(game);
6092
game.chat = new Chat(game);
6193
game.inv_bar = new InventoryBar(game);
62-
game.eh = new EventHandler(game);
6394
game.distanceBasedFog.addShaderToMaterial(game.world.material);
6495
var gui = new dat.GUI();
6596
game.params = {
@@ -90,7 +121,11 @@ async function Setup(game) {
90121
.easing(TWEEN.Easing.Quadratic.Out)
91122
.start();
92123
};
93-
resolve();
124+
125+
ws.onopen = () => {
126+
game.eh = new EventHandler(game);
127+
resolve();
128+
};
94129
});
95130
});
96131
}

src/index.js

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,16 @@ var opn = require("open");
33
var express = require("express");
44
var app = express();
55
var server = require("http").createServer(app);
6-
var io = require("socket.io")(server);
76
var mineflayer = require("mineflayer");
87
var Chunk = require("prismarine-chunk")(version);
98
var vec3 = require("vec3");
109
var Convert = require("ansi-to-html");
1110
var convert = new Convert();
1211
var helmet = require("helmet");
1312
var compression = require("compression");
13+
const WebSocket = require("ws");
14+
const qs = require("qs");
15+
const { encode, decode } = require("@msgpack/msgpack");
1416
var port = process.env.PORT || 8080;
1517

1618
app.use(
@@ -19,6 +21,12 @@ app.use(
1921
})
2022
);
2123
app.use(compression());
24+
25+
const wss = new WebSocket.Server({
26+
server,
27+
clientTracking: false,
28+
});
29+
2230
var mode = process.argv[2];
2331
if (mode === "production") {
2432
app.use(express.static(`${__dirname}/client/dist`));
@@ -35,9 +43,16 @@ server.listen(port, function () {
3543
opn(`http://localhost:${port}`);
3644
return console.log(`Server is running on \x1b[34m*:${port}\x1b[0m`);
3745
});
46+
3847
var botByNick = {};
39-
io.sockets.on("connection", function (socket) {
40-
var query = socket.handshake.query;
48+
49+
wss.on("connection", (socket, req) => {
50+
const emit = (type, ...data) => {
51+
socket.send(encode([type, ...data]));
52+
};
53+
54+
const query = qs.parse(req.url.substr(1), { ignoreQueryPrefix: true });
55+
4156
console.log(`[\x1b[32m+\x1b[0m] ${query.nick}`);
4257
var heldItem = null;
4358
var bot = mineflayer.createBot({
@@ -51,29 +66,29 @@ io.sockets.on("connection", function (socket) {
5166
bot._client.on("map_chunk", function (packet) {
5267
var cell = new Chunk();
5368
cell.load(packet.chunkData, packet.bitMap, true, true);
54-
socket.emit("mapChunk", cell.sections, packet.x, packet.z);
69+
emit("mapChunk", cell.sections, packet.x, packet.z);
5570
});
5671
bot._client.on("respawn", function (packet) {
57-
socket.emit("dimension", packet.dimension.value.effects.value);
72+
emit("dimension", packet.dimension.value.effects.value);
5873
});
5974
bot.on("heldItemChanged", function (item) {
6075
heldItem = item;
6176
});
6277
bot.on("login", function () {
63-
socket.emit("dimension", bot.game.dimension);
78+
emit("dimension", bot.game.dimension);
6479
});
6580
bot.on("move", function () {
66-
socket.emit("move", bot.entity.position);
81+
emit("move", bot.entity.position);
6782
});
6883
bot.on("health", function () {
69-
socket.emit("hp", bot.health);
70-
socket.emit("food", bot.food);
84+
emit("hp", bot.health);
85+
emit("food", bot.food);
7186
});
7287
bot.on("spawn", function () {
73-
socket.emit("spawn", bot.entity.yaw, bot.entity.pitch);
88+
emit("spawn", bot.entity.yaw, bot.entity.pitch);
7489
});
7590
bot.on("kicked", function (reason) {
76-
socket.emit("kicked", reason);
91+
emit("kicked", reason);
7792
});
7893
bot.on("message", function (msg) {
7994
let message = msg.toAnsi();
@@ -87,34 +102,34 @@ io.sockets.on("connection", function (socket) {
87102
for (const replacement of replacements)
88103
message = message.replace(replacement[0], replacement[1]);
89104

90-
socket.emit("msg", convert.toHtml(message));
105+
emit("msg", convert.toHtml(message));
91106
});
92107
bot.on("experience", function () {
93-
socket.emit("xp", bot.experience);
108+
emit("xp", bot.experience);
94109
});
95110
bot.on("blockUpdate", function (oldb, newb) {
96-
socket.emit("blockUpdate", [
111+
emit("blockUpdate", [
97112
newb.position.x,
98113
newb.position.y,
99114
newb.position.z,
100115
newb.stateId,
101116
]);
102117
});
103118
bot.on("diggingCompleted", function (block) {
104-
socket.emit("diggingCompleted", block);
119+
emit("diggingCompleted", block);
105120
});
106121
bot.on("diggingAborted", function (block) {
107-
socket.emit("diggingAborted", block);
122+
emit("diggingAborted", block);
108123
});
109124
bot.on("game", function () {
110-
socket.emit("game", bot.game);
125+
emit("game", bot.game);
111126
});
112127
var inv = "";
113128
var interval = setInterval(function () {
114129
var inv_new = JSON.stringify(bot.inventory.slots);
115130
if (inv !== inv_new) {
116131
inv = inv_new;
117-
socket.emit("inventory", bot.inventory.slots);
132+
emit("inventory", bot.inventory.slots);
118133
}
119134
var entities = {
120135
mobs: [],
@@ -134,17 +149,20 @@ io.sockets.on("connection", function (socket) {
134149
]);
135150
}
136151
}
137-
socket.emit("entities", entities);
152+
emit("entities", entities);
138153
}, 100);
154+
155+
const handlers = new Map();
156+
139157
bot.once("spawn", function () {
140-
socket.on("fly", function (toggle) {
158+
handlers.set("fly", function (toggle) {
141159
if (toggle) {
142160
bot.creative.startFlying();
143161
} else {
144162
bot.creative.stopFlying();
145163
}
146164
});
147-
socket.on("blockPlace", function (pos, vec) {
165+
handlers.set("blockPlace", function (pos, vec) {
148166
var block = bot.blockAt(new vec3(...pos));
149167
if (heldItem !== void 0 && heldItem !== null) {
150168
console.log(heldItem);
@@ -153,44 +171,44 @@ io.sockets.on("connection", function (socket) {
153171
});
154172
}
155173
});
156-
socket.on("invc", function (num) {
174+
handlers.set("invc", function (num) {
157175
var item = bot.inventory.slots[num + 36];
158176
if (item !== null && item !== void 0) {
159177
bot.equip(item, "hand");
160178
} else if (heldItem !== void 0) {
161179
bot.unequip("hand");
162180
}
163181
});
164-
socket.on("move", function (state, toggle) {
182+
handlers.set("move", function (state, toggle) {
165183
if (state === "right") {
166184
state = "left";
167185
} else if (state === "left") {
168186
state = "right";
169187
}
170188
bot.setControlState(state, toggle);
171189
});
172-
socket.on("command", function (com) {
190+
handlers.set("command", function (com) {
173191
bot.chat(com);
174192
});
175-
socket.on("rotate", function (data) {
193+
handlers.set("rotate", function (data) {
176194
bot.look(...data);
177195
});
178-
socket.on("disconnect", function () {
196+
handlers.set("disconnect", function () {
179197
try {
180198
clearInterval(interval);
181199
console.log(`[\x1b[31m-\x1b[0m] ${query.nick}`);
182200
bot.end();
183201
} catch (error) {}
184202
});
185-
socket.on("dig", function (pos) {
203+
handlers.set("dig", function (pos) {
186204
var block = bot.blockAt(vec3(pos[0], pos[1] - 16, pos[2]));
187205
if (block !== null) {
188206
var digTime = bot.digTime(block);
189207
if (bot.targetDigBlock !== null) {
190208
console.log("Already digging...");
191209
bot.stopDigging();
192210
}
193-
socket.emit("digTime", digTime, block);
211+
emit("digTime", digTime, block);
194212
console.log("Start");
195213
bot.dig(block, false, function (xd) {
196214
if (xd === void 0) {
@@ -201,8 +219,20 @@ io.sockets.on("connection", function (socket) {
201219
});
202220
}
203221
});
204-
socket.on("stopDigging", function () {
222+
handlers.set("stopDigging", function () {
205223
bot.stopDigging();
206224
});
225+
226+
socket.on("message", (message) => {
227+
try {
228+
const [type, ...data] = decode(message);
229+
230+
const handler = handlers.get(type);
231+
232+
handler(...data);
233+
} catch (err) {
234+
console.log(err);
235+
}
236+
});
207237
});
208238
});

0 commit comments

Comments
 (0)