@jsprismarine/raknet
Version:
Basic RakNet implementation written in TypeScript
64 lines (63 loc) • 6.33 kB
JavaScript
import InetAddress from "../utils/InetAddress.es.js";
import BinaryStream from "@jsprismarine/jsbinaryutils";
//#region src/protocol/Packet.ts
/**
* The base class for all packets.
*/
var Packet = class extends BinaryStream {
id;
/**
* Create a new packet.
*/
constructor(id, buffer) {
super(buffer);
this.id = id;
}
/**
* Get the packet ID.
* @returns The packet's ID.
*/
getId() {
return this.id;
}
decode() {
this.readByte();
this.decodePayload();
}
decodePayload() {}
encode() {
this.writeByte(this.getId());
this.encodePayload();
}
encodePayload() {}
readString() {
return this.read(this.readShort()).toString("utf-8");
}
writeString(v) {
const data = Buffer.from(v, "utf-8");
this.writeUnsignedShort(data.byteLength);
this.write(data);
}
readAddress() {
const ver = this.readByte();
if (ver === 4) {
const ipBytes = this.read(4);
return new InetAddress(`${-ipBytes[0] - 1 & 255}.${-ipBytes[1] - 1 & 255}.${-ipBytes[2] - 1 & 255}.${-ipBytes[3] - 1 & 255}`, this.readShort(), ver);
}
this.skip(2);
const port = this.readShort();
this.skip(4);
const addr = this.read(16).toString();
this.skip(4);
return new InetAddress(addr, port, ver);
}
writeAddress(address) {
this.writeByte(4);
const bytes = address.getAddress().split(".", 4).map((v) => Number.parseInt(v, 10));
for (const byte of bytes) this.writeByte(~byte & 255);
this.writeUnsignedShort(address.getPort());
}
};
//#endregion
export { Packet as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2V0LmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm90b2NvbC9QYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IEluZXRBZGRyZXNzIGZyb20gJy4uL3V0aWxzL0luZXRBZGRyZXNzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIHBhY2tldHMuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhY2tldCBleHRlbmRzIEJpbmFyeVN0cmVhbSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHBhY2tldC5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoaWQ6IG51bWJlciwgYnVmZmVyPzogQnVmZmVyKSB7XG4gICAgICAgIHN1cGVyKGJ1ZmZlcik7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHBhY2tldCBJRC5cbiAgICAgKiBAcmV0dXJucyBUaGUgcGFja2V0J3MgSUQuXG4gICAgICovXG4gICAgcHVibGljIGdldElkKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVhZEJ5dGUoKTtcbiAgICAgICAgdGhpcy5kZWNvZGVQYXlsb2FkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGRlY29kZVBheWxvYWQoKTogdm9pZCB7fVxuXG4gICAgcHVibGljIGVuY29kZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUodGhpcy5nZXRJZCgpKTtcbiAgICAgICAgdGhpcy5lbmNvZGVQYXlsb2FkKCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGVuY29kZVBheWxvYWQoKTogdm9pZCB7fVxuXG4gICAgcHVibGljIHJlYWRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZCh0aGlzLnJlYWRTaG9ydCgpKS50b1N0cmluZygndXRmLTgnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVTdHJpbmcodjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuZnJvbSh2LCAndXRmLTgnKTtcbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkU2hvcnQoZGF0YS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgdGhpcy53cml0ZShkYXRhIGFzIGFueSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWRBZGRyZXNzKCk6IEluZXRBZGRyZXNzIHtcbiAgICAgICAgY29uc3QgdmVyID0gdGhpcy5yZWFkQnl0ZSgpO1xuICAgICAgICBpZiAodmVyID09PSA0KSB7XG4gICAgICAgICAgICBjb25zdCBpcEJ5dGVzID0gdGhpcy5yZWFkKDQpO1xuICAgICAgICAgICAgY29uc3QgYWRkciA9IGAkeygtaXBCeXRlc1swXSEgLSAxKSAmIDB4ZmZ9LiR7KC1pcEJ5dGVzWzFdISAtIDEpICYgMHhmZn0uJHsoLWlwQnl0ZXNbMl0hIC0gMSkgJiAweGZmfS4ke1xuICAgICAgICAgICAgICAgICgtaXBCeXRlc1szXSEgLSAxKSAmIDB4ZmZcbiAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgY29uc3QgcG9ydCA9IHRoaXMucmVhZFNob3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEluZXRBZGRyZXNzKGFkZHIsIHBvcnQsIHZlcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNraXAoMik7IC8vIFNraXAgMiBieXRlc1xuICAgICAgICBjb25zdCBwb3J0ID0gdGhpcy5yZWFkU2hvcnQoKTtcbiAgICAgICAgdGhpcy5za2lwKDQpOyAvLyBTa2lwIDQgYnl0ZXNcbiAgICAgICAgY29uc3QgYWRkciA9IHRoaXMucmVhZCgxNikudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5za2lwKDQpOyAvLyBTa2lwIDQgYnl0ZXNcbiAgICAgICAgcmV0dXJuIG5ldyBJbmV0QWRkcmVzcyhhZGRyLCBwb3J0LCB2ZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZUFkZHJlc3MoYWRkcmVzczogSW5ldEFkZHJlc3MpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53cml0ZUJ5dGUoNCk7IC8vIElQdjQgb25seVxuICAgICAgICBjb25zdCBieXRlcyA9IGFkZHJlc3NcbiAgICAgICAgICAgIC5nZXRBZGRyZXNzKClcbiAgICAgICAgICAgIC5zcGxpdCgnLicsIDQpXG4gICAgICAgICAgICAubWFwKCh2KSA9PiBOdW1iZXIucGFyc2VJbnQodiwgMTApKTtcbiAgICAgICAgLy8gMTAgc2hvdWxkIHdvcmsgcGVyZmVjdGx5IGZpbmUsIGJ1dCBtYXliZSBiYXNlMiBpcyBkaXJlY3RseSBiZXR0ZXIuLi5cbiAgICAgICAgLy8gVE9ETzogc2VlIHdoZW4gd2lsbCByZWZhY3RvciB0aGlzIGNvZGUgc29vblxuICAgICAgICBmb3IgKGNvbnN0IGJ5dGUgb2YgYnl0ZXMpIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVCeXRlKH5ieXRlICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkU2hvcnQoYWRkcmVzcy5nZXRQb3J0KCkpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBTUEsSUFBcUIsU0FBckIsY0FBb0MsYUFBYTtDQUM3Qzs7OztDQUtBLFlBQW1CLElBQVksUUFBaUI7RUFDNUMsTUFBTSxNQUFNO0VBQ1osS0FBSyxLQUFLO0NBQ2Q7Ozs7O0NBTUEsUUFBdUI7RUFDbkIsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsU0FBc0I7RUFDbEIsS0FBSyxTQUFTO0VBQ2QsS0FBSyxjQUFjO0NBQ3ZCO0NBRUEsZ0JBQWdDLENBQUM7Q0FFakMsU0FBc0I7RUFDbEIsS0FBSyxVQUFVLEtBQUssTUFBTSxDQUFDO0VBQzNCLEtBQUssY0FBYztDQUN2QjtDQUVBLGdCQUFnQyxDQUFDO0NBRWpDLGFBQTRCO0VBQ3hCLE9BQU8sS0FBSyxLQUFLLEtBQUssVUFBVSxDQUFDLEVBQUUsU0FBUyxPQUFPO0NBQ3ZEO0NBRUEsWUFBbUIsR0FBaUI7RUFDaEMsTUFBTSxPQUFPLE9BQU8sS0FBSyxHQUFHLE9BQU87RUFDbkMsS0FBSyxtQkFBbUIsS0FBSyxVQUFVO0VBQ3ZDLEtBQUssTUFBTSxJQUFXO0NBQzFCO0NBRUEsY0FBa0M7RUFDOUIsTUFBTSxNQUFNLEtBQUssU0FBUztFQUMxQixJQUFJLFFBQVEsR0FBRztHQUNYLE1BQU0sVUFBVSxLQUFLLEtBQUssQ0FBQztHQUszQixPQUFPLElBQUksWUFBWSxHQUpOLENBQUMsUUFBUSxLQUFNLElBQUssSUFBSyxHQUFJLENBQUMsUUFBUSxLQUFNLElBQUssSUFBSyxHQUFJLENBQUMsUUFBUSxLQUFNLElBQUssSUFBSyxHQUMvRixDQUFDLFFBQVEsS0FBTSxJQUFLLE9BRVosS0FBSyxVQUNXLEdBQU0sR0FBRztFQUMxQztFQUVBLEtBQUssS0FBSyxDQUFDO0VBQ1gsTUFBTSxPQUFPLEtBQUssVUFBVTtFQUM1QixLQUFLLEtBQUssQ0FBQztFQUNYLE1BQU0sT0FBTyxLQUFLLEtBQUssRUFBRSxFQUFFLFNBQVM7RUFDcEMsS0FBSyxLQUFLLENBQUM7RUFDWCxPQUFPLElBQUksWUFBWSxNQUFNLE1BQU0sR0FBRztDQUMxQztDQUVBLGFBQW9CLFNBQTRCO0VBQzVDLEtBQUssVUFBVSxDQUFDO0VBQ2hCLE1BQU0sUUFBUSxRQUNULFdBQVcsRUFDWCxNQUFNLEtBQUssQ0FBQyxFQUNaLEtBQUssTUFBTSxPQUFPLFNBQVMsR0FBRyxFQUFFLENBQUM7RUFHdEMsS0FBSyxNQUFNLFFBQVEsT0FDZixLQUFLLFVBQVUsQ0FBQyxPQUFPLEdBQUk7RUFFL0IsS0FBSyxtQkFBbUIsUUFBUSxRQUFRLENBQUM7Q0FDN0M7QUFDSiJ9