it-ws
Version:
Simple async iterables for websocket client connections
48 lines • 1.55 kB
JavaScript
import sink from './sink.js';
import source from './source.js';
export default (socket, options) => {
options = options ?? {};
const connectedSource = source(socket);
let remoteAddress = options.remoteAddress;
let remotePort = options.remotePort;
if (socket.url != null) {
// only client->server sockets have urls, server->client connections do not
try {
const url = new URL(socket.url);
remoteAddress = url.hostname;
remotePort = parseInt(url.port, 10);
}
catch { }
}
if (remoteAddress == null || remotePort == null) {
throw new Error('Remote connection did not have address and/or port');
}
const duplex = {
sink: sink(socket, options),
source: connectedSource,
connected: async () => { await connectedSource.connected(); },
close: async () => {
if (socket.readyState === socket.CONNECTING || socket.readyState === socket.OPEN) {
await new Promise((resolve) => {
socket.addEventListener('close', () => {
resolve();
});
socket.close();
});
}
},
destroy: () => {
if (socket.terminate != null) {
socket.terminate();
}
else {
socket.close();
}
},
remoteAddress,
remotePort,
socket
};
return duplex;
};
//# sourceMappingURL=duplex.js.map