From 410ac101935099f2fae4fa39fd0e5621cc2a079d Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Tue, 30 Jul 2019 23:19:55 +0200 Subject: [PATCH] refactor: replace custom fetch with ky-universal This change simplifies code related to ad-hoc HTTP requests by switching from custom code to ky-universal. It is a drop-in replacement for fetch that works in browser and node that retries failed request License: MIT Signed-off-by: Marcin Rataj --- .aegir.js | 2 +- package.json | 4 ++-- .../components/files-regular/add-from-url.js | 7 +++++-- src/core/runtime/dns-browser.js | 14 ++++++-------- src/core/runtime/fetch-browser.js | 3 --- src/core/runtime/fetch-nodejs.js | 2 -- src/core/runtime/preload-browser.js | 18 +++++++++--------- 7 files changed, 23 insertions(+), 27 deletions(-) delete mode 100644 src/core/runtime/fetch-browser.js delete mode 100644 src/core/runtime/fetch-nodejs.js diff --git a/.aegir.js b/.aegir.js index 60f97ab578..74d6e16c2a 100644 --- a/.aegir.js +++ b/.aegir.js @@ -8,7 +8,7 @@ const ipfsdServer = IPFSFactory.createServer() const preloadNode = MockPreloadNode.createNode() module.exports = { - bundlesize: { maxSize: '690kB' }, + bundlesize: { maxSize: '692kB' }, webpack: { resolve: { mainFields: ['browser', 'main'], diff --git a/package.json b/package.json index 3394e6ffae..3cbd44b27b 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "./src/core/runtime/add-from-fs-nodejs.js": "./src/core/runtime/add-from-fs-browser.js", "./src/core/runtime/config-nodejs.js": "./src/core/runtime/config-browser.js", "./src/core/runtime/dns-nodejs.js": "./src/core/runtime/dns-browser.js", - "./src/core/runtime/fetch-nodejs.js": "./src/core/runtime/fetch-browser.js", "./src/core/runtime/libp2p-nodejs.js": "./src/core/runtime/libp2p-browser.js", "./src/core/runtime/preload-nodejs.js": "./src/core/runtime/preload-browser.js", "./src/core/runtime/repo-nodejs.js": "./src/core/runtime/repo-browser.js", @@ -121,6 +120,8 @@ "just-flatten-it": "^2.1.0", "just-safe-set": "^2.1.0", "kind-of": "^6.0.2", + "ky": "~0.11.2", + "ky-universal": "~0.2.2", "libp2p": "~0.25.4", "libp2p-bootstrap": "~0.9.3", "libp2p-crypto": "~0.16.0", @@ -146,7 +147,6 @@ "multicodec": "~0.5.1", "multihashes": "~0.4.14", "multihashing-async": "~0.6.0", - "node-fetch": "^2.3.0", "p-queue": "^6.1.0", "peer-book": "~0.9.0", "peer-id": "~0.12.3", diff --git a/src/core/components/files-regular/add-from-url.js b/src/core/components/files-regular/add-from-url.js index 73697aa2cf..31a653540d 100644 --- a/src/core/components/files-regular/add-from-url.js +++ b/src/core/components/files-regular/add-from-url.js @@ -1,7 +1,7 @@ 'use strict' const { URL } = require('iso-url') -const fetch = require('../../runtime/fetch-nodejs') +const { default: ky } = require('ky-universal') module.exports = (self) => { return async (url, options, callback) => { @@ -14,7 +14,10 @@ module.exports = (self) => { try { const parsedUrl = new URL(url) - const res = await fetch(url) + const res = await ky(url, { + timeout: 15000, + retry: 3 + }) if (!res.ok) { throw new Error('unexpected status code: ' + res.status) diff --git a/src/core/runtime/dns-browser.js b/src/core/runtime/dns-browser.js index 93d5b9c176..bcca14e64e 100644 --- a/src/core/runtime/dns-browser.js +++ b/src/core/runtime/dns-browser.js @@ -3,6 +3,7 @@ const TLRU = require('../../utils/tlru') const { default: PQueue } = require('p-queue') +const { default: ky } = require('ky-universal') // Avoid sending multiple queries for the same hostname by caching results const cache = new TLRU(1000) @@ -46,12 +47,9 @@ module.exports = (domain, opts, callback) => { url += `&${encodeURIComponent(prop)}=${encodeURIComponent(opts[prop])}` }) - _httpQueue.add(() => fetch(url, { mode: 'cors' }) - .then((response) => response.json()) - .then((response) => { - cache.set(query, response, ttl) - setImmediate(() => unpackResponse(domain, response, callback)) - }) - .catch((err) => setImmediate(() => callback(err))) - ) + _httpQueue.add(async () => { + const response = await ky(url, { mode: 'cors' }).json() + cache.set(query, response, ttl) + setImmediate(() => unpackResponse(domain, response, callback)) + }).catch((err) => setImmediate(() => callback(err))) } diff --git a/src/core/runtime/fetch-browser.js b/src/core/runtime/fetch-browser.js deleted file mode 100644 index b2f604db7c..0000000000 --- a/src/core/runtime/fetch-browser.js +++ /dev/null @@ -1,3 +0,0 @@ -/* eslint-env browser */ -'use strict' -module.exports = fetch diff --git a/src/core/runtime/fetch-nodejs.js b/src/core/runtime/fetch-nodejs.js deleted file mode 100644 index ca77ad8310..0000000000 --- a/src/core/runtime/fetch-nodejs.js +++ /dev/null @@ -1,2 +0,0 @@ -'use strict' -module.exports = require('node-fetch') diff --git a/src/core/runtime/preload-browser.js b/src/core/runtime/preload-browser.js index c09e716160..a9d7ecae80 100644 --- a/src/core/runtime/preload-browser.js +++ b/src/core/runtime/preload-browser.js @@ -2,6 +2,7 @@ 'use strict' const { default: PQueue } = require('p-queue') +const { default: ky } = require('ky-universal') const debug = require('debug') const log = debug('ipfs:preload') @@ -17,15 +18,14 @@ module.exports = function preload (url, callback) { const controller = new AbortController() const signal = controller.signal - _httpQueue.add(() => fetch(url, { signal }) - .then(res => { - if (!res.ok) { - log.error('failed to preload', url, res.status, res.statusText) - throw new Error(`failed to preload ${url}`) - } - setImmediate(callback) - }) - ).catch((err) => setImmediate(() => callback(err))) + _httpQueue.add(async () => { + const res = await ky(url, { signal }) + if (!res.ok) { + log.error('failed to preload', url, res.status, res.statusText) + throw new Error(`failed to preload ${url}`) + } + setImmediate(callback) + }).catch((err) => setImmediate(() => callback(err))) return { cancel: () => controller.abort()