@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
76 lines (69 loc) • 9.57 kB
JavaScript
'use strict';
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const BinaryStream = require('@jsprismarine/jsbinaryutils');
const Zlib = require('zlib');
const network_CompressionProvider = require('../CompressionProvider.cjs.cjs');
const network_packet_DataPacket = require('./DataPacket.cjs.cjs');
const network_packet_NetworkSettingsPacket = require('./NetworkSettingsPacket.cjs.cjs');
const _interopDefault = e => e && e.__esModule ? e : { default: e };
const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream);
const Zlib__default = /*#__PURE__*/_interopDefault(Zlib);
class BatchPacket extends network_packet_DataPacket.default {
static NetID = 254;
compressed = true;
// TODO: better solution
payload = new BinaryStream__default.default();
// 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 ? network_CompressionProvider.CompressionProvider.fromAlgorithmSync(this.readByte())(this.readRemaining()) : this.readRemaining()
);
}
async asyncDecode() {
this.decodeHeader();
try {
this.payload.write(
this.compressed ? await network_CompressionProvider.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(network_packet_NetworkSettingsPacket.PacketCompressionAlgorithm.ZLIB);
}
this.write(
this.compressed ? Zlib__default.default.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__default.default(this.payload.getBuffer());
const packets = [];
do {
packets.push(stream.read(stream.readUnsignedVarInt()));
} while (!stream.feof());
return packets;
}
}
exports.default = BatchPacket;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hQYWNrZXQuY2pzLmNqcyIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25ldHdvcmsvcGFja2V0L0JhdGNoUGFja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCBabGliIGZyb20gJ3psaWInO1xuaW1wb3J0IHsgQ29tcHJlc3Npb25Qcm92aWRlciB9IGZyb20gJy4uL0NvbXByZXNzaW9uUHJvdmlkZXIuanMnO1xuaW1wb3J0IERhdGFQYWNrZXQgZnJvbSAnLi9EYXRhUGFja2V0JztcbmltcG9ydCB7IFBhY2tldENvbXByZXNzaW9uQWxnb3JpdGhtIH0gZnJvbSAnLi9OZXR3b3JrU2V0dGluZ3NQYWNrZXQuanMnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXRjaFBhY2tldCBleHRlbmRzIERhdGFQYWNrZXQge1xuICAgIHB1YmxpYyBzdGF0aWMgTmV0SUQgPSAweGZlO1xuXG4gICAgcHVibGljIGNvbXByZXNzZWQgPSB0cnVlOyAvLyAgVE9ETzogYmV0dGVyIHNvbHV0aW9uXG4gICAgcHJpdmF0ZSBwYXlsb2FkID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgIC8vIEJpZ2dlciBjb21wcmVzc2lvbiBsZXZlbCBsZWFkcyB0byBtb3JlIENQVSB1c2FnZSBhbmQgbGVzcyBuZXR3b3JrLCBhbmQgdmljZSB2ZXJzYVxuICAgIC8vIFRPRE86IGJhdGNoLnNldENvbXByZXNzaW9uTGV2ZWwoKSwgaXQgc2hvdWxkIGJlIGRlcGVuZGVudCBmcm9tIFNlcnZlciBpbnN0YW5jZVxuICAgIC8vIHByaXZhdGUgcmVhZG9ubHkgY29tcHJlc3Npb25MZXZlbDogbnVtYmVyID0gU2VydmVyPy5pbnN0YW5jZT8uZ2V0Q29uZmlnKCkuZ2V0UGFja2V0Q29tcHJlc3Npb25MZXZlbCgpID8/IDc7XG5cbiAgICBwdWJsaWMgZGVjb2RlSGVhZGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwaWQgPSB0aGlzLnJlYWRCeXRlKCk7XG4gICAgICAgIGlmIChwaWQgIT09IHRoaXMuZ2V0SWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCYXRjaCBJRCBtaXNtYXRjaDogaXMgJHt0aGlzLmdldElkKCl9LCBnb3QgJHtwaWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZGVjb2RlUGF5bG9hZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYXlsb2FkLndyaXRlKFxuICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkXG4gICAgICAgICAgICAgICAgPyBDb21wcmVzc2lvblByb3ZpZGVyLmZyb21BbGdvcml0aG1TeW5jKHRoaXMucmVhZEJ5dGUoKSkodGhpcy5yZWFkUmVtYWluaW5nKCkpXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJlYWRSZW1haW5pbmcoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBhc3luY0RlY29kZSgpOiBQcm9taXNlPEJ1ZmZlcltdPiB7XG4gICAgICAgIHRoaXMuZGVjb2RlSGVhZGVyKCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGF5bG9hZC53cml0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXByZXNzZWRcbiAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCBDb21wcmVzc2lvblByb3ZpZGVyLmZyb21BbGdvcml0aG0odGhpcy5yZWFkQnl0ZSgpKSh0aGlzLnJlYWRSZW1haW5pbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJlYWRSZW1haW5pbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGluZmxhdGUgYmF0Y2hlZCBjb250ZW50YCwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRQYWNrZXRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuY29kZUhlYWRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUodGhpcy5nZXRJZCgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5jb2RlUGF5bG9hZCgpOiB2b2lkIHtcbiAgICAgICAgLy8gdGhpcy5hcHBlbmQoQnVmZmVyLmZyb20oRmZsYXRlLmRlZmxhdGVTeW5jKHRoaXMucGF5bG9hZCwgeyBsZXZlbDogNyB9KSkpO1xuICAgICAgICAvLyBTZWVtcyBsaWtlIFpsaWIgcnVucyBhIGxpdHRsZSBiaXQgYmV0dGVyIGZvciBkZWZsYXRpbmcsIHdpbGwgc2VlIGluIGZ1dHVyZSB3aXRoIGFzeW5jLi4uXG4gICAgICAgIC8vIHRoaXMud3JpdGUoWmxpYi5kZWZsYXRlUmF3U3luYyh0aGlzLnBheWxvYWQuZ2V0QnVmZmVyKCksIHsgbGV2ZWw6IDcgfSkpO1xuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlQnl0ZShQYWNrZXRDb21wcmVzc2lvbkFsZ29yaXRobS5aTElCKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndyaXRlKFxuICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkID8gWmxpYi5kZWZsYXRlUmF3U3luYyh0aGlzLnBheWxvYWQuZ2V0QnVmZmVyKCksIHsgbGV2ZWw6IDcgfSkgOiB0aGlzLnBheWxvYWQuZ2V0QnVmZmVyKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUGFja2V0KHBhY2tldDogRGF0YVBhY2tldCk6IHZvaWQge1xuICAgICAgICBpZiAoIXBhY2tldC5nZXRFbmNvZGVkKCkpIHtcbiAgICAgICAgICAgIHBhY2tldC5lbmNvZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGF5bG9hZC53cml0ZVVuc2lnbmVkVmFySW50KHBhY2tldC5nZXRCdWZmZXIoKS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy5wYXlsb2FkLndyaXRlKHBhY2tldC5nZXRCdWZmZXIoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhY2tldHMoKTogQnVmZmVyW10ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKHRoaXMucGF5bG9hZC5nZXRCdWZmZXIoKSk7XG4gICAgICAgIGNvbnN0IHBhY2tldHM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIC8vIFZhclVpbnQ6IHBhY2tldCBsZW5ndGhcbiAgICAgICAgICAgIHBhY2tldHMucHVzaChzdHJlYW0ucmVhZChzdHJlYW0ucmVhZFVuc2lnbmVkVmFySW50KCkpKTtcbiAgICAgICAgfSB3aGlsZSAoIXN0cmVhbS5mZW9mKCkpO1xuICAgICAgICByZXR1cm4gcGFja2V0cztcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiRGF0YVBhY2tldCIsIkJpbmFyeVN0cmVhbSIsIkNvbXByZXNzaW9uUHJvdmlkZXIiLCJQYWNrZXRDb21wcmVzc2lvbkFsZ29yaXRobSIsIlpsaWIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVNBLE1BQXFCLG9CQUFvQkEsaUNBQVcsQ0FBQTtBQUFBLEVBQ2hELE9BQWMsS0FBUSxHQUFBLEdBQUE7QUFBQSxFQUVmLFVBQWEsR0FBQSxJQUFBO0FBQUE7QUFBQSxFQUNaLE9BQUEsR0FBVSxJQUFJQyw2QkFBYSxFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLNUIsWUFBcUIsR0FBQTtBQUN4QixJQUFNLE1BQUEsR0FBQSxHQUFNLEtBQUssUUFBUyxFQUFBO0FBQzFCLElBQUksSUFBQSxHQUFBLEtBQVEsSUFBSyxDQUFBLEtBQUEsRUFBUyxFQUFBO0FBQ3RCLE1BQU0sTUFBQSxJQUFJLE1BQU0sQ0FBeUIsc0JBQUEsRUFBQSxJQUFBLENBQUssT0FBTyxDQUFBLE1BQUEsRUFBUyxHQUFHLENBQUUsQ0FBQSxDQUFBO0FBQUE7QUFDdkU7QUFDSixFQUVPLGFBQXNCLEdBQUE7QUFDekIsSUFBQSxJQUFBLENBQUssT0FBUSxDQUFBLEtBQUE7QUFBQSxNQUNULElBQUssQ0FBQSxVQUFBLEdBQ0NDLCtDQUFvQixDQUFBLGlCQUFBLENBQWtCLElBQUssQ0FBQSxRQUFBLEVBQVUsQ0FBQSxDQUFFLElBQUssQ0FBQSxhQUFBLEVBQWUsQ0FBQSxHQUMzRSxLQUFLLGFBQWM7QUFBQSxLQUM3QjtBQUFBO0FBQ0osRUFFQSxNQUFhLFdBQWlDLEdBQUE7QUFDMUMsSUFBQSxJQUFBLENBQUssWUFBYSxFQUFBO0FBRWxCLElBQUksSUFBQTtBQUNBLE1BQUEsSUFBQSxDQUFLLE9BQVEsQ0FBQSxLQUFBO0FBQUEsUUFDVCxJQUFLLENBQUEsVUFBQSxHQUNDLE1BQU1BLCtDQUFBLENBQW9CLGNBQWMsSUFBSyxDQUFBLFFBQUEsRUFBVSxDQUFBLENBQUUsSUFBSyxDQUFBLGFBQUEsRUFBZSxDQUFBLEdBQzdFLEtBQUssYUFBYztBQUFBLE9BQzdCO0FBQUEsYUFDSyxLQUFnQixFQUFBO0FBQ3JCLE1BQUEsTUFBTSxJQUFJLEtBQU0sQ0FBQSxDQUFBLGlDQUFBLENBQUEsRUFBcUMsRUFBRSxLQUFBLEVBQU8sT0FBTyxDQUFBO0FBQUE7QUFHekUsSUFBQSxPQUFPLEtBQUssVUFBVyxFQUFBO0FBQUE7QUFDM0IsRUFFTyxZQUFxQixHQUFBO0FBQ3hCLElBQUssSUFBQSxDQUFBLFNBQUEsQ0FBVSxJQUFLLENBQUEsS0FBQSxFQUFPLENBQUE7QUFBQTtBQUMvQixFQUVPLGFBQXNCLEdBQUE7QUFJekIsSUFBQSxJQUFJLEtBQUssVUFBWSxFQUFBO0FBQ2pCLE1BQUssSUFBQSxDQUFBLFNBQUEsQ0FBVUMsZ0VBQTJCLElBQUksQ0FBQTtBQUFBO0FBRWxELElBQUssSUFBQSxDQUFBLEtBQUE7QUFBQSxNQUNELElBQUssQ0FBQSxVQUFBLEdBQWFDLHFCQUFLLENBQUEsY0FBQSxDQUFlLEtBQUssT0FBUSxDQUFBLFNBQUEsRUFBYSxFQUFBLEVBQUUsT0FBTyxDQUFFLEVBQUMsQ0FBSSxHQUFBLElBQUEsQ0FBSyxRQUFRLFNBQVU7QUFBQSxLQUMzRztBQUFBO0FBQ0osRUFFTyxVQUFVLE1BQTBCLEVBQUE7QUFDdkMsSUFBSSxJQUFBLENBQUMsTUFBTyxDQUFBLFVBQUEsRUFBYyxFQUFBO0FBQ3RCLE1BQUEsTUFBQSxDQUFPLE1BQU8sRUFBQTtBQUFBO0FBR2xCLElBQUEsSUFBQSxDQUFLLE9BQVEsQ0FBQSxtQkFBQSxDQUFvQixNQUFPLENBQUEsU0FBQSxHQUFZLFVBQVUsQ0FBQTtBQUM5RCxJQUFBLElBQUEsQ0FBSyxPQUFRLENBQUEsS0FBQSxDQUFNLE1BQU8sQ0FBQSxTQUFBLEVBQVcsQ0FBQTtBQUFBO0FBQ3pDLEVBRU8sVUFBdUIsR0FBQTtBQUMxQixJQUFBLE1BQU0sU0FBUyxJQUFJSCw2QkFBQSxDQUFhLElBQUssQ0FBQSxPQUFBLENBQVEsV0FBVyxDQUFBO0FBQ3hELElBQUEsTUFBTSxVQUFvQixFQUFDO0FBQzNCLElBQUcsR0FBQTtBQUVDLE1BQUEsT0FBQSxDQUFRLEtBQUssTUFBTyxDQUFBLElBQUEsQ0FBSyxNQUFPLENBQUEsa0JBQUEsRUFBb0IsQ0FBQyxDQUFBO0FBQUEsS0FDekQsUUFBUyxDQUFDLE1BQUEsQ0FBTyxJQUFLLEVBQUE7QUFDdEIsSUFBTyxPQUFBLE9BQUE7QUFBQTtBQUVmOzs7OyJ9