@jsprismarine/raknet
Version:
Basic RakNet implementation written in TypeScript
111 lines (104 loc) • 15 kB
JavaScript
'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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