Skip to content

Commit d0fcce5

Browse files
committed
perf: avoid discarded replay splice results
1 parent 6ba7c59 commit d0fcce5

2 files changed

Lines changed: 25 additions & 2 deletions

File tree

packages/devframe/src/utils/streaming-channel.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,25 @@ describe('streaming-channel sink', () => {
6161
expect(sink.buffer.length).toBe(0)
6262
})
6363

64+
it.each([
65+
{ replayWindow: 1, retained: [5] },
66+
{ replayWindow: 3, retained: [3, 4, 5] },
67+
{ replayWindow: 0.5, retained: [5] },
68+
{ replayWindow: 2.5, retained: [3, 4, 5] },
69+
{ replayWindow: Number.POSITIVE_INFINITY, retained: [1, 2, 3, 4, 5] },
70+
{ replayWindow: Number.NaN, retained: [] },
71+
])('preserves replay entries and buffer identity with window $replayWindow', ({ replayWindow, retained }) => {
72+
const sink = createStreamSink<number>({ replayWindow })
73+
const buffer = sink.buffer
74+
for (let chunk = 1; chunk <= 5; chunk++)
75+
sink.write(chunk)
76+
77+
expect(sink.buffer).toBe(buffer)
78+
expect(buffer).toEqual(retained.map(chunk => ({ seq: chunk, chunk })))
79+
expect(sink.lastSeq).toBe(5)
80+
sink.close()
81+
})
82+
6483
it('aborts signal on close so handlers can short-circuit', () => {
6584
const sink = createStreamSink<string>()
6685
expect(sink.signal.aborted).toBe(false)

packages/devframe/src/utils/streaming-channel.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,12 @@ export function createStreamSink<T>(options: CreateStreamSinkOptions = {}): Stre
151151
lastSeq += 1
152152
if (replayWindow > 0) {
153153
buffer.push({ seq: lastSeq, chunk })
154-
if (buffer.length > replayWindow)
155-
buffer.splice(0, buffer.length - replayWindow)
154+
if (buffer.length > replayWindow) {
155+
if (buffer.length - replayWindow === 1)
156+
buffer.shift()
157+
else
158+
buffer.splice(0, buffer.length - replayWindow)
159+
}
156160
}
157161
events.emit('chunk', lastSeq, chunk)
158162
}

0 commit comments

Comments
 (0)