Add fetch body serialization support for Blob, ArrayBuffer, and TypedArray (#329)

* Add fetch body serialization support for Blob, ArrayBuffer, and TypedArray

* js: fix Blob fetch body serialization

The Blob branch passed the Blob to _bodyToUint8Array, which did not know
about obscura's Blob (its data lives in _bytes) and fell through to
encoding String(blob), so a Blob body was sent as "[object Blob]".
Teach _bodyToUint8Array about _bytes, and build the binary string with
the loop-based _bytesToBinaryString instead of String.fromCharCode.apply
so large blobs do not overflow the argument limit.

---------

Co-authored-by: SGavrl <277843151+SGavrl@users.noreply.github.com>
This commit is contained in:
RezoandSGavrl authored and GitHub committed 2026-06-26 20:43:19 +00:00
1 parent 505738450a
commit 260c4c01fa
1 file changed
+18
+18
View File
@@ -3020,6 +3020,8 @@ function _bodyToUint8Array(body) {
if (body instanceof Uint8Array) return body;
if (body instanceof ArrayBuffer) return new Uint8Array(body);
if (ArrayBuffer.isView(body)) return new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
// obscura's Blob materializes its data into _bytes in the constructor.
if (body._bytes instanceof Uint8Array) return body._bytes;
return new TextEncoder().encode(String(body));
}
@@ -3088,6 +3090,22 @@ function _serializeBody(initBody, headers) {
}
return initBody.toString();
}
if (typeof Blob !== 'undefined' && initBody instanceof Blob) {
if (initBody.type && !Object.keys(headers).some(k => k.toLowerCase() === 'content-type')) {
headers['Content-Type'] = initBody.type;
}
return _bytesToBinaryString(_bodyToUint8Array(initBody));
}
if (typeof ArrayBuffer !== 'undefined' && initBody instanceof ArrayBuffer) {
const bytes = new Uint8Array(initBody);
let s = ''; for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
return s;
}
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView(initBody) && initBody.buffer instanceof ArrayBuffer) {
const bytes = new Uint8Array(initBody.buffer, initBody.byteOffset, initBody.byteLength);
let s = ''; for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);
return s;
}
return typeof initBody === 'string' ? initBody : String(initBody);
}