From 9f6ff4ade9ca842e2886bf6384f18e5b73538a12 Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 11:36:30 +0200 Subject: [PATCH 1/8] reduce time for test/eventsource/eventsource-close.js --- test/eventsource/eventsource-close.js | 44 +++++++++++++++------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/test/eventsource/eventsource-close.js b/test/eventsource/eventsource-close.js index aef42e95185..8ff0e7bb98c 100644 --- a/test/eventsource/eventsource-close.js +++ b/test/eventsource/eventsource-close.js @@ -1,59 +1,63 @@ 'use strict' -const assert = require('node:assert') -const events = require('node:events') +const { tspl } = require('@matteo.collina/tspl') +const { once } = require('node:events') const http = require('node:http') -const { setTimeout } = require('node:timers/promises') -const { test, describe } = require('node:test') +const { test, describe, after } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') describe('EventSource - close', () => { - test('should not emit error when closing the EventSource Instance', async () => { + test('should not emit error when closing the EventSource Instance', async (t) => { + t = tspl(t, { plan: 1 }) + const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { - assert.strictEqual(req.headers.connection, 'keep-alive') + t.strictEqual(req.headers.connection, 'keep-alive') res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('data: hello\n\n') + + res.on('close', () => { + server.close() + }) }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.onopen = async () => { eventSourceInstance.close() - await setTimeout(1000, { ref: false }) - server.close() } eventSourceInstance.onerror = () => { - assert.fail('Should not have errored') + t.fail('Should not have errored') } + + await t.completed }) - test('should set readyState to CLOSED', async () => { + test('should set readyState to CLOSED', async (t) => { + t = tspl(t, { plan: 3 }) const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { - assert.strictEqual(req.headers.connection, 'keep-alive') + t.strictEqual(req.headers.connection, 'keep-alive') res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('data: hello\n\n') }) - server.listen(0) - await events.once(server, 'listening') + after(() => server.close()) + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.onopen = () => { - assert.strictEqual(eventSourceInstance.readyState, EventSource.OPEN) + t.strictEqual(eventSourceInstance.readyState, EventSource.OPEN) eventSourceInstance.close() - assert.strictEqual(eventSourceInstance.readyState, EventSource.CLOSED) + t.strictEqual(eventSourceInstance.readyState, EventSource.CLOSED) } eventSourceInstance.onerror = () => { - assert.fail('Should not have errored') + t.fail('Should not have errored') } - await setTimeout(2000, { ref: false }) - server.close() + await t.completed }) }) From d9a4b90c839b6fb687b11f6a799abe69e065c8d5 Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 11:40:13 +0200 Subject: [PATCH 2/8] import once properly, use createDeferredPromise --- test/eventsource/eventsource-attributes.js | 4 +- test/eventsource/eventsource-connect.js | 42 +++--- .../eventsource-constructor-stringify.js | 5 +- test/eventsource/eventsource-constructor.js | 8 +- test/eventsource/eventsource-message.js | 122 +++--------------- test/eventsource/eventsource-reconnect.js | 14 +- test/eventsource/eventsource-redirecting.js | 14 +- .../eventsource-request-status-error.js | 4 +- 8 files changed, 57 insertions(+), 156 deletions(-) diff --git a/test/eventsource/eventsource-attributes.js b/test/eventsource/eventsource-attributes.js index 42465c912c7..0ac13e29ed2 100644 --- a/test/eventsource/eventsource-attributes.js +++ b/test/eventsource/eventsource-attributes.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') @@ -12,7 +12,7 @@ describe('EventSource - eventhandler idl', async () => { }) server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port let done = 0 diff --git a/test/eventsource/eventsource-connect.js b/test/eventsource/eventsource-connect.js index 95af14d5567..3c69505e289 100644 --- a/test/eventsource/eventsource-connect.js +++ b/test/eventsource/eventsource-connect.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe, after } = require('node:test') const FakeTimers = require('@sinonjs/fake-timers') @@ -16,8 +16,7 @@ describe('EventSource - sending correct request headers', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -38,8 +37,7 @@ describe('EventSource - sending correct request headers', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -61,8 +59,7 @@ describe('EventSource - sending correct request headers', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -83,8 +80,7 @@ describe('EventSource - sending correct request headers', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -106,8 +102,7 @@ describe('EventSource - received response must have content-type to be text/even res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -127,8 +122,7 @@ describe('EventSource - received response must have content-type to be text/even res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -148,8 +142,7 @@ describe('EventSource - received response must have content-type to be text/even res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -169,8 +162,7 @@ describe('EventSource - received response must have content-type to be text/even res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -199,15 +191,15 @@ describe('EventSource - received response must have content-type to be text/even } clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') const start = Date.now() clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') const end = Date.now() eventSourceInstance.close() @@ -234,15 +226,15 @@ describe('EventSource - received response must have content-type to be text/even onerrorCalls.push(error) } - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') const start = Date.now() clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') clock.tick(reconnectionTime) - await events.once(eventSourceInstance, 'error') + await once(eventSourceInstance, 'error') const end = Date.now() eventSourceInstance.close() diff --git a/test/eventsource/eventsource-constructor-stringify.js b/test/eventsource/eventsource-constructor-stringify.js index a8cd6b14986..f4c6415445e 100644 --- a/test/eventsource/eventsource-constructor-stringify.js +++ b/test/eventsource/eventsource-constructor-stringify.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') @@ -14,8 +14,7 @@ describe('EventSource - constructor stringify', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource({ toString: function () { return `http://localhost:${port}` } }) diff --git a/test/eventsource/eventsource-constructor.js b/test/eventsource/eventsource-constructor.js index 49a818e4cce..d0dcc7d2023 100644 --- a/test/eventsource/eventsource-constructor.js +++ b/test/eventsource/eventsource-constructor.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') @@ -13,8 +13,7 @@ describe('EventSource - withCredentials', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -35,8 +34,7 @@ describe('EventSource - withCredentials', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`, { withCredentials: true }) diff --git a/test/eventsource/eventsource-message.js b/test/eventsource/eventsource-message.js index 9de1eae4b43..cca63a3cc80 100644 --- a/test/eventsource/eventsource-message.js +++ b/test/eventsource/eventsource-message.js @@ -1,24 +1,16 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { setTimeout } = require('node:timers/promises') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') +const { createDeferredPromise } = require('../../lib/util/promise') describe('EventSource - message', () => { test('Should not emit a message if only retry field was sent', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -28,8 +20,7 @@ describe('EventSource - message', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const start = Date.now() @@ -55,16 +46,7 @@ describe('EventSource - message', () => { }) test('Should not emit a message if no data is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -74,8 +56,7 @@ describe('EventSource - message', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -95,16 +76,7 @@ describe('EventSource - message', () => { }) test('Should emit a custom type message if data is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -116,7 +88,7 @@ describe('EventSource - message', () => { server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -132,16 +104,7 @@ describe('EventSource - message', () => { }) test('Should emit a message event if data is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -153,7 +116,7 @@ describe('EventSource - message', () => { server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -169,16 +132,7 @@ describe('EventSource - message', () => { }) test('Should emit a message event if data as a field is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -190,7 +144,7 @@ describe('EventSource - message', () => { server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -206,16 +160,7 @@ describe('EventSource - message', () => { }) test('Should emit a custom message event if data is empty', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -227,7 +172,7 @@ describe('EventSource - message', () => { server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -243,16 +188,7 @@ describe('EventSource - message', () => { }) test('Should emit a message event if data is empty', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -264,7 +200,7 @@ describe('EventSource - message', () => { server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -280,16 +216,7 @@ describe('EventSource - message', () => { }) test('Should emit a custom message event if data only as a field is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -301,7 +228,7 @@ describe('EventSource - message', () => { server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -317,16 +244,7 @@ describe('EventSource - message', () => { }) test('Should not emit a custom type message if no data is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -339,7 +257,7 @@ describe('EventSource - message', () => { server.listen(0) let reconnectionCount = 0 - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) diff --git a/test/eventsource/eventsource-reconnect.js b/test/eventsource/eventsource-reconnect.js index 8459bb00d69..b5b94499f1b 100644 --- a/test/eventsource/eventsource-reconnect.js +++ b/test/eventsource/eventsource-reconnect.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') @@ -24,8 +24,7 @@ describe('EventSource - reconnect', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) @@ -57,8 +56,7 @@ describe('EventSource - reconnect', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const start = Date.now() @@ -93,8 +91,7 @@ describe('EventSource - reconnect', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const start = Date.now() @@ -135,8 +132,7 @@ describe('EventSource - reconnect', () => { res.end() }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const start = Date.now() diff --git a/test/eventsource/eventsource-redirecting.js b/test/eventsource/eventsource-redirecting.js index 20bfa983994..d106f0b369f 100644 --- a/test/eventsource/eventsource-redirecting.js +++ b/test/eventsource/eventsource-redirecting.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') @@ -20,7 +20,7 @@ describe('EventSource - redirecting', () => { }) server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port @@ -47,8 +47,7 @@ describe('EventSource - redirecting', () => { } }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}/redirect`) @@ -73,8 +72,7 @@ describe('EventSource - redirecting', () => { } }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}/redirect`) @@ -93,7 +91,7 @@ describe('EventSource - redirecting', () => { } }) targetServer.listen(0) - await events.once(targetServer, 'listening') + await once(targetServer, 'listening') const targetPort = targetServer.address().port const sourceServer = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { @@ -101,7 +99,7 @@ describe('EventSource - redirecting', () => { res.end() }) sourceServer.listen(0) - await events.once(sourceServer, 'listening') + await once(sourceServer, 'listening') const sourcePort = sourceServer.address().port diff --git a/test/eventsource/eventsource-request-status-error.js b/test/eventsource/eventsource-request-status-error.js index 694ae160213..59ee6cb22c6 100644 --- a/test/eventsource/eventsource-request-status-error.js +++ b/test/eventsource/eventsource-request-status-error.js @@ -1,7 +1,7 @@ 'use strict' const assert = require('node:assert') -const events = require('node:events') +const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') @@ -15,7 +15,7 @@ describe('EventSource - status error', () => { }) server.listen(0) - await events.once(server, 'listening') + await once(server, 'listening') const port = server.address().port From 44d0fc863c9363646317ab6905a54ccd4a2a9923 Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 11:57:27 +0200 Subject: [PATCH 3/8] use createDeferredPromise in eventsource-reconnect.js --- test/eventsource/eventsource-reconnect.js | 45 +++-------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/test/eventsource/eventsource-reconnect.js b/test/eventsource/eventsource-reconnect.js index b5b94499f1b..1acbfddba20 100644 --- a/test/eventsource/eventsource-reconnect.js +++ b/test/eventsource/eventsource-reconnect.js @@ -5,19 +5,11 @@ const { once } = require('node:events') const http = require('node:http') const { test, describe } = require('node:test') const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') +const { createDeferredPromise } = require('../../lib/util/promise') describe('EventSource - reconnect', () => { test('Should reconnect on connection close', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -40,16 +32,7 @@ describe('EventSource - reconnect', () => { }) test('Should reconnect on with reconnection timeout', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -74,16 +57,7 @@ describe('EventSource - reconnect', () => { }) test('Should reconnect on with modified reconnection timeout', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -112,16 +86,7 @@ describe('EventSource - reconnect', () => { test('Should reconnect and send lastEventId', async () => { let requestCount = 0 - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } - - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) From cad241af3e15cc04526faa04349b2384c5e71aec Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 12:13:06 +0200 Subject: [PATCH 4/8] optimize further --- test/eventsource/eventsource-close.js | 2 +- test/eventsource/eventsource-message.js | 118 ++++++---------------- test/eventsource/eventsource-reconnect.js | 33 +++--- 3 files changed, 53 insertions(+), 100 deletions(-) diff --git a/test/eventsource/eventsource-close.js b/test/eventsource/eventsource-close.js index 8ff0e7bb98c..805306459be 100644 --- a/test/eventsource/eventsource-close.js +++ b/test/eventsource/eventsource-close.js @@ -24,7 +24,7 @@ describe('EventSource - close', () => { const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { + eventSourceInstance.onopen = () => { eventSourceInstance.close() } diff --git a/test/eventsource/eventsource-message.js b/test/eventsource/eventsource-message.js index cca63a3cc80..7ae3cf00db1 100644 --- a/test/eventsource/eventsource-message.js +++ b/test/eventsource/eventsource-message.js @@ -3,7 +3,6 @@ const assert = require('node:assert') const { once } = require('node:events') const http = require('node:http') -const { setTimeout } = require('node:timers/promises') const { test, describe } = require('node:test') const { EventSource } = require('../../lib/web/eventsource/eventsource') const { createDeferredPromise } = require('../../lib/util/promise') @@ -15,21 +14,19 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('retry: 100\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) await once(server.listen(0), 'listening') const port = server.address().port const start = Date.now() + let connectionCount = 0 const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { assert.ok(Date.now() - start >= 100) assert.ok(Date.now() - start < 1000) - server.close() eventSourceInstance.close() finishedPromise.resolve() } @@ -37,12 +34,10 @@ describe('EventSource - message', () => { eventSourceInstance.onmessage = () => { finishedPromise.reject('Should not have received a message') eventSourceInstance.close() - server.close() } - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should not emit a message if no data is provided', async () => { @@ -51,9 +46,7 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('event:message\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) await once(server.listen(0), 'listening') @@ -64,15 +57,13 @@ describe('EventSource - message', () => { eventSourceInstance.onmessage = () => { finishedPromise.reject('Should not have received a message') eventSourceInstance.close() - server.close() } - await setTimeout(500) - server.close() eventSourceInstance.close() finishedPromise.resolve() await finishedPromise.promise + server.close() }) test('Should emit a custom type message if data is provided', async () => { @@ -81,26 +72,20 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('event:custom\ndata:test\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('custom', () => { finishedPromise.resolve() eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should emit a message event if data is provided', async () => { @@ -109,26 +94,20 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('data:test\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('message', () => { finishedPromise.resolve() eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should emit a message event if data as a field is provided', async () => { @@ -137,26 +116,20 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('data\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('message', () => { finishedPromise.resolve() eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should emit a custom message event if data is empty', async () => { @@ -165,26 +138,20 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('event:custom\ndata:\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('custom', () => { finishedPromise.resolve() eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should emit a message event if data is empty', async () => { @@ -193,26 +160,20 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('data:\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('message', () => { finishedPromise.resolve() eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should emit a custom message event if data only as a field is provided', async () => { @@ -221,26 +182,20 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('event:custom\ndata\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('custom', () => { finishedPromise.resolve() eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) test('Should not emit a custom type message if no data is provided', async () => { @@ -249,35 +204,26 @@ describe('EventSource - message', () => { const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('event:custom\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - let reconnectionCount = 0 - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { - if (++reconnectionCount === 2) { - server.close() - eventSourceInstance.close() - finishedPromise.resolve() - } + eventSourceInstance.onopen = () => { + if (++reconnectionCount === 2) { + eventSourceInstance.close() + finishedPromise.resolve() } } eventSourceInstance.addEventListener('custom', () => { finishedPromise.reject('Should not have received a message') eventSourceInstance.close() - server.close() }) - await setTimeout(500) - await finishedPromise.promise + server.close() }) }) diff --git a/test/eventsource/eventsource-reconnect.js b/test/eventsource/eventsource-reconnect.js index 1acbfddba20..2c5c39e3f4a 100644 --- a/test/eventsource/eventsource-reconnect.js +++ b/test/eventsource/eventsource-reconnect.js @@ -8,7 +8,7 @@ const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsou const { createDeferredPromise } = require('../../lib/util/promise') describe('EventSource - reconnect', () => { - test('Should reconnect on connection close', async () => { + test('Should reconnect on connection closed by server', async () => { const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { @@ -20,15 +20,16 @@ describe('EventSource - reconnect', () => { const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { - server.close() + let connectionCount = 0 + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { eventSourceInstance.close() finishedPromise.resolve() } } await finishedPromise.promise + server.close() }) test('Should reconnect on with reconnection timeout', async () => { @@ -44,16 +45,18 @@ describe('EventSource - reconnect', () => { const start = Date.now() const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { + + let connectionCount = 0 + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { assert.ok(Date.now() - start >= defaultReconnectionTime) - server.close() eventSourceInstance.close() finishedPromise.resolve() } } await finishedPromise.promise + server.close() }) test('Should reconnect on with modified reconnection timeout', async () => { @@ -70,17 +73,19 @@ describe('EventSource - reconnect', () => { const start = Date.now() const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { + + let connectionCount = 0 + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { assert.ok(Date.now() - start >= 100) assert.ok(Date.now() - start < 1000) - server.close() eventSourceInstance.close() finishedPromise.resolve() } } await finishedPromise.promise + server.close() }) test('Should reconnect and send lastEventId', async () => { @@ -102,15 +107,17 @@ describe('EventSource - reconnect', () => { const start = Date.now() const eventSourceInstance = new EventSource(`http://localhost:${port}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { + + let connectionCount = 0 + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { assert.ok(Date.now() - start >= 3000) - server.close() eventSourceInstance.close() finishedPromise.resolve() } } await finishedPromise.promise + server.close() }) }) From 857ee832b0e808f0d50b99a3385d181a673d46bd Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 12:28:00 +0200 Subject: [PATCH 5/8] improve eventsource-reconnect.js --- test/eventsource/eventsource-reconnect.js | 46 +++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/test/eventsource/eventsource-reconnect.js b/test/eventsource/eventsource-reconnect.js index 2c5c39e3f4a..1f33fd8381d 100644 --- a/test/eventsource/eventsource-reconnect.js +++ b/test/eventsource/eventsource-reconnect.js @@ -3,12 +3,16 @@ const assert = require('node:assert') const { once } = require('node:events') const http = require('node:http') -const { test, describe } = require('node:test') +const { test, describe, after } = require('node:test') +const FakeTimers = require('@sinonjs/fake-timers') const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') const { createDeferredPromise } = require('../../lib/util/promise') describe('EventSource - reconnect', () => { test('Should reconnect on connection closed by server', async () => { + const clock = FakeTimers.install() + after(() => clock.uninstall()) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { @@ -28,11 +32,21 @@ describe('EventSource - reconnect', () => { } } + await once(eventSourceInstance, 'open') + + clock.tick(10) + await once(eventSourceInstance, 'error') + + clock.tick(defaultReconnectionTime) + await finishedPromise.promise server.close() }) test('Should reconnect on with reconnection timeout', async () => { + const clock = FakeTimers.install() + after(() => clock.uninstall()) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { @@ -55,11 +69,21 @@ describe('EventSource - reconnect', () => { } } + await once(eventSourceInstance, 'open') + + clock.tick(10) + await once(eventSourceInstance, 'error') + + clock.tick(defaultReconnectionTime) + await finishedPromise.promise server.close() }) test('Should reconnect on with modified reconnection timeout', async () => { + const clock = FakeTimers.install() + after(() => clock.uninstall()) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { @@ -84,13 +108,22 @@ describe('EventSource - reconnect', () => { } } + await once(eventSourceInstance, 'open') + + clock.tick(10) + await once(eventSourceInstance, 'error') + + clock.tick(100) + await finishedPromise.promise server.close() }) test('Should reconnect and send lastEventId', async () => { - let requestCount = 0 + const clock = FakeTimers.install() + after(() => clock.uninstall()) + let requestCount = 0 const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { @@ -111,12 +144,19 @@ describe('EventSource - reconnect', () => { let connectionCount = 0 eventSourceInstance.onopen = () => { if (++connectionCount === 2) { - assert.ok(Date.now() - start >= 3000) + assert.ok(Date.now() - start >= defaultReconnectionTime) eventSourceInstance.close() finishedPromise.resolve() } } + await once(eventSourceInstance, 'open') + + clock.tick(10) + await once(eventSourceInstance, 'error') + + clock.tick(defaultReconnectionTime) + await finishedPromise.promise server.close() }) From 40644b093a55732d751c491d8ee525388d068e90 Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 12:34:51 +0200 Subject: [PATCH 6/8] improve time of eventsource-message --- test/eventsource/eventsource-message.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/test/eventsource/eventsource-message.js b/test/eventsource/eventsource-message.js index 7ae3cf00db1..69c3f743aaa 100644 --- a/test/eventsource/eventsource-message.js +++ b/test/eventsource/eventsource-message.js @@ -3,9 +3,10 @@ const assert = require('node:assert') const { once } = require('node:events') const http = require('node:http') -const { test, describe } = require('node:test') -const { EventSource } = require('../../lib/web/eventsource/eventsource') +const { test, describe, after } = require('node:test') +const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') const { createDeferredPromise } = require('../../lib/util/promise') +const FakeTimers = require('@sinonjs/fake-timers') describe('EventSource - message', () => { test('Should not emit a message if only retry field was sent', async () => { @@ -199,6 +200,9 @@ describe('EventSource - message', () => { }) test('Should not emit a custom type message if no data is provided', async () => { + const clock = FakeTimers.install() + after(() => clock.uninstall()) + const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { @@ -223,6 +227,13 @@ describe('EventSource - message', () => { eventSourceInstance.close() }) + await once(eventSourceInstance, 'open') + clock.tick(defaultReconnectionTime) + await once(eventSourceInstance, 'error') + + clock.tick(defaultReconnectionTime) + await once(eventSourceInstance, 'open') + clock.tick(defaultReconnectionTime) await finishedPromise.promise server.close() }) From bfc4f9597a0d3039f8f2c73f2b8234bdf09f995b Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 12:38:11 +0200 Subject: [PATCH 7/8] reduce lines --- test/eventsource/eventsource-attributes.js | 3 +-- test/eventsource/eventsource-redirecting.js | 10 ++++------ test/eventsource/eventsource-request-status-error.js | 4 +--- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/test/eventsource/eventsource-attributes.js b/test/eventsource/eventsource-attributes.js index 0ac13e29ed2..f6b9f0a2cc8 100644 --- a/test/eventsource/eventsource-attributes.js +++ b/test/eventsource/eventsource-attributes.js @@ -11,8 +11,7 @@ describe('EventSource - eventhandler idl', async () => { res.writeHead(200, 'dummy') }) - server.listen(0) - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port let done = 0 diff --git a/test/eventsource/eventsource-redirecting.js b/test/eventsource/eventsource-redirecting.js index d106f0b369f..1f054aaa2f1 100644 --- a/test/eventsource/eventsource-redirecting.js +++ b/test/eventsource/eventsource-redirecting.js @@ -19,8 +19,7 @@ describe('EventSource - redirecting', () => { } }) - server.listen(0) - await once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port @@ -90,17 +89,16 @@ describe('EventSource - redirecting', () => { res.write('event: message\ndata: test\n\n') } }) - targetServer.listen(0) - await once(targetServer, 'listening') + + await once(targetServer.listen(0), 'listening') const targetPort = targetServer.address().port const sourceServer = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(301, undefined, { Location: `http://127.0.0.1:${targetPort}/target` }) res.end() }) - sourceServer.listen(0) - await once(sourceServer, 'listening') + await once(sourceServer.listen(0), 'listening') const sourcePort = sourceServer.address().port const eventSourceInstance = new EventSource(`http://127.0.0.1:${sourcePort}/redirect`) diff --git a/test/eventsource/eventsource-request-status-error.js b/test/eventsource/eventsource-request-status-error.js index 59ee6cb22c6..12af17f7c1d 100644 --- a/test/eventsource/eventsource-request-status-error.js +++ b/test/eventsource/eventsource-request-status-error.js @@ -14,9 +14,7 @@ describe('EventSource - status error', () => { res.end() }) - server.listen(0) - await once(server, 'listening') - + await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) From e8d85cebb70c4c65229bee4ddfd35b7484f62b03 Mon Sep 17 00:00:00 2001 From: Aras Abbasi Date: Sun, 31 Aug 2025 12:50:05 +0200 Subject: [PATCH 8/8] use tspl instead of createDeferredPromise --- test/eventsource/eventsource-message.js | 102 +++++++++++----------- test/eventsource/eventsource-reconnect.js | 62 +++++-------- 2 files changed, 74 insertions(+), 90 deletions(-) diff --git a/test/eventsource/eventsource-message.js b/test/eventsource/eventsource-message.js index 69c3f743aaa..aa3273343db 100644 --- a/test/eventsource/eventsource-message.js +++ b/test/eventsource/eventsource-message.js @@ -1,16 +1,15 @@ 'use strict' -const assert = require('node:assert') const { once } = require('node:events') const http = require('node:http') const { test, describe, after } = require('node:test') +const { tspl } = require('@matteo.collina/tspl') const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') -const { createDeferredPromise } = require('../../lib/util/promise') const FakeTimers = require('@sinonjs/fake-timers') describe('EventSource - message', () => { - test('Should not emit a message if only retry field was sent', async () => { - const finishedPromise = createDeferredPromise() + test('Should not emit a message if only retry field was sent', async (t) => { + t = tspl(t, { plan: 2 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -18,6 +17,7 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port @@ -26,23 +26,21 @@ describe('EventSource - message', () => { const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.onopen = () => { if (++connectionCount === 2) { - assert.ok(Date.now() - start >= 100) - assert.ok(Date.now() - start < 1000) + t.ok(Date.now() - start >= 100) + t.ok(Date.now() - start < 1000) eventSourceInstance.close() - finishedPromise.resolve() } } eventSourceInstance.onmessage = () => { - finishedPromise.reject('Should not have received a message') + t.fail('Should not have received a message') eventSourceInstance.close() } - await finishedPromise.promise - server.close() + await t.completed }) - test('Should not emit a message if no data is provided', async () => { - const finishedPromise = createDeferredPromise() + test('Should not emit a message if no data is provided', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -50,25 +48,25 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.onmessage = () => { - finishedPromise.reject('Should not have received a message') + t.fail('Should not have received a message') eventSourceInstance.close() } eventSourceInstance.close() - finishedPromise.resolve() + t.ok('Should not have received a message') - await finishedPromise.promise - server.close() + await t.completed }) - test('Should emit a custom type message if data is provided', async () => { - const finishedPromise = createDeferredPromise() + test('Should emit a custom type message if data is provided', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -76,21 +74,21 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('custom', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() }) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should emit a message event if data is provided', async () => { - const finishedPromise = createDeferredPromise() + test('Should emit a message event if data is provided', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -98,21 +96,21 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('message', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() }) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should emit a message event if data as a field is provided', async () => { - const finishedPromise = createDeferredPromise() + test('Should emit a message event if data as a field is provided', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -120,21 +118,21 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('message', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() }) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should emit a custom message event if data is empty', async () => { - const finishedPromise = createDeferredPromise() + test('Should emit a custom message event if data is empty', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -142,21 +140,21 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('custom', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() }) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should emit a message event if data is empty', async () => { - const finishedPromise = createDeferredPromise() + test('Should emit a message event if data is empty', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -164,21 +162,21 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('message', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() }) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should emit a custom message event if data only as a field is provided', async () => { - const finishedPromise = createDeferredPromise() + test('Should emit a custom message event if data only as a field is provided', async (t) => { + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -186,24 +184,24 @@ describe('EventSource - message', () => { setTimeout(() => res.end(), 100) }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port const eventSourceInstance = new EventSource(`http://localhost:${port}`) eventSourceInstance.addEventListener('custom', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() }) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should not emit a custom type message if no data is provided', async () => { + test('Should not emit a custom type message if no data is provided', async (t) => { const clock = FakeTimers.install() after(() => clock.uninstall()) - const finishedPromise = createDeferredPromise() + t = tspl(t, { plan: 1 }) const server = http.createServer({ joinDuplicateHeaders: true }, async (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) @@ -212,6 +210,7 @@ describe('EventSource - message', () => { }) let reconnectionCount = 0 + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port @@ -219,11 +218,11 @@ describe('EventSource - message', () => { eventSourceInstance.onopen = () => { if (++reconnectionCount === 2) { eventSourceInstance.close() - finishedPromise.resolve() + t.ok(true) } } eventSourceInstance.addEventListener('custom', () => { - finishedPromise.reject('Should not have received a message') + t.fail('Should not have received a message') eventSourceInstance.close() }) @@ -234,7 +233,6 @@ describe('EventSource - message', () => { clock.tick(defaultReconnectionTime) await once(eventSourceInstance, 'open') clock.tick(defaultReconnectionTime) - await finishedPromise.promise - server.close() + await t.completed }) }) diff --git a/test/eventsource/eventsource-reconnect.js b/test/eventsource/eventsource-reconnect.js index 1f33fd8381d..e254ef4e75a 100644 --- a/test/eventsource/eventsource-reconnect.js +++ b/test/eventsource/eventsource-reconnect.js @@ -4,21 +4,22 @@ const assert = require('node:assert') const { once } = require('node:events') const http = require('node:http') const { test, describe, after } = require('node:test') +const { tspl } = require('@matteo.collina/tspl') const FakeTimers = require('@sinonjs/fake-timers') const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') -const { createDeferredPromise } = require('../../lib/util/promise') describe('EventSource - reconnect', () => { - test('Should reconnect on connection closed by server', async () => { + test('Should reconnect on connection closed by server', async (t) => { + t = tspl(t, { plan: 1 }) + const clock = FakeTimers.install() after(() => clock.uninstall()) - const finishedPromise = createDeferredPromise() - const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.end() }) + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port @@ -28,7 +29,7 @@ describe('EventSource - reconnect', () => { eventSourceInstance.onopen = () => { if (++connectionCount === 2) { eventSourceInstance.close() - finishedPromise.resolve() + t.ok(true) } } @@ -39,21 +40,19 @@ describe('EventSource - reconnect', () => { clock.tick(defaultReconnectionTime) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should reconnect on with reconnection timeout', async () => { + test('Should reconnect on with reconnection timeout', async (t) => { + t = tspl(t, { plan: 1 }) const clock = FakeTimers.install() after(() => clock.uninstall()) - const finishedPromise = createDeferredPromise() - const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.end() }) - + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port @@ -65,7 +64,7 @@ describe('EventSource - reconnect', () => { if (++connectionCount === 2) { assert.ok(Date.now() - start >= defaultReconnectionTime) eventSourceInstance.close() - finishedPromise.resolve() + t.ok(true) } } @@ -76,22 +75,20 @@ describe('EventSource - reconnect', () => { clock.tick(defaultReconnectionTime) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should reconnect on with modified reconnection timeout', async () => { + test('Should reconnect on with modified reconnection timeout', async (t) => { + t = tspl(t, { plan: 1 }) const clock = FakeTimers.install() after(() => clock.uninstall()) - const finishedPromise = createDeferredPromise() - const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('retry: 100\n\n') res.end() }) - + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port @@ -104,7 +101,7 @@ describe('EventSource - reconnect', () => { assert.ok(Date.now() - start >= 100) assert.ok(Date.now() - start < 1000) eventSourceInstance.close() - finishedPromise.resolve() + t.ok(true) } } @@ -115,49 +112,38 @@ describe('EventSource - reconnect', () => { clock.tick(100) - await finishedPromise.promise - server.close() + await t.completed }) - test('Should reconnect and send lastEventId', async () => { + test('Should reconnect and send lastEventId', async (t) => { + t = tspl(t, { plan: 1 }) const clock = FakeTimers.install() after(() => clock.uninstall()) let requestCount = 0 - const finishedPromise = createDeferredPromise() const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.write('id: 1337\n\n') - if (requestCount++ !== 0) { - assert.strictEqual(req.headers['last-event-id'], '1337') + if (++requestCount === 2) { + t.strictEqual(req.headers['last-event-id'], '1337') } res.end() }) - + after(() => server.close()) await once(server.listen(0), 'listening') const port = server.address().port - const start = Date.now() const eventSourceInstance = new EventSource(`http://localhost:${port}`) - let connectionCount = 0 - eventSourceInstance.onopen = () => { - if (++connectionCount === 2) { - assert.ok(Date.now() - start >= defaultReconnectionTime) - eventSourceInstance.close() - finishedPromise.resolve() - } - } - await once(eventSourceInstance, 'open') clock.tick(10) await once(eventSourceInstance, 'error') clock.tick(defaultReconnectionTime) + await once(eventSourceInstance, 'open') - await finishedPromise.promise - server.close() + await t.completed }) })