From 86bb31bc8c247d566f19619c6e12643e5d22ff66 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Thu, 26 Sep 2024 17:45:26 -0700 Subject: [PATCH] enhance Buffer.from to support (de)serialization roundtrip --- src/js/builtins/JSBufferConstructor.ts | 6 ++++++ test/js/node/buffer.test.js | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+) 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 17f25ec067a9b..35a3c1094cf64 100644 --- a/test/js/node/buffer.test.js +++ b/test/js/node/buffer.test.js @@ -2917,3 +2917,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); + }); +});