From 603fcb565343f81bd2f38aabdc143611eff8cb03 Mon Sep 17 00:00:00 2001
From: Iwo Plaza <iwoplaza@gmail.com>
Date: Thu, 18 Jul 2024 14:53:11 +0200
Subject: [PATCH] [Fix] Invalid typing for BufferReader/Writer options. (#17)

---
 src/io/bufferIOBase.ts            | 21 +++++++++------------
 src/io/bufferReaderWriter.test.ts | 21 +++++++++++++++++++++
 2 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/src/io/bufferIOBase.ts b/src/io/bufferIOBase.ts
index 9da3e85..d0fa8e7 100644
--- a/src/io/bufferIOBase.ts
+++ b/src/io/bufferIOBase.ts
@@ -5,11 +5,11 @@ export type BufferIOOptions = {
   /**
    * @default 0
    */
-  byteOffset: number;
+  byteOffset?: number;
   /**
    * @default 'system'
    */
-  endianness: Endianness | 'system';
+  endianness?: Endianness | 'system';
 };
 
 export class BufferIOBase {
@@ -25,7 +25,13 @@ export class BufferIOBase {
   public readonly endianness: Endianness;
 
   constructor(buffer: ArrayBufferLike, options?: BufferIOOptions) {
-    this.byteOffset = options?.byteOffset ?? 0;
+    const { byteOffset = 0, endianness = 'system' } = options ?? {};
+
+    this.byteOffset = byteOffset;
+
+    const systemEndianness = getSystemEndianness();
+    this.endianness = endianness === 'system' ? systemEndianness : endianness;
+    this.switchEndianness = this.endianness !== systemEndianness;
 
     if (typeof Buffer !== 'undefined' && buffer instanceof Buffer) {
       // Getting rid of the outer shell, which causes the Uint8Array line to create a copy, instead of a view.
@@ -40,15 +46,6 @@ export class BufferIOBase {
     this.helperUint32View = new Uint32Array(helperBuffer);
     this.helperFloatView = new Float32Array(helperBuffer);
     this.helperByteView = new Uint8Array(helperBuffer);
-
-    const systemEndianness = getSystemEndianness();
-
-    this.endianness =
-      !options || options.endianness === 'system'
-        ? systemEndianness
-        : options.endianness;
-
-    this.switchEndianness = this.endianness !== systemEndianness;
   }
 
   get currentByteOffset() {
diff --git a/src/io/bufferReaderWriter.test.ts b/src/io/bufferReaderWriter.test.ts
index 80cecae..60858ab 100644
--- a/src/io/bufferReaderWriter.test.ts
+++ b/src/io/bufferReaderWriter.test.ts
@@ -2,8 +2,29 @@ import { describe, it, expect } from 'vitest';
 import { BufferWriter } from './bufferWriter';
 import { BufferReader } from './bufferReader';
 import { randBetween, randIntBetween } from '../test/random';
+import { getSystemEndianness } from '../util';
 
 describe('BufferWriter/BufferReader', () => {
+  it('parses options correctly', () => {
+    const buffer = Buffer.alloc(16);
+
+    const noOptions = new BufferWriter(buffer);
+    expect(noOptions.endianness).toEqual(getSystemEndianness());
+    expect(noOptions.currentByteOffset).toEqual(0);
+
+    const withByteOffset = new BufferWriter(buffer, { byteOffset: 16 });
+    expect(withByteOffset.endianness).toEqual(getSystemEndianness());
+    expect(withByteOffset.currentByteOffset).toEqual(16);
+
+    const withBigEndian = new BufferWriter(buffer, { endianness: 'big' });
+    expect(withBigEndian.endianness).toEqual('big');
+    expect(withBigEndian.currentByteOffset).toEqual(0);
+
+    const withLittleEndian = new BufferWriter(buffer, { endianness: 'little' });
+    expect(withLittleEndian.endianness).toEqual('little');
+    expect(withLittleEndian.currentByteOffset).toEqual(0);
+  });
+
   it('should encode and decode int sequence', () => {
     // Generating random int sequence
     const intList = [];