From 6ebb08a9093888a8c3f1839cdec22b4728a0b033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andre=CC=81=20Costa=20Lima?= Date: Mon, 25 Jan 2021 16:54:37 +0000 Subject: [PATCH] fix: handle blobs as stream when FileReader.readAsArrayBuffer is available --- package-lock.json | 38 ++++++++++++++++++++++++++++++++++++++ package.json | 3 +++ src/StreamBlobResponse.js | 23 +++++++++++++---------- src/utils.js | 4 ++-- test/index.js | 12 +++++++++--- 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index db04a5a6..7724ca6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7455,6 +7455,15 @@ } } }, + "react-native-url-polyfill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/react-native-url-polyfill/-/react-native-url-polyfill-1.2.0.tgz", + "integrity": "sha512-hpLZ8RyS3oGVyTOe/HjoqVoCOSkeJvrCoEB3bJsY7t9uh7kpQDV6kgvdlECEafYpxe3RzMrKLVcmWRbPU7CuAw==", + "dev": true, + "requires": { + "whatwg-url-without-unicode": "8.0.0-3" + } + }, "react-refresh": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", @@ -8729,6 +8738,12 @@ } } }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "dev": true + }, "text-extensions": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", @@ -9041,6 +9056,29 @@ "defaults": "^1.0.3" } }, + "web-streams-polyfill": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.0.1.tgz", + "integrity": "sha512-M+EmTdszMWINywOZaqpZ6VIEDUmNpRaTOuizF0ZKPjSDC8paMRe/jBBwFv0Yeyn5WYnM5pMqMQa82vpaE+IJRw==", + "dev": true + }, + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + }, + "whatwg-url-without-unicode": { + "version": "8.0.0-3", + "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", + "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "dev": true, + "requires": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 03f0beae..78be1a31 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,10 @@ "querystring": "^0.2.0", "react-native-polyfill-globals": "^2.0.0", "react-native-test-runner": "^2.0.0", + "react-native-url-polyfill": "^1.2.0", "standard-version": "^9.1.0", + "text-encoding": "^0.7.0", + "web-streams-polyfill": "^3.0.1", "zora": "^4.0.2" }, "files": [ diff --git a/src/StreamBlobResponse.js b/src/StreamBlobResponse.js index 0d97d5f3..644f67db 100644 --- a/src/StreamBlobResponse.js +++ b/src/StreamBlobResponse.js @@ -1,22 +1,25 @@ import BlobManager from "react-native/Libraries/Blob/BlobManager"; import Response from "./Response"; -// import { createBlobReader } from "./utils"; +import { createBlobReader } from "./utils"; class StreamBlobResponse { constructor(blobData, stream, streamController, options) { const blob = BlobManager.createFromOptions(blobData); this._blobData = blobData; this._blobResponse = new Response(blob, options); - // this._streamResponse = new Response(stream, options); - // return createBlobReader(blob) - // .readAsArrayBuffer() - // .then((arrayBuffer) => { - // this._arrayBufferResponse = new Response(arrayBuffer, options); - // streamController.enqueue(new Uint8Array(arrayBuffer)); - - // return this; - // }); + return createBlobReader(blob) + .readAsArrayBuffer() + .then((arrayBuffer) => { + this._streamResponse = new Response(stream, options); + this._arrayBufferResponse = new Response(arrayBuffer, options); + streamController.enqueue(new Uint8Array(arrayBuffer)); + + return this; + }) + .catch(() => { + return this; + }); } get bodyUsed() { diff --git a/src/utils.js b/src/utils.js index 47f96336..6f5c9a55 100644 --- a/src/utils.js +++ b/src/utils.js @@ -10,11 +10,11 @@ function createBlobReader(blob) { }); return { - readAsArrayBuffer: () => { + readAsArrayBuffer: async () => { reader.readAsArrayBuffer(blob); return fileReaderReady; }, - readAsText: () => { + readAsText: async () => { reader.readAsText(blob); return fileReaderReady; }, diff --git a/test/index.js b/test/index.js index 12bb04a9..6bcfaacb 100644 --- a/test/index.js +++ b/test/index.js @@ -1,9 +1,15 @@ -import "react-native-polyfill-globals/auto"; import { Platform } from "react-native"; +import { polyfill as polyfillEncoding } from "react-native-polyfill-globals/src/encoding"; +import { polyfill as polyfillReadableStream } from "react-native-polyfill-globals/src/readable-stream"; +import { polyfill as polyfillURL } from "react-native-polyfill-globals/src/url"; import { test } from "zora"; import delay from "delay"; import { Headers, Request, Response, fetch } from "../"; +polyfillEncoding(); +polyfillReadableStream(); +polyfillURL(); + const BASE_URL = Platform.select({ android: "http://10.0.2.2:8082", ios: "http://localhost:8082", @@ -21,11 +27,11 @@ function createBlobReader(blob) { }); return { - readAsArrayBuffer: () => { + readAsArrayBuffer: async () => { reader.readAsArrayBuffer(blob); return fileReaderReady; }, - readAsText: () => { + readAsText: async () => { reader.readAsText(blob); return fileReaderReady; },