wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
1
{"version":3,"file":"connector.js","names":["_net","_interopRequireDefault","require","_nodeUrl","e","__esModule","default","connectInParallel","options","lookup","signal","throwIfAborted","addresses","lookupAllAddresses","host","Promise","resolve","reject","sockets","Array","length","errors","onError","err","push","removeListener","onConnect","destroy","removeEventListener","onAbort","AggregateError","j","socket","reason","i","len","net","connect","address","family","on","addEventListener","once","connectInSequence","isIPv6","isIPv4","domainInASCII","url","domainToASCII","all"],"sources":["../src/connector.ts"],"sourcesContent":["import net from 'net';\nimport dns, { type LookupAddress } from 'dns';\n\nimport url from 'node:url';\n\ntype LookupFunction = (hostname: string, options: dns.LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: dns.LookupAddress[]) => void) => void;\n\nexport async function connectInParallel(options: { host: string, port: number, localAddress?: string | undefined }, lookup: LookupFunction, signal: AbortSignal) {\n  signal.throwIfAborted();\n\n  const addresses = await lookupAllAddresses(options.host, lookup, signal);\n\n  return await new Promise<net.Socket>((resolve, reject) => {\n    const sockets = new Array(addresses.length);\n\n    const errors: Error[] = [];\n\n    function onError(this: net.Socket, err: Error) {\n      errors.push(err);\n\n      this.removeListener('error', onError);\n      this.removeListener('connect', onConnect);\n\n      this.destroy();\n\n      if (errors.length === addresses.length) {\n        signal.removeEventListener('abort', onAbort);\n\n        reject(new AggregateError(errors, 'Could not connect (parallel)'));\n      }\n    }\n\n    function onConnect(this: net.Socket) {\n      signal.removeEventListener('abort', onAbort);\n\n      for (let j = 0; j < sockets.length; j++) {\n        const socket = sockets[j];\n\n        if (this === socket) {\n          continue;\n        }\n\n        socket.removeListener('error', onError);\n        socket.removeListener('connect', onConnect);\n        socket.destroy();\n      }\n\n      resolve(this);\n    }\n\n    const onAbort = () => {\n      for (let j = 0; j < sockets.length; j++) {\n        const socket = sockets[j];\n\n        socket.removeListener('error', onError);\n        socket.removeListener('connect', onConnect);\n\n        socket.destroy();\n      }\n\n      reject(signal.reason);\n    };\n\n    for (let i = 0, len = addresses.length; i < len; i++) {\n      const socket = sockets[i] = net.connect({\n        ...options,\n        host: addresses[i].address,\n        family: addresses[i].family\n      });\n\n      socket.on('error', onError);\n      socket.on('connect', onConnect);\n    }\n\n    signal.addEventListener('abort', onAbort, { once: true });\n  });\n}\n\nexport async function connectInSequence(options: { host: string, port: number, localAddress?: string | undefined }, lookup: LookupFunction, signal: AbortSignal) {\n  signal.throwIfAborted();\n\n  const errors: any[] = [];\n  const addresses = await lookupAllAddresses(options.host, lookup, signal);\n\n  for (const address of addresses) {\n    try {\n      return await new Promise<net.Socket>((resolve, reject) => {\n        const socket = net.connect({\n          ...options,\n          host: address.address,\n          family: address.family\n        });\n\n        const onAbort = () => {\n          socket.removeListener('error', onError);\n          socket.removeListener('connect', onConnect);\n\n          socket.destroy();\n\n          reject(signal.reason);\n        };\n\n        const onError = (err: Error) => {\n          signal.removeEventListener('abort', onAbort);\n\n          socket.removeListener('error', onError);\n          socket.removeListener('connect', onConnect);\n\n          socket.destroy();\n\n          reject(err);\n        };\n\n        const onConnect = () => {\n          signal.removeEventListener('abort', onAbort);\n\n          socket.removeListener('error', onError);\n          socket.removeListener('connect', onConnect);\n\n          resolve(socket);\n        };\n\n        signal.addEventListener('abort', onAbort, { once: true });\n\n        socket.on('error', onError);\n        socket.on('connect', onConnect);\n      });\n    } catch (err) {\n      // If the signal was aborted, re-throw the error.\n      signal.throwIfAborted();\n\n      errors.push(err);\n\n      continue;\n    }\n  }\n\n  throw new AggregateError(errors, 'Could not connect (sequence)');\n}\n\n/**\n * Look up all addresses for the given hostname.\n */\nexport async function lookupAllAddresses(host: string, lookup: LookupFunction, signal: AbortSignal): Promise<dns.LookupAddress[]> {\n  signal.throwIfAborted();\n\n  if (net.isIPv6(host)) {\n    return [{ address: host, family: 6 }];\n  } else if (net.isIPv4(host)) {\n    return [{ address: host, family: 4 }];\n  } else {\n    return await new Promise<LookupAddress[]>((resolve, reject) => {\n      const onAbort = () => {\n        reject(signal.reason);\n      };\n\n      signal.addEventListener('abort', onAbort);\n\n      const domainInASCII = url.domainToASCII(host);\n      lookup(domainInASCII === '' ? host : domainInASCII, { all: true }, (err, addresses) => {\n        signal.removeEventListener('abort', onAbort);\n\n        err ? reject(err) : resolve(addresses);\n      });\n    });\n  }\n}\n"],"mappings":"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","ignoreList":[]}