Skip to content

Commit b2c85f5

Browse files
committed
fix: return promise from stream.cancel()
The promise returned from stream.cancel() was ignored so far. This lead to unhandled promises when the stream throws during the cancel operation. In turn the whole hono node-server was shutdown. Close #248
1 parent 7f327f5 commit b2c85f5

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

src/utils.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ export function writeFromReadableStream(stream: ReadableStream<Uint8Array>, writ
55
if (stream.locked) {
66
throw new TypeError('ReadableStream is locked.')
77
} else if (writable.destroyed) {
8-
stream.cancel()
9-
return
8+
return stream.cancel()
109
}
1110
const reader = stream.getReader()
1211
writable.on('close', cancel)

test/utils.test.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { buildOutgoingHttpHeaders } from '../src/utils'
1+
import { console } from 'node:inspector/promises'
2+
import { Writable } from 'node:stream'
3+
import { buildOutgoingHttpHeaders, writeFromReadableStream } from '../src/utils'
24

35
describe('buildOutgoingHttpHeaders', () => {
46
it('original content-type is preserved', () => {
@@ -71,3 +73,18 @@ describe('buildOutgoingHttpHeaders', () => {
7173
})
7274
})
7375
})
76+
77+
describe('writeFromReadableStream', () => {
78+
it('does handle rejections from canceled streams', async () => {
79+
const stream = new ReadableStream({
80+
async cancel() {
81+
throw new Error('Aborted')
82+
},
83+
})
84+
85+
const destroyedWritable = new Writable()
86+
destroyedWritable.destroy()
87+
88+
await expect(writeFromReadableStream(stream, destroyedWritable)).rejects.toThrow('Aborted')
89+
})
90+
})

0 commit comments

Comments
 (0)