Skip to content

Commit a1dee4e

Browse files
authored
fix: ReadableStream not handling error properly (RocketChat#38081)
1 parent f837394 commit a1dee4e

3 files changed

Lines changed: 24 additions & 1 deletion

File tree

.changeset/early-dots-leave.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@rocket.chat/meteor': patch
3+
---
4+
5+
Fixes an issue where cancelling a file upload results in an uncaught exception

apps/meteor/app/api/server/lib/getUploadFormData.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const createMockRequest = (
1212
content: string | Buffer;
1313
mimetype?: string;
1414
},
15+
options: { simulateError?: boolean } = {},
1516
): Request => {
1617
const boundary = '----WebKitFormBoundary7MA4YWxkTrZu0gW';
1718
const parts: string[] = [];
@@ -40,6 +41,10 @@ const createMockRequest = (
4041
},
4142
body: new ReadableStream({
4243
async pull(controller) {
44+
if (options.simulateError) {
45+
controller.error(new Error('aborted'));
46+
return;
47+
}
4348
controller.enqueue(buffer);
4449
controller.close();
4550
},
@@ -177,4 +182,15 @@ describe('getUploadFormData', () => {
177182
expect((error as Error).message).to.equal('[error-file-too-large]');
178183
}
179184
});
185+
186+
it('should handle an aborted request stream', async () => {
187+
const mockRequest = createMockRequest({}, undefined, { simulateError: true });
188+
189+
try {
190+
await getUploadFormData({ request: mockRequest }, { fileOptional: true });
191+
throw new Error('Expected function to throw');
192+
} catch (error) {
193+
expect((error as Error).message).to.equal('aborted');
194+
}
195+
});
180196
});

apps/meteor/app/api/server/lib/getUploadFormData.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,9 @@ export async function getUploadFormData<
165165
});
166166

167167
// Unclear why typescript complains that the ReadableStream from request.body is incompatible here
168-
Readable.fromWeb(request.body satisfies ReadableStream).pipe(bb);
168+
Readable.fromWeb(request.body satisfies ReadableStream)
169+
.on('error', (err) => reject(err))
170+
.pipe(bb);
169171

170172
return resultPromise;
171173
}

0 commit comments

Comments
 (0)