Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 17 additions & 35 deletions src/Decoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,20 +98,20 @@ export class Decoder {
return this.view.byteLength - this.pos >= size;
}

createNoExtraBytesError(posToShow: number) {
createNoExtraBytesError(posToShow: number): Error {
const { view, pos } = this;
return new RangeError(`Extra ${view.byteLength - pos} byte(s) found at buffer[${posToShow}]`);
}

decodeOneSync(): unknown {
decodeSingleSync(): unknown {
const object = this.decodeSync();
if (this.hasRemaining()) {
throw this.createNoExtraBytesError(this.pos);
}
return object;
}

async decodeOneAsync(stream: AsyncIterable<ArrayLike<number>>): Promise<unknown> {
async decodeSingleAsync(stream: AsyncIterable<ArrayLike<number>>): Promise<unknown> {
let decoded = false;
let object: unknown;
for await (const buffer of stream) {
Expand Down Expand Up @@ -146,53 +146,35 @@ export class Decoder {
);
}

async *decodeStream(stream: AsyncIterable<ArrayLike<number>>) {
for await (const buffer of stream) {
this.appendBuffer(buffer);

try {
while (true) {
const result = this.decodeSync();
decodeArrayStream(stream: AsyncIterable<ArrayLike<number>>) {
return this.decodeMultiAsync(stream, true);
}

yield result;
}
} catch (e) {
if (!(e instanceof DataViewIndexOutOfBoundsError)) {
throw e; // rethrow
}
// fallthrough
}
}
decodeStream(stream: AsyncIterable<ArrayLike<number>>) {
return this.decodeMultiAsync(stream, false);
}

async *decodeArrayStream(stream: AsyncIterable<ArrayLike<number>>) {
let headerParsed = false;
let decoded = false;
let itemsLeft = 0;
private async *decodeMultiAsync(stream: AsyncIterable<ArrayLike<number>>, isArray: boolean) {
let isArrayHeaderRequired = isArray;
let arrayItemsLeft = -1;

for await (const buffer of stream) {
if (decoded) {
if (isArray && arrayItemsLeft === 0) {
throw this.createNoExtraBytesError(this.totalPos);
}

this.appendBuffer(buffer);

if (!headerParsed) {
itemsLeft = this.readArraySize();
headerParsed = true;
if (isArrayHeaderRequired) {
arrayItemsLeft = this.readArraySize();
isArrayHeaderRequired = false;
this.complete();
}

try {
while (true) {
const result = this.decodeSync();

yield result;

itemsLeft--;

if (itemsLeft === 0) {
decoded = true;
yield this.decodeSync();
if (--arrayItemsLeft === 0) {
break;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/decode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,5 @@ export function decode(
options.maxExtLength,
);
decoder.setBuffer(buffer); // decodeSync() requires only one buffer
return decoder.decodeOneSync();
return decoder.decodeSingleSync();
}
2 changes: 1 addition & 1 deletion src/decodeAsync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export async function decodeAsync(
options.maxMapLength,
options.maxExtLength,
);
return decoder.decodeOneAsync(stream);
return decoder.decodeSingleAsync(stream);
}

export function decodeArrayStream(
Expand Down