Skip to content

Commit f47352c

Browse files
committed
perf(standard-server): optimize event-iterator payload for void returns
1 parent 910f96e commit f47352c

File tree

4 files changed

+62
-20
lines changed

4 files changed

+62
-20
lines changed

packages/standard-server-fetch/src/event-iterator.test.ts

+22-5
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,28 @@ describe('toEventStream', () => {
165165
.pipeThrough(new TextDecoderStream())
166166
.getReader()
167167

168-
expect((await reader.read()).value).toEqual('event: message\nid: id-1\ndata: {"order":1}\n\n')
169-
expect((await reader.read()).value).toEqual('event: message\nretry: 20000\ndata: {"order":2}\n\n')
170-
expect((await reader.read()).value).toEqual('event: message\n\n')
171-
expect((await reader.read()).value).toEqual('event: done\nretry: 40000\nid: id-4\ndata: {"order":4}\n\n')
172-
expect((await reader.read()).done).toEqual(true)
168+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nid: id-1\ndata: {"order":1}\n\n' })
169+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nretry: 20000\ndata: {"order":2}\n\n' })
170+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\n\n' })
171+
expect((await reader.read())).toEqual({ done: false, value: 'event: done\nretry: 40000\nid: id-4\ndata: {"order":4}\n\n' })
172+
expect((await reader.read())).toEqual({ done: true, value: undefined })
173+
})
174+
175+
it('without return', async () => {
176+
async function* gen() {
177+
yield withEventMeta({ order: 1 }, { id: 'id-1' })
178+
yield withEventMeta({ order: 2 }, { retry: 20000 })
179+
yield undefined
180+
}
181+
182+
const reader = toEventStream(gen(), {})
183+
.pipeThrough(new TextDecoderStream())
184+
.getReader()
185+
186+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nid: id-1\ndata: {"order":1}\n\n' })
187+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nretry: 20000\ndata: {"order":2}\n\n' })
188+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\n\n' })
189+
expect((await reader.read())).toEqual({ done: true, value: undefined })
173190
})
174191

175192
it('with normal error', async () => {

packages/standard-server-fetch/src/event-iterator.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,15 @@ export function toEventStream(
115115

116116
clearInterval(timeout)
117117

118-
controller.enqueue(encodeEventMessage({
119-
...getEventMeta(value.value),
120-
event: value.done ? 'done' : 'message',
121-
data: stringifyJSON(value.value),
122-
}))
118+
const meta = getEventMeta(value.value)
119+
120+
if (!value.done || value.value !== undefined || meta !== undefined) {
121+
controller.enqueue(encodeEventMessage({
122+
...meta,
123+
event: value.done ? 'done' : 'message',
124+
data: stringifyJSON(value.value),
125+
}))
126+
}
123127

124128
if (value.done) {
125129
controller.close()

packages/standard-server-node/src/event-iterator.test.ts

+22-5
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,28 @@ describe('toEventStream', () => {
165165
.pipeThrough(new TextDecoderStream())
166166
.getReader()
167167

168-
expect((await reader.read()).value).toEqual('event: message\nid: id-1\ndata: {"order":1}\n\n')
169-
expect((await reader.read()).value).toEqual('event: message\nretry: 20000\ndata: {"order":2}\n\n')
170-
expect((await reader.read()).value).toEqual('event: message\n\n')
171-
expect((await reader.read()).value).toEqual('event: done\nretry: 40000\nid: id-4\ndata: {"order":4}\n\n')
172-
expect((await reader.read()).done).toEqual(true)
168+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nid: id-1\ndata: {"order":1}\n\n' })
169+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nretry: 20000\ndata: {"order":2}\n\n' })
170+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\n\n' })
171+
expect((await reader.read())).toEqual({ done: false, value: 'event: done\nretry: 40000\nid: id-4\ndata: {"order":4}\n\n' })
172+
expect((await reader.read())).toEqual({ done: true, value: undefined })
173+
})
174+
175+
it('without return', async () => {
176+
async function* gen() {
177+
yield withEventMeta({ order: 1 }, { id: 'id-1' })
178+
yield withEventMeta({ order: 2 }, { retry: 20000 })
179+
yield undefined
180+
}
181+
182+
const reader = Readable.toWeb(toEventStream(gen(), {}))
183+
.pipeThrough(new TextDecoderStream())
184+
.getReader()
185+
186+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nid: id-1\ndata: {"order":1}\n\n' })
187+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\nretry: 20000\ndata: {"order":2}\n\n' })
188+
expect((await reader.read())).toEqual({ done: false, value: 'event: message\n\n' })
189+
expect((await reader.read())).toEqual({ done: true, value: undefined })
173190
})
174191

175192
it('with normal error', async () => {

packages/standard-server-node/src/event-iterator.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,15 @@ export function toEventStream(
116116

117117
clearInterval(timeout)
118118

119-
controller.enqueue(encodeEventMessage({
120-
...getEventMeta(value.value),
121-
event: value.done ? 'done' : 'message',
122-
data: stringifyJSON(value.value),
123-
}))
119+
const meta = getEventMeta(value.value)
120+
121+
if (!value.done || value.value !== undefined || meta !== undefined) {
122+
controller.enqueue(encodeEventMessage({
123+
...meta,
124+
event: value.done ? 'done' : 'message',
125+
data: stringifyJSON(value.value),
126+
}))
127+
}
124128

125129
if (value.done) {
126130
controller.close()

0 commit comments

Comments
 (0)