142 lines
18 KiB
JavaScript
142 lines
18 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.connectInParallel = connectInParallel;
|
|
exports.connectInSequence = connectInSequence;
|
|
exports.lookupAllAddresses = lookupAllAddresses;
|
|
var _net = _interopRequireDefault(require("net"));
|
|
var _nodeUrl = _interopRequireDefault(require("node:url"));
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
async function connectInParallel(options, lookup, signal) {
|
|
signal.throwIfAborted();
|
|
const addresses = await lookupAllAddresses(options.host, lookup, signal);
|
|
return await new Promise((resolve, reject) => {
|
|
const sockets = new Array(addresses.length);
|
|
const errors = [];
|
|
function onError(err) {
|
|
errors.push(err);
|
|
this.removeListener('error', onError);
|
|
this.removeListener('connect', onConnect);
|
|
this.destroy();
|
|
if (errors.length === addresses.length) {
|
|
signal.removeEventListener('abort', onAbort);
|
|
reject(new AggregateError(errors, 'Could not connect (parallel)'));
|
|
}
|
|
}
|
|
function onConnect() {
|
|
signal.removeEventListener('abort', onAbort);
|
|
for (let j = 0; j < sockets.length; j++) {
|
|
const socket = sockets[j];
|
|
if (this === socket) {
|
|
continue;
|
|
}
|
|
socket.removeListener('error', onError);
|
|
socket.removeListener('connect', onConnect);
|
|
socket.destroy();
|
|
}
|
|
resolve(this);
|
|
}
|
|
const onAbort = () => {
|
|
for (let j = 0; j < sockets.length; j++) {
|
|
const socket = sockets[j];
|
|
socket.removeListener('error', onError);
|
|
socket.removeListener('connect', onConnect);
|
|
socket.destroy();
|
|
}
|
|
reject(signal.reason);
|
|
};
|
|
for (let i = 0, len = addresses.length; i < len; i++) {
|
|
const socket = sockets[i] = _net.default.connect({
|
|
...options,
|
|
host: addresses[i].address,
|
|
family: addresses[i].family
|
|
});
|
|
socket.on('error', onError);
|
|
socket.on('connect', onConnect);
|
|
}
|
|
signal.addEventListener('abort', onAbort, {
|
|
once: true
|
|
});
|
|
});
|
|
}
|
|
async function connectInSequence(options, lookup, signal) {
|
|
signal.throwIfAborted();
|
|
const errors = [];
|
|
const addresses = await lookupAllAddresses(options.host, lookup, signal);
|
|
for (const address of addresses) {
|
|
try {
|
|
return await new Promise((resolve, reject) => {
|
|
const socket = _net.default.connect({
|
|
...options,
|
|
host: address.address,
|
|
family: address.family
|
|
});
|
|
const onAbort = () => {
|
|
socket.removeListener('error', onError);
|
|
socket.removeListener('connect', onConnect);
|
|
socket.destroy();
|
|
reject(signal.reason);
|
|
};
|
|
const onError = err => {
|
|
signal.removeEventListener('abort', onAbort);
|
|
socket.removeListener('error', onError);
|
|
socket.removeListener('connect', onConnect);
|
|
socket.destroy();
|
|
reject(err);
|
|
};
|
|
const onConnect = () => {
|
|
signal.removeEventListener('abort', onAbort);
|
|
socket.removeListener('error', onError);
|
|
socket.removeListener('connect', onConnect);
|
|
resolve(socket);
|
|
};
|
|
signal.addEventListener('abort', onAbort, {
|
|
once: true
|
|
});
|
|
socket.on('error', onError);
|
|
socket.on('connect', onConnect);
|
|
});
|
|
} catch (err) {
|
|
// If the signal was aborted, re-throw the error.
|
|
signal.throwIfAborted();
|
|
errors.push(err);
|
|
continue;
|
|
}
|
|
}
|
|
throw new AggregateError(errors, 'Could not connect (sequence)');
|
|
}
|
|
|
|
/**
|
|
* Look up all addresses for the given hostname.
|
|
*/
|
|
async function lookupAllAddresses(host, lookup, signal) {
|
|
signal.throwIfAborted();
|
|
if (_net.default.isIPv6(host)) {
|
|
return [{
|
|
address: host,
|
|
family: 6
|
|
}];
|
|
} else if (_net.default.isIPv4(host)) {
|
|
return [{
|
|
address: host,
|
|
family: 4
|
|
}];
|
|
} else {
|
|
return await new Promise((resolve, reject) => {
|
|
const onAbort = () => {
|
|
reject(signal.reason);
|
|
};
|
|
signal.addEventListener('abort', onAbort);
|
|
const domainInASCII = _nodeUrl.default.domainToASCII(host);
|
|
lookup(domainInASCII === '' ? host : domainInASCII, {
|
|
all: true
|
|
}, (err, addresses) => {
|
|
signal.removeEventListener('abort', onAbort);
|
|
err ? reject(err) : resolve(addresses);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbmV0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfbm9kZVVybCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY29ubmVjdEluUGFyYWxsZWwiLCJvcHRpb25zIiwibG9va3VwIiwic2lnbmFsIiwidGhyb3dJZkFib3J0ZWQiLCJhZGRyZXNzZXMiLCJsb29rdXBBbGxBZGRyZXNzZXMiLCJob3N0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzb2NrZXRzIiwiQXJyYXkiLCJsZW5ndGgiLCJlcnJvcnMiLCJvbkVycm9yIiwiZXJyIiwicHVzaCIsInJlbW92ZUxpc3RlbmVyIiwib25Db25uZWN0IiwiZGVzdHJveSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvbkFib3J0IiwiQWdncmVnYXRlRXJyb3IiLCJqIiwic29ja2V0IiwicmVhc29uIiwiaSIsImxlbiIsIm5ldCIsImNvbm5lY3QiLCJhZGRyZXNzIiwiZmFtaWx5Iiwib24iLCJhZGRFdmVudExpc3RlbmVyIiwib25jZSIsImNvbm5lY3RJblNlcXVlbmNlIiwiaXNJUHY2IiwiaXNJUHY0IiwiZG9tYWluSW5BU0NJSSIsInVybCIsImRvbWFpblRvQVNDSUkiLCJhbGwiXSwic291cmNlcyI6WyIuLi9zcmMvY29ubmVjdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBkbnMsIHsgdHlwZSBMb29rdXBBZGRyZXNzIH0gZnJvbSAnZG5zJztcblxuaW1wb3J0IHVybCBmcm9tICdub2RlOnVybCc7XG5cbnR5cGUgTG9va3VwRnVuY3Rpb24gPSAoaG9zdG5hbWU6IHN0cmluZywgb3B0aW9uczogZG5zLkxvb2t1cEFsbE9wdGlvbnMsIGNhbGxiYWNrOiAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24gfCBudWxsLCBhZGRyZXNzZXM6IGRucy5Mb29rdXBBZGRyZXNzW10pID0+IHZvaWQpID0+IHZvaWQ7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0SW5QYXJhbGxlbChvcHRpb25zOiB7IGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyLCBsb2NhbEFkZHJlc3M/OiBzdHJpbmcgfCB1bmRlZmluZWQgfSwgbG9va3VwOiBMb29rdXBGdW5jdGlvbiwgc2lnbmFsOiBBYm9ydFNpZ25hbCkge1xuICBzaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBjb25zdCBhZGRyZXNzZXMgPSBhd2FpdCBsb29rdXBBbGxBZGRyZXNzZXMob3B0aW9ucy5ob3N0LCBsb29rdXAsIHNpZ25hbCk7XG5cbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG5ldC5Tb2NrZXQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzb2NrZXRzID0gbmV3IEFycmF5KGFkZHJlc3Nlcy5sZW5ndGgpO1xuXG4gICAgY29uc3QgZXJyb3JzOiBFcnJvcltdID0gW107XG5cbiAgICBmdW5jdGlvbiBvbkVycm9yKHRoaXM6IG5ldC5Tb2NrZXQsIGVycjogRXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGVycik7XG5cbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgICAgdGhpcy5kZXN0cm95KCk7XG5cbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSBhZGRyZXNzZXMubGVuZ3RoKSB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuXG4gICAgICAgIHJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IoZXJyb3JzLCAnQ291bGQgbm90IGNvbm5lY3QgKHBhcmFsbGVsKScpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbkNvbm5lY3QodGhpczogbmV0LlNvY2tldCkge1xuICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc29ja2V0cy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSBzb2NrZXRzW2pdO1xuXG4gICAgICAgIGlmICh0aGlzID09PSBzb2NrZXQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgICAgc29ja2V0LmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbkFib3J0ID0gKCkgPT4ge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzb2NrZXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHNvY2tldHNbal07XG5cbiAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuXG4gICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICB9XG5cbiAgICAgIHJlamVjdChzaWduYWwucmVhc29uKTtcbiAgICB9O1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFkZHJlc3Nlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3Qgc29ja2V0ID0gc29ja2V0c1tpXSA9IG5ldC5jb25uZWN0KHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaG9zdDogYWRkcmVzc2VzW2ldLmFkZHJlc3MsXG4gICAgICAgIGZhbWlseTogYWRkcmVzc2VzW2ldLmZhbWlseVxuICAgICAgfSk7XG5cbiAgICAgIHNvY2tldC5vbignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgIHNvY2tldC5vbignY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgfVxuXG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RJblNlcXVlbmNlKG9wdGlvbnM6IHsgaG9zdDogc3RyaW5nLCBwb3J0OiBudW1iZXIsIGxvY2FsQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZCB9LCBsb29rdXA6IExvb2t1cEZ1bmN0aW9uLCBzaWduYWw6IEFib3J0U2lnbmFsKSB7XG4gIHNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGNvbnN0IGVycm9yczogYW55W10gPSBbXTtcbiAgY29uc3QgYWRkcmVzc2VzID0gYXdhaXQgbG9va3VwQWxsQWRkcmVzc2VzKG9wdGlvbnMuaG9zdCwgbG9va3VwLCBzaWduYWwpO1xuXG4gIGZvciAoY29uc3QgYWRkcmVzcyBvZiBhZGRyZXNzZXMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPG5ldC5Tb2NrZXQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gbmV0LmNvbm5lY3Qoe1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgaG9zdDogYWRkcmVzcy5hZGRyZXNzLFxuICAgICAgICAgIGZhbWlseTogYWRkcmVzcy5mYW1pbHlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG5cbiAgICAgICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG5cbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG5cbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBvbkNvbm5lY3QgPSAoKSA9PiB7XG4gICAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0Jywgb25BYm9ydCk7XG5cbiAgICAgICAgICBzb2NrZXQucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgICAgc29ja2V0LnJlbW92ZUxpc3RlbmVyKCdjb25uZWN0Jywgb25Db25uZWN0KTtcblxuICAgICAgICAgIHJlc29sdmUoc29ja2V0KTtcbiAgICAgICAgfTtcblxuICAgICAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG5cbiAgICAgICAgc29ja2V0Lm9uKCdlcnJvcicsIG9uRXJyb3IpO1xuICAgICAgICBzb2NrZXQub24oJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBJZiB0aGUgc2lnbmFsIHdhcyBhYm9ydGVkLCByZS10aHJvdyB0aGUgZXJyb3IuXG4gICAgICBzaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgICAgZXJyb3JzLnB1c2goZXJyKTtcblxuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgJ0NvdWxkIG5vdCBjb25uZWN0IChzZXF1ZW5jZSknKTtcbn1cblxuLyoqXG4gKiBMb29rIHVwIGFsbCBhZGRyZXNzZXMgZm9yIHRoZSBnaXZlbiBob3N0bmFtZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvb2t1cEFsbEFkZHJlc3Nlcyhob3N0OiBzdHJpbmcsIGxvb2t1cDogTG9va3VwRnVuY3Rpb24sIHNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPGRucy5Mb29rdXBBZGRyZXNzW10+IHtcbiAgc2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG5ldC5pc0lQdjYoaG9zdCkpIHtcbiAgICByZXR1cm4gW3sgYWRkcmVzczogaG9zdCwgZmFtaWx5OiA2IH1dO1xuICB9IGVsc2UgaWYgKG5ldC5pc0lQdjQoaG9zdCkpIHtcbiAgICByZXR1cm4gW3sgYWRkcmVzczogaG9zdCwgZmFtaWx5OiA0IH1dO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxMb29rdXBBZGRyZXNzW10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgIHJlamVjdChzaWduYWwucmVhc29uKTtcbiAgICAgIH07XG5cbiAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuXG4gICAgICBjb25zdCBkb21haW5JbkFTQ0lJID0gdXJsLmRvbWFpblRvQVNDSUkoaG9zdCk7XG4gICAgICBsb29rdXAoZG9tYWluSW5BU0NJSSA9PT0gJycgPyBob3N0IDogZG9tYWluSW5BU0NJSSwgeyBhbGw6IHRydWUgfSwgKGVyciwgYWRkcmVzc2VzKSA9PiB7XG4gICAgICAgIHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIG9uQWJvcnQpO1xuXG4gICAgICAgIGVyciA/IHJlamVjdChlcnIpIDogcmVzb2x2ZShhZGRyZXNzZXMpO1xuICAgICAgfSk7XG4gICAgfSk7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
|