wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
1
{"version":3,"file":"instance-lookup.js","names":["_dns","_interopRequireDefault","require","_sender","e","__esModule","default","SQL_SERVER_BROWSER_PORT","TIMEOUT","RETRIES","MYSTERY_HEADER_LENGTH","instanceLookup","options","server","TypeError","instanceName","timeout","undefined","retries","lookup","dns","port","signal","throwIfAborted","response","request","Buffer","from","i","timeoutSignal","AbortSignal","sendMessage","any","err","aborted","Error","message","toString","foundPort","parseBrowserResponse","getPort","instances","split","len","length","instance","parts","p","partsLen","name","value","parseInt","toUpperCase"],"sources":["../src/instance-lookup.ts"],"sourcesContent":["import dns from 'dns';\n\nimport { sendMessage } from './sender';\n\nconst SQL_SERVER_BROWSER_PORT = 1434;\nconst TIMEOUT = 2 * 1000;\nconst RETRIES = 3;\n// There are three bytes at the start of the response, whose purpose is unknown.\nconst MYSTERY_HEADER_LENGTH = 3;\n\ntype LookupFunction = (hostname: string, options: dns.LookupAllOptions, callback: (err: NodeJS.ErrnoException | null, addresses: dns.LookupAddress[]) => void) => void;\n\n// Most of the functionality has been determined from from jTDS's MSSqlServerInfo class.\nexport async function instanceLookup(options: { server: string, instanceName: string, timeout?: number, retries?: number, port?: number, lookup?: LookupFunction, signal: AbortSignal }) {\n  const server = options.server;\n  if (typeof server !== 'string') {\n    throw new TypeError('Invalid arguments: \"server\" must be a string');\n  }\n\n  const instanceName = options.instanceName;\n  if (typeof instanceName !== 'string') {\n    throw new TypeError('Invalid arguments: \"instanceName\" must be a string');\n  }\n\n  const timeout = options.timeout === undefined ? TIMEOUT : options.timeout;\n  if (typeof timeout !== 'number') {\n    throw new TypeError('Invalid arguments: \"timeout\" must be a number');\n  }\n\n  const retries = options.retries === undefined ? RETRIES : options.retries;\n  if (typeof retries !== 'number') {\n    throw new TypeError('Invalid arguments: \"retries\" must be a number');\n  }\n\n  if (options.lookup !== undefined && typeof options.lookup !== 'function') {\n    throw new TypeError('Invalid arguments: \"lookup\" must be a function');\n  }\n  const lookup = options.lookup ?? dns.lookup;\n\n  if (options.port !== undefined && typeof options.port !== 'number') {\n    throw new TypeError('Invalid arguments: \"port\" must be a number');\n  }\n  const port = options.port ?? SQL_SERVER_BROWSER_PORT;\n\n  const signal = options.signal;\n\n  signal.throwIfAborted();\n\n  let response;\n\n  const request = Buffer.from([0x02]);\n\n  for (let i = 0; i <= retries; i++) {\n    const timeoutSignal = AbortSignal.timeout(timeout);\n\n    try {\n      response = await sendMessage(options.server, port, lookup, AbortSignal.any([ signal, timeoutSignal ]), request);\n    } catch (err) {\n      // If the current attempt timed out, continue with the next\n      if (timeoutSignal.aborted) {\n        continue;\n      }\n\n      throw err;\n    }\n  }\n\n  if (!response) {\n    throw new Error('Failed to get response from SQL Server Browser on ' + server);\n  }\n\n  const message = response.toString('ascii', MYSTERY_HEADER_LENGTH);\n  const foundPort = parseBrowserResponse(message, instanceName);\n\n  if (!foundPort) {\n    throw new Error('Port for ' + instanceName + ' not found in ' + options.server);\n  }\n\n  return foundPort;\n}\n\nexport function parseBrowserResponse(response: string, instanceName: string) {\n  let getPort;\n\n  const instances = response.split(';;');\n  for (let i = 0, len = instances.length; i < len; i++) {\n    const instance = instances[i];\n    const parts = instance.split(';');\n\n    for (let p = 0, partsLen = parts.length; p < partsLen; p += 2) {\n      const name = parts[p];\n      const value = parts[p + 1];\n\n      if (name === 'tcp' && getPort) {\n        const port = parseInt(value, 10);\n        return port;\n      }\n\n      if (name === 'InstanceName') {\n        if (value.toUpperCase() === instanceName.toUpperCase()) {\n          getPort = true;\n        } else {\n          getPort = false;\n        }\n      }\n    }\n  }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,IAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAAuC,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEvC,MAAMG,uBAAuB,GAAG,IAAI;AACpC,MAAMC,OAAO,GAAG,CAAC,GAAG,IAAI;AACxB,MAAMC,OAAO,GAAG,CAAC;AACjB;AACA,MAAMC,qBAAqB,GAAG,CAAC;AAI/B;AACO,eAAeC,cAAcA,CAACC,OAAkJ,EAAE;EACvL,MAAMC,MAAM,GAAGD,OAAO,CAACC,MAAM;EAC7B,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;IAC9B,MAAM,IAAIC,SAAS,CAAC,8CAA8C,CAAC;EACrE;EAEA,MAAMC,YAAY,GAAGH,OAAO,CAACG,YAAY;EACzC,IAAI,OAAOA,YAAY,KAAK,QAAQ,EAAE;IACpC,MAAM,IAAID,SAAS,CAAC,oDAAoD,CAAC;EAC3E;EAEA,MAAME,OAAO,GAAGJ,OAAO,CAACI,OAAO,KAAKC,SAAS,GAAGT,OAAO,GAAGI,OAAO,CAACI,OAAO;EACzE,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,IAAIF,SAAS,CAAC,+CAA+C,CAAC;EACtE;EAEA,MAAMI,OAAO,GAAGN,OAAO,CAACM,OAAO,KAAKD,SAAS,GAAGR,OAAO,GAAGG,OAAO,CAACM,OAAO;EACzE,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IAC/B,MAAM,IAAIJ,SAAS,CAAC,+CAA+C,CAAC;EACtE;EAEA,IAAIF,OAAO,CAACO,MAAM,KAAKF,SAAS,IAAI,OAAOL,OAAO,CAACO,MAAM,KAAK,UAAU,EAAE;IACxE,MAAM,IAAIL,SAAS,CAAC,gDAAgD,CAAC;EACvE;EACA,MAAMK,MAAM,GAAGP,OAAO,CAACO,MAAM,IAAIC,YAAG,CAACD,MAAM;EAE3C,IAAIP,OAAO,CAACS,IAAI,KAAKJ,SAAS,IAAI,OAAOL,OAAO,CAACS,IAAI,KAAK,QAAQ,EAAE;IAClE,MAAM,IAAIP,SAAS,CAAC,4CAA4C,CAAC;EACnE;EACA,MAAMO,IAAI,GAAGT,OAAO,CAACS,IAAI,IAAId,uBAAuB;EAEpD,MAAMe,MAAM,GAAGV,OAAO,CAACU,MAAM;EAE7BA,MAAM,CAACC,cAAc,CAAC,CAAC;EAEvB,IAAIC,QAAQ;EAEZ,MAAMC,OAAO,GAAGC,MAAM,CAACC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;EAEnC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,IAAIV,OAAO,EAAEU,CAAC,EAAE,EAAE;IACjC,MAAMC,aAAa,GAAGC,WAAW,CAACd,OAAO,CAACA,OAAO,CAAC;IAElD,IAAI;MACFQ,QAAQ,GAAG,MAAM,IAAAO,mBAAW,EAACnB,OAAO,CAACC,MAAM,EAAEQ,IAAI,EAAEF,MAAM,EAAEW,WAAW,CAACE,GAAG,CAAC,CAAEV,MAAM,EAAEO,aAAa,CAAE,CAAC,EAAEJ,OAAO,CAAC;IACjH,CAAC,CAAC,OAAOQ,GAAG,EAAE;MACZ;MACA,IAAIJ,aAAa,CAACK,OAAO,EAAE;QACzB;MACF;MAEA,MAAMD,GAAG;IACX;EACF;EAEA,IAAI,CAACT,QAAQ,EAAE;IACb,MAAM,IAAIW,KAAK,CAAC,oDAAoD,GAAGtB,MAAM,CAAC;EAChF;EAEA,MAAMuB,OAAO,GAAGZ,QAAQ,CAACa,QAAQ,CAAC,OAAO,EAAE3B,qBAAqB,CAAC;EACjE,MAAM4B,SAAS,GAAGC,oBAAoB,CAACH,OAAO,EAAErB,YAAY,CAAC;EAE7D,IAAI,CAACuB,SAAS,EAAE;IACd,MAAM,IAAIH,KAAK,CAAC,WAAW,GAAGpB,YAAY,GAAG,gBAAgB,GAAGH,OAAO,CAACC,MAAM,CAAC;EACjF;EAEA,OAAOyB,SAAS;AAClB;AAEO,SAASC,oBAAoBA,CAACf,QAAgB,EAAET,YAAoB,EAAE;EAC3E,IAAIyB,OAAO;EAEX,MAAMC,SAAS,GAAGjB,QAAQ,CAACkB,KAAK,CAAC,IAAI,CAAC;EACtC,KAAK,IAAId,CAAC,GAAG,CAAC,EAAEe,GAAG,GAAGF,SAAS,CAACG,MAAM,EAAEhB,CAAC,GAAGe,GAAG,EAAEf,CAAC,EAAE,EAAE;IACpD,MAAMiB,QAAQ,GAAGJ,SAAS,CAACb,CAAC,CAAC;IAC7B,MAAMkB,KAAK,GAAGD,QAAQ,CAACH,KAAK,CAAC,GAAG,CAAC;IAEjC,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEC,QAAQ,GAAGF,KAAK,CAACF,MAAM,EAAEG,CAAC,GAAGC,QAAQ,EAAED,CAAC,IAAI,CAAC,EAAE;MAC7D,MAAME,IAAI,GAAGH,KAAK,CAACC,CAAC,CAAC;MACrB,MAAMG,KAAK,GAAGJ,KAAK,CAACC,CAAC,GAAG,CAAC,CAAC;MAE1B,IAAIE,IAAI,KAAK,KAAK,IAAIT,OAAO,EAAE;QAC7B,MAAMnB,IAAI,GAAG8B,QAAQ,CAACD,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO7B,IAAI;MACb;MAEA,IAAI4B,IAAI,KAAK,cAAc,EAAE;QAC3B,IAAIC,KAAK,CAACE,WAAW,CAAC,CAAC,KAAKrC,YAAY,CAACqC,WAAW,CAAC,CAAC,EAAE;UACtDZ,OAAO,GAAG,IAAI;QAChB,CAAC,MAAM;UACLA,OAAO,GAAG,KAAK;QACjB;MACF;IACF;EACF;AACF","ignoreList":[]}