enhance: fix exports and extend decoder input type support
This commit is contained in:
parent
34bdb046f0
commit
bbc9c86531
@ -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",
|
||||
|
@ -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<ArrayBuffer, EbmlTagTrait>, FileDataViewController
|
||||
implements
|
||||
Transformer<EbmlStreamDecoderChunkType, EbmlTagTrait>,
|
||||
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<EbmlTagTrait>,
|
||||
isFlush: boolean
|
||||
) {
|
||||
@ -144,7 +151,7 @@ export class EbmlDecodeStreamTransformer
|
||||
}
|
||||
}
|
||||
|
||||
async tick(
|
||||
private async tick(
|
||||
ctrl: TransformStreamDefaultController<EbmlTagTrait>,
|
||||
isFlush: boolean
|
||||
) {
|
||||
@ -191,7 +198,7 @@ export class EbmlDecodeStreamTransformer
|
||||
}
|
||||
|
||||
async transform(
|
||||
chunk: ArrayBuffer,
|
||||
chunk: EbmlStreamDecoderChunkType,
|
||||
ctrl: TransformStreamDefaultController<EbmlTagTrait>
|
||||
): Promise<void> {
|
||||
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;
|
||||
|
@ -5,14 +5,14 @@ import { EbmlMasterTag } from './models/tag-master';
|
||||
import { EbmlTreeMasterNotMatchError, UnreachableOrLogicError } from './errors';
|
||||
|
||||
export class EbmlEncodeStreamTransformer
|
||||
implements Transformer<EbmlTagTrait, ArrayBuffer>
|
||||
implements Transformer<EbmlTagTrait, Uint8Array>
|
||||
{
|
||||
stack = new Stack<[EbmlMasterTag, ArrayBuffer[]]>();
|
||||
_writeBuffer = new Queue<ArrayBuffer>();
|
||||
stack = new Stack<[EbmlMasterTag, Uint8Array[]]>();
|
||||
_writeBuffer = new Queue<Uint8Array>();
|
||||
_writeBufferTask: Promise<void> | 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<ArrayBuffer>,
|
||||
ctrl: TransformStreamDefaultController<Uint8Array>,
|
||||
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: <explanation>
|
||||
async transform(
|
||||
tag: EbmlTagTrait,
|
||||
ctrl: TransformStreamDefaultController<ArrayBuffer>
|
||||
ctrl: TransformStreamDefaultController<Uint8Array>
|
||||
) {
|
||||
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<ArrayBuffer>) {
|
||||
flush(ctrl: TransformStreamDefaultController<Uint8Array>) {
|
||||
this.waitBufferRelease(ctrl, true);
|
||||
}
|
||||
}
|
||||
|
||||
export class EbmlStreamEncoder extends TransformStream<
|
||||
EbmlTagTrait,
|
||||
ArrayBuffer
|
||||
Uint8Array
|
||||
> {
|
||||
public readonly transformer: EbmlEncodeStreamTransformer;
|
||||
|
||||
|
10
src/index.ts
10
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,
|
||||
|
@ -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<ArrayBuffer>;
|
||||
}) as ReadableStream<Uint8Array>;
|
||||
|
||||
const makeDataStreamTest =
|
||||
(stream: () => ReadableStream<ArrayBuffer>) =>
|
||||
(stream: () => ReadableStream<Uint8Array>) =>
|
||||
async (cb: (tag: EbmlMasterTag | EbmlDataTag, done: () => void) => void) => {
|
||||
await new Promise((resolve, reject) => {
|
||||
stream()
|
||||
|
Loading…
Reference in New Issue
Block a user