diff --git a/packages/engine.io-parser/lib/decodePacket.browser.ts b/packages/engine.io-parser/lib/decodePacket.browser.ts index 5c7e5317b3..135ab180e3 100644 --- a/packages/engine.io-parser/lib/decodePacket.browser.ts +++ b/packages/engine.io-parser/lib/decodePacket.browser.ts @@ -66,7 +66,13 @@ const mapBinary = (data: any, binaryType?: BinaryType) => { return data; } else { // from WebTransport (Uint8Array) - return data.buffer; + return data.byteOffset === 0 && + data.byteLength === data.buffer.byteLength + ? data.buffer + : data.buffer.slice( + data.byteOffset, + data.byteOffset + data.byteLength, + ); } } }; diff --git a/packages/engine.io-parser/test/index.ts b/packages/engine.io-parser/test/index.ts index e574c9bb1b..8ade7cea3f 100644 --- a/packages/engine.io-parser/test/index.ts +++ b/packages/engine.io-parser/test/index.ts @@ -14,6 +14,24 @@ import "./node"; // replaced by "./browser" for the tests in the browser (see "b describe("engine.io-parser", () => { describe("single packet", () => { + for (const [start, end] of [ + [1, 3], + [0, 2], + [2, 2], + [0, 4], + ]) { + it(`should decode only the binary view bytes from ${start} to ${end}`, () => { + const bytes = Uint8Array.of(1, 2, 3, 4); + const view = bytes.subarray(start, end); + const decoded = decodePacket(view, "arraybuffer"); + + expect(decoded.type).to.eql("message"); + expect(decoded.data).to.be.an(ArrayBuffer); + expect(areArraysEqual(decoded.data, view)).to.be(true); + expect(decoded.data.byteLength).to.eql(view.byteLength); + }); + } + it("should encode/decode a string", (done) => { const packet: Packet = { type: "message", data: "test" }; encodePacket(packet, true, (encodedPacket) => {