UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

128 lines (121 loc) • 16 kB
'use strict'; Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const BinaryStream = require('@jsprismarine/jsbinaryutils'); const _interopDefault = e => e && e.__esModule ? e : { default: e }; const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream); var QueryType = /* @__PURE__ */ ((QueryType2) => { QueryType2[QueryType2["Handshake"] = 0] = "Handshake"; QueryType2[QueryType2["Stats"] = 9] = "Stats"; return QueryType2; })(QueryType || {}); class QueryManager { server; constructor(server) { this.server = server; } async onRaw(buffer, rinfo) { return new Promise(async (resolve, reject) => { const stream = new BinaryStream__default.default(buffer); const magic = stream.readUnsignedShort(); const type = stream.readByte(); const sessionId = stream.readInt() & 252645135; if (!this.server.getRaknet()) { reject(new Error("Server is not started")); return; } if (magic !== 65277) { reject(new Error("Invalid magic")); return; } switch (type) { case 0 /* Handshake */: { const res = new BinaryStream__default.default(); res.writeByte(9); res.writeInt(sessionId); res.write(Buffer.from(`9513307\0`, "binary")); this.server.getRaknet()?.sendBuffer(res.getBuffer(), { address: rinfo.getAddress(), port: rinfo.getPort(), family: "IPv4", size: 0 }); resolve(res.getBuffer()); return; } case 9 /* Stats */: { const res = new BinaryStream__default.default(); res.writeByte(0); res.writeByte(115); res.writeByte(112); res.writeByte(108); res.writeByte(105); res.writeByte(116); res.writeByte(110); res.writeByte(117); res.writeByte(109); res.writeByte(0); res.writeByte(128); res.writeByte(0); const plugins = []; res.write( Buffer.from( `\0${[ "hostname", this.server.getMetadata().getMotd(), "gametype", "SMP", "game_id", "MINECRAFTPE", "version", this.server.getVersion(), "plugins", `JSPrismarine on Prismarine ${this.server.getVersion()} ${plugins.join("; ")}`, // TODO "map", this.server.getWorldManager().getDefaultWorld().getName(), "numplayers", this.server.getMetadata().getOnlinePlayerCount(), "maxplayers", this.server.getMetadata().getMaxPlayerCount(), "hostport", this.server.getConfig().getServerPort(), "hostip", this.server.getConfig().getServerIp() ].join("\0")}\0\0`, "binary" ) ); res.writeByte(1); res.writeByte(112); res.writeByte(108); res.writeByte(97); res.writeByte(121); res.writeByte(101); res.writeByte(114); res.writeByte(95); res.writeByte(0); res.writeByte(0); res.write( Buffer.from( `${this.server.getSessionManager().getAllPlayers().map((player) => `${player.getName()}\0`)}\0`, "binary" ) ); this.server.getRaknet()?.sendBuffer(res.getBuffer(), { address: rinfo.getAddress(), port: rinfo.getPort(), family: "IPv4", size: 0 }); resolve(res.getBuffer()); return; } default: throw new Error("Invalid QueryType"); } }); } } exports.QueryManager = QueryManager; exports.QueryType = QueryType; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnlNYW5hZ2VyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyeS9RdWVyeU1hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBJbmV0QWRkcmVzcyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuXG5leHBvcnQgZW51bSBRdWVyeVR5cGUge1xuICAgIEhhbmRzaGFrZSA9IDAsXG4gICAgU3RhdHMgPSA5XG59XG5cbmV4cG9ydCBjbGFzcyBRdWVyeU1hbmFnZXIge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG9uUmF3KGJ1ZmZlcjogQnVmZmVyLCByaW5mbzogSW5ldEFkZHJlc3MpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgbWFnaWMgPSBzdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IFF1ZXJ5VHlwZSA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gc3RyZWFtLnJlYWRJbnQoKSAmIDB4MGYwZjBmMGY7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zZXJ2ZXIuZ2V0UmFrbmV0KCkpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdTZXJ2ZXIgaXMgbm90IHN0YXJ0ZWQnKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobWFnaWMgIT09IDY1Mjc3KSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignSW52YWxpZCBtYWdpYycpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlUeXBlLkhhbmRzaGFrZToge1xuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kc2hha2VcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDkpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVJbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKEJ1ZmZlci5mcm9tKGA5NTEzMzA3XFwwYCwgJ2JpbmFyeScpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0UmFrbmV0KCk/LnNlbmRCdWZmZXIocmVzLmdldEJ1ZmZlcigpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiByaW5mby5nZXRBZGRyZXNzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiByaW5mby5nZXRQb3J0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHk6ICdJUHY0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzLmdldEJ1ZmZlcigpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNhc2UgUXVlcnlUeXBlLlN0YXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFkZGluZ1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExNSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTEyKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwNSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTE2KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMTApO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDExNyk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTA5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgwKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMjgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDApO1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmQgcGFkZGluZ1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcXDAke1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TWV0YWRhdGEoKS5nZXRNb3RkKCksXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dhbWV0eXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NNUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnYW1lX2lkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01JTkVDUkFGVFBFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRWZXJzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbHVnaW5zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEpTUHJpc21hcmluZSBvbiBQcmlzbWFyaW5lICR7dGhpcy5zZXJ2ZXIuZ2V0VmVyc2lvbigpfSAke3BsdWdpbnMuam9pbignOyAnKX1gLCAvLyBUT0RPXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRXb3JsZE1hbmFnZXIoKS5nZXREZWZhdWx0V29ybGQoKSEuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtcGxheWVycycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldE1ldGFkYXRhKCkuZ2V0T25saW5lUGxheWVyQ291bnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heHBsYXllcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRNZXRhZGF0YSgpLmdldE1heFBsYXllckNvdW50KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob3N0cG9ydCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldENvbmZpZygpLmdldFNlcnZlclBvcnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3RpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmdldENvbmZpZygpLmdldFNlcnZlcklwKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcMCcpfVxcMFxcMGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpbmFyeSdcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQYWRkaW5nXG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTEyKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMDgpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDk3KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSgxMjEpO1xuICAgICAgICAgICAgICAgICAgICByZXMud3JpdGVCeXRlKDEwMSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMTE0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlQnl0ZSg5NSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy53cml0ZUJ5dGUoMCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuZCBwYWRkaW5nXG5cbiAgICAgICAgICAgICAgICAgICAgcmVzLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5zZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb25NYW5hZ2VyKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFsbFBsYXllcnMoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwbGF5ZXIpID0+IGAke3BsYXllci5nZXROYW1lKCl9XFwwYCl9XFwwYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmluYXJ5J1xuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5nZXRSYWtuZXQoKT8uc2VuZEJ1ZmZlcihyZXMuZ2V0QnVmZmVyKCksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IHJpbmZvLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHJpbmZvLmdldFBvcnQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseTogJ0lQdjQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogMFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5nZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFF1ZXJ5VHlwZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiUXVlcnlUeXBlIiwiQmluYXJ5U3RyZWFtIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBSVksSUFBQSxTQUFBLHFCQUFBQSxVQUFMLEtBQUE7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