Extremely Popular
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158import { decode, encode, byteFormat } from "../deps.ts";
/** @ignore */export class BufferReader { private pos: number = 0; constructor(readonly buffer: Uint8Array) {}
get finished(): boolean { return this.pos >= this.buffer.length; }
skip(len: number): BufferReader { this.pos += len; return this; }
readBuffer(len: number): Uint8Array { const buffer = this.buffer.slice(this.pos, this.pos + len); this.pos += len; return buffer; }
readUints(len: number): number { let num = 0; for (let n = 0; n < len; n++) { num += this.buffer[this.pos++] << (8 * n); } return num; }
readUint8(): number { return this.buffer[this.pos++]; }
readUint16(): number { return this.readUints(2); }
readUint32(): number { return this.readUints(4); }
readUint64(): number { return this.readUints(8); }
readNullTerminatedString(): string { let end = this.buffer.indexOf(0x00, this.pos); if (end === -1) end = this.buffer.length; const buf = this.buffer.slice(this.pos, end); this.pos += buf.length + 1; return decode(buf); }
readString(len: number): string { const str = decode(this.buffer.slice(this.pos, this.pos + len)); this.pos += len; return str; }
readEncodedLen(): number { const first = this.readUint8(); if (first < 251) { return first; } else { if (first == 0xfc) { return this.readUint16(); } else if (first == 0xfd) { return this.readUints(3); } else if (first == 0xfe) { return this.readUints(8); } } return -1; }
readLenCodeString(): string | null { const len = this.readEncodedLen(); if (len == -1) return null; return this.readString(len); }}
/** @ignore */export class BufferWriter { private pos: number = 0; constructor(readonly buffer: Uint8Array) {}
get wroteData(): Uint8Array { return this.buffer.slice(0, this.pos); }
get length(): number { return this.pos; }
get capacity(): number { return this.buffer.length - this.pos; }
skip(len: number): BufferWriter { this.pos += len; return this; }
writeBuffer(buffer: Uint8Array): BufferWriter { if (buffer.length > this.capacity) { buffer = buffer.slice(0, this.capacity); } this.buffer.set(buffer, this.pos); this.pos += buffer.length; return this; }
write(byte: number): BufferWriter { this.buffer[this.pos++] = byte; return this; }
writeInt16LE(num: number) {}
writeIntLE(num: number, len: number) { const int = new Int32Array(1); int[0] = 40; console.log(int); }
writeUint16(num: number): BufferWriter { return this.writeUints(2, num); }
writeUint32(num: number): BufferWriter { return this.writeUints(4, num); }
writeUint64(num: number): BufferWriter { return this.writeUints(8, num); }
writeUints(len: number, num: number): BufferWriter { for (let n = 0; n < len; n++) { this.buffer[this.pos++] = (num >> (n * 8)) & 0xff; } return this; }
writeNullTerminatedString(str: string): BufferWriter { return this.writeString(str).write(0x00); }
writeString(str: string): BufferWriter { const buf = encode(str); this.buffer.set(buf, this.pos); this.pos += buf.length; return this; }}