Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 0 additions & 81 deletions packages/fetch/src/event-stream.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -583,87 +583,6 @@ describe('toEventStream', () => {
await expect(reader.read()).resolves.toEqual({ done: true })
})
})

describe('empty close event', () => {
it('enabled by default', async () => {
async function* gen() {
yield 'hello'
}

const stream = toEventStream(gen(), {
initialComment: { enabled: false },
keepAlive: { enabled: false },
})

const reader = stream
.pipeThrough(new TextDecoderStream())
.getReader()

await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: message\ndata: "hello"\n\n' })
await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: close\n\n' })
await expect(reader.read()).resolves.toEqual({ done: true })
})

it('disabled', async () => {
async function* gen() {
yield 'hello'
}

const stream = toEventStream(gen(), {
initialComment: { enabled: false },
keepAlive: { enabled: false },
emptyCloseEventEnabled: false,
})

const reader = stream
.pipeThrough(new TextDecoderStream())
.getReader()

await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: message\ndata: "hello"\n\n' })
await expect(reader.read()).resolves.toEqual({ done: true })
})

it('enabled explicitly', async () => {
async function* gen() {
yield 'hello'
}

const stream = toEventStream(gen(), {
initialComment: { enabled: false },
keepAlive: { enabled: false },
emptyCloseEventEnabled: true,
})

const reader = stream
.pipeThrough(new TextDecoderStream())
.getReader()

await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: message\ndata: "hello"\n\n' })
await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: close\n\n' })
await expect(reader.read()).resolves.toEqual({ done: true })
})

it.each([true, false])('still sends close event when iterator returns a value: %s', async (emptyCloseEventEnabled) => {
async function* gen() {
yield 'hello'
return 'bye'
}

const stream = toEventStream(gen(), {
initialComment: { enabled: false },
keepAlive: { enabled: false },
emptyCloseEventEnabled,
})

const reader = stream
.pipeThrough(new TextDecoderStream())
.getReader()

await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: message\ndata: "hello"\n\n' })
await expect(reader.read()).resolves.toEqual({ done: false, value: 'event: close\ndata: "bye"\n\n' })
await expect(reader.read()).resolves.toEqual({ done: true })
})
})
})

it.each([
Expand Down
22 changes: 5 additions & 17 deletions packages/fetch/src/event-stream.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,6 @@ export interface ToEventStreamOptions {
*/
comment?: string
}

/**
* If true, a `close` event is sent even when the iterator completes with `undefined`.
* When the iterator returns a value, a `close` event is always emitted regardless of this setting.
*
* @default true
*/
emptyCloseEventEnabled?: boolean
}

export function toEventStream(
Expand All @@ -132,7 +124,6 @@ export function toEventStream(
const keepAliveComment = options.keepAlive?.comment ?? ''
const initialCommentEnabled = options.initialComment?.enabled ?? true
const initialComment = options.initialComment?.comment ?? ''
const emptyCloseEventEnabled = options.emptyCloseEventEnabled ?? true

let cancelled = false
let timeout: ReturnType<typeof setInterval> | undefined
Expand Down Expand Up @@ -193,14 +184,11 @@ export function toEventStream(
try {
const [data, meta] = unwrapEvent(result.value)

if (!result.done || data !== undefined || meta !== undefined || emptyCloseEventEnabled) {
const event = result.done ? 'close' : 'message'
controller.enqueue(encodeEventStreamMessage({
...meta,
event,
data: stringifyJSON(data),
}))
}
controller.enqueue(encodeEventStreamMessage({
...meta,
event: result.done ? 'close' : 'message',
data: stringifyJSON(data),
}))
}
catch (err) {
/**
Expand Down
Loading