UNPKG

@jsprismarine/raknet

Version:
95 lines (94 loc) 12 kB
import { BitFlags } from "./BitFlags.es.js"; import { FrameReliability } from "./FrameReliability.es.js"; import BinaryStream from "@jsprismarine/jsbinaryutils"; import assert from "assert"; //#region src/protocol/Frame.ts var MAX_FRAME_BYTE_LENGTH = 23; var Frame = class { reliability = FrameReliability.UNRELIABLE; reliableIndex = null; sequenceIndex = null; orderIndex = null; orderChannel; fragmentSize = 0; fragmentId; fragmentIndex; content; fromBinary(stream) { const header = stream.readByte(); this.reliability = (header & 224) >> 5; const length = Math.ceil(stream.readShort() / 8); if (this.isReliable()) this.reliableIndex = stream.readTriadLE(); if (this.isSequenced()) this.sequenceIndex = stream.readTriadLE(); if (this.isOrdered()) { this.orderIndex = stream.readTriadLE(); this.orderChannel = stream.readByte(); } if ((header & BitFlags.SPLIT) > 0) { this.fragmentSize = stream.readInt(); this.fragmentId = stream.readShort(); this.fragmentIndex = stream.readInt(); } this.content = stream.read(length); return this; } toBinary() { const stream = new BinaryStream(); const fragmented = this.isFragmented(); stream.writeByte(this.reliability << 5 | (fragmented ? BitFlags.SPLIT : 0)); stream.writeUnsignedShort(this.content.byteLength << 3); if (this.isReliable()) { assert(typeof this.reliableIndex === "number", "Invalid ReliableIndex for reliable Frame"); stream.writeUnsignedTriadLE(this.reliableIndex); } if (this.isSequenced()) { assert(typeof this.sequenceIndex === "number", "Invalid SequenceIndex for sequenced Frame"); stream.writeUnsignedTriadLE(this.sequenceIndex); } if (this.isOrdered()) { assert(typeof this.orderIndex === "number", "Invalid OrderIndex for ordered Frame"); stream.writeUnsignedTriadLE(this.orderIndex); assert(typeof this.orderChannel === "number", "Invalid OrderChannel for ordered FrameSet"); stream.writeByte(this.orderChannel); } if (fragmented) { stream.writeUnsignedInt(this.fragmentSize); stream.writeUnsignedShort(this.fragmentId); stream.writeUnsignedInt(this.fragmentIndex); } stream.write(this.content); return stream; } getByteLength() { return 3 + this.content.byteLength + (this.isReliable() ? 3 : 0) + (this.isSequenced() ? 3 : 0) + (this.isOrdered() ? 4 : 0) + (this.isFragmented() ? 10 : 0); } isReliable() { return [ FrameReliability.RELIABLE, FrameReliability.RELIABLE_ORDERED, FrameReliability.RELIABLE_SEQUENCED, FrameReliability.RELIABLE_WITH_ACK_RECEIPT, FrameReliability.RELIABLE_ORDERED_WITH_ACK_RECEIPT ].includes(this.reliability); } isSequenced() { return [FrameReliability.RELIABLE_SEQUENCED, FrameReliability.UNRELIABLE_SEQUENCED].includes(this.reliability); } isOrdered() { return [ FrameReliability.UNRELIABLE_SEQUENCED, FrameReliability.RELIABLE_ORDERED, FrameReliability.RELIABLE_SEQUENCED, FrameReliability.RELIABLE_ORDERED_WITH_ACK_RECEIPT ].includes(this.reliability); } isOrderedExclusive() { return [FrameReliability.RELIABLE_ORDERED, FrameReliability.RELIABLE_ORDERED_WITH_ACK_RECEIPT].includes(this.reliability); } isFragmented() { return this.fragmentSize > 0; } }; //#endregion export { MAX_FRAME_BYTE_LENGTH, Frame as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbWUuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3RvY29sL0ZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCBCaXRGbGFncyBmcm9tICcuL0JpdEZsYWdzJztcbmltcG9ydCBGcmFtZVJlbGlhYmlsaXR5IGZyb20gJy4vRnJhbWVSZWxpYWJpbGl0eSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvUmFrTmV0L2Jsb2IvMWExNjk4OTVhOTAwYzlmYzQ4NDFjNTU2ZTE2NTE0MTgyYjc1ZmFmOC9Tb3VyY2UvUmVsaWFiaWxpdHlMYXllci5jcHAjTDEzM1xuLy8gSXQncyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYSBmcmFtZXNldCBjYW4gdGFrZS4gKHNwbGl0dGVkIHJlbGlhYmxlIHNlcXVlbmNlZCkuXG5leHBvcnQgY29uc3QgTUFYX0ZSQU1FX0JZVEVfTEVOR1RIID0gMjM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyYW1lIHtcbiAgICBwdWJsaWMgcmVsaWFiaWxpdHkgPSBGcmFtZVJlbGlhYmlsaXR5LlVOUkVMSUFCTEU7XG5cbiAgICBwdWJsaWMgcmVsaWFibGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgc2VxdWVuY2VJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgb3JkZXJJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9yZGVyQ2hhbm5lbCE6IE5vbk51bGxhYmxlPG51bWJlcj47XG5cbiAgICBwdWJsaWMgZnJhZ21lbnRTaXplID0gMDtcbiAgICBwdWJsaWMgZnJhZ21lbnRJZCE6IG51bWJlcjtcbiAgICBwdWJsaWMgZnJhZ21lbnRJbmRleCE6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb250ZW50ITogQnVmZmVyO1xuXG4gICAgcHVibGljIGZyb21CaW5hcnkoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBGcmFtZSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgICB0aGlzLnJlbGlhYmlsaXR5ID0gKGhlYWRlciAmIDB4ZTApID4+IDU7XG5cbiAgICAgICAgLy8gTGVuZ3RoIGZyb20gYml0cyB0byBieXRlc1xuICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLmNlaWwoc3RyZWFtLnJlYWRTaG9ydCgpIC8gOCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZWxpYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbGlhYmxlSW5kZXggPSBzdHJlYW0ucmVhZFRyaWFkTEUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2VxdWVuY2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCA9IHN0cmVhbS5yZWFkVHJpYWRMRSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNPcmRlcmVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3JkZXJJbmRleCA9IHN0cmVhbS5yZWFkVHJpYWRMRSgpO1xuICAgICAgICAgICAgdGhpcy5vcmRlckNoYW5uZWwgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoaGVhZGVyICYgQml0RmxhZ3MuU1BMSVQpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudFNpemUgPSBzdHJlYW0ucmVhZEludCgpO1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudElkID0gc3RyZWFtLnJlYWRTaG9ydCgpO1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudEluZGV4ID0gc3RyZWFtLnJlYWRJbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmVhbS5yZWFkKGxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0JpbmFyeSgpOiBCaW5hcnlTdHJlYW0ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ZWQgPSB0aGlzLmlzRnJhZ21lbnRlZCgpO1xuXG4gICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoKHRoaXMucmVsaWFiaWxpdHkgPDwgNSkgfCAoZnJhZ21lbnRlZCA/IEJpdEZsYWdzLlNQTElUIDogMCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29udGVudC5ieXRlTGVuZ3RoIDw8IDMpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUmVsaWFibGUoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLnJlbGlhYmxlSW5kZXggPT09ICdudW1iZXInLCAnSW52YWxpZCBSZWxpYWJsZUluZGV4IGZvciByZWxpYWJsZSBGcmFtZScpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKHRoaXMucmVsaWFibGVJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gJ251bWJlcicsICdJbnZhbGlkIFNlcXVlbmNlSW5kZXggZm9yIHNlcXVlbmNlZCBGcmFtZScpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKHRoaXMuc2VxdWVuY2VJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09yZGVyZWQoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLm9yZGVySW5kZXggPT09ICdudW1iZXInLCAnSW52YWxpZCBPcmRlckluZGV4IGZvciBvcmRlcmVkIEZyYW1lJyk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFRyaWFkTEUodGhpcy5vcmRlckluZGV4KTtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdGhpcy5vcmRlckNoYW5uZWwgPT09ICdudW1iZXInLCAnSW52YWxpZCBPcmRlckNoYW5uZWwgZm9yIG9yZGVyZWQgRnJhbWVTZXQnKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUodGhpcy5vcmRlckNoYW5uZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWdtZW50ZWQpIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50KHRoaXMuZnJhZ21lbnRTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5mcmFnbWVudElkKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50KHRoaXMuZnJhZ21lbnRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGUodGhpcy5jb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qnl0ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgMyArXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQuYnl0ZUxlbmd0aCArXG4gICAgICAgICAgICAodGhpcy5pc1JlbGlhYmxlKCkgPyAzIDogMCkgK1xuICAgICAgICAgICAgKHRoaXMuaXNTZXF1ZW5jZWQoKSA/IDMgOiAwKSArXG4gICAgICAgICAgICAodGhpcy5pc09yZGVyZWQoKSA/IDQgOiAwKSArXG4gICAgICAgICAgICAodGhpcy5pc0ZyYWdtZW50ZWQoKSA/IDEwIDogMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNSZWxpYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEUsXG4gICAgICAgICAgICBGcmFtZVJlbGlhYmlsaXR5LlJFTElBQkxFX09SREVSRUQsXG4gICAgICAgICAgICBGcmFtZVJlbGlhYmlsaXR5LlJFTElBQkxFX1NFUVVFTkNFRCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfV0lUSF9BQ0tfUkVDRUlQVCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfT1JERVJFRF9XSVRIX0FDS19SRUNFSVBUXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5yZWxpYWJpbGl0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2VxdWVuY2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0ZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfU0VRVUVOQ0VELCBGcmFtZVJlbGlhYmlsaXR5LlVOUkVMSUFCTEVfU0VRVUVOQ0VEXS5pbmNsdWRlcyh0aGlzLnJlbGlhYmlsaXR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcmRlcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgRnJhbWVSZWxpYWJpbGl0eS5VTlJFTElBQkxFX1NFUVVFTkNFRCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfT1JERVJFRCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfU0VRVUVOQ0VELFxuICAgICAgICAgICAgRnJhbWVSZWxpYWJpbGl0eS5SRUxJQUJMRV9PUkRFUkVEX1dJVEhfQUNLX1JFQ0VJUFRcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzLnJlbGlhYmlsaXR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcmRlcmVkRXhjbHVzaXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0ZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfT1JERVJFRCwgRnJhbWVSZWxpYWJpbGl0eS5SRUxJQUJMRV9PUkRFUkVEX1dJVEhfQUNLX1JFQ0VJUFRdLmluY2x1ZGVzKFxuICAgICAgICAgICAgdGhpcy5yZWxpYWJpbGl0eVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZyYWdtZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyYWdtZW50U2l6ZSA+IDA7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQU9BLElBQWEsd0JBQXdCO0FBRXJDLElBQXFCLFFBQXJCLE1BQTJCO0NBQ3ZCLGNBQXFCLGlCQUFpQjtDQUV0QyxnQkFBc0M7Q0FFdEMsZ0JBQXNDO0NBRXRDLGFBQW1DO0NBQ25DO0NBRUEsZUFBc0I7Q0FDdEI7Q0FDQTtDQUVBO0NBRUEsV0FBa0IsUUFBNkI7RUFDM0MsTUFBTSxTQUFTLE9BQU8sU0FBUztFQUMvQixLQUFLLGVBQWUsU0FBUyxRQUFTO0VBR3RDLE1BQU0sU0FBUyxLQUFLLEtBQUssT0FBTyxVQUFVLElBQUksQ0FBQztFQUUvQyxJQUFJLEtBQUssV0FBVyxHQUNoQixLQUFLLGdCQUFnQixPQUFPLFlBQVk7RUFHNUMsSUFBSSxLQUFLLFlBQVksR0FDakIsS0FBSyxnQkFBZ0IsT0FBTyxZQUFZO0VBRzVDLElBQUksS0FBSyxVQUFVLEdBQUc7R0FDbEIsS0FBSyxhQUFhLE9BQU8sWUFBWTtHQUNyQyxLQUFLLGVBQWUsT0FBTyxTQUFTO0VBQ3hDO0VBRUEsS0FBSyxTQUFTLFNBQVMsU0FBUyxHQUFHO0dBQy9CLEtBQUssZUFBZSxPQUFPLFFBQVE7R0FDbkMsS0FBSyxhQUFhLE9BQU8sVUFBVTtHQUNuQyxLQUFLLGdCQUFnQixPQUFPLFFBQVE7RUFDeEM7RUFFQSxLQUFLLFVBQVUsT0FBTyxLQUFLLE1BQU07RUFDakMsT0FBTztDQUNYO0NBRUEsV0FBZ0M7RUFDNUIsTUFBTSxTQUFTLElBQUksYUFBYTtFQUNoQyxNQUFNLGFBQWEsS0FBSyxhQUFhO0VBRXJDLE9BQU8sVUFBVyxLQUFLLGVBQWUsS0FBTSxhQUFhLFNBQVMsUUFBUSxFQUFFO0VBQzVFLE9BQU8sbUJBQW1CLEtBQUssUUFBUSxjQUFjLENBQUM7RUFFdEQsSUFBSSxLQUFLLFdBQVcsR0FBRztHQUNuQixPQUFPLE9BQU8sS0FBSyxrQkFBa0IsVUFBVSwwQ0FBMEM7R0FDekYsT0FBTyxxQkFBcUIsS0FBSyxhQUFhO0VBQ2xEO0VBRUEsSUFBSSxLQUFLLFlBQVksR0FBRztHQUNwQixPQUFPLE9BQU8sS0FBSyxrQkFBa0IsVUFBVSwyQ0FBMkM7R0FDMUYsT0FBTyxxQkFBcUIsS0FBSyxhQUFhO0VBQ2xEO0VBRUEsSUFBSSxLQUFLLFVBQVUsR0FBRztHQUNsQixPQUFPLE9BQU8sS0FBSyxlQUFlLFVBQVUsc0NBQXNDO0dBQ2xGLE9BQU8scUJBQXFCLEtBQUssVUFBVTtHQUMzQyxPQUFPLE9BQU8sS0FBSyxpQkFBaUIsVUFBVSwyQ0FBMkM7R0FDekYsT0FBTyxVQUFVLEtBQUssWUFBWTtFQUN0QztFQUVBLElBQUksWUFBWTtHQUNaLE9BQU8saUJBQWlCLEtBQUssWUFBWTtHQUN6QyxPQUFPLG1CQUFtQixLQUFLLFVBQVU7R0FDekMsT0FBTyxpQkFBaUIsS0FBSyxhQUFhO0VBQzlDO0VBRUEsT0FBTyxNQUFNLEtBQUssT0FBTztFQUN6QixPQUFPO0NBQ1g7Q0FFQSxnQkFBK0I7RUFDM0IsT0FDSSxJQUNBLEtBQUssUUFBUSxjQUNaLEtBQUssV0FBVyxJQUFJLElBQUksTUFDeEIsS0FBSyxZQUFZLElBQUksSUFBSSxNQUN6QixLQUFLLFVBQVUsSUFBSSxJQUFJLE1BQ3ZCLEtBQUssYUFBYSxJQUFJLEtBQUs7Q0FFcEM7Q0FFQSxhQUE2QjtFQUN6QixPQUFPO0dBQ0gsaUJBQWlCO0dBQ2pCLGlCQUFpQjtHQUNqQixpQkFBaUI7R0FDakIsaUJBQWlCO0dBQ2pCLGlCQUFpQjtFQUNyQixFQUFFLFNBQVMsS0FBSyxXQUFXO0NBQy9CO0NBRUEsY0FBOEI7RUFDMUIsT0FBTyxDQUFDLGlCQUFpQixvQkFBb0IsaUJBQWlCLG9CQUFvQixFQUFFLFNBQVMsS0FBSyxXQUFXO0NBQ2pIO0NBRUEsWUFBNEI7RUFDeEIsT0FBTztHQUNILGlCQUFpQjtHQUNqQixpQkFBaUI7R0FDakIsaUJBQWlCO0dBQ2pCLGlCQUFpQjtFQUNyQixFQUFFLFNBQVMsS0FBSyxXQUFXO0NBQy9CO0NBRUEscUJBQXFDO0VBQ2pDLE9BQU8sQ0FBQyxpQkFBaUIsa0JBQWtCLGlCQUFpQixpQ0FBaUMsRUFBRSxTQUMzRixLQUFLLFdBQ1Q7Q0FDSjtDQUVBLGVBQStCO0VBQzNCLE9BQU8sS0FBSyxlQUFlO0NBQy9CO0FBQ0oifQ==