Comparing version 2.0.0 to 2.1.0
@@ -13,6 +13,9 @@ const source = require('./source') | ||
return { | ||
const duplex = { | ||
sink: sink(socket, options), | ||
source: source(socket, options) | ||
source: source(socket, options), | ||
connected: () => duplex.source.connected() | ||
} | ||
return duplex | ||
} |
{ | ||
"name": "it-ws", | ||
"version": "2.0.0", | ||
"version": "2.1.0", | ||
"description": "Simple async iterables for websocket client connections", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -25,2 +25,4 @@ # it-ws | ||
await stream.connected() // Wait for websocket to be connected (optional) | ||
pipeline(() => source, stream.sink) | ||
@@ -27,0 +29,0 @@ pipeline(() => stream.source, sink) |
@@ -13,3 +13,5 @@ const { Buffer } = require('safe-buffer') | ||
module.exports = socket => { | ||
return (async function * () { | ||
const removeListener = socket.removeEventListener || socket.removeListener | ||
const source = (async function * () { | ||
const messages = new EventIterator( | ||
@@ -22,6 +24,5 @@ (push, stop, fail) => { | ||
(push, stop, fail) => { | ||
const remove = socket.removeEventListener || socket.removeListener | ||
remove.call(socket, 'message', push) | ||
remove.call(socket, 'error', fail) | ||
remove.call(socket, 'close', stop) | ||
removeListener.call(socket, 'message', push) | ||
removeListener.call(socket, 'error', fail) | ||
removeListener.call(socket, 'close', stop) | ||
}, | ||
@@ -35,2 +36,38 @@ { highWaterMark: Infinity } | ||
})() | ||
let connected = socket.readyState === 1 | ||
let connError | ||
socket.addEventListener('open', () => { | ||
connected = true | ||
connError = null | ||
}) | ||
socket.addEventListener('close', () => { | ||
connected = false | ||
connError = null | ||
}) | ||
socket.addEventListener('error', err => { | ||
if (!connected) connError = err | ||
}) | ||
source.connected = () => new Promise((resolve, reject) => { | ||
if (connected) return resolve() | ||
if (connError) return reject(connError) | ||
const cleanUp = cont => { | ||
removeListener.call(socket, 'open', onOpen) | ||
removeListener.call(socket, 'error', onError) | ||
cont() | ||
} | ||
const onOpen = () => cleanUp(resolve) | ||
const onError = err => cleanUp(() => reject(err)) | ||
socket.addEventListener('open', onOpen) | ||
socket.addEventListener('error', onError) | ||
}) | ||
return source | ||
} |
@@ -53,4 +53,13 @@ var test = require('tape') | ||
test('test error', async function (t) { | ||
test('test connection error awaiting connected', async function (t) { | ||
try { | ||
await ws(new WebSocket('ws://localhost:34897/' + Math.random())).connected() | ||
} catch (err) { | ||
t.ok(err.message.includes('ECONNREFUSED')) | ||
t.end() | ||
} | ||
}) | ||
test('test connection error in stream', async function (t) { | ||
try { | ||
await pipeline( | ||
@@ -57,0 +66,0 @@ () => ws(new WebSocket('ws://localhost:34897/' + Math.random())).source, |
26345
641
228