Skip to content

Commit a98919f

Browse files
committed
fix: make decodeAsync(), decodeStream(), and decodeArrayStream() to take BufferSource
where BufferSource is ArrayBuffer | ArrayBufferView
1 parent 6c225f3 commit a98919f

File tree

4 files changed

+29
-14
lines changed

4 files changed

+29
-14
lines changed

src/Decoder.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,13 @@ export class Decoder<ContextType> {
8585
this.headByte = HEAD_BYTE_REQUIRED;
8686
}
8787

88-
private setBuffer(buffer: ArrayLike<number> | ArrayBuffer): void {
88+
private setBuffer(buffer: ArrayLike<number> | BufferSource): void {
8989
this.bytes = ensureUint8Array(buffer);
9090
this.view = createDataView(this.bytes);
9191
this.pos = 0;
9292
}
9393

94-
private appendBuffer(buffer: ArrayLike<number>) {
94+
private appendBuffer(buffer: ArrayLike<number> | BufferSource) {
9595
if (this.headByte === HEAD_BYTE_REQUIRED && !this.hasRemaining()) {
9696
this.setBuffer(buffer);
9797
} else {
@@ -114,7 +114,7 @@ export class Decoder<ContextType> {
114114
return new RangeError(`Extra ${view.byteLength - pos} of ${view.byteLength} byte(s) found at buffer[${posToShow}]`);
115115
}
116116

117-
public decode(buffer: ArrayLike<number> | ArrayBuffer): unknown {
117+
public decode(buffer: ArrayLike<number> | BufferSource): unknown {
118118
this.reinitializeState();
119119
this.setBuffer(buffer);
120120

@@ -125,7 +125,7 @@ export class Decoder<ContextType> {
125125
return object;
126126
}
127127

128-
public async decodeAsync(stream: AsyncIterable<ArrayLike<number>>): Promise<unknown> {
128+
public async decodeAsync(stream: AsyncIterable<ArrayLike<number> | BufferSource>): Promise<unknown> {
129129
let decoded = false;
130130
let object: unknown;
131131
for await (const buffer of stream) {
@@ -160,15 +160,15 @@ export class Decoder<ContextType> {
160160
);
161161
}
162162

163-
public decodeArrayStream(stream: AsyncIterable<ArrayLike<number>>) {
163+
public decodeArrayStream(stream: AsyncIterable<ArrayLike<number> | BufferSource>) {
164164
return this.decodeMultiAsync(stream, true);
165165
}
166166

167-
public decodeStream(stream: AsyncIterable<ArrayLike<number>>) {
167+
public decodeStream(stream: AsyncIterable<ArrayLike<number> | BufferSource>) {
168168
return this.decodeMultiAsync(stream, false);
169169
}
170170

171-
private async *decodeMultiAsync(stream: AsyncIterable<ArrayLike<number>>, isArray: boolean) {
171+
private async *decodeMultiAsync(stream: AsyncIterable<ArrayLike<number> | BufferSource>, isArray: boolean) {
172172
let isArrayHeaderRequired = isArray;
173173
let arrayItemsLeft = -1;
174174

src/decode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const defaultDecodeOptions: DecodeOptions = {};
4343
* This is a synchronous decoding function. See other variants for asynchronous decoding: `decodeAsync()`, `decodeStream()`, `decodeArrayStream()`.
4444
*/
4545
export function decode<ContextType = undefined>(
46-
buffer: ArrayLike<number> | ArrayBuffer,
46+
buffer: ArrayLike<number> | BufferSource,
4747
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
4848
): unknown {
4949
const decoder = new Decoder(

src/decodeAsync.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import { Decoder } from "./Decoder";
2-
import { defaultDecodeOptions, DecodeOptions } from "./decode";
3-
import { ensureAsyncIterable, ReadableStreamLike } from "./utils/stream";
4-
import { SplitUndefined } from "./context";
2+
import { ensureAsyncIterable } from "./utils/stream";
3+
import { defaultDecodeOptions } from "./decode";
4+
import type { ReadableStreamLike } from "./utils/stream";
5+
import type { DecodeOptions } from "./decode";
6+
import type { SplitUndefined } from "./context";
57

68
export async function decodeAsync<ContextType>(
7-
streamLike: ReadableStreamLike<ArrayLike<number>>,
9+
streamLike: ReadableStreamLike<ArrayLike<number> | BufferSource>,
810
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
911
): Promise<unknown> {
1012
const stream = ensureAsyncIterable(streamLike);
@@ -22,7 +24,7 @@ export async function decodeAsync<ContextType>(
2224
}
2325

2426
export function decodeArrayStream<ContextType>(
25-
streamLike: ReadableStreamLike<ArrayLike<number>>,
27+
streamLike: ReadableStreamLike<ArrayLike<number> | BufferSource>,
2628
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
2729
) {
2830
const stream = ensureAsyncIterable(streamLike);
@@ -41,7 +43,7 @@ export function decodeArrayStream<ContextType>(
4143
}
4244

4345
export function decodeStream<ContextType>(
44-
streamLike: ReadableStreamLike<ArrayLike<number>>,
46+
streamLike: ReadableStreamLike<ArrayLike<number> | BufferSource>,
4547
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
4648
) {
4749
const stream = ensureAsyncIterable(streamLike);

test/decodeAsync.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,17 @@ describe("decodeAsync", () => {
107107
};
108108
assert.deepStrictEqual(await decodeAsync(createStream()), object);
109109
});
110+
111+
it("decodes BufferSource", async () => {
112+
// https://developer.mozilla.org/en-US/docs/Web/API/BufferSource
113+
const createStream = async function* () {
114+
yield [0x81] as ArrayLike<number>; // fixmap size=1
115+
yield encode("foo") as BufferSource;
116+
yield encode("bar") as BufferSource;
117+
};
118+
119+
// createStream() returns AsyncGenerator<ArrayLike<number> | BufferSource, ...>
120+
const object = await decodeAsync(createStream());
121+
assert.deepStrictEqual(object, { "foo": "bar" });
122+
});
110123
});

0 commit comments

Comments
 (0)