diff --git a/src/js/builtins/JSBufferConstructor.ts b/src/js/builtins/JSBufferConstructor.ts index 69615d8dcc8b8..2c0c09e982ba7 100644 --- a/src/js/builtins/JSBufferConstructor.ts +++ b/src/js/builtins/JSBufferConstructor.ts @@ -29,6 +29,12 @@ export function from(items) { } } } + if (typeof items === "object") { + const data = items.data; + if (items.type === "Buffer" && Array.isArray(data)) { + return new $Buffer(data); + } + } var arrayLike = $toObject( items, diff --git a/test/js/node/buffer.test.js b/test/js/node/buffer.test.js index 9eec90f9ed29a..32402af3d273c 100644 --- a/test/js/node/buffer.test.js +++ b/test/js/node/buffer.test.js @@ -2921,3 +2921,27 @@ export function fillRepeating(dstBuffer, start, end) { sLen <<= 1; // double length for next segment } } + +describe("serialization", () => { + it("json", () => { + expect(JSON.stringify(Buffer.alloc(0))).toBe('{"type":"Buffer","data":[]}'); + expect(JSON.stringify(Buffer.from([1, 2, 3, 4]))).toBe('{"type":"Buffer","data":[1,2,3,4]}'); + }); + + it("and deserialization", () => { + const buf = Buffer.from("test"); + const json = JSON.stringify(buf); + const obj = JSON.parse(json); + const copy = Buffer.from(obj); + expect(copy).toEqual(buf); + }); + + it("custom", () => { + const buffer = Buffer.from("test"); + const string = JSON.stringify(buffer); + expect(string).toBe('{"type":"Buffer","data":[116,101,115,116]}'); + + const receiver = (key, value) => (value && value.type === "Buffer" ? Buffer.from(value.data) : value); + expect(JSON.parse(string, receiver)).toEqual(buffer); + }); +});