diff --git a/package.json b/package.json index ba97487..cabb62f 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ }, "homepage": "https://github.com/libp2p/js-libp2p-websockets#readme", "dependencies": { - "abortable-iterator": "^1.0.4", + "abortable-iterator": "^2.0.0", "async-iterator-to-pull-stream": "^1.3.0", "class-is": "^1.1.0", "debug": "^4.1.1", diff --git a/src/index.js b/src/index.js index 16110e3..bf93f81 100644 --- a/src/index.js +++ b/src/index.js @@ -28,8 +28,8 @@ class WebSockets { let onAbort const abort = new Promise((resolve, reject) => { onAbort = () => { + reject(new AbortError()) socket.close() - reject(new AbortError('connection aborted')) } // Already aborted? diff --git a/src/listener.js b/src/listener.js index 5c5422e..6ffdda6 100644 --- a/src/listener.js +++ b/src/listener.js @@ -2,7 +2,7 @@ const multiaddr = require('multiaddr') const os = require('os') -const createServer = require('it-ws/server') +const { createServer } = require('it-ws') module.exports = (options, handler) => { if (typeof options === 'function') { diff --git a/test/compliance.node.js b/test/compliance.node.js index 18ef713..13e4605 100644 --- a/test/compliance.node.js +++ b/test/compliance.node.js @@ -3,6 +3,7 @@ const tests = require('interface-transport') const multiaddr = require('multiaddr') +const http = require('http') const WS = require('../src') describe('compliance', () => { @@ -15,7 +16,47 @@ describe('compliance', () => { multiaddr('/dns4/ipfs.io/tcp/9092/ws'), multiaddr('/dns4/ipfs.io/tcp/9092/wss') ] - return { transport: ws, addrs } + + let delayMs = 0 + const delayedCreateListener = (options, handler) => { + if (typeof options === 'function') { + handler = options + options = {} + } + + options = options || {} + + // A server that will delay the upgrade event by delayMs + options.server = new Proxy(http.createServer(), { + get (server, prop) { + if (prop === 'on') { + return (event, handler) => { + server.on(event, (...args) => { + if (event !== 'upgrade' || !delayMs) { + return handler(...args) + } + setTimeout(() => handler(...args), delayMs) + }) + } + } + return server[prop] + } + }) + + return ws.createListener(options, handler) + } + + const wsProxy = new Proxy(ws, { + get: (_, prop) => prop === 'createListener' ? delayedCreateListener : ws[prop] + }) + + // Used by the dial tests to simulate a delayed connect + const connector = { + delay (ms) { delayMs = ms }, + restore () { delayMs = 0 } + } + + return { transport: wsProxy, addrs, connector } }, async teardown () {} })