electron-fetch
Advanced tools
Comparing version 1.6.0 to 1.7.0
@@ -7,2 +7,6 @@ | ||
## V1.7.0 | ||
- Add AbortController support (thanks @Informatic) | ||
- Update all dependencies | ||
## V1.6.0 | ||
@@ -9,0 +13,0 @@ - Add option `useSessionCookies` to use session cookies when running on Electron >=7 (thanks @taratatach) |
@@ -92,2 +92,3 @@ import { Readable, Stream } from 'stream' | ||
body?: BodyInit | ||
signal: AbortSignal | ||
// (/!\ only works when running on Node.js) set to `manual` to extract redirect headers, `error` to reject redirect | ||
@@ -125,2 +126,3 @@ redirect?: RequestRedirect | ||
readonly redirect: RequestRedirect | ||
readonly signal: AbortSignal | ||
@@ -127,0 +129,0 @@ clone (): Request |
@@ -1138,2 +1138,3 @@ import { parse, format, resolve } from 'url'; | ||
this.redirect = init.redirect || input.redirect || 'follow'; | ||
this.signal = init.signal || input.signal || null; | ||
this.headers = new Headers(init.headers || input.headers || {}); | ||
@@ -1282,2 +1283,7 @@ this.headers.delete('Content-Length'); // user cannot set content-length themself as per fetch spec | ||
options.headers.host = options.headers.host[0]; | ||
} | ||
if (request.signal && request.signal.aborted) { | ||
reject(new FetchError('request aborted', 'abort')); | ||
return; | ||
} // send request | ||
@@ -1312,6 +1318,27 @@ | ||
const abortRequest = () => { | ||
const err = new FetchError('request aborted', 'abort'); | ||
reject(err); | ||
if (request.useElectronNet) { | ||
req.abort(); | ||
} else { | ||
req.destroy(err); | ||
} | ||
}; | ||
if (request.signal) { | ||
request.signal.addEventListener('abort', abortRequest); | ||
} | ||
if (request.timeout) { | ||
reqTimeout = setTimeout(() => { | ||
req.abort(); | ||
reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); | ||
const err = new FetchError(`network timeout at: ${request.url}`, 'request-timeout'); | ||
reject(err); | ||
if (request.useElectronNet) { | ||
req.abort(); | ||
} else { | ||
req.destroy(err); | ||
} | ||
}, request.timeout); | ||
@@ -1336,7 +1363,24 @@ } | ||
clearTimeout(reqTimeout); | ||
if (request.signal) { | ||
request.signal.removeEventListener('abort', abortRequest); | ||
} | ||
reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); | ||
}); | ||
req.on('abort', () => { | ||
clearTimeout(reqTimeout); | ||
if (request.signal) { | ||
request.signal.removeEventListener('abort', abortRequest); | ||
} | ||
}); | ||
req.on('response', res => { | ||
clearTimeout(reqTimeout); // handle redirect | ||
clearTimeout(reqTimeout); | ||
if (request.signal) { | ||
request.signal.removeEventListener('abort', abortRequest); | ||
} // handle redirect | ||
if (fetch.isRedirect(res.statusCode) && request.redirect !== 'manual') { | ||
@@ -1394,2 +1438,18 @@ if (request.redirect === 'error') { | ||
res.pipe(body); | ||
const abortBody = () => { | ||
res.destroy(); | ||
res.emit('error', new FetchError('request aborted', 'abort')); // separated from the `.destroy()` because somehow Node's IncomingMessage streams do not emit errors on destroy | ||
}; | ||
if (request.signal) { | ||
request.signal.addEventListener('abort', abortBody); | ||
res.on('end', () => { | ||
request.signal.removeEventListener('abort', abortBody); | ||
}); | ||
res.on('error', () => { | ||
request.signal.removeEventListener('abort', abortBody); | ||
}); | ||
} | ||
const responseOptions = { | ||
@@ -1396,0 +1456,0 @@ url: request.url, |
@@ -1168,2 +1168,3 @@ 'use strict'; | ||
this.redirect = init.redirect || input.redirect || 'follow'; | ||
this.signal = init.signal || input.signal || null; | ||
this.headers = new Headers(init.headers || input.headers || {}); | ||
@@ -1312,2 +1313,7 @@ this.headers.delete('Content-Length'); // user cannot set content-length themself as per fetch spec | ||
options.headers.host = options.headers.host[0]; | ||
} | ||
if (request.signal && request.signal.aborted) { | ||
reject(new FetchError('request aborted', 'abort')); | ||
return; | ||
} // send request | ||
@@ -1342,6 +1348,27 @@ | ||
const abortRequest = () => { | ||
const err = new FetchError('request aborted', 'abort'); | ||
reject(err); | ||
if (request.useElectronNet) { | ||
req.abort(); | ||
} else { | ||
req.destroy(err); | ||
} | ||
}; | ||
if (request.signal) { | ||
request.signal.addEventListener('abort', abortRequest); | ||
} | ||
if (request.timeout) { | ||
reqTimeout = setTimeout(() => { | ||
req.abort(); | ||
reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); | ||
const err = new FetchError(`network timeout at: ${request.url}`, 'request-timeout'); | ||
reject(err); | ||
if (request.useElectronNet) { | ||
req.abort(); | ||
} else { | ||
req.destroy(err); | ||
} | ||
}, request.timeout); | ||
@@ -1366,7 +1393,24 @@ } | ||
clearTimeout(reqTimeout); | ||
if (request.signal) { | ||
request.signal.removeEventListener('abort', abortRequest); | ||
} | ||
reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); | ||
}); | ||
req.on('abort', () => { | ||
clearTimeout(reqTimeout); | ||
if (request.signal) { | ||
request.signal.removeEventListener('abort', abortRequest); | ||
} | ||
}); | ||
req.on('response', res => { | ||
clearTimeout(reqTimeout); // handle redirect | ||
clearTimeout(reqTimeout); | ||
if (request.signal) { | ||
request.signal.removeEventListener('abort', abortRequest); | ||
} // handle redirect | ||
if (fetch.isRedirect(res.statusCode) && request.redirect !== 'manual') { | ||
@@ -1424,2 +1468,18 @@ if (request.redirect === 'error') { | ||
res.pipe(body); | ||
const abortBody = () => { | ||
res.destroy(); | ||
res.emit('error', new FetchError('request aborted', 'abort')); // separated from the `.destroy()` because somehow Node's IncomingMessage streams do not emit errors on destroy | ||
}; | ||
if (request.signal) { | ||
request.signal.addEventListener('abort', abortBody); | ||
res.on('end', () => { | ||
request.signal.removeEventListener('abort', abortBody); | ||
}); | ||
res.on('error', () => { | ||
request.signal.removeEventListener('abort', abortBody); | ||
}); | ||
} | ||
const responseOptions = { | ||
@@ -1426,0 +1486,0 @@ url: request.url, |
{ | ||
"name": "electron-fetch", | ||
"version": "1.6.0", | ||
"version": "1.7.0", | ||
"description": "A light-weight module that brings window.fetch to electron's background process", | ||
@@ -45,5 +45,6 @@ "main": "lib/index.js", | ||
"devDependencies": { | ||
"@babel/core": "^7.11.4", | ||
"@babel/preset-env": "^7.11.0", | ||
"@babel/register": "^7.10.5", | ||
"@babel/core": "^7.11.5", | ||
"@babel/preset-env": "^7.11.5", | ||
"@babel/register": "^7.11.5", | ||
"abortcontroller-polyfill": "^1.5.0", | ||
"babel-eslint": "^10.1.0", | ||
@@ -56,3 +57,3 @@ "babel-plugin-istanbul": "^6.0.0", | ||
"cross-env": "^7.0.2", | ||
"electron": "^10.0.0", | ||
"electron": "^10.1.1", | ||
"electron-mocha": "^9.1.0", | ||
@@ -63,3 +64,3 @@ "form-data": "^3.0.0", | ||
"istanbul-lib-coverage": "^3.0.0", | ||
"mocha": "^8.1.1", | ||
"mocha": "^8.1.3", | ||
"nyc": "^15.1.0", | ||
@@ -70,3 +71,3 @@ "parted": "^0.1.1", | ||
"resumer": "0.0.0", | ||
"rollup": "^2.26.5", | ||
"rollup": "^2.26.9", | ||
"rollup-plugin-babel": "^4.4.0", | ||
@@ -76,3 +77,3 @@ "standard": "^14.3.4", | ||
"typescript": "^4.0.2", | ||
"whatwg-url": "^8.2.0", | ||
"whatwg-url": "^8.2.1", | ||
"xvfb-maybe": "^0.2.1" | ||
@@ -79,0 +80,0 @@ }, |
@@ -193,2 +193,3 @@ | ||
redirect: 'follow', // (/!\ only works when running on Node.js) set to `manual` to extract redirect headers, `error` to reject redirect | ||
signal: null, // the AbortSignal from an AbortController instance. | ||
@@ -195,0 +196,0 @@ // The following properties are electron-fetch extensions |
111532
2629
401
30