@jsprismarine/raknet
Version:
Basic RakNet implementation written in TypeScript
95 lines (94 loc) • 12 kB
JavaScript
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==