Skip to content

Commit ca6e0b9

Browse files
committed
do not use node buffer
1 parent d526e33 commit ca6e0b9

4 files changed

Lines changed: 167 additions & 125 deletions

File tree

‎src/decoder.test.ts‎

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
import { Buffer } from "node:buffer"
2-
31
import { describe, expect, it } from "vitest"
42

53
// eslint-disable-next-line antfu/no-import-dist
64
import { Decoder } from "../dist/decoder.mjs"
75

86
describe(".currentOffset", () => {
97
it("example works as described", () => {
10-
const buffer = Buffer.from([0x01, 0x01, 0x00, 0x00])
8+
const buffer = new Uint8Array([0x01, 0x01, 0x00, 0x00])
119
const decoder = new Decoder(buffer)
1210
expect(decoder.readUint32()).toBe(257)
1311
expect(decoder.currentOffset).toBe(4)
@@ -16,7 +14,7 @@ describe(".currentOffset", () => {
1614

1715
describe(".endianness", () => {
1816
it("example works as described", () => {
19-
const buffer = Buffer.from([0x00, 0x00, 0x01, 0x01])
17+
const buffer = new Uint8Array([0x00, 0x00, 0x01, 0x01])
2018
const decoder = new Decoder(buffer)
2119
decoder.endianness("big")
2220
expect(decoder.readUint32()).toBe(257)
@@ -25,7 +23,7 @@ describe(".endianness", () => {
2523

2624
describe(".seek", () => {
2725
it("example works as described", () => {
28-
const buffer = Buffer.from([0xff, 0xff, 0x01, 0x00])
26+
const buffer = new Uint8Array([0xff, 0xff, 0x01, 0x00])
2927
const decoder = new Decoder(buffer)
3028
expect(decoder.seek(2)).toBe(0)
3129
expect(decoder.readUint16()).toBe(1)
@@ -34,7 +32,7 @@ describe(".seek", () => {
3432

3533
describe(".goto", () => {
3634
it("example works as described", () => {
37-
const buffer = Buffer.from([0xff, 0xff, 0x01, 0x00])
35+
const buffer = new Uint8Array([0xff, 0xff, 0x01, 0x00])
3836
const decoder = new Decoder(buffer)
3937
expect(decoder.readUint16()).toBe(65535)
4038
expect(decoder.goto(0)).toBe(2)
@@ -45,14 +43,14 @@ describe(".goto", () => {
4543

4644
describe(".alignTo", () => {
4745
it("skips forwards correctly if diff if positive", () => {
48-
const decoder = new Decoder(Buffer.alloc(10))
46+
const decoder = new Decoder(new Uint8Array(10))
4947
decoder.seek(12)
5048
decoder.alignTo(16)
5149
expect(decoder.currentOffset).toBe(16)
5250
})
5351

5452
it("skips forwards correctly if diff if negative", () => {
55-
const decoder = new Decoder(Buffer.alloc(10))
53+
const decoder = new Decoder(new Uint8Array(10))
5654
decoder.seek(4)
5755
decoder.alignTo(16)
5856
expect(decoder.currentOffset).toBe(16)
@@ -61,7 +59,7 @@ describe(".alignTo", () => {
6159
it("example works as described", () => {
6260
// prettier-ignore
6361
// Assume we have a header 5 bytes long, then 3 bytes of padding up to 8 bytes in, then more data
64-
const buffer = Buffer.from([
62+
const buffer = new Uint8Array([
6563
0x74, 0xee, 0xb2, 0x36, 0x0c, 0x00, 0x00, 0x00,
6664
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6765
])
@@ -78,13 +76,13 @@ describe(".alignTo", () => {
7876
describe("integers", () => {
7977
describe(".readInt8", () => {
8078
it("example works as described", () => {
81-
const decoder = new Decoder(Buffer.from([0xff]))
79+
const decoder = new Decoder(new Uint8Array([0xff]))
8280
expect(decoder.readInt8()).toBe(-1)
8381
})
8482

8583
it("pointer example works as described", () => {
86-
// (3 + 0) | pad | -1
87-
const decoder = new Decoder(Buffer.from([0x03, 0x00, 0x00, 0xff]))
84+
// (3 + 0) | pad | -1
85+
const decoder = new Decoder(new Uint8Array([0x03, 0x00, 0x00, 0xff]))
8886
const pointer = decoder.readUint16()
8987
expect(pointer).toBe(3)
9088
expect(decoder.readInt8({ pointer })).toBe(-1)
@@ -93,13 +91,13 @@ describe("integers", () => {
9391

9492
describe(".readUint8", () => {
9593
it("example works as described", () => {
96-
const decoder = new Decoder(Buffer.from([0xff]))
94+
const decoder = new Decoder(new Uint8Array([0xff]))
9795
expect(decoder.readUint8()).toBe(255)
9896
})
9997

10098
it("pointer example works as described", () => {
101-
// (3 + 0) | pad | -1
102-
const decoder = new Decoder(Buffer.from([0x03, 0x00, 0x00, 0xff]))
99+
// (3 + 0) | pad | -1
100+
const decoder = new Decoder(new Uint8Array([0x03, 0x00, 0x00, 0xff]))
103101
const pointer = decoder.readUint16()
104102
expect(pointer).toBe(3)
105103
expect(decoder.readUint8({ pointer })).toBe(255)
@@ -108,12 +106,12 @@ describe("integers", () => {
108106

109107
describe(".readInt16", () => {
110108
it("example works as described", () => {
111-
const decoder = new Decoder(Buffer.from([0xff, 0xff]))
109+
const decoder = new Decoder(new Uint8Array([0xff, 0xff]))
112110
expect(decoder.readInt16()).toBe(-1)
113111
})
114112

115113
it("pointer example works as described", () => {
116-
const decoder = new Decoder(Buffer.from([0x03, 0x00, 0x00, 0xff, 0xff]))
114+
const decoder = new Decoder(new Uint8Array([0x03, 0x00, 0x00, 0xff, 0xff]))
117115
const pointer = decoder.readUint16()
118116
expect(pointer).toBe(3)
119117
expect(decoder.readInt16({ pointer })).toBe(-1)
@@ -122,13 +120,13 @@ describe("integers", () => {
122120

123121
describe(".readUint16", () => {
124122
it("decodes a value correctly", () => {
125-
const decoder = new Decoder(Buffer.from([0xff, 0xff]))
123+
const decoder = new Decoder(new Uint8Array([0xff, 0xff]))
126124
expect(decoder.readUint16()).toBe(65535)
127125
})
128126

129127
it("decodes a value via a pointer correctly", () => {
130-
// (3 + 0) | pad | -1
131-
const decoder = new Decoder(Buffer.from([0x03, 0x00, 0x00, 0xff, 0xff]))
128+
// (3 + 0) | pad | -1
129+
const decoder = new Decoder(new Uint8Array([0x03, 0x00, 0x00, 0xff, 0xff]))
132130
const pointer = decoder.readUint16()
133131
expect(pointer).toBe(3)
134132
expect(decoder.readUint16({ pointer })).toBe(65535)
@@ -138,7 +136,7 @@ describe("integers", () => {
138136

139137
describe(".readString", () => {
140138
it("should parse strings correctly", () => {
141-
const data = Buffer.from("testhelloworld")
139+
const data = new TextEncoder().encode("testhelloworld")
142140

143141
const decoder = new Decoder(data)
144142
expect(decoder.readString({ length: 4 })).toBe("test")
@@ -147,7 +145,7 @@ describe(".readString", () => {
147145
})
148146

149147
it("should parse zeroed strings correctly", () => {
150-
const data = Buffer.from("test\x00hello\x00world\x00")
148+
const data = new TextEncoder().encode("test\x00hello\x00world\x00")
151149

152150
const decoder = new Decoder(data)
153151
expect(decoder.readString({ zeroed: true })).toBe("test")
@@ -157,7 +155,7 @@ describe(".readString", () => {
157155
})
158156

159157
it("should parse the README example", () => {
160-
const data = Buffer.from([
158+
const data = new Uint8Array([
161159
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x21,
162160
])
163161
const decoder = new Decoder(data)
@@ -167,7 +165,9 @@ it("should parse the README example", () => {
167165
expect(decoder.readString({ length: 7 })).toBe(", World")
168166

169167
// Or you can use it more ergonomically when possible
170-
const decoder2 = new Decoder(Buffer.alloc(2, 2))
168+
const filledArray = new Uint8Array(2)
169+
filledArray.fill(2)
170+
const decoder2 = new Decoder(filledArray)
171171
const result = {
172172
a: decoder2.readUint8(),
173173
b: decoder2.readUint8(),
@@ -177,7 +177,7 @@ it("should parse the README example", () => {
177177
})
178178

179179
it("should allow parsing simple data", () => {
180-
const testBuffer = Buffer.alloc(17)
180+
const testBuffer = new Uint8Array(17)
181181
const values = [3257, 3263, 6483, 9773]
182182
const view = new DataView(testBuffer.buffer)
183183
view.setInt8(0, 4)

‎src/decoder.ts‎

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
1-
import type { Buffer } from "node:buffer"
1+
import { TextDecoder } from "node:util"
22

33
type BaseOptions = {
44
pointer?: number
55
}
66

77
type BaseStringOptions = {
8-
encoding?: BufferEncoding
8+
encoding?: "utf-8" | "utf8"
99
}
1010

1111
type BufferOptions = BaseOptions & { length: number }
1212

1313
type StringOptions = BaseStringOptions & ({ length: number } | { zeroed: boolean })
1414

1515
export class Decoder {
16-
#buffer: Buffer
16+
#buffer: Uint8Array
1717
#currentOffset = 0
1818
#littleEndian = true
1919

@@ -23,7 +23,7 @@ export class Decoder {
2323
*
2424
* Defaults to little endian.
2525
*/
26-
constructor(buffer: Buffer) {
26+
constructor(buffer: Uint8Array) {
2727
this.#buffer = buffer
2828
}
2929

@@ -32,8 +32,8 @@ export class Decoder {
3232
*
3333
* @example
3434
* ```ts
35-
* // 1 + 256 + 0 + 0
36-
* const buffer = Buffer.from([0x01, 0x01, 0x00, 0x00])
35+
* // 1 + 256 + 0 + 0
36+
* const buffer = new Uint8Array([0x01, 0x01, 0x00, 0x00])
3737
* const decoder = new Decoder(buffer)
3838
* decoder.readUint32() // 257
3939
* decoder.currentOffset // 4
@@ -48,8 +48,8 @@ export class Decoder {
4848
* @param endianness - `big` or `little`
4949
* @example
5050
* ```ts
51-
* // 0 + 0 + 256 + 1
52-
* const buffer = Buffer.from([0x00, 0x00, 0x01, 0x01])
51+
* // 0 + 0 + 256 + 1
52+
* const buffer = new Uint8Array([0x00, 0x00, 0x01, 0x01])
5353
* const decoder = new Decoder(buffer)
5454
* decoder.endianness("big")
5555
* decoder.readUint32() // 257
@@ -65,8 +65,8 @@ export class Decoder {
6565
* @returns The previous offset.
6666
* @example
6767
* ```ts
68-
* // (max + max)|(1 + 0)
69-
* const buffer = Buffer.from([0xFF, 0xFF, 0x01, 0x00])
68+
* // (max + max)|(1 + 0)
69+
* const buffer = new Uint8Array([0xFF, 0xFF, 0x01, 0x00])
7070
* const decoder = new Decoder(buffer)
7171
* decoder.seek(2) // 0
7272
* decoder.readUint16() // 1
@@ -84,8 +84,8 @@ export class Decoder {
8484
* @returns The previous offset.
8585
* @example
8686
* ```ts
87-
* // (max + max)|(1 + 0)
88-
* const buffer = Buffer.from([0xff, 0xff, 0x01, 0x00])
87+
* // (max + max)|(1 + 0)
88+
* const buffer = new Uint8Array([0xff, 0xff, 0x01, 0x00])
8989
* const decoder = new Decoder(buffer)
9090
* decoder.readUint16() // 65535
9191
* decoder.goto(0) // 2
@@ -109,7 +109,7 @@ export class Decoder {
109109
* @example
110110
* ```ts
111111
* // Assume we have a header 5 bytes long, then 3 bytes of padding up to 8 bytes in, then more data
112-
* const buffer = Buffer.from([
112+
* const buffer = new Uint8Array([
113113
* 0x74, 0xee, 0xb2, 0x36, 0x0c, 0x00, 0x00, 0x00,
114114
* 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115115
* ])
@@ -135,13 +135,13 @@ export class Decoder {
135135
* @returns Value between -128 and 127.
136136
* @example
137137
* ```ts
138-
* const decoder = new Decoder(Buffer.from([0xff]))
138+
* const decoder = new Decoder(new Uint8Array([0xff]))
139139
* expect(decoder.readInt8()).toBe(-1)
140140
* ```
141141
* @example Read via pointer offset
142142
* ```ts
143-
* // (3 + 0) | pad | -1
144-
* const decoder = new Decoder(Buffer.from([0x03, 0x00, 0x00, 0xff]))
143+
* // (3 + 0) | pad | -1
144+
* const decoder = new Decoder(new Uint8Array([0x03, 0x00, 0x00, 0xff]))
145145
* const pointer = decoder.readUint16() // 3
146146
* decoder.readInt8({ pointer }) // -1
147147
* ```
@@ -167,13 +167,13 @@ export class Decoder {
167167
* @returns Value between 0 and 255.
168168
* @example
169169
* ```ts
170-
* const decoder = new Decoder(Buffer.from([0xff]))
170+
* const decoder = new Decoder(new Uint8Array([0xff]))
171171
* expect(decoder.readInt8()).toBe(255)
172172
* ```
173173
* @example Read via pointer offset
174174
* ```ts
175-
* // (3 + 0) | pad | -1
176-
* const decoder = new Decoder(Buffer.from([0x03, 0x00, 0x00, 0xff]))
175+
* // (3 + 0) | pad | -1
176+
* const decoder = new Decoder(new Uint8Array([0x03, 0x00, 0x00, 0xff]))
177177
* const pointer = decoder.readUint16() // 3
178178
* decoder.readInt8({ pointer }) // 255
179179
* ```
@@ -370,7 +370,7 @@ export class Decoder {
370370
* @param opts.length {number} - Length of slice (not inclusive).
371371
* @param opts.pointer {number} - See {@link Decoder#readUint8}.
372372
*/
373-
readBuffer(opts: BufferOptions): Buffer {
373+
readBuffer(opts: BufferOptions): Uint8Array {
374374
const result = this.#buffer.subarray(
375375
this.#currentOffset,
376376
this.#currentOffset + opts.length,
@@ -391,17 +391,17 @@ export class Decoder {
391391
* @param opts.encoding - Defaults to `utf8`.
392392
* @example Zeroed
393393
* ```ts
394-
* const decoder = new Decoder(Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00]))
394+
* const decoder = new Decoder(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00]))
395395
* decoder.readString({ zeroed: true }) // "hello"
396396
* ```
397397
* @example Length
398398
* ```ts
399-
* const decoder = new Decoder(Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]))
399+
* const decoder = new Decoder(new Uint8Array([0x68, 0x65, 0x6c, 0x6c, 0x6f]))
400400
* decoder.readString({ length: 5 }) // "hello"
401401
* ```
402402
*/
403403
readString(opts: StringOptions): string {
404-
let strBuffer: Buffer | null = null
404+
let strBuffer: Uint8Array | null = null
405405

406406
if ("length" in opts && opts.length != null) {
407407
strBuffer = this.readBuffer(opts)
@@ -426,6 +426,9 @@ export class Decoder {
426426
throw new Error("You need to specify either `zeroed` or `length`.")
427427
}
428428

429-
return strBuffer.toString(opts.encoding ?? "utf8")
429+
this.#textDecoder ??= new TextDecoder(opts.encoding ?? "utf8")
430+
return this.#textDecoder.decode(strBuffer)
430431
}
432+
433+
#textDecoder!: TextDecoder
431434
}

‎src/encoder.test.ts‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,16 @@ describe(".setString", () => {
214214
const encoder = new Encoder(5)
215215
encoder.setString("test")
216216

217-
expect(encoder.buffer.toString()).toBe("test\x00")
217+
const textDecoder = new TextDecoder()
218+
expect(textDecoder.decode(encoder.buffer)).toBe("test\x00")
218219
})
219220

220221
it("should write 2-byte characters correctly", () => {
221222
const encoder = new Encoder()
222223
encoder.setString("Ûbercharge")
223224

224-
expect(encoder.buffer.toString()).toBe("Ûbercharge\x00")
225+
const textDecoder = new TextDecoder()
226+
expect(textDecoder.decode(encoder.buffer)).toBe("Ûbercharge\x00")
225227
})
226228

227229
it("should grow the buffer if needed", () => {
@@ -232,6 +234,7 @@ describe(".setString", () => {
232234
const buffer = encoder.buffer
233235
expect(buffer.length).toBe(7)
234236
expect(buffer[0]).toBe(1)
235-
expect(buffer.subarray(2).toString("utf8")).toBe("test\x00")
237+
const textDecoder = new TextDecoder()
238+
expect(textDecoder.decode(buffer.subarray(2))).toBe("test\x00")
236239
})
237240
})

0 commit comments

Comments
 (0)