diff --git a/lib/web/eventsource/eventsource-stream.js b/lib/web/eventsource/eventsource-stream.js index 7b9e2f8cbba..ed9de5813e7 100644 --- a/lib/web/eventsource/eventsource-stream.js +++ b/lib/web/eventsource/eventsource-stream.js @@ -309,9 +309,7 @@ class EventSourceStream extends Transform { if (isFieldName(line, fieldLength, EVENT)) { const value = line.toString('utf8', valueStart) - if (value.length > 0) { - event.event = value - } + event.event = value } } diff --git a/test/eventsource/eventsource-message.js b/test/eventsource/eventsource-message.js index f76503752c7..4c52c631105 100644 --- a/test/eventsource/eventsource-message.js +++ b/test/eventsource/eventsource-message.js @@ -86,6 +86,33 @@ describe('EventSource - message', () => { }) }) + test('Should use the default message type when an empty event field replaces a custom type', async (t) => { + t.plan(3) + + const server = http.createServer({ joinDuplicateHeaders: true }, (_req, res) => { + res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) + res.end('event: custom\nevent:\ndata: payload\n\n') + }) + + await once(server.listen(0), 'listening') + const port = server.address().port + const eventSourceInstance = new EventSource(`http://localhost:${port}`) + + t.after(async () => { + eventSourceInstance.close() + await new Promise(resolve => server.close(resolve)) + }) + + const received = await Promise.race([ + once(eventSourceInstance, 'message').then(([event]) => ({ listener: 'message', event })), + once(eventSourceInstance, 'custom').then(([event]) => ({ listener: 'custom', event })) + ]) + + t.assert.strictEqual(received.listener, 'message') + t.assert.strictEqual(received.event.type, 'message') + t.assert.strictEqual(received.event.data, 'payload') + }) + test('Should emit a message event if data is provided', (t, done) => { t.plan(1) diff --git a/test/eventsource/eventsource-stream-parse-line.js b/test/eventsource/eventsource-stream-parse-line.js index cbe66bef286..c1e02b9decf 100644 --- a/test/eventsource/eventsource-stream-parse-line.js +++ b/test/eventsource/eventsource-stream-parse-line.js @@ -258,7 +258,7 @@ describe('EventSourceStream - parseLine', () => { t.assert.strictEqual(event.retry, undefined) }) - test('empty event', (t) => { + test('empty event replaces previous event type', (t) => { const stream = new EventSourceStream({ eventSourceSettings: { ...defaultEventSourceSettings @@ -266,15 +266,11 @@ describe('EventSourceStream - parseLine', () => { }) const event = {} - 'event: \ndata:data'.split('\n').forEach((line) => { - stream.parseLine(Buffer.from(line, 'utf8'), event) - }) - t.assert.strictEqual(typeof event, 'object') - t.assert.strictEqual(Object.keys(event).length, 1) - t.assert.strictEqual(event.data, 'data') - t.assert.strictEqual(event.id, undefined) - t.assert.strictEqual(event.event, undefined) - t.assert.strictEqual(event.retry, undefined) + stream.parseLine(Buffer.from('event: custom', 'utf8'), event) + t.assert.strictEqual(event.event, 'custom') + + stream.parseLine(Buffer.from('event: ', 'utf8'), event) + t.assert.strictEqual(event.event, '') }) })