Skip to content

Commit a22691f

Browse files
committed
feature: decode ArrayBuffer as well as byte arrays
1 parent 7453508 commit a22691f

File tree

6 files changed

+27
-16
lines changed

6 files changed

+27
-16
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ deepStrictEqual(decode(encoded), object);
4444
- [API](#api)
4545
- [`encode(data: unknown, options?: EncodeOptions): Uint8Array`](#encodedata-unknown-options-encodeoptions-uint8array)
4646
- [`EncodeOptions`](#encodeoptions)
47-
- [`decode(buffer: ArrayLike<number>, options?: DecodeOptions): unknown`](#decodebuffer-arraylikenumber-options-decodeoptions-unknown)
47+
- [`decode(buffer: ArrayLike<number> | ArrayBuffer, options?: DecodeOptions): unknown`](#decodebuffer-arraylikenumber--arraybuffer-options-decodeoptions-unknown)
4848
- [`DecodeOptions`](#decodeoptions)
4949
- [`decodeAsync(stream: AsyncIterable<ArrayLike<number>> | ReadableStream<ArrayLike<number>>, options?: DecodeAsyncOptions): Promise<unknown>`](#decodeasyncstream-asynciterablearraylikenumber--readablestreamarraylikenumber-options-decodeasyncoptions-promiseunknown)
5050
- [`decodeArrayStream(stream: AsyncIterable<ArrayLike<number>> | ReadableStream<ArrayLike<number>>, options?: DecodeAsyncOptions): AsyncIterable<unknown>`](#decodearraystreamstream-asynciterablearraylikenumber--readablestreamarraylikenumber-options-decodeasyncoptions-asynciterableunknown)
@@ -115,11 +115,11 @@ maxDepth | number | `100`
115115
initialBufferSize | number | `2048`
116116
sortKeys | boolean | false
117117

118-
### `decode(buffer: ArrayLike<number>, options?: DecodeOptions): unknown`
118+
### `decode(buffer: ArrayLike<number> | ArrayBuffer, options?: DecodeOptions): unknown`
119119

120120
It decodes `buffer` encoded as MessagePack, and returns a decoded object as `uknown`.
121121

122-
`buffer` must be an array of bytes, which is typically `Uint8Array`.
122+
`buffer` must be an array of bytes, which is typically `Uint8Array`, or `ArrayBuffer`.
123123

124124
for example:
125125

src/Decoder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ export class Decoder {
6868
readonly maxExtLength = DEFAULT_MAX_LENGTH,
6969
) {}
7070

71-
setBuffer(buffer: ArrayLike<number>): void {
71+
setBuffer(buffer: ArrayLike<number> | ArrayBuffer): void {
7272
this.bytes = ensureUint8Array(buffer);
7373
this.view = createDataView(this.bytes);
7474
this.pos = 0;

src/decode.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ export type DecodeOptions = Partial<
3535

3636
export const defaultDecodeOptions: DecodeOptions = {};
3737

38-
export function decode(buffer: ArrayLike<number>, options: DecodeOptions = defaultDecodeOptions): unknown {
38+
export function decode(
39+
buffer: ArrayLike<number> | ArrayBuffer,
40+
options: DecodeOptions = defaultDecodeOptions,
41+
): unknown {
3942
const decoder = new Decoder(
4043
options.extensionCodec,
4144
options.maxStrLength,

src/utils/typedArrays.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
export function ensureUint8Array(buffer: ArrayLike<number> | Uint8Array | ArrayBufferView) {
1+
export function ensureUint8Array(buffer: ArrayLike<number> | Uint8Array | ArrayBufferView | ArrayBuffer) {
22
if (buffer instanceof Uint8Array) {
33
return buffer;
44
} else if (ArrayBuffer.isView(buffer)) {
55
return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
6+
} else if (buffer instanceof ArrayBuffer) {
7+
return new Uint8Array(buffer);
68
} else {
79
// ArrayLike<number>
810
return Uint8Array.from(buffer);

test/encode-options.test.ts

Lines changed: 0 additions & 10 deletions
This file was deleted.

test/encode.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import assert from "assert";
2+
import { encode, decode } from "@msgpack/msgpack";
3+
4+
describe("encode", () => {
5+
context("sortKeys", () => {
6+
it("canonicalize encoded binaries", () => {
7+
assert.deepStrictEqual(encode({ a: 1, b: 2 }, { sortKeys: true }), encode({ b: 2, a: 1 }, { sortKeys: true }));
8+
});
9+
});
10+
11+
context("ArrayBuffer as buffer", () => {
12+
const buffer = encode([1, 2, 3]);
13+
const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteLength);
14+
assert.deepStrictEqual(decode(arrayBuffer), decode(buffer));
15+
});
16+
});

0 commit comments

Comments
 (0)