From c2166c47f58735cbf993364f0b0415f481c6b778 Mon Sep 17 00:00:00 2001 From: Borewit Date: Sat, 30 Nov 2024 17:01:25 +0100 Subject: [PATCH] Fix random read at position 0 --- lib/AbstractTokenizer.ts | 21 +++++++-------------- test/test.ts | 10 ++++++++++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/lib/AbstractTokenizer.ts b/lib/AbstractTokenizer.ts index b65e9cc3..3dbea8fa 100644 --- a/lib/AbstractTokenizer.ts +++ b/lib/AbstractTokenizer.ts @@ -133,24 +133,17 @@ export abstract class AbstractTokenizer implements ITokenizer { protected normalizeOptions(uint8Array: Uint8Array, options?: IReadChunkOptions): INormalizedReadChunkOptions { - if (options && options.position !== undefined && options.position < this.position) { + if (!this.supportsRandomAccess() && options && options.position !== undefined && options.position < this.position) { throw new Error('`options.position` must be equal or greater than `tokenizer.position`'); } - if (options) { - return { - mayBeLess: options.mayBeLess === true, - offset: options.offset ? options.offset : 0, - length: options.length ? options.length : (uint8Array.length - (options.offset ? options.offset : 0)), - position: options.position ? options.position : this.position - }; - } - return { - mayBeLess: false, - offset: 0, - length: uint8Array.length, - position: this.position + ...{ + mayBeLess: false, + offset: 0, + length: uint8Array.length, + position: this.position + }, ...options }; } diff --git a/test/test.ts b/test/test.ts index f0d78c7e..d96c5534 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1012,6 +1012,16 @@ describe('Random-read-acccess', async () => { } }); + it('Be able to random read from position 0', async () => { + const tokenizer = await fromFile(getResourcePath('id3v1.mp3')); + // Advance tokenizer.position + await tokenizer.ignore(20); + const mpegSync = new Uint8Array(2); + await tokenizer.readBuffer(mpegSync,{position: 0}); + assert.strictEqual(mpegSync[0], 255, 'First sync byte'); + assert.strictEqual(mpegSync[1], 251, 'Second sync byte'); + }); + });