-
Notifications
You must be signed in to change notification settings - Fork 27.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(edge): make trackStreamConsumed handle cancellation
- Loading branch information
1 parent
5eebc0a
commit 78745e9
Showing
2 changed files
with
125 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
import { DetachedPromise } from '../../lib/detached-promise' | ||
import { trackStreamConsumed } from './web-on-close' | ||
|
||
describe('trackStreamConsumed', () => { | ||
it('calls onEnd when the stream finishes', async () => { | ||
const endPromise = new DetachedPromise<void>() | ||
const onEnd = jest.fn(endPromise.resolve) | ||
|
||
const { stream: inputStream, controller } = | ||
readableStreamWithController<string>() | ||
const trackedStream = trackStreamConsumed(inputStream, onEnd) | ||
|
||
const reader = trackedStream.getReader() | ||
controller.enqueue('one') | ||
controller.enqueue('two') | ||
await reader.read() | ||
await reader.read() | ||
expect(onEnd).not.toHaveBeenCalled() | ||
|
||
controller.close() | ||
|
||
await endPromise.promise | ||
expect(onEnd).toHaveBeenCalledTimes(1) | ||
}) | ||
|
||
it('calls onEnd when the stream errors', async () => { | ||
const endPromise = new DetachedPromise<void>() | ||
const onEnd = jest.fn(endPromise.resolve) | ||
|
||
const { stream: inputStream, controller } = | ||
readableStreamWithController<string>() | ||
const trackedStream = trackStreamConsumed(inputStream, onEnd) | ||
|
||
const reader = trackedStream.getReader() | ||
controller.enqueue('one') | ||
controller.enqueue('two') | ||
await reader.read() | ||
await reader.read() | ||
expect(onEnd).not.toHaveBeenCalled() | ||
|
||
controller.error(new Error('kaboom')) | ||
|
||
await endPromise.promise | ||
expect(onEnd).toHaveBeenCalledTimes(1) | ||
}) | ||
|
||
it('calls onEnd when the stream is cancelled', async () => { | ||
const endPromise = new DetachedPromise<void>() | ||
const onEnd = jest.fn(endPromise.resolve) | ||
|
||
const { stream: inputStream, controller } = | ||
readableStreamWithController<string>() | ||
const trackedStream = trackStreamConsumed(inputStream, onEnd) | ||
|
||
const reader = trackedStream.getReader() | ||
controller.enqueue('one') | ||
controller.enqueue('two') | ||
await reader.read() | ||
await reader.read() | ||
expect(onEnd).not.toHaveBeenCalled() | ||
|
||
await reader.cancel() | ||
await endPromise.promise | ||
expect(onEnd).toHaveBeenCalledTimes(1) | ||
}) | ||
}) | ||
|
||
function readableStreamWithController<TChunk>() { | ||
let controller: ReadableStreamDefaultController<TChunk> = undefined! | ||
const stream = new ReadableStream<TChunk>({ | ||
start(_controller) { | ||
controller = _controller | ||
}, | ||
}) | ||
return { controller, stream } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters