Compare commits

..

No commits in common. "master" and "1.3.0" have entirely different histories.

21 changed files with 2930 additions and 676 deletions

View File

@ -1,33 +0,0 @@
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
name: Build for Browser
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
# Don't run updateCheck for now
#- run: npm run dev:updateCheck
- run: npm run buildweb
#- run: npm test

View File

@ -1,7 +1,7 @@
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
name: Build for NodeJS name: Node.js CI
on: on:
push: push:

View File

@ -1,12 +1,9 @@
.github/* .github/*
base/*
enums/* enums/*
index.ts index.ts
combined.ts combined.ts
readers/* readers/*
writers/* writers/*
tooling/*
tsconfig.json
# Logs # Logs
logs logs

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2021-2024 Holly Stubbs (tgpholly) Copyright (c) 2023 Holly Stubbs (tgpholly)
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -22,13 +22,12 @@ I tried to keep it as simple as possible to use, for example if you want to writ
writer.writeByte(<number>); writer.writeByte(<number>);
``` ```
You can find a list of all of the methods for [Writers](https://git.eusv.net/tgpholly/bufferStuff/src/branch/master/writers/IWriter.ts) and [Readers](https://git.eusv.net/tgpholly/bufferStuff/src/branch/master/readers/IReader.ts) in their interface files. You can find a list of all of the methods for [Writers](https://github.com/tgpholly/bufferStuff/blob/master/writers/IWriter.ts) and [Readers](https://github.com/tgpholly/bufferStuff/blob/master/readers/IReader.ts) in their interface files.
## Projects using bufferStuff ## Projects using bufferStuff
If your project uses bufferStuff feel free to make a PR to add it to this list! If your project uses bufferStuff feel free to make a PR to add it to this list!
### [tgpholly/mc-beta-server](https://git.eusv.net/tgpholly/mc-beta-server) ### [tgpholly/mc-beta-server](https://github.com/tgpholly/mc-beta-server)
### [tgpholly/ultrakillMP_server](https://github.com/tgpholly/ultrakillMP_server) ### [tgpholly/ultrakillMP_server](https://github.com/tgpholly/ultrakillMP_server)
### [tgpholly/t00-multiuser](https://git.eusv.net/tgpholly/t00-multiuser)
## Projects similar to bufferStuff ## Projects similar to bufferStuff
### [tgpholly/csharp-extensions/BinaryTools](https://github.com/tgpholly/csharp-extensions/tree/master/BinaryTools) - Basically bufferStuff but for C# ### [tgpholly/csharp-extensions/BinaryTools](https://github.com/tgpholly/csharp-extensions/tree/master/BinaryTools) - Basically bufferStuff but for C#

View File

@ -1,387 +0,0 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
// This is a mostly 1:1 feature complete implementation of node's Buffer class for browsers.
// It's missing some of the static stuff but everything in the object *should* be there.
class BrowserBuffer {
public buffer:Uint8Array;
private dataView:DataView;
public constructor(dataOrSize: Array<number> | ArrayBufferLike | number) {
if (typeof(dataOrSize) === "number") {
this.buffer = new Uint8Array(dataOrSize);
} else if (typeof(dataOrSize) === "object") {
this.buffer = new Uint8Array(dataOrSize); // Convert whatever comes in to a Uint8Array.
} else {
this.buffer = new Uint8Array(0); // Fallback
}
this.dataView = new DataView(this.buffer.buffer);
}
public static allocUnsafe(size:number) { return this.alloc(size); }
public static allocUnsafeSlow(size:number) { return this.alloc(size); }
public static alloc(size:number) {
return new BrowserBuffer(size);
}
public static concat(buffers:Array<BrowserBuffer>, totalLength?:number) {
let joinedArrays:Uint8Array;
if (totalLength !== undefined) {
joinedArrays = new Uint8Array(totalLength);
} else {
let arraysLength = 0;
for (const buffer of buffers) {
arraysLength += buffer.length;
}
joinedArrays = new Uint8Array(arraysLength);
}
let offset = 0;
for (const buffer of buffers) {
joinedArrays.set(buffer.buffer, offset);
offset += buffer.length;
}
return new BrowserBuffer(joinedArrays);
}
public static from(data: Array<number> | ArrayBufferLike | string) {
if (typeof(data) === "string") {
throw new Error("BrowserBuffer does not currently support creating buffers from strings.");
}
return new BrowserBuffer(data);
}
// NOTE: Here to match node buffer, has no use.
public static readonly poolSize:number = 8192;
// TODO: Implement
public static of() {}
public static isBuffer() {}
public static isEncoding() {}
public static byteLength() {}
public static copyBytesFrom() {}
public static compare() {}
public get length() {
return this.buffer.length;
}
private checkRanged(value:number|bigint, valueName:string, lowRange:number|bigint, highRange:number|bigint) {
if (value < lowRange || value > highRange) {
throw new Error(`The value of "${valueName}" is out of range. It must be >= ${lowRange} and <= ${highRange}. Received ${value}`);
}
}
private checkValue(value:number|bigint, low:number|bigint, high:number|bigint) {
this.checkRanged(value, "value", low, high);
}
private checkOffset(offset?:number) {
if (offset) {
this.checkRanged(offset, "offset", 0, this.buffer.length - 1);
}
}
// Writing methods
public writeInt8(value:number, offset:number) {
this.checkValue(value, -128, 127);
this.checkOffset(offset);
this.dataView.setInt8(offset, value);
return this;
}
public writeUInt8(value:number, offset:number) {
this.checkValue(value, 0, 255);
this.checkOffset(offset);
this.dataView.setUint8(offset, value);
return this;
}
// Little Endian
public writeInt16LE(value:number, offset:number) {
this.checkValue(value, -32768, 32767);
this.checkOffset(offset);
this.dataView.setInt16(offset, value, true);
return this;
}
public writeUInt16LE(value:number, offset:number) {
this.checkValue(value, 0, 65535);
this.checkOffset(offset);
this.dataView.setUint16(offset, value, true);
return this;
}
public writeInt32LE(value:number, offset:number) {
this.checkValue(value, -2147483648, 2147483647);
this.checkOffset(offset);
this.dataView.setInt32(offset, value, true);
return this;
}
public writeUInt32LE(value:number, offset:number) {
this.checkValue(value, 0, 4294967295);
this.checkOffset(offset);
this.dataView.setUint32(offset, value, true);
return this;
}
public writeBigInt64LE(value:bigint|number, offset:number) {
if (typeof(value) === "number") {
value = BigInt(value);
}
this.checkValue(value, -(2n ** 63n), 2n ** 63n);
this.checkOffset(offset);
this.dataView.setBigInt64(offset, value, true);
return this;
}
public writeBigUint64LE(value:bigint|number, offset:number) {
if (typeof(value) === "number") {
value = BigInt(value);
}
this.checkValue(value, 0n, 2n ** 64n);
this.checkOffset(offset);
this.dataView.setBigUint64(offset, value, true);
return this;
}
public writeFloatLE(value:number, offset:number) {
this.checkOffset(offset);
this.dataView.setFloat32(offset, value, true);
return this;
}
public writeDoubleLE(value:number, offset:number) {
this.checkOffset(offset);
this.dataView.setFloat64(offset, value, true);
return this;
}
// Big Endian
public writeInt16BE(value:number, offset:number) {
this.checkValue(value, -32768, 32767);
this.checkOffset(offset);
this.dataView.setInt16(offset, value, false);
return this;
}
public writeUInt16BE(value:number, offset:number) {
this.checkValue(value, 0, 65535);
this.checkOffset(offset);
this.dataView.setUint16(offset, value, false);
return this;
}
public writeInt32BE(value:number, offset:number) {
this.checkValue(value, -2147483648, 2147483647);
this.checkOffset(offset);
this.dataView.setInt32(offset, value, false);
return this;
}
public writeUInt32BE(value:number, offset:number) {
this.checkValue(value, 0, 4294967295);
this.checkOffset(offset);
this.dataView.setUint32(offset, value, false);
return this;
}
public writeBigInt64BE(value:bigint|number, offset:number) {
if (typeof(value) === "number") {
value = BigInt(value);
}
this.checkValue(value, -(2n ** 63n), 2n ** 63n);
this.checkOffset(offset);
this.dataView.setBigInt64(offset, value, false);
return this;
}
public writeBigUint64BE(value:bigint|number, offset:number) {
if (typeof(value) === "number") {
value = BigInt(value);
}
this.checkValue(value, 0n, 2n ** 64n);
this.checkOffset(offset);
this.dataView.setBigUint64(offset, value, false);
return this;
}
public writeFloatBE(value:number, offset:number) {
this.checkOffset(offset);
this.dataView.setFloat32(offset, value, false);
return this;
}
public writeDoubleBE(value:number, offset:number) {
this.checkOffset(offset);
this.dataView.setFloat64(offset, value, false);
return this;
}
// Reading methods
public readInt8(offset:number) {
this.checkOffset(offset);
return this.dataView.getInt8(offset);
}
public readUInt8(offset:number) {
this.checkOffset(offset);
return this.dataView.getUint8(offset);
}
// Little Endian
public readInt16LE(offset:number) {
this.checkOffset(offset);
return this.dataView.getInt16(offset, true);
}
public readUInt16LE(offset:number) {
this.checkOffset(offset);
return this.dataView.getUint16(offset, true);
}
public readInt32LE(offset:number) {
this.checkOffset(offset);
return this.dataView.getInt32(offset, true);
}
public readUInt32LE(offset:number) {
this.checkOffset(offset);
return this.dataView.getUint32(offset, true);
}
public readBigInt64LE(offset:number) {
this.checkOffset(offset);
return this.dataView.getBigInt64(offset, true);
}
public readBigUint64LE(offset:number) {
this.checkOffset(offset);
return this.dataView.getBigUint64(offset, true);
}
public readFloatLE(offset:number) {
this.checkOffset(offset);
return this.dataView.getFloat32(offset, true);
}
public readDoubleLE(offset:number) {
this.checkOffset(offset);
return this.dataView.getFloat64(offset, true);
}
// Big Endian
public readInt16BE(offset:number) {
this.checkOffset(offset);
return this.dataView.getInt16(offset, false);
}
public readUInt16BE(offset:number) {
this.checkOffset(offset);
return this.dataView.getUint16(offset, false);
}
public readInt32BE(offset:number) {
this.checkOffset(offset);
return this.dataView.getInt32(offset, false);
}
public readUInt32BE(offset:number) {
this.checkOffset(offset);
return this.dataView.getUint32(offset, false);
}
public readBigInt64BE(offset:number) {
this.checkOffset(offset);
return this.dataView.getBigInt64(offset, false);
}
public readBigUint64BE(offset:number) {
this.checkOffset(offset);
return this.dataView.getBigUint64(offset, false);
}
public readFloatBE(offset:number) {
this.checkOffset(offset);
return this.dataView.getFloat32(offset, false);
}
public readDoubleBE(offset:number) {
this.checkOffset(offset);
return this.dataView.getFloat64(offset, false);
}
}
export function getBufferClass() : BufferConstructor {
if (typeof(Buffer) === "undefined") {
// @ts-ignore
return BrowserBuffer;
} else {
return Buffer;
}
}

View File

@ -1,6 +1,3 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { IReader } from "./readers/IReader"; import { IReader } from "./readers/IReader";
import { IWriter } from "./writers/IWriter"; import { IWriter } from "./writers/IWriter";
import { ReaderBE } from "./readers/ReaderBE"; import { ReaderBE } from "./readers/ReaderBE";

2883
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,39 +1,33 @@
{ {
"name": "bufferstuff", "name": "bufferstuff",
"version": "1.5.1", "version": "1.3.0",
"description": "A set of utility classes for reading and writing binary data in NodeJS and the browser", "description": "A set of utility classes for reading and writing binary data in NodeJS and the browser",
"main": "./lib/index.js", "main": "./lib/index.js",
"types": "./lib/index.d.ts", "types": "./lib/index.d.ts",
"scripts": { "scripts": {
"updateCheck": "check-outdated", "updateCheck": "check-outdated",
"_clean": "tsc --build --clean",
"build": "npm-run-all build:*", "build": "npm-run-all build:*",
"build:smash": "ts-node ./tooling/fileSmasher.ts", "build:smash": "ts-node ./tooling/fileSmasher.ts",
"build:build": "tsc --build", "build:build": "tsc --build",
"build:cleanup": "ts-node ./tooling/cleanup.ts", "build:cleanup": "ts-node ./tooling/cleanup.ts",
"_clean": "tsc --build --clean"
"buildweb": "npm-run-all buildweb:*",
"buildweb:smash": "ts-node ./tooling/fileSmasher.ts forweb",
"buildweb:build": "tsc --build",
"buildweb:cleanup": "ts-node ./tooling/cleanup.ts"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://git.eusv.net/tgpholly/bufferStuff.git" "url": "git+https://github.com/tgpholly/bufferStuff.git"
}, },
"keywords": [], "keywords": [],
"author": "tgpholly", "author": "tgpholly",
"license": "MIT", "license": "MIT",
"bugs": { "bugs": {
"url": "https://git.eusv.net/tgpholly/bufferStuff/issues" "url": "https://github.com/tgpholly/bufferStuff/issues"
}, },
"homepage": "https://git.eusv.net/tgpholly/bufferStuff#readme", "homepage": "https://github.com/tgpholly/bufferStuff#readme",
"devDependencies": { "devDependencies": {
"check-outdated": "^2.12.0", "check-outdated": "^2.11.0",
"npm-run-all": "^4.1.5", "ts-loader": "^9.4.3",
"terser": "^5.27.0", "ts-node": "^10.9.1",
"ts-node": "^10.9.2", "typescript": "^5.1.3",
"typescript": "^5.3.3" "npm-run-all": "^4.1.5"
} }
} }

View File

@ -1,16 +1,9 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
export interface IReader { export interface IReader {
readOffset: number,
length: number,
readBuffer(bytes:number): Buffer, readBuffer(bytes:number): Buffer,
readUint8Array(bytes:number): Uint8Array, readUint8Array(bytes:number): Uint8Array,
readByte(): number, readByte(): number,
readUByte(): number, readUByte(): number,
readBool(): boolean, readBool(): boolean,
readShortString(): string,
readBytesAsString(bytesToRead:number): string,
readShort(): number, readShort(): number,
readUShort(): number, readUShort(): number,
readInt(): number, readInt(): number,
@ -19,7 +12,7 @@ export interface IReader {
readULong(): bigint, readULong(): bigint,
readFloat(): number, readFloat(): number,
readDouble(): number, readDouble(): number,
readShortString(): string,
readString(): string, readString(): string,
readShortsAsString(shortsToRead:number): string,
readString16(): string, readString16(): string,
} }

View File

@ -1,8 +1,5 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { IReader } from "./IReader"; import { IReader } from "./IReader";
import { ReaderBase } from "../base/ReaderBase"; import { ReaderBase } from "./ReaderBase";
export class ReaderBE extends ReaderBase implements IReader { export class ReaderBE extends ReaderBase implements IReader {
public readShort() { public readShort() {
@ -53,9 +50,20 @@ export class ReaderBE extends ReaderBase implements IReader {
return value; return value;
} }
public readShortString() {
const length = this.readUByte();
let text:string = "";
for (let i = 0; i < length; i++) {
text += String.fromCharCode(this.readUByte());
}
return text;
}
public readString() { public readString() {
const length = this.readUShort(); const length = this.readUShort();
let text = ""; let text:string = "";
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
text += String.fromCharCode(this.readUByte()); text += String.fromCharCode(this.readUByte());
@ -66,7 +74,7 @@ export class ReaderBE extends ReaderBase implements IReader {
public readString16() { public readString16() {
const length = this.readUShort(); const length = this.readUShort();
let text = ""; let text:string = "";
for (let i = 0; i < length; i++) { for (let i = 0; i < length; i++) {
text += String.fromCharCode(this.readUShort()); text += String.fromCharCode(this.readUShort());
@ -74,14 +82,4 @@ export class ReaderBE extends ReaderBase implements IReader {
return text; return text;
} }
public readShortsAsString(shortsToRead:number) {
let text = "";
for (let i = 0; i < shortsToRead; i++) {
text += String.fromCharCode(this.readUShort());
}
return text;
}
} }

View File

@ -1,6 +1,3 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
export class ReaderBase { export class ReaderBase {
public buffer:Buffer; public buffer:Buffer;
public offset:number; public offset:number;
@ -10,14 +7,6 @@ export class ReaderBase {
this.offset = 0; this.offset = 0;
} }
public get readOffset() {
return this.offset;
}
public get length() {
return this.buffer.length;
}
public readBuffer(bytes:number) { public readBuffer(bytes:number) {
const value = this.buffer.subarray(this.offset, this.offset + bytes); const value = this.buffer.subarray(this.offset, this.offset + bytes);
this.offset += bytes; this.offset += bytes;
@ -50,25 +39,4 @@ export class ReaderBase {
public readBool() { public readBool() {
return Boolean(this.readUByte()); return Boolean(this.readUByte());
} }
public readShortString() {
const length = this.readUByte();
let text = "";
for (let i = 0; i < length; i++) {
text += String.fromCharCode(this.readUByte());
}
return text;
}
public readBytesAsString(bytesToRead:number) {
let text = "";
for (let i = 0; i < bytesToRead; i++) {
text += String.fromCharCode(this.readUByte());
}
return text;
}
} }

View File

@ -1,8 +1,5 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { IReader } from "./IReader"; import { IReader } from "./IReader";
import { ReaderBase } from "../base/ReaderBase"; import { ReaderBase } from "./ReaderBase";
export class ReaderLE extends ReaderBase implements IReader { export class ReaderLE extends ReaderBase implements IReader {
public readShort() { public readShort() {
@ -53,6 +50,17 @@ export class ReaderLE extends ReaderBase implements IReader {
return value; return value;
} }
public readShortString() {
const length = this.readUByte();
let text:string = "";
for (let i = 0; i < length; i++) {
text += String.fromCharCode(this.readUByte());
}
return text;
}
public readString() { public readString() {
const length = this.readUShort(); const length = this.readUShort();
let text:string = ""; let text:string = "";
@ -74,14 +82,4 @@ export class ReaderLE extends ReaderBase implements IReader {
return text; return text;
} }
public readShortsAsString(shortsToRead:number) {
let text = "";
for (let i = 0; i < shortsToRead; i++) {
text += String.fromCharCode(this.readUShort());
}
return text;
}
} }

View File

@ -1,6 +1,3 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { readdirSync, rmSync, renameSync } from "fs"; import { readdirSync, rmSync, renameSync } from "fs";
const libFiles = readdirSync("./lib"); const libFiles = readdirSync("./lib");

View File

@ -1,25 +1,21 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
// fileSmasher ~.~ // fileSmasher ~.~
// for when you're just too lazy to // for when you're just too lazy to
// do it properly. // do it properly.
import { readdirSync, lstatSync, readFileSync, writeFileSync } from "fs"; import { readdirSync, statSync, readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
const tsFileData:Array<string> = new Array<string>(); let tsFileData:Array<string> = new Array<string>();
// Github Actions forced my hand
const toolinglessFolderPath = __dirname.replace("/tooling", "/");
function readDir(nam:string) { function readDir(nam:string) {
const files = readdirSync(nam); const files = readdirSync(nam);
for (const file of files) { for (const file of files) {
if (nam == toolinglessFolderPath && (file.startsWith(".") || file == "tooling" || file == "lib" || file == "node_modules" || file == "combined.ts")) { if (nam == "./" && (file.startsWith(".") || file == "tooling" || file == "lib" || file == "node_modules" || file == "combined.ts")) {
continue; continue;
} }
if (lstatSync(`${nam}/${file}`).isDirectory()) { // This is a very dumb way of checking for folders
// protip: don't do this.
if (statSync(`${nam}/${file}`).size == 0) {
readDir(`${nam}/${file}`); readDir(`${nam}/${file}`);
} else if (file.endsWith(".ts")) { } else if (file.endsWith(".ts")) {
tsFileData.push(readFileSync((`${nam}/${file}`).replace("//", "/")).toString()); tsFileData.push(readFileSync((`${nam}/${file}`).replace("//", "/")).toString());
@ -27,7 +23,7 @@ function readDir(nam:string) {
} }
} }
readDir(toolinglessFolderPath); readDir("./");
const combinedFiles = tsFileData.join("\n"); const combinedFiles = tsFileData.join("\n");
@ -63,11 +59,8 @@ for (const line of splitLines) {
continue; continue;
} }
// Fix up classes, interfaces and such. // Fix up classes, interfaces and such.
if (process.argv[2] === "forweb") { resultLines.push(checkForMatchAndReplace(line));
resultLines.push(line.replace("export class", "class").replace("export function", "function").replace("export enum", "enum").replace("export interface", "interface")); //resultLines.push(line.replace("export class", "class").replace("export interface", "interface").replace("export enum", "enum"));
} else {
resultLines.push(checkForMatchAndReplace(line));
}
} }
writeFileSync("./combined.ts", resultLines.join("\n")); writeFileSync("./combined.ts", resultLines.join("\n"));

View File

@ -1,10 +0,0 @@
import { readFileSync, writeFileSync } from "fs";
import { minify } from "terser";
(async () => {
const mangled = await minify(readFileSync("./lib/index.js").toString(), {
mangle: true,
toplevel: true,
});
writeFileSync("./lib/index.min.js", `${mangled.code}`);
})();

View File

@ -2,7 +2,7 @@
"compilerOptions": { "compilerOptions": {
"module": "CommonJS", "module": "CommonJS",
"moduleResolution": "node", "moduleResolution": "node",
"target": "ES2020", "target": "es6",
"esModuleInterop": true, "esModuleInterop": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"rootDir": "./", "rootDir": "./",

View File

@ -1,9 +1,4 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
export interface IWriter { export interface IWriter {
writeOffset: number,
length: number,
toBuffer(): Buffer, toBuffer(): Buffer,
toString(): string, toString(): string,
writeBuffer(buffer:Buffer): IWriter, writeBuffer(buffer:Buffer): IWriter,
@ -11,17 +6,15 @@ export interface IWriter {
writeByte(value:number): IWriter, writeByte(value:number): IWriter,
writeUByte(value:number): IWriter, writeUByte(value:number): IWriter,
writeBool(value:boolean|number): IWriter, writeBool(value:boolean|number): IWriter,
writeStringAsBytes(text:string): IWriter,
writeShort(value:number): IWriter, writeShort(value:number): IWriter,
writeUShort(value:number): IWriter, writeUShort(value:number): IWriter,
writeInt(value:number): IWriter, writeInt(value:number): IWriter,
writeUInt(value:number): IWriter, writeUInt(value:number): IWriter,
writeLong(value:number|bigint): IWriter, writeLong(value:number|bigint): IWriter,
writeULong(value:number|bigint): IWriter, writeULong(value:number): IWriter,
writeFloat(value:number): IWriter, writeFloat(value:number): IWriter,
writeDouble(value:number): IWriter, writeDouble(value:number): IWriter,
writeShortString(text:string): IWriter, writeShortString(text:string): IWriter,
writeString(text:string): IWriter, writeString(text:string): IWriter,
writeString16(text:string): IWriter, writeString16(text:string): IWriter,
writeStringAsShorts(text:string): IWriter
} }

View File

@ -1,14 +1,10 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { IWriter } from "./IWriter"; import { IWriter } from "./IWriter";
import { WriterBase } from "../base/WriterBase"; import { WriterBase } from "./WriterBase";
import { getBufferClass } from "../base/BufferShim";
export class WriterBE extends WriterBase implements IWriter { export class WriterBE extends WriterBase implements IWriter {
public writeShort(value:number) { public writeShort(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(2); const buffer = Buffer.alloc(2);
buffer.writeInt16BE(value); buffer.writeInt16BE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -21,7 +17,7 @@ export class WriterBE extends WriterBase implements IWriter {
public writeUShort(value:number) { public writeUShort(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(2); const buffer = Buffer.alloc(2);
buffer.writeUInt16BE(value); buffer.writeUInt16BE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -34,7 +30,7 @@ export class WriterBE extends WriterBase implements IWriter {
public writeInt(value:number) { public writeInt(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(4); const buffer = Buffer.alloc(4);
buffer.writeInt32BE(value); buffer.writeInt32BE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -47,7 +43,7 @@ export class WriterBE extends WriterBase implements IWriter {
public writeUInt(value:number) { public writeUInt(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(4); const buffer = Buffer.alloc(4);
buffer.writeUInt32BE(value); buffer.writeUInt32BE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -64,7 +60,7 @@ export class WriterBE extends WriterBase implements IWriter {
} }
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(8); const buffer = Buffer.alloc(8);
buffer.writeBigInt64BE(value); buffer.writeBigInt64BE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -81,7 +77,7 @@ export class WriterBE extends WriterBase implements IWriter {
} }
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(8); const buffer = Buffer.alloc(8);
buffer.writeBigUint64BE(value); buffer.writeBigUint64BE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -94,7 +90,7 @@ export class WriterBE extends WriterBase implements IWriter {
public writeFloat(value:number) { public writeFloat(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(4); const buffer = Buffer.alloc(4);
buffer.writeFloatBE(value); buffer.writeFloatBE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -107,7 +103,7 @@ export class WriterBE extends WriterBase implements IWriter {
public writeDouble(value:number) { public writeDouble(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(8); const buffer = Buffer.alloc(8);
buffer.writeDoubleBE(value); buffer.writeDoubleBE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -147,19 +143,4 @@ export class WriterBE extends WriterBase implements IWriter {
return this; return this;
} }
public writeStringAsShorts(text:string) {
let buffer:Buffer;
if (this.resizable) {
buffer = getBufferClass().alloc(text.length * 2);
} else {
buffer = this.buffer;
}
for (let i = 0; i < text.length; i++) {
buffer.writeUint16BE(text.charCodeAt(i), i);
}
return this;
}
} }

View File

@ -1,27 +1,14 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { getBufferClass } from "./BufferShim";
export class WriterBase { export class WriterBase {
public buffer:Buffer; public buffer:Buffer;
public offset:number; public offset:number;
public readonly resizable:boolean; public readonly resizable:boolean;
public constructor(size:number = 0) { public constructor(size:number = 0) {
this.buffer = getBufferClass().alloc(size); this.buffer = Buffer.alloc(size);
this.offset = 0; this.offset = 0;
this.resizable = size === 0; this.resizable = size === 0;
} }
public get writeOffset() {
return this.offset;
}
public get length() {
return this.buffer.length;
}
public toBuffer() { public toBuffer() {
return this.buffer; return this.buffer;
} }
@ -31,20 +18,20 @@ export class WriterBase {
} }
public writeBuffer(buffer:Buffer) { public writeBuffer(buffer:Buffer) {
this.buffer = getBufferClass().concat([this.buffer, buffer], this.buffer.length + buffer.length); this.buffer = Buffer.concat([this.buffer, buffer], this.buffer.length + buffer.length);
return this; return this;
} }
public writeUint8Array(array:Uint8Array) { public writeUint8Array(array:Uint8Array) {
this.writeBuffer(getBufferClass().from(array)); this.writeBuffer(Buffer.from(array));
return this; return this;
} }
public writeByte(value:number) { public writeByte(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(1); const buffer = Buffer.alloc(1);
buffer.writeInt8(value); buffer.writeInt8(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -57,7 +44,7 @@ export class WriterBase {
public writeUByte(value:number) { public writeUByte(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(1); const buffer = Buffer.alloc(1);
buffer.writeUInt8(value); buffer.writeUInt8(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -76,19 +63,4 @@ export class WriterBase {
return this; return this;
} }
public writeStringAsBytes(text:string) {
let buffer;
if (this.resizable) {
buffer = getBufferClass().alloc(text.length);
} else {
buffer = this.buffer;
}
for (let i = 0; i < text.length; i++) {
buffer.writeUInt8(text.charCodeAt(i), i);
}
return this;
}
} }

View File

@ -1,14 +1,10 @@
// Copyright (c) Holly Stubbs (tgpholly) - Licensed under MIT
// Check LICENSE in repository root for more information.
import { IWriter } from "./IWriter"; import { IWriter } from "./IWriter";
import { WriterBase } from "../base/WriterBase"; import { WriterBase } from "./WriterBase";
import { getBufferClass } from "../base/BufferShim";
export class WriterLE extends WriterBase implements IWriter { export class WriterLE extends WriterBase implements IWriter {
public writeShort(value:number) { public writeShort(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(2); const buffer = Buffer.alloc(2);
buffer.writeInt16LE(value); buffer.writeInt16LE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -21,7 +17,7 @@ export class WriterLE extends WriterBase implements IWriter {
public writeUShort(value:number) { public writeUShort(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(2); const buffer = Buffer.alloc(2);
buffer.writeUInt16LE(value); buffer.writeUInt16LE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -34,7 +30,7 @@ export class WriterLE extends WriterBase implements IWriter {
public writeInt(value:number) { public writeInt(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(4); const buffer = Buffer.alloc(4);
buffer.writeInt32LE(value); buffer.writeInt32LE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -46,7 +42,7 @@ export class WriterLE extends WriterBase implements IWriter {
} }
public writeUInt(value:number) { public writeUInt(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(4); const buffer = Buffer.alloc(4);
buffer.writeUInt32LE(value); buffer.writeUInt32LE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -63,7 +59,7 @@ export class WriterLE extends WriterBase implements IWriter {
} }
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(8); const buffer = Buffer.alloc(8);
buffer.writeBigInt64LE(value); buffer.writeBigInt64LE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -80,7 +76,7 @@ export class WriterLE extends WriterBase implements IWriter {
} }
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(8); const buffer = Buffer.alloc(8);
buffer.writeBigUint64LE(value); buffer.writeBigUint64LE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -93,7 +89,7 @@ export class WriterLE extends WriterBase implements IWriter {
public writeFloat(value:number) { public writeFloat(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(4); const buffer = Buffer.alloc(4);
buffer.writeFloatLE(value); buffer.writeFloatLE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -106,7 +102,7 @@ export class WriterLE extends WriterBase implements IWriter {
public writeDouble(value:number) { public writeDouble(value:number) {
if (this.resizable) { if (this.resizable) {
const buffer = getBufferClass().alloc(8); const buffer = Buffer.alloc(8);
buffer.writeDoubleLE(value); buffer.writeDoubleLE(value);
this.writeBuffer(buffer); this.writeBuffer(buffer);
} else { } else {
@ -146,19 +142,4 @@ export class WriterLE extends WriterBase implements IWriter {
return this; return this;
} }
public writeStringAsShorts(text:string) {
let buffer:Buffer;
if (this.resizable) {
buffer = getBufferClass().alloc(text.length * 2);
} else {
buffer = this.buffer;
}
for (let i = 0; i < text.length; i++) {
buffer.writeUint16LE(text.charCodeAt(i), i);
}
return this;
}
} }