diff --git a/package.json b/package.json index bfa0940..1b2aa13 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "konoebml", - "version": "0.1.0-rc.1", + "version": "0.1.0-rc.2", "description": "A modern JavaScript implementation of EBML RFC8794", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/src/decoder.ts b/src/decoder.ts index a81b922..17bb779 100644 --- a/src/decoder.ts +++ b/src/decoder.ts @@ -5,8 +5,15 @@ import { decodeEbmlContent } from './decode-utils'; import { StreamFlushReason, UnreachableOrLogicError } from './errors'; import { dataViewSlice } from './tools'; +export type EbmlStreamDecoderChunkType = + | Uint8Array + | ArrayBuffer + | ArrayBufferLike; + export class EbmlDecodeStreamTransformer - implements Transformer, FileDataViewController + implements + Transformer, + FileDataViewController { private _offset = 0; private _buffer: Uint8Array = new Uint8Array(0); @@ -122,17 +129,17 @@ export class EbmlDecodeStreamTransformer } } - notifyIdle() { + private notifyIdle() { if (this._tickIdleCallback) { this._tickIdleCallback(); } } - tryEnqueueToBuffer(item: EbmlTagTrait) { + private tryEnqueueToBuffer(item: EbmlTagTrait) { this._writeBuffer.enqueue(item); } - waitBufferRelease( + private waitBufferRelease( ctrl: TransformStreamDefaultController, isFlush: boolean ) { @@ -144,7 +151,7 @@ export class EbmlDecodeStreamTransformer } } - async tick( + private async tick( ctrl: TransformStreamDefaultController, isFlush: boolean ) { @@ -191,7 +198,7 @@ export class EbmlDecodeStreamTransformer } async transform( - chunk: ArrayBuffer, + chunk: EbmlStreamDecoderChunkType, ctrl: TransformStreamDefaultController ): Promise { if (chunk.byteLength === 0) { @@ -202,7 +209,10 @@ export class EbmlDecodeStreamTransformer ); newBuffer.set(this._buffer, 0); - newBuffer.set(new Uint8Array(chunk), this._buffer.byteLength); + newBuffer.set( + chunk instanceof Uint8Array ? chunk : new Uint8Array(chunk), + this._buffer.byteLength + ); this._buffer = newBuffer; await this.tick(ctrl, false); @@ -214,7 +224,7 @@ export class EbmlDecodeStreamTransformer } export class EbmlStreamDecoder extends TransformStream< - ArrayBuffer, + EbmlStreamDecoderChunkType, EbmlTagTrait > { public readonly transformer: EbmlDecodeStreamTransformer; diff --git a/src/encoder.ts b/src/encoder.ts index 424073a..adaec34 100644 --- a/src/encoder.ts +++ b/src/encoder.ts @@ -5,14 +5,14 @@ import { EbmlMasterTag } from './models/tag-master'; import { EbmlTreeMasterNotMatchError, UnreachableOrLogicError } from './errors'; export class EbmlEncodeStreamTransformer - implements Transformer + implements Transformer { - stack = new Stack<[EbmlMasterTag, ArrayBuffer[]]>(); - _writeBuffer = new Queue(); + stack = new Stack<[EbmlMasterTag, Uint8Array[]]>(); + _writeBuffer = new Queue(); _writeBufferTask: Promise | undefined; closed = false; - tryEnqueueToBuffer(...frag: ArrayBuffer[]) { + tryEnqueueToBuffer(...frag: Uint8Array[]) { const top = this.stack.peek(); if (top) { top[1].push(...frag); @@ -24,21 +24,22 @@ export class EbmlEncodeStreamTransformer } waitBufferRelease( - ctrl: TransformStreamDefaultController, + ctrl: TransformStreamDefaultController, isFlush: boolean ) { while (this._writeBuffer.size) { if (ctrl.desiredSize! <= 0 && !isFlush) { break; } - ctrl.enqueue(this._writeBuffer.dequeue()); + const pop = this._writeBuffer.dequeue(); + ctrl.enqueue(pop); } } // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: async transform( tag: EbmlTagTrait, - ctrl: TransformStreamDefaultController + ctrl: TransformStreamDefaultController ) { if (!(tag instanceof EbmlTagTrait)) { throw new UnreachableOrLogicError('should only accept embl tag but not'); @@ -74,14 +75,14 @@ export class EbmlEncodeStreamTransformer this.waitBufferRelease(ctrl, false); } - flush(ctrl: TransformStreamDefaultController) { + flush(ctrl: TransformStreamDefaultController) { this.waitBufferRelease(ctrl, true); } } export class EbmlStreamEncoder extends TransformStream< EbmlTagTrait, - ArrayBuffer + Uint8Array > { public readonly transformer: EbmlEncodeStreamTransformer; diff --git a/src/index.ts b/src/index.ts index d9ec27a..f816ad8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,11 @@ export { decodeEbmlTagHeader, decodeEbmlContent, } from './decode-utils'; -export { EbmlStreamDecoder, EbmlDecodeStreamTransformer } from './decoder'; +export { + EbmlStreamDecoder, + EbmlDecodeStreamTransformer, + type EbmlStreamDecoderChunkType, +} from './decoder'; export { EbmlStreamEncoder, EbmlEncodeStreamTransformer, @@ -19,7 +23,8 @@ export { export { EbmlBlockLacing, EbmlTagIdEnum, - type EbmlElementType, + EbmlElementType, + EbmlTagPosition, type EbmlBinaryDataTagIdType, type EbmlMasterTagIdType, type EbmlBlockTagIdType, @@ -32,7 +37,6 @@ export { type EbmlUintDataTagIdType, type EbmlUtf8DataTagIdType, type EbmlTagIdType, - EbmlTagPosition, isEbmlBinaryDataTagId, isEbmlBlockTagId, isEbmlDateDataTagId, diff --git a/tests/value.spec.ts b/tests/value.spec.ts index e59679c..73cd794 100644 --- a/tests/value.spec.ts +++ b/tests/value.spec.ts @@ -15,10 +15,10 @@ process.setMaxListeners(Number.POSITIVE_INFINITY); const createReadStream = (file: string) => Readable.toWeb(fs.createReadStream(file), { strategy: { highWaterMark: 100, size: (chunk) => chunk.byteLength }, - }) as ReadableStream; + }) as ReadableStream; const makeDataStreamTest = - (stream: () => ReadableStream) => + (stream: () => ReadableStream) => async (cb: (tag: EbmlMasterTag | EbmlDataTag, done: () => void) => void) => { await new Promise((resolve, reject) => { stream()