Skip to content

Commit 89bc323

Browse files
committed
introduce decodeMulti()
* also introduce decodeMultiStream(), which was decodeStream() * deprecate decodeStream() in favor of decodeMultiStream()
1 parent 04e2270 commit 89bc323

File tree

6 files changed

+81
-11
lines changed

6 files changed

+81
-11
lines changed

src/Decoder.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,15 @@ export class Decoder<ContextType> {
125125
return object;
126126
}
127127

128+
public *decodeMulti(buffer: ArrayLike<number> | BufferSource): Generator<unknown, void, unknown> {
129+
this.reinitializeState();
130+
this.setBuffer(buffer);
131+
132+
while (this.hasRemaining()) {
133+
yield this.doDecodeSync();
134+
}
135+
}
136+
128137
public async decodeAsync(stream: AsyncIterable<ArrayLike<number> | BufferSource>): Promise<unknown> {
129138
let decoded = false;
130139
let object: unknown;

src/decode.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,10 @@ export type DecodeOptions<ContextType = undefined> = Readonly<
3838
export const defaultDecodeOptions: DecodeOptions = {};
3939

4040
/**
41-
* It decodes a MessagePack-encoded buffer.
41+
* It decodes a single MessagePack object in a buffer.
4242
*
43-
* This is a synchronous decoding function. See other variants for asynchronous decoding: `decodeAsync()`, `decodeStream()`, `decodeArrayStream()`.
43+
* This is a synchronous decoding function.
44+
* See other variants for asynchronous decoding: {@link decodeAsync()}, {@link decodeStream()}, or {@link decodeArrayStream()}.
4445
*/
4546
export function decode<ContextType = undefined>(
4647
buffer: ArrayLike<number> | BufferSource,
@@ -57,3 +58,23 @@ export function decode<ContextType = undefined>(
5758
);
5859
return decoder.decode(buffer);
5960
}
61+
62+
/**
63+
* It decodes multiple MessagePack objects in a buffer.
64+
* This is corresponding to {@link decodeMultiStream()}.
65+
*/
66+
export function decodeMulti<ContextType = undefined>(
67+
buffer: ArrayLike<number> | BufferSource,
68+
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
69+
): Generator<unknown, void, unknown> {
70+
const decoder = new Decoder(
71+
options.extensionCodec,
72+
(options as typeof options & { context: any }).context,
73+
options.maxStrLength,
74+
options.maxBinLength,
75+
options.maxArrayLength,
76+
options.maxMapLength,
77+
options.maxExtLength,
78+
);
79+
return decoder.decodeMulti(buffer);
80+
}

src/decodeAsync.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export function decodeArrayStream<ContextType>(
4242
return decoder.decodeArrayStream(stream);
4343
}
4444

45-
export function decodeStream<ContextType>(
45+
export function decodeMultiStream<ContextType>(
4646
streamLike: ReadableStreamLike<ArrayLike<number> | BufferSource>,
4747
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
4848
) {
@@ -60,3 +60,13 @@ export function decodeStream<ContextType>(
6060

6161
return decoder.decodeStream(stream);
6262
}
63+
64+
/**
65+
* @deprecated Use {@link decodeMultiStream()} instead.
66+
*/
67+
export function decodeStream<ContextType>(
68+
streamLike: ReadableStreamLike<ArrayLike<number> | BufferSource>,
69+
options: DecodeOptions<SplitUndefined<ContextType>> = defaultDecodeOptions as any,
70+
) {
71+
return decodeMultiStream(streamLike, options);
72+
}

src/index.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ export { encode };
55
import type { EncodeOptions } from "./encode";
66
export type { EncodeOptions };
77

8-
import { decode } from "./decode";
9-
export { decode };
8+
import { decode, decodeMulti } from "./decode";
9+
export { decode, decodeMulti };
1010
import type { DecodeOptions } from "./decode";
1111
export { DecodeOptions };
1212

13-
import { decodeAsync, decodeArrayStream, decodeStream } from "./decodeAsync";
14-
export { decodeAsync, decodeArrayStream, decodeStream };
13+
import { decodeAsync, decodeArrayStream, decodeMultiStream, decodeStream } from "./decodeAsync";
14+
export { decodeAsync, decodeArrayStream, decodeMultiStream, decodeStream };
1515

1616
import { Decoder } from "./Decoder";
1717
export { Decoder };

test/decodeMulti.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import assert from "assert";
2+
import { encode, decodeMulti } from "@msgpack/msgpack";
3+
4+
describe("decodeMulti", () => {
5+
it("decodes multiple objects in a single binary", () => {
6+
const items = [
7+
"foo",
8+
10,
9+
{
10+
name: "bar",
11+
},
12+
[1, 2, 3],
13+
];
14+
15+
const encodedItems = items.map((item) => encode(item));
16+
const encoded = new Uint8Array(encodedItems.reduce((p, c) => p + c.byteLength, 0));
17+
let offset = 0;
18+
for (const encodedItem of encodedItems) {
19+
encoded.set(encodedItem, offset);
20+
offset += encodedItem.byteLength;
21+
}
22+
23+
const result: Array<unknown> = [];
24+
25+
for (const item of decodeMulti(encoded)) {
26+
result.push(item);
27+
}
28+
29+
assert.deepStrictEqual(result, items);
30+
});});
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import assert from "assert";
2-
import { encode, decodeStream } from "@msgpack/msgpack";
2+
import { encode, decodeMultiStream } from "@msgpack/msgpack";
33

44
describe("decodeStream", () => {
55
it("decodes stream", async () => {
@@ -20,14 +20,14 @@ describe("decodeStream", () => {
2020

2121
const result: Array<unknown> = [];
2222

23-
for await (const item of decodeStream(createStream())) {
23+
for await (const item of decodeMultiStream(createStream())) {
2424
result.push(item);
2525
}
2626

2727
assert.deepStrictEqual(result, items);
2828
});
2929

30-
it("decodes stream with a single binary", async () => {
30+
it("decodes multiple objects in a single binary stream", async () => {
3131
const items = [
3232
"foo",
3333
10,
@@ -51,7 +51,7 @@ describe("decodeStream", () => {
5151

5252
const result: Array<unknown> = [];
5353

54-
for await (const item of decodeStream(createStream())) {
54+
for await (const item of decodeMultiStream(createStream())) {
5555
result.push(item);
5656
}
5757

0 commit comments

Comments
 (0)