UNPKG

@jsprismarine/raknet

Version:
111 lines (104 loc) 15 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const BinaryStream = require('@jsprismarine/jsbinaryutils'); const protocol_BitFlags = require('./BitFlags.cjs.cjs'); const protocol_FrameReliability = require('./FrameReliability.cjs.cjs'); const assert = require('assert'); const _interopDefault = e => e && e.__esModule ? e : { default: e }; const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream); const assert__default = /*#__PURE__*/_interopDefault(assert); const MAX_FRAME_BYTE_LENGTH = 23; class Frame { reliability = protocol_FrameReliability.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 & protocol_BitFlags.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__default.default(); const fragmented = this.isFragmented(); stream.writeByte(this.reliability << 5 | (fragmented ? protocol_BitFlags.BitFlags.SPLIT : 0)); stream.writeUnsignedShort(this.content.byteLength << 3); if (this.isReliable()) { assert__default.default(typeof this.reliableIndex === "number", "Invalid ReliableIndex for reliable Frame"); stream.writeUnsignedTriadLE(this.reliableIndex); } if (this.isSequenced()) { assert__default.default(typeof this.sequenceIndex === "number", "Invalid SequenceIndex for sequenced Frame"); stream.writeUnsignedTriadLE(this.sequenceIndex); } if (this.isOrdered()) { assert__default.default(typeof this.orderIndex === "number", "Invalid OrderIndex for ordered Frame"); stream.writeUnsignedTriadLE(this.orderIndex); assert__default.default(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 [ protocol_FrameReliability.FrameReliability.RELIABLE, protocol_FrameReliability.FrameReliability.RELIABLE_ORDERED, protocol_FrameReliability.FrameReliability.RELIABLE_SEQUENCED, protocol_FrameReliability.FrameReliability.RELIABLE_WITH_ACK_RECEIPT, protocol_FrameReliability.FrameReliability.RELIABLE_ORDERED_WITH_ACK_RECEIPT ].includes(this.reliability); } isSequenced() { return [protocol_FrameReliability.FrameReliability.RELIABLE_SEQUENCED, protocol_FrameReliability.FrameReliability.UNRELIABLE_SEQUENCED].includes(this.reliability); } isOrdered() { return [ protocol_FrameReliability.FrameReliability.UNRELIABLE_SEQUENCED, protocol_FrameReliability.FrameReliability.RELIABLE_ORDERED, protocol_FrameReliability.FrameReliability.RELIABLE_SEQUENCED, protocol_FrameReliability.FrameReliability.RELIABLE_ORDERED_WITH_ACK_RECEIPT ].includes(this.reliability); } isOrderedExclusive() { return [protocol_FrameReliability.FrameReliability.RELIABLE_ORDERED, protocol_FrameReliability.FrameReliability.RELIABLE_ORDERED_WITH_ACK_RECEIPT].includes( this.reliability ); } isFragmented() { return this.fragmentSize > 0; } } exports.MAX_FRAME_BYTE_LENGTH = MAX_FRAME_BYTE_LENGTH; exports.default = Frame; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJhbWUuY2pzLmNqcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3RvY29sL0ZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCBCaXRGbGFncyBmcm9tICcuL0JpdEZsYWdzJztcbmltcG9ydCBGcmFtZVJlbGlhYmlsaXR5IGZyb20gJy4vRnJhbWVSZWxpYWJpbGl0eSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvUmFrTmV0L2Jsb2IvMWExNjk4OTVhOTAwYzlmYzQ4NDFjNTU2ZTE2NTE0MTgyYjc1ZmFmOC9Tb3VyY2UvUmVsaWFiaWxpdHlMYXllci5jcHAjTDEzM1xuLy8gSXQncyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYSBmcmFtZXNldCBjYW4gdGFrZS4gKHNwbGl0dGVkIHJlbGlhYmxlIHNlcXVlbmNlZCkuXG5leHBvcnQgY29uc3QgTUFYX0ZSQU1FX0JZVEVfTEVOR1RIID0gMjM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyYW1lIHtcbiAgICBwdWJsaWMgcmVsaWFiaWxpdHkgPSBGcmFtZVJlbGlhYmlsaXR5LlVOUkVMSUFCTEU7XG5cbiAgICBwdWJsaWMgcmVsaWFibGVJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgc2VxdWVuY2VJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgb3JkZXJJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIG9yZGVyQ2hhbm5lbCE6IE5vbk51bGxhYmxlPG51bWJlcj47XG5cbiAgICBwdWJsaWMgZnJhZ21lbnRTaXplID0gMDtcbiAgICBwdWJsaWMgZnJhZ21lbnRJZCE6IG51bWJlcjtcbiAgICBwdWJsaWMgZnJhZ21lbnRJbmRleCE6IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb250ZW50ITogQnVmZmVyO1xuXG4gICAgcHVibGljIGZyb21CaW5hcnkoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBGcmFtZSB7XG4gICAgICAgIGNvbnN0IGhlYWRlciA9IHN0cmVhbS5yZWFkQnl0ZSgpO1xuICAgICAgICB0aGlzLnJlbGlhYmlsaXR5ID0gKGhlYWRlciAmIDB4ZTApID4+IDU7XG5cbiAgICAgICAgLy8gTGVuZ3RoIGZyb20gYml0cyB0byBieXRlc1xuICAgICAgICBjb25zdCBsZW5ndGggPSBNYXRoLmNlaWwoc3RyZWFtLnJlYWRTaG9ydCgpIC8gOCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNSZWxpYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbGlhYmxlSW5kZXggPSBzdHJlYW0ucmVhZFRyaWFkTEUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzU2VxdWVuY2VkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VxdWVuY2VJbmRleCA9IHN0cmVhbS5yZWFkVHJpYWRMRSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNPcmRlcmVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMub3JkZXJJbmRleCA9IHN0cmVhbS5yZWFkVHJpYWRMRSgpO1xuICAgICAgICAgICAgdGhpcy5vcmRlckNoYW5uZWwgPSBzdHJlYW0ucmVhZEJ5dGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoaGVhZGVyICYgQml0RmxhZ3MuU1BMSVQpID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudFNpemUgPSBzdHJlYW0ucmVhZEludCgpO1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudElkID0gc3RyZWFtLnJlYWRTaG9ydCgpO1xuICAgICAgICAgICAgdGhpcy5mcmFnbWVudEluZGV4ID0gc3RyZWFtLnJlYWRJbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmVhbS5yZWFkKGxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0JpbmFyeSgpOiBCaW5hcnlTdHJlYW0ge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgIGNvbnN0IGZyYWdtZW50ZWQgPSB0aGlzLmlzRnJhZ21lbnRlZCgpO1xuXG4gICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoKHRoaXMucmVsaWFiaWxpdHkgPDwgNSkgfCAoZnJhZ21lbnRlZCA/IEJpdEZsYWdzLlNQTElUIDogMCkpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFNob3J0KHRoaXMuY29udGVudC5ieXRlTGVuZ3RoIDw8IDMpO1xuXG4gICAgICAgIGlmICh0aGlzLmlzUmVsaWFibGUoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLnJlbGlhYmxlSW5kZXggPT09ICdudW1iZXInLCAnSW52YWxpZCBSZWxpYWJsZUluZGV4IGZvciByZWxpYWJsZSBGcmFtZScpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKHRoaXMucmVsaWFibGVJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICAgICAgICBhc3NlcnQodHlwZW9mIHRoaXMuc2VxdWVuY2VJbmRleCA9PT0gJ251bWJlcicsICdJbnZhbGlkIFNlcXVlbmNlSW5kZXggZm9yIHNlcXVlbmNlZCBGcmFtZScpO1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKHRoaXMuc2VxdWVuY2VJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc09yZGVyZWQoKSkge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB0aGlzLm9yZGVySW5kZXggPT09ICdudW1iZXInLCAnSW52YWxpZCBPcmRlckluZGV4IGZvciBvcmRlcmVkIEZyYW1lJyk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFRyaWFkTEUodGhpcy5vcmRlckluZGV4KTtcbiAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdGhpcy5vcmRlckNoYW5uZWwgPT09ICdudW1iZXInLCAnSW52YWxpZCBPcmRlckNoYW5uZWwgZm9yIG9yZGVyZWQgRnJhbWVTZXQnKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUodGhpcy5vcmRlckNoYW5uZWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyYWdtZW50ZWQpIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50KHRoaXMuZnJhZ21lbnRTaXplKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkU2hvcnQodGhpcy5mcmFnbWVudElkKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkSW50KHRoaXMuZnJhZ21lbnRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdHJlYW0ud3JpdGUodGhpcy5jb250ZW50KTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qnl0ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgMyArXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQuYnl0ZUxlbmd0aCArXG4gICAgICAgICAgICAodGhpcy5pc1JlbGlhYmxlKCkgPyAzIDogMCkgK1xuICAgICAgICAgICAgKHRoaXMuaXNTZXF1ZW5jZWQoKSA/IDMgOiAwKSArXG4gICAgICAgICAgICAodGhpcy5pc09yZGVyZWQoKSA/IDQgOiAwKSArXG4gICAgICAgICAgICAodGhpcy5pc0ZyYWdtZW50ZWQoKSA/IDEwIDogMClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNSZWxpYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEUsXG4gICAgICAgICAgICBGcmFtZVJlbGlhYmlsaXR5LlJFTElBQkxFX09SREVSRUQsXG4gICAgICAgICAgICBGcmFtZVJlbGlhYmlsaXR5LlJFTElBQkxFX1NFUVVFTkNFRCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfV0lUSF9BQ0tfUkVDRUlQVCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfT1JERVJFRF9XSVRIX0FDS19SRUNFSVBUXG4gICAgICAgIF0uaW5jbHVkZXModGhpcy5yZWxpYWJpbGl0eSk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzU2VxdWVuY2VkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0ZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfU0VRVUVOQ0VELCBGcmFtZVJlbGlhYmlsaXR5LlVOUkVMSUFCTEVfU0VRVUVOQ0VEXS5pbmNsdWRlcyh0aGlzLnJlbGlhYmlsaXR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcmRlcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgRnJhbWVSZWxpYWJpbGl0eS5VTlJFTElBQkxFX1NFUVVFTkNFRCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfT1JERVJFRCxcbiAgICAgICAgICAgIEZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfU0VRVUVOQ0VELFxuICAgICAgICAgICAgRnJhbWVSZWxpYWJpbGl0eS5SRUxJQUJMRV9PUkRFUkVEX1dJVEhfQUNLX1JFQ0VJUFRcbiAgICAgICAgXS5pbmNsdWRlcyh0aGlzLnJlbGlhYmlsaXR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNPcmRlcmVkRXhjbHVzaXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gW0ZyYW1lUmVsaWFiaWxpdHkuUkVMSUFCTEVfT1JERVJFRCwgRnJhbWVSZWxpYWJpbGl0eS5SRUxJQUJMRV9PUkRFUkVEX1dJVEhfQUNLX1JFQ0VJUFRdLmluY2x1ZGVzKFxuICAgICAgICAgICAgdGhpcy5yZWxpYWJpbGl0eVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0ZyYWdtZW50ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZyYWdtZW50U2l6ZSA+IDA7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkZyYW1lUmVsaWFiaWxpdHkiLCJCaXRGbGFncyIsIkJpbmFyeVN0cmVhbSIsImFzc2VydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFPTyxNQUFNLHFCQUF3QixHQUFBO0FBRXJDLE1BQXFCLEtBQU0sQ0FBQTtBQUFBLEVBQ2hCLGNBQWNBLDBDQUFpQixDQUFBLFVBQUE7QUFBQSxFQUUvQixhQUErQixHQUFBLElBQUE7QUFBQSxFQUUvQixhQUErQixHQUFBLElBQUE7QUFBQSxFQUUvQixVQUE0QixHQUFBLElBQUE7QUFBQSxFQUM1QixZQUFBO0FBQUEsRUFFQSxZQUFlLEdBQUEsQ0FBQTtBQUFBLEVBQ2YsVUFBQTtBQUFBLEVBQ0EsYUFBQTtBQUFBLEVBRUEsT0FBQTtBQUFBLEVBRUEsV0FBVyxNQUE2QixFQUFBO0FBQzNDLElBQU0sTUFBQSxNQUFBLEdBQVMsT0FBTyxRQUFTLEVBQUE7QUFDL0IsSUFBSyxJQUFBLENBQUEsV0FBQSxHQUFBLENBQWUsU0FBUyxHQUFTLEtBQUEsQ0FBQTtBQUd0QyxJQUFBLE1BQU0sU0FBUyxJQUFLLENBQUEsSUFBQSxDQUFLLE1BQU8sQ0FBQSxTQUFBLEtBQWMsQ0FBQyxDQUFBO0FBRS9DLElBQUksSUFBQSxJQUFBLENBQUssWUFBYyxFQUFBO0FBQ25CLE1BQUssSUFBQSxDQUFBLGFBQUEsR0FBZ0IsT0FBTyxXQUFZLEVBQUE7QUFBQTtBQUc1QyxJQUFJLElBQUEsSUFBQSxDQUFLLGFBQWUsRUFBQTtBQUNwQixNQUFLLElBQUEsQ0FBQSxhQUFBLEdBQWdCLE9BQU8sV0FBWSxFQUFBO0FBQUE7QUFHNUMsSUFBSSxJQUFBLElBQUEsQ0FBSyxXQUFhLEVBQUE7QUFDbEIs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