Files
agent/model/UhkBuffer.ts

112 lines
2.9 KiB
TypeScript

class UhkBuffer {
buffer: Buffer;
offset: number;
private static maxStringByteLength = 0xFFFF;
private static longStringPrefix = 0xFF;
private static stringEncoding = 'utf8';
constructor(buffer:Buffer) {
this.offset = 0;
this.buffer = buffer;
}
readInt8():number {
let value = this.buffer.readInt8(this.offset);
this.offset += 1;
return value;
}
writeInt8(value:number):void {
this.buffer.writeInt8(value, this.offset);
this.offset += 1;
}
readUInt8():number {
let value = this.buffer.readUInt8(this.offset);
this.offset += 1;
return value;
}
writeUInt8(value:number):void {
this.buffer.writeUInt8(value, this.offset);
this.offset += 1;
}
readInt16():number {
let value = this.buffer.readInt16LE(this.offset);
this.offset += 2;
return value;
}
writeInt16(value:number):void {
this.buffer.writeInt16LE(value, this.offset);
this.offset += 2;
}
readUInt16():number {
let value = this.buffer.readUInt16LE(this.offset);
this.offset += 2;
return value;
}
writeUInt16(value:number):void {
this.buffer.writeUInt16LE(value, this.offset);
this.offset += 2;
}
readInt32():number {
let value = this.buffer.readInt32LE(this.offset);
this.offset += 4;
return value;
}
writeInt32(value:number):void {
this.buffer.writeInt32LE(value, this.offset);
this.offset += 4;
}
readUInt32():number {
let value = this.buffer.readUInt32LE(this.offset);
this.offset += 4;
return value;
}
writeUInt32(value:number):void {
this.buffer.writeUInt32LE(value, this.offset);
this.offset += 4;
}
readString():string {
let stringByteLength = this.readUInt8();
if (stringByteLength == UhkBuffer.longStringPrefix) {
stringByteLength += this.readUInt8() << 8;
}
let string = this.buffer.toString(UhkBuffer.stringEncoding, this.offset, stringByteLength);
this.offset += stringByteLength;
return string;
}
writeString(string:string):void {
let stringByteLength = Buffer.byteLength(string, UhkBuffer.stringEncoding);
if (stringByteLength > UhkBuffer.maxStringByteLength) {
throw 'Cannot serialize string: ${stringByteLength} bytes is larger ' +
'than the maximum allowed length of ${UhkBuffer.maxStringByteLength} bytes';
}
if (stringByteLength >= UhkBuffer.longStringPrefix) {
this.writeUInt8(UhkBuffer.longStringPrefix);
this.writeUInt16(stringByteLength);
} else {
this.writeUInt8(stringByteLength);
}
this.buffer.write(string, this.offset, stringByteLength, UhkBuffer.stringEncoding);
this.offset += stringByteLength;
}
}