it-ws
Version:
Simple async iterables for websocket client connections
39 lines • 1.39 kB
JavaScript
import ready from './ready.js';
export default (socket, options) => {
options = options ?? {};
options.closeOnEnd = options.closeOnEnd !== false;
const sink = async (source) => {
for await (const data of source) {
try {
await ready(socket);
}
catch (err) {
if (err.message === 'socket closed')
break;
throw err;
}
// the ready promise resolved without error but the socket was closing so
// exit the loop and don't send data
if (socket.readyState === socket.CLOSING || socket.readyState === socket.CLOSED) {
break;
}
socket.send(data);
}
if (options.closeOnEnd != null && socket.readyState <= 1) {
await new Promise((resolve, reject) => {
socket.addEventListener('close', event => {
if (event.wasClean || event.code === 1006) {
resolve();
}
else {
const err = Object.assign(new Error('ws error'), { event });
reject(err);
}
});
setTimeout(() => { socket.close(); });
});
}
};
return sink;
};
//# sourceMappingURL=sink.js.map