diff --git a/packages/node/src/BacktraceNodeRequestHandler.ts b/packages/node/src/BacktraceNodeRequestHandler.ts index 49d0af33..3699a6e2 100644 --- a/packages/node/src/BacktraceNodeRequestHandler.ts +++ b/packages/node/src/BacktraceNodeRequestHandler.ts @@ -10,7 +10,7 @@ import { import FormData from 'form-data'; import http, { ClientRequest, IncomingMessage } from 'http'; import https from 'https'; -import { Readable } from 'stream'; +import { PassThrough, Readable } from 'stream'; export interface BacktraceNodeRequestHandlerOptions { readonly timeout?: number; @@ -238,13 +238,39 @@ export class BacktraceNodeRequestHandler implements BacktraceRequestHandler { } for (const attachment of attachments) { - const data = attachment.get(); + let data = attachment.get(); if (!data) { continue; } + + if (data instanceof Readable) { + data = this.wrapReadableSuppressErrors(data); + } + formData.append(`attachment_${attachment.name}`, data, attachment.name); } return formData; } + + /** + * When inputStream emits an error, it will be suppressed, and the stream will be closed. + */ + private wrapReadableSuppressErrors(inputStream: Readable) { + const safeStream = new PassThrough(); + + inputStream.on('data', (chunk) => { + safeStream.write(chunk); + }); + + inputStream.on('end', () => { + safeStream.end(); + }); + + inputStream.on('error', () => { + safeStream.end(); + }); + + return safeStream; + } }