diff --git a/test/eventsource/eventsource-attributes.js b/test/eventsource/eventsource-attributes.js index 42465c912c7..f6b9f0a2cc8 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') @@ -11,8 +11,7 @@ describe('EventSource - eventhandler idl', async () => { res.writeHead(200, 'dummy') }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port let done = 0 diff --git a/test/eventsource/eventsource-close.js b/test/eventsource/eventsource-close.js index aef42e95185..805306459be 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.onopen = () => { 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 }) }) 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..aa3273343db 100644 --- a/test/eventsource/eventsource-message.js +++ b/test/eventsource/eventsource-message.js @@ -1,365 +1,238 @@ '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 { test, describe, after } = require('node:test') +const { tspl } = require('@matteo.collina/tspl') +const { EventSource, defaultReconnectionTime } = require('../../lib/web/eventsource/eventsource') +const FakeTimers = require('@sinonjs/fake-timers') 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 - }) + 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' }) res.write('retry: 100\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - server.listen(0) - await events.once(server, 'listening') + after(() => server.close()) + 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 = () => { - assert.ok(Date.now() - start >= 100) - assert.ok(Date.now() - start < 1000) - server.close() + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { + 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() - server.close() } - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('event:message\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.onmessage = () => { - finishedPromise.reject('Should not have received a message') + t.fail('Should not have received a message') eventSourceInstance.close() - server.close() } - await setTimeout(500) - server.close() eventSourceInstance.close() - finishedPromise.resolve() + t.ok('Should not have received a message') - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('event:custom\ndata:test\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.addEventListener('custom', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() - server.close() }) - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('data:test\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.addEventListener('message', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() - server.close() }) - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('data\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.addEventListener('message', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() - server.close() }) - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('event:custom\ndata:\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.addEventListener('custom', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() - server.close() }) - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('data:\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.addEventListener('message', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() - server.close() }) - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - 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 - }) + 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' }) res.write('event:custom\ndata\n\n') - await setTimeout(100) - - res.end() + setTimeout(() => res.end(), 100) }) - 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.addEventListener('custom', () => { - finishedPromise.resolve() + t.ok(true) eventSourceInstance.close() - server.close() }) - await setTimeout(500) - - await finishedPromise.promise + await t.completed }) - test('Should not emit a custom type message if no data is provided', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } + test('Should not emit a custom type message if no data is provided', async (t) => { + const clock = FakeTimers.install() + after(() => clock.uninstall()) - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + t = tspl(t, { plan: 1 }) 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 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 = async () => { - eventSourceInstance.onopen = () => { - if (++reconnectionCount === 2) { - server.close() - eventSourceInstance.close() - finishedPromise.resolve() - } + eventSourceInstance.onopen = () => { + if (++reconnectionCount === 2) { + eventSourceInstance.close() + t.ok(true) } } eventSourceInstance.addEventListener('custom', () => { - finishedPromise.reject('Should not have received a message') + t.fail('Should not have received a message') eventSourceInstance.close() - server.close() }) - await setTimeout(500) + await once(eventSourceInstance, 'open') + clock.tick(defaultReconnectionTime) + await once(eventSourceInstance, 'error') - await finishedPromise.promise + clock.tick(defaultReconnectionTime) + await once(eventSourceInstance, 'open') + clock.tick(defaultReconnectionTime) + await t.completed }) }) diff --git a/test/eventsource/eventsource-reconnect.js b/test/eventsource/eventsource-reconnect.js index 8459bb00d69..e254ef4e75a 100644 --- a/test/eventsource/eventsource-reconnect.js +++ b/test/eventsource/eventsource-reconnect.js @@ -1,155 +1,149 @@ '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 { 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') describe('EventSource - reconnect', () => { - test('Should reconnect on connection close', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } + test('Should reconnect on connection closed by server', async (t) => { + t = tspl(t, { plan: 1 }) - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + const clock = FakeTimers.install() + after(() => clock.uninstall()) const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.end() }) + after(() => 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.onopen = () => { - server.close() + let connectionCount = 0 + eventSourceInstance.onopen = () => { + if (++connectionCount === 2) { eventSourceInstance.close() - finishedPromise.resolve() + t.ok(true) } } - await finishedPromise.promise - }) + await once(eventSourceInstance, 'open') - test('Should reconnect on with reconnection timeout', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } + clock.tick(10) + await once(eventSourceInstance, 'error') - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + clock.tick(defaultReconnectionTime) + + await t.completed + }) + + test('Should reconnect on with reconnection timeout', async (t) => { + t = tspl(t, { plan: 1 }) + const clock = FakeTimers.install() + after(() => clock.uninstall()) const server = http.createServer({ joinDuplicateHeaders: true }, (req, res) => { res.writeHead(200, 'OK', { 'Content-Type': 'text/event-stream' }) res.end() }) - - server.listen(0) - await events.once(server, 'listening') + 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}`) - 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() + t.ok(true) } } - await finishedPromise.promise - }) + await once(eventSourceInstance, 'open') - test('Should reconnect on with modified reconnection timeout', async () => { - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } + clock.tick(10) + await once(eventSourceInstance, 'error') - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + clock.tick(defaultReconnectionTime) + + await t.completed + }) + + test('Should reconnect on with modified reconnection timeout', async (t) => { + t = tspl(t, { plan: 1 }) + const clock = FakeTimers.install() + after(() => clock.uninstall()) 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() }) - - server.listen(0) - await events.once(server, 'listening') + 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}`) - 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() + t.ok(true) } } - await finishedPromise.promise - }) + await once(eventSourceInstance, 'open') - test('Should reconnect and send lastEventId', async () => { - let requestCount = 0 + clock.tick(10) + await once(eventSourceInstance, 'error') - const finishedPromise = { - promise: undefined, - resolve: undefined, - reject: undefined - } + clock.tick(100) - finishedPromise.promise = new Promise((resolve, reject) => { - finishedPromise.resolve = resolve - finishedPromise.reject = reject - }) + await t.completed + }) + + test('Should reconnect and send lastEventId', async (t) => { + t = tspl(t, { plan: 1 }) + const clock = FakeTimers.install() + after(() => clock.uninstall()) + + let requestCount = 0 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() }) - - server.listen(0) - await events.once(server, 'listening') + 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}`) - eventSourceInstance.onopen = async () => { - eventSourceInstance.onopen = () => { - assert.ok(Date.now() - start >= 3000) - server.close() - eventSourceInstance.close() - finishedPromise.resolve() - } - } - await finishedPromise.promise + await once(eventSourceInstance, 'open') + + clock.tick(10) + await once(eventSourceInstance, 'error') + + clock.tick(defaultReconnectionTime) + await once(eventSourceInstance, 'open') + + await t.completed }) }) diff --git a/test/eventsource/eventsource-redirecting.js b/test/eventsource/eventsource-redirecting.js index 20bfa983994..1f054aaa2f1 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') @@ -19,8 +19,7 @@ describe('EventSource - redirecting', () => { } }) - server.listen(0) - await events.once(server, 'listening') + await once(server.listen(0), 'listening') const port = server.address().port @@ -47,8 +46,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 +71,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`) @@ -92,17 +89,16 @@ describe('EventSource - redirecting', () => { res.write('event: message\ndata: test\n\n') } }) - targetServer.listen(0) - await events.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 events.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 694ae160213..12af17f7c1d 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') @@ -14,9 +14,7 @@ describe('EventSource - status error', () => { 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}`)