82 lines
2.1 KiB
TypeScript
82 lines
2.1 KiB
TypeScript
import { equalBytes } from "@noble/ciphers/utils.js";
|
|
import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js";
|
|
|
|
export {
|
|
bytesToHex,
|
|
hexToBytes,
|
|
equalBytes
|
|
};
|
|
|
|
export const base64ToBytes = (base64: string): Uint8Array => {
|
|
const binaryString = atob(base64);
|
|
const bytes = new Uint8Array(binaryString.length);
|
|
for (let i = 0; i < binaryString.length; i++) {
|
|
bytes[i] = binaryString.charCodeAt(i);
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
export class BufferReader {
|
|
private buffer: Uint8Array;
|
|
private offset: number;
|
|
|
|
constructor(buffer: Uint8Array) {
|
|
this.buffer = buffer;
|
|
this.offset = 0;
|
|
}
|
|
|
|
public readByte(): number {
|
|
return this.buffer[this.offset++];
|
|
}
|
|
|
|
public readBytes(length?: number): Uint8Array {
|
|
if (length === undefined) {
|
|
length = this.buffer.length - this.offset;
|
|
}
|
|
const bytes = this.buffer.slice(this.offset, this.offset + length);
|
|
this.offset += length;
|
|
return bytes;
|
|
}
|
|
|
|
public hasMore(): boolean {
|
|
return this.offset < this.buffer.length;
|
|
}
|
|
|
|
public remainingBytes(): number {
|
|
return this.buffer.length - this.offset;
|
|
}
|
|
|
|
public peekByte(): number {
|
|
return this.buffer[this.offset];
|
|
}
|
|
|
|
public readUint16LE(): number {
|
|
const value = this.buffer[this.offset] | (this.buffer[this.offset + 1] << 8);
|
|
this.offset += 2;
|
|
return value;
|
|
}
|
|
|
|
public readUint32LE(): number {
|
|
const value = this.buffer[this.offset] | (this.buffer[this.offset + 1] << 8) | (this.buffer[this.offset + 2] << 16) | (this.buffer[this.offset + 3] << 24);
|
|
this.offset += 4;
|
|
return value;
|
|
}
|
|
|
|
public readInt16LE(): number {
|
|
const value = this.buffer[this.offset] | (this.buffer[this.offset + 1] << 8);
|
|
this.offset += 2;
|
|
return value < 0x8000 ? value : value - 0x10000;
|
|
}
|
|
|
|
public readInt32LE(): number {
|
|
const value = this.buffer[this.offset] | (this.buffer[this.offset + 1] << 8) | (this.buffer[this.offset + 2] << 16) | (this.buffer[this.offset + 3] << 24);
|
|
this.offset += 4;
|
|
return value < 0x80000000 ? value : value - 0x100000000;
|
|
}
|
|
|
|
public readTimestamp(): Date {
|
|
const timestamp = this.readUint32LE();
|
|
return new Date(timestamp * 1000);
|
|
}
|
|
}
|