diff --git a/packages/@pollyjs/adapter-node-http/src/-private/transport-wrapper.js b/packages/@pollyjs/adapter-node-http/src/-private/transport-wrapper.js index 27915258..0c627d7f 100644 --- a/packages/@pollyjs/adapter-node-http/src/-private/transport-wrapper.js +++ b/packages/@pollyjs/adapter-node-http/src/-private/transport-wrapper.js @@ -138,17 +138,16 @@ export default class TransportWrapper { ...NodeUrl.parse(pollyRequest.url) }); - request.on('error', error => { - throw error; + const requestPromise = new Promise((resolve, reject) => { + request.once('response', response => resolve(response)); + request.once('error', reject); }); // Write the request body chunks.forEach(chunk => request.write(chunk)); - const response = await new Promise(resolve => { - request.once('response', response => resolve(response)); - request.end(); - }); + request.end(); + const response = await requestPromise; const responseBody = await new Promise((resolve, reject) => { const chunks = []; @@ -270,13 +269,18 @@ export default class TransportWrapper { parsedUrl.set('hostname', hostname); parsedUrl.set('port', port !== '80' ? port : ''); - adapter.handleRequest({ - method, - headers, - url: parsedUrl.href, - body: chunks, - requestArguments: [wrapper, req, args] - }); + adapter + .handleRequest({ + method, + headers, + url: parsedUrl.href, + body: chunks, + requestArguments: [wrapper, req, args] + }) + .catch(e => { + // This allows the consumer to handle the error gracefully + req.emit('error', e); + }); }; return req; diff --git a/packages/@pollyjs/core/src/utils/deferred-promise.js b/packages/@pollyjs/core/src/utils/deferred-promise.js index 6974021e..46716533 100644 --- a/packages/@pollyjs/core/src/utils/deferred-promise.js +++ b/packages/@pollyjs/core/src/utils/deferred-promise.js @@ -10,6 +10,9 @@ export default function defer() { _reject = reject; }); + // Prevent unhandled rejection warnings + promise.catch(() => {}); + promise.resolve = _resolve; promise.reject = _reject;