Skip to content

Commit 8b6c3d3

Browse files
committed
fix: response correctly returns instance instead of promise
BREAKING CHANGE: Response returns the instance rather than a promise in all cases
1 parent 74f6a96 commit 8b6c3d3

6 files changed

+100
-199
lines changed

src/ArrayBufferResponse.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { toByteArray } from "base64-js";
2+
import Response from "./Response";
3+
4+
class ArrayBufferResponse extends Response {
5+
constructor(base64, options) {
6+
const buffer = toByteArray(base64);
7+
super(buffer, options);
8+
this._base64 = base64;
9+
}
10+
11+
clone() {
12+
return new ArrayBufferResponse(this._base64, {
13+
status: this.status,
14+
statusText: this.statusText,
15+
headers: new Headers(this.headers),
16+
url: this.url,
17+
});
18+
}
19+
}
20+
21+
export default ArrayBufferResponse;

src/BlobResponse.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import BlobManager from "react-native/Libraries/Blob/BlobManager";
2+
import Response from "./Response";
3+
4+
class BlobResponse extends Response {
5+
constructor(blobData, options) {
6+
const blob = BlobManager.createFromOptions(blobData);
7+
super(blob, options);
8+
this._blobData = blobData;
9+
}
10+
11+
clone() {
12+
return new BlobResponse(this._blobData, {
13+
status: this.status,
14+
statusText: this.statusText,
15+
headers: new Headers(this.headers),
16+
url: this.url,
17+
});
18+
}
19+
}
20+
21+
export default BlobResponse;

src/Fetch.js

+9-14
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { Networking } from "react-native";
22
import pDefer from "p-defer";
33
import Request from "./Request";
44
import Response from "./Response";
5-
import StreamBlobResponse from "./StreamBlobResponse";
6-
import StreamArrayBufferResponse from "./StreamArrayBufferResponse";
5+
import BlobResponse from "./BlobResponse";
6+
import ArrayBufferResponse from "./ArrayBufferResponse";
77

88
class AbortError extends Error {
99
constructor() {
@@ -232,24 +232,19 @@ class Fetch {
232232
let ResponseClass;
233233

234234
if (this._nativeResponseType === "blob") {
235-
ResponseClass = StreamBlobResponse;
235+
ResponseClass = BlobResponse;
236236
}
237237

238238
if (this._nativeResponseType === "base64") {
239-
ResponseClass = StreamArrayBufferResponse;
239+
ResponseClass = ArrayBufferResponse;
240240
}
241241

242242
try {
243-
this._response = await new ResponseClass(
244-
this._nativeResponse,
245-
this._stream,
246-
this._streamController,
247-
{
248-
status: this._responseStatus,
249-
url: this._responseUrl,
250-
headers: this._nativeResponseHeaders,
251-
}
252-
);
243+
this._response = new ResponseClass(this._nativeResponse, {
244+
status: this._responseStatus,
245+
url: this._responseUrl,
246+
headers: this._nativeResponseHeaders,
247+
});
253248
this._deferredPromise.resolve(this._response);
254249
} catch (error) {
255250
this._deferredPromise.reject(error);

src/StreamArrayBufferResponse.js

-84
This file was deleted.

src/StreamBlobResponse.js

-101
This file was deleted.

test/index.js

+49
Original file line numberDiff line numberDiff line change
@@ -1856,4 +1856,53 @@ test("fetch method", (t) => {
18561856
t.eq(await res3.text(), "bar4");
18571857
});
18581858
});
1859+
1860+
t.test("cloning", (t) => {
1861+
t.test("cloning response from text stream", async (t) => {
1862+
const url = new URL("/stream", BASE_URL);
1863+
const res = await fetch(url, {
1864+
reactNative: { textStreaming: true },
1865+
});
1866+
const clone = res.clone();
1867+
const stream = await clone.body;
1868+
const text = new TextDecoder().decode(await drainStream(stream));
1869+
1870+
t.ok(
1871+
stream instanceof ReadableStream,
1872+
"Response implements streaming body"
1873+
);
1874+
t.eq(text, "Hello world!");
1875+
});
1876+
1877+
t.test("cloning blob response", async (t) => {
1878+
const url = new URL("/request", BASE_URL);
1879+
const res = await fetch(url, {
1880+
headers: {
1881+
Accept: "application/json",
1882+
},
1883+
});
1884+
const clone = res.clone();
1885+
const json = await clone.json();
1886+
t.eq(json.headers.accept, "application/json");
1887+
});
1888+
1889+
t.test("cloning array buffer response", async (t) => {
1890+
const url = new URL("/binary", BASE_URL);
1891+
const res = await fetch(url, {
1892+
reactNative: {
1893+
__nativeResponseType: "base64",
1894+
},
1895+
});
1896+
const clone = res.clone();
1897+
const buf = await clone.arrayBuffer();
1898+
1899+
t.ok(buf instanceof ArrayBuffer, "buf is an ArrayBuffer instance");
1900+
t.eq(buf.byteLength, 256, "buf.byteLength is correct");
1901+
1902+
const expected = Array.from({ length: 256 }, (_, i) => i);
1903+
const actual = Array.from(new Uint8Array(buf));
1904+
1905+
t.eq(actual, expected);
1906+
});
1907+
});
18591908
});

0 commit comments

Comments
 (0)