UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

67 lines (64 loc) 8.89 kB
import BinaryStream from '@jsprismarine/jsbinaryutils'; import Zlib from 'zlib'; import { CompressionProvider } from '../CompressionProvider.es.js'; import DataPacket from './DataPacket.es.js'; import { PacketCompressionAlgorithm } from './NetworkSettingsPacket.es.js'; class BatchPacket extends DataPacket { static NetID = 254; compressed = true; // TODO: better solution payload = new BinaryStream(); // Bigger compression level leads to more CPU usage and less network, and vice versa // TODO: batch.setCompressionLevel(), it should be dependent from Server instance // private readonly compressionLevel: number = Server?.instance?.getConfig().getPacketCompressionLevel() ?? 7; decodeHeader() { const pid = this.readByte(); if (pid !== this.getId()) { throw new Error(`Batch ID mismatch: is ${this.getId()}, got ${pid}`); } } decodePayload() { this.payload.write( this.compressed ? CompressionProvider.fromAlgorithmSync(this.readByte())(this.readRemaining()) : this.readRemaining() ); } async asyncDecode() { this.decodeHeader(); try { this.payload.write( this.compressed ? await CompressionProvider.fromAlgorithm(this.readByte())(this.readRemaining()) : this.readRemaining() ); } catch (error) { throw new Error(`Failed to inflate batched content`, { cause: error }); } return this.getPackets(); } encodeHeader() { this.writeByte(this.getId()); } encodePayload() { if (this.compressed) { this.writeByte(PacketCompressionAlgorithm.ZLIB); } this.write( this.compressed ? Zlib.deflateRawSync(this.payload.getBuffer(), { level: 7 }) : this.payload.getBuffer() ); } addPacket(packet) { if (!packet.getEncoded()) { packet.encode(); } this.payload.writeUnsignedVarInt(packet.getBuffer().byteLength); this.payload.write(packet.getBuffer()); } getPackets() { const stream = new BinaryStream(this.payload.getBuffer()); const packets = []; do { packets.push(stream.read(stream.readUnsignedVarInt())); } while (!stream.feof()); return packets; } } export { BatchPacket as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hQYWNrZXQuZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZXR3b3JrL3BhY2tldC9CYXRjaFBhY2tldC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgWmxpYiBmcm9tICd6bGliJztcbmltcG9ydCB7IENvbXByZXNzaW9uUHJvdmlkZXIgfSBmcm9tICcuLi9Db21wcmVzc2lvblByb3ZpZGVyLmpzJztcbmltcG9ydCBEYXRhUGFja2V0IGZyb20gJy4vRGF0YVBhY2tldCc7XG5pbXBvcnQgeyBQYWNrZXRDb21wcmVzc2lvbkFsZ29yaXRobSB9IGZyb20gJy4vTmV0d29ya1NldHRpbmdzUGFja2V0LmpzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmF0Y2hQYWNrZXQgZXh0ZW5kcyBEYXRhUGFja2V0IHtcbiAgICBwdWJsaWMgc3RhdGljIE5ldElEID0gMHhmZTtcblxuICAgIHB1YmxpYyBjb21wcmVzc2VkID0gdHJ1ZTsgLy8gIFRPRE86IGJldHRlciBzb2x1dGlvblxuICAgIHByaXZhdGUgcGF5bG9hZCA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAvLyBCaWdnZXIgY29tcHJlc3Npb24gbGV2ZWwgbGVhZHMgdG8gbW9yZSBDUFUgdXNhZ2UgYW5kIGxlc3MgbmV0d29yaywgYW5kIHZpY2UgdmVyc2FcbiAgICAvLyBUT0RPOiBiYXRjaC5zZXRDb21wcmVzc2lvbkxldmVsKCksIGl0IHNob3VsZCBiZSBkZXBlbmRlbnQgZnJvbSBTZXJ2ZXIgaW5zdGFuY2VcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uTGV2ZWw6IG51bWJlciA9IFNlcnZlcj8uaW5zdGFuY2U/LmdldENvbmZpZygpLmdldFBhY2tldENvbXByZXNzaW9uTGV2ZWwoKSA/PyA3O1xuXG4gICAgcHVibGljIGRlY29kZUhlYWRlcigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGlkID0gdGhpcy5yZWFkQnl0ZSgpO1xuICAgICAgICBpZiAocGlkICE9PSB0aGlzLmdldElkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmF0Y2ggSUQgbWlzbWF0Y2g6IGlzICR7dGhpcy5nZXRJZCgpfSwgZ290ICR7cGlkfWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29kZVBheWxvYWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGF5bG9hZC53cml0ZShcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZFxuICAgICAgICAgICAgICAgID8gQ29tcHJlc3Npb25Qcm92aWRlci5mcm9tQWxnb3JpdGhtU3luYyh0aGlzLnJlYWRCeXRlKCkpKHRoaXMucmVhZFJlbWFpbmluZygpKVxuICAgICAgICAgICAgICAgIDogdGhpcy5yZWFkUmVtYWluaW5nKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgYXN5bmNEZWNvZGUoKTogUHJvbWlzZTxCdWZmZXJbXT4ge1xuICAgICAgICB0aGlzLmRlY29kZUhlYWRlcigpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBheWxvYWQud3JpdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkXG4gICAgICAgICAgICAgICAgICAgID8gYXdhaXQgQ29tcHJlc3Npb25Qcm92aWRlci5mcm9tQWxnb3JpdGhtKHRoaXMucmVhZEJ5dGUoKSkodGhpcy5yZWFkUmVtYWluaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5yZWFkUmVtYWluaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBpbmZsYXRlIGJhdGNoZWQgY29udGVudGAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFja2V0cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmNvZGVIZWFkZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlKHRoaXMuZ2V0SWQoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuY29kZVBheWxvYWQoKTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMuYXBwZW5kKEJ1ZmZlci5mcm9tKEZmbGF0ZS5kZWZsYXRlU3luYyh0aGlzLnBheWxvYWQsIHsgbGV2ZWw6IDcgfSkpKTtcbiAgICAgICAgLy8gU2VlbXMgbGlrZSBabGliIHJ1bnMgYSBsaXR0bGUgYml0IGJldHRlciBmb3IgZGVmbGF0aW5nLCB3aWxsIHNlZSBpbiBmdXR1cmUgd2l0aCBhc3luYy4uLlxuICAgICAgICAvLyB0aGlzLndyaXRlKFpsaWIuZGVmbGF0ZVJhd1N5bmModGhpcy5wYXlsb2FkLmdldEJ1ZmZlcigpLCB7IGxldmVsOiA3IH0pKTtcbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZCkge1xuICAgICAgICAgICAgdGhpcy53cml0ZUJ5dGUoUGFja2V0Q29tcHJlc3Npb25BbGdvcml0aG0uWkxJQik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cml0ZShcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZCA/IFpsaWIuZGVmbGF0ZVJhd1N5bmModGhpcy5wYXlsb2FkLmdldEJ1ZmZlcigpLCB7IGxldmVsOiA3IH0pIDogdGhpcy5wYXlsb2FkLmdldEJ1ZmZlcigpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhY2tldChwYWNrZXQ6IERhdGFQYWNrZXQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFwYWNrZXQuZ2V0RW5jb2RlZCgpKSB7XG4gICAgICAgICAgICBwYWNrZXQuZW5jb2RlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBheWxvYWQud3JpdGVVbnNpZ25lZFZhckludChwYWNrZXQuZ2V0QnVmZmVyKCkuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMucGF5bG9hZC53cml0ZShwYWNrZXQuZ2V0QnVmZmVyKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYWNrZXRzKCk6IEJ1ZmZlcltdIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSh0aGlzLnBheWxvYWQuZ2V0QnVmZmVyKCkpO1xuICAgICAgICBjb25zdCBwYWNrZXRzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICAvLyBWYXJVaW50OiBwYWNrZXQgbGVuZ3RoXG4gICAgICAgICAgICBwYWNrZXRzLnB1c2goc3RyZWFtLnJlYWQoc3RyZWFtLnJlYWRVbnNpZ25lZFZhckludCgpKSk7XG4gICAgICAgIH0gd2hpbGUgKCFzdHJlYW0uZmVvZigpKTtcbiAgICAgICAgcmV0dXJuIHBhY2tldHM7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQVNBLE1BQXFCLG9CQUFvQixVQUFXLENBQUE7QUFBQSxFQUNoRCxPQUFjLEtBQVEsR0FBQSxHQUFBO0FBQUEsRUFFZixVQUFhLEdBQUEsSUFBQTtBQUFBO0FBQUEsRUFDWixPQUFBLEdBQVUsSUFBSSxZQUFhLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUs1QixZQUFxQixHQUFBO0FBQ3hCLElBQU0sTUFBQSxHQUFBLEdBQU0sS0FBSyxRQUFTLEVBQUE7QUFDMUIsSUFBSSxJQUFBLEdBQUEsS0FBUSxJQUFLLENBQUEsS0FBQSxFQUFTLEVBQUE7QUFDdEIsTUFBTSxNQUFBLElBQUksTUFBTSxDQUF5QixzQkFBQSxFQUFBLElBQUEsQ0FBSyxPQUFPLENBQUEsTUFBQSxFQUFTLEdBQUcsQ0FBRSxDQUFBLENBQUE7QUFBQTtBQUN2RTtBQUNKLEVBRU8sYUFBc0IsR0FBQTtBQUN6QixJQUFBLElBQUEsQ0FBSyxPQUFRLENBQUEsS0FBQTtBQUFBLE1BQ1QsSUFBSyxDQUFBLFVBQUEsR0FDQyxtQkFBb0IsQ0FBQSxpQkFBQSxDQUFrQixJQUFLLENBQUEsUUFBQSxFQUFVLENBQUEsQ0FBRSxJQUFLLENBQUEsYUFBQSxFQUFlLENBQUEsR0FDM0UsS0FBSyxhQUFjO0FBQUEsS0FDN0I7QUFBQTtBQUNKLEVBRUEsTUFBYSxXQUFpQyxHQUFBO0FBQzFDLElBQUEsSUFBQSxDQUFLLFlBQWEsRUFBQTtBQUVsQixJQUFJLElBQUE7QUFDQSxNQUFBLElBQUEsQ0FBSyxPQUFRLENBQUEsS0FBQTtBQUFBLFFBQ1QsSUFBSyxDQUFBLFVBQUEsR0FDQyxNQUFNLG1CQUFBLENBQW9CLGNBQWMsSUFBSyxDQUFBLFFBQUEsRUFBVSxDQUFBLENBQUUsSUFBSyxDQUFBLGFBQUEsRUFBZSxDQUFBLEdBQzdFLEtBQUssYUFBYztBQUFBLE9BQzdCO0FBQUEsYUFDSyxLQUFnQixFQUFBO0FBQ3JCLE1BQUEsTUFBTSxJQUFJLEtBQU0sQ0FBQSxDQUFBLGlDQUFBLENBQUEsRUFBcUMsRUFBRSxLQUFBLEVBQU8sT0FBTyxDQUFBO0FBQUE7QUFHekUsSUFBQSxPQUFPLEtBQUssVUFBVyxFQUFBO0FBQUE7QUFDM0IsRUFFTyxZQUFxQixHQUFBO0FBQ3hCLElBQUssSUFBQSxDQUFBLFNBQUEsQ0FBVSxJQUFLLENBQUEsS0FBQSxFQUFPLENBQUE7QUFBQTtBQUMvQixFQUVPLGFBQXNCLEdBQUE7QUFJekIsSUFBQSxJQUFJLEtBQUssVUFBWSxFQUFBO0FBQ2pCLE1BQUssSUFBQSxDQUFBLFNBQUEsQ0FBVSwyQkFBMkIsSUFBSSxDQUFBO0FBQUE7QUFFbEQsSUFBSyxJQUFBLENBQUEsS0FBQTtBQUFBLE1BQ0QsSUFBSyxDQUFBLFVBQUEsR0FBYSxJQUFLLENBQUEsY0FBQSxDQUFlLEtBQUssT0FBUSxDQUFBLFNBQUEsRUFBYSxFQUFBLEVBQUUsT0FBTyxDQUFFLEVBQUMsQ0FBSSxHQUFBLElBQUEsQ0FBSyxRQUFRLFNBQVU7QUFBQSxLQUMzRztBQUFBO0FBQ0osRUFFTyxVQUFVLE1BQTBCLEVBQUE7QUFDdkMsSUFBSSxJQUFBLENBQUMsTUFBTyxDQUFBLFVBQUEsRUFBYyxFQUFBO0FBQ3RCLE1BQUEsTUFBQSxDQUFPLE1BQU8sRUFBQTtBQUFBO0FBR2xCLElBQUEsSUFBQSxDQUFLLE9BQVEsQ0FBQSxtQkFBQSxDQUFvQixNQUFPLENBQUEsU0FBQSxHQUFZLFVBQVUsQ0FBQTtBQUM5RCxJQUFBLElBQUEsQ0FBSyxPQUFRLENBQUEsS0FBQSxDQUFNLE1BQU8sQ0FBQSxTQUFBLEVBQVcsQ0FBQTtBQUFBO0FBQ3pDLEVBRU8sVUFBdUIsR0FBQTtBQUMxQixJQUFBLE1BQU0sU0FBUyxJQUFJLFlBQUEsQ0FBYSxJQUFLLENBQUEsT0FBQSxDQUFRLFdBQVcsQ0FBQTtBQUN4RCxJQUFBLE1BQU0sVUFBb0IsRUFBQztBQUMzQixJQUFHLEdBQUE7QUFFQyxNQUFBLE9BQUEsQ0FBUSxLQUFLLE1BQU8sQ0FBQSxJQUFBLENBQUssTUFBTyxDQUFBLGtCQUFBLEVBQW9CLENBQUMsQ0FBQTtBQUFBLEtBQ3pELFFBQVMsQ0FBQyxNQUFBLENBQU8sSUFBSyxFQUFBO0FBQ3RCLElBQU8sT0FBQSxPQUFBO0FBQUE7QUFFZjs7OzsifQ==