Skip to content

Commit 9b0ff2f

Browse files
authored
fix: use native fetch if available (#62)
If you are in the Electron Renderer process, native fetch is available but it's ignored because the renderer does not respect the browser field of package.json, so we end up with `node-fetch` that uses a browser polyfill of the node `http` module which is very slow on Electron. Instead use native fetch if it's available or `node-fetch` if not, unless you're on the Electron Main process in which case use `electron-fetch` which uses the Electron `net` module which is faster than the node `http` module in that environment.
1 parent 78edc8b commit 9b0ff2f

File tree

4 files changed

+23
-8
lines changed

4 files changed

+23
-8
lines changed

package.json

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"./src/text-decoder.js": "./src/text-decoder.browser.js",
1717
"./src/temp-dir.js": "./src/temp-dir.browser.js",
1818
"./src/path-join.js": "./src/path-join.browser.js",
19-
"./test/files/glob-source.spec.js": false
19+
"./test/files/glob-source.spec.js": false,
20+
"@achingbrain/electron-fetch": false
2021
},
2122
"repository": "github:ipfs/js-ipfs-utils",
2223
"scripts": {
@@ -34,15 +35,18 @@
3435
"license": "MIT",
3536
"dependencies": {
3637
"abort-controller": "^3.0.0",
37-
"any-signal": "^1.1.0",
38+
"any-signal": "^2.1.0",
3839
"buffer": "^5.6.0",
40+
"@achingbrain/electron-fetch": "^1.7.2",
3941
"err-code": "^2.0.0",
4042
"fs-extra": "^9.0.1",
4143
"is-electron": "^2.2.0",
4244
"iso-url": "^0.4.7",
4345
"it-glob": "0.0.8",
4446
"merge-options": "^2.0.0",
4547
"nanoid": "^3.1.3",
48+
"native-abort-controller": "0.0.3",
49+
"native-fetch": "^2.0.0",
4650
"node-fetch": "^2.6.0",
4751
"stream-to-it": "^0.2.0"
4852
},

src/fetch.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
'use strict'
2+
3+
const { isElectronMain } = require('./env')
4+
5+
if (isElectronMain) {
6+
module.exports = require('@achingbrain/electron-fetch')
7+
} else {
8+
// use window.fetch if it is available, fall back to node-fetch if not
9+
module.exports = require('native-fetch')
10+
}

src/http.js

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
/* eslint-disable no-undef */
22
'use strict'
33

4-
const fetch = require('node-fetch')
4+
const {
5+
default: fetch,
6+
Request,
7+
Headers
8+
} = require('./fetch')
59
const merge = require('merge-options').bind({ ignoreUndefined: true })
610
const { URL, URLSearchParams } = require('iso-url')
711
const TextDecoder = require('./text-decoder')
8-
const AbortController = require('abort-controller')
12+
const AbortController = require('native-abort-controller')
913
const anySignal = require('any-signal')
1014

11-
const Request = fetch.Request
12-
const Headers = fetch.Headers
13-
1415
class TimeoutError extends Error {
1516
constructor () {
1617
super('Request timed out')

test/http.spec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const { expect } = require('aegir/utils/chai')
55
const HTTP = require('../src/http')
66
const toStream = require('it-to-stream')
77
const delay = require('delay')
8-
const AbortController = require('abort-controller')
8+
const AbortController = require('native-abort-controller')
99
const drain = require('it-drain')
1010
const all = require('it-all')
1111
const { isBrowser, isWebWorker } = require('../src/env')

0 commit comments

Comments
 (0)