Comparing version 11.0.1 to 11.0.2
@@ -8,6 +8,8 @@ "use strict"; | ||
var _dns = _interopRequireDefault(require("dns")); | ||
var _nodeAbortController = _interopRequireDefault(require("node-abort-controller")); | ||
var _sender = require("./sender"); | ||
var _dns = _interopRequireDefault(require("dns")); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
@@ -23,7 +25,2 @@ | ||
class InstanceLookup { | ||
// Wrapper allows for stubbing Sender when unit testing instance-lookup. | ||
createSender(host, port, lookup, request) { | ||
return new _sender.Sender(host, port, lookup, request); | ||
} | ||
instanceLookup(options, callback) { | ||
@@ -77,5 +74,6 @@ var _options$lookup, _options$port; | ||
let timer; | ||
const controller = new _nodeAbortController.default(); | ||
const onTimeout = () => { | ||
sender.cancel(); | ||
controller.abort(); | ||
makeAttempt(); | ||
@@ -87,3 +85,3 @@ }; | ||
const request = Buffer.from([0x02]); | ||
sender = this.createSender(options.server, port, lookup, request); | ||
sender = new _sender.Sender(options.server, port, lookup, controller.signal, request); | ||
timer = setTimeout(onTimeout, timeout); | ||
@@ -93,4 +91,8 @@ sender.execute((err, response) => { | ||
if ((err === null || err === void 0 ? void 0 : err.name) === 'AbortError') { | ||
return; | ||
} | ||
if (err) { | ||
callback('Failed to lookup instance on ' + server + ' - ' + err.message); | ||
callback(new Error('Failed to lookup instance on ' + server + ' - ' + err.message)); | ||
} else { | ||
@@ -103,3 +105,3 @@ const message = response.toString('ascii', MYSTERY_HEADER_LENGTH); | ||
} else { | ||
callback('Port for ' + instanceName + ' not found in ' + options.server); | ||
callback(new Error('Port for ' + instanceName + ' not found in ' + options.server)); | ||
} | ||
@@ -109,3 +111,3 @@ } | ||
} else { | ||
callback('Failed to get response from SQL Server Browser on ' + server); | ||
callback(new Error('Failed to get response from SQL Server Browser on ' + server)); | ||
} | ||
@@ -112,0 +114,0 @@ }; |
@@ -20,39 +20,32 @@ "use strict"; | ||
class AbortError extends Error { | ||
constructor() { | ||
super('The operation was aborted'); | ||
this.code = void 0; | ||
this.code = 'ABORT_ERR'; | ||
this.name = 'AbortError'; | ||
} | ||
} | ||
class ParallelSendStrategy { | ||
constructor(addresses, port, request) { | ||
constructor(addresses, port, signal, request) { | ||
this.addresses = void 0; | ||
this.port = void 0; | ||
this.request = void 0; | ||
this.socketV4 = void 0; | ||
this.socketV6 = void 0; | ||
this.onMessage = void 0; | ||
this.onError = void 0; | ||
this.signal = void 0; | ||
this.addresses = addresses; | ||
this.port = port; | ||
this.request = request; | ||
this.socketV4 = null; | ||
this.socketV6 = null; | ||
this.onError = null; | ||
this.onMessage = null; | ||
this.signal = signal; | ||
} | ||
clearSockets() { | ||
const clearSocket = (socket, onError, onMessage) => { | ||
socket.removeListener('error', onError); | ||
socket.removeListener('message', onMessage); | ||
socket.close(); | ||
}; | ||
send(cb) { | ||
const signal = this.signal; | ||
if (this.socketV4) { | ||
clearSocket(this.socketV4, this.onError, this.onMessage); | ||
this.socketV4 = null; | ||
if (signal.aborted) { | ||
return cb(new AbortError()); | ||
} | ||
if (this.socketV6) { | ||
clearSocket(this.socketV6, this.onError, this.onMessage); | ||
this.socketV6 = null; | ||
} | ||
} | ||
send(cb) { | ||
const sockets = []; | ||
let errorCount = 0; | ||
@@ -64,3 +57,4 @@ | ||
if (errorCount === this.addresses.length) { | ||
this.clearSockets(); | ||
signal.removeEventListener('abort', onAbort); | ||
clearSockets(); | ||
cb(err); | ||
@@ -71,45 +65,36 @@ } | ||
const onMessage = message => { | ||
this.clearSockets(); | ||
signal.removeEventListener('abort', onAbort); | ||
clearSockets(); | ||
cb(null, message); | ||
}; | ||
const createDgramSocket = (udpType, onError, onMessage) => { | ||
const socket = _dgram.default.createSocket(udpType); | ||
const onAbort = () => { | ||
clearSockets(); | ||
cb(new AbortError()); | ||
}; | ||
socket.on('error', onError); | ||
socket.on('message', onMessage); | ||
return socket; | ||
const clearSockets = () => { | ||
for (const socket of sockets) { | ||
socket.removeListener('error', onError); | ||
socket.removeListener('message', onMessage); | ||
socket.close(); | ||
} | ||
}; | ||
signal.addEventListener('abort', onAbort, { | ||
once: true | ||
}); | ||
for (let j = 0; j < this.addresses.length; j++) { | ||
const udpTypeV4 = 'udp4'; | ||
const udpTypeV6 = 'udp6'; | ||
const udpType = this.addresses[j].family === 6 ? udpTypeV6 : udpTypeV4; | ||
let socket; | ||
const udpType = this.addresses[j].family === 6 ? 'udp6' : 'udp4'; | ||
if (udpType === udpTypeV4) { | ||
if (!this.socketV4) { | ||
this.socketV4 = createDgramSocket(udpTypeV4, onError, onMessage); | ||
} | ||
const socket = _dgram.default.createSocket(udpType); | ||
socket = this.socketV4; | ||
} else { | ||
if (!this.socketV6) { | ||
this.socketV6 = createDgramSocket(udpTypeV6, onError, onMessage); | ||
} | ||
socket = this.socketV6; | ||
} | ||
sockets.push(socket); | ||
socket.on('error', onError); | ||
socket.on('message', onMessage); | ||
socket.send(this.request, 0, this.request.length, this.port, this.addresses[j].address); | ||
} | ||
this.onError = onError; | ||
this.onMessage = onMessage; | ||
} | ||
cancel() { | ||
this.clearSockets(); | ||
} | ||
} | ||
@@ -120,8 +105,8 @@ | ||
class Sender { | ||
constructor(host, port, lookup, request) { | ||
constructor(host, port, lookup, signal, request) { | ||
this.host = void 0; | ||
this.port = void 0; | ||
this.request = void 0; | ||
this.parallelSendStrategy = void 0; | ||
this.lookup = void 0; | ||
this.signal = void 0; | ||
this.host = host; | ||
@@ -131,3 +116,3 @@ this.port = port; | ||
this.lookup = lookup; | ||
this.parallelSendStrategy = null; | ||
this.signal = signal; | ||
} | ||
@@ -165,23 +150,11 @@ | ||
}); | ||
} // Wrapper for stubbing creation of Strategy object. Sinon support for constructors | ||
// seems limited. | ||
createParallelSendStrategy(addresses, port, request) { | ||
return new ParallelSendStrategy(addresses, port, request); | ||
} | ||
executeForAddresses(addresses, cb) { | ||
this.parallelSendStrategy = this.createParallelSendStrategy(addresses, this.port, this.request); | ||
this.parallelSendStrategy.send(cb); | ||
const parallelSendStrategy = new ParallelSendStrategy(addresses, this.port, this.signal, this.request); | ||
parallelSendStrategy.send(cb); | ||
} | ||
cancel() { | ||
if (this.parallelSendStrategy) { | ||
this.parallelSendStrategy.cancel(); | ||
} | ||
} | ||
} | ||
exports.Sender = Sender; |
@@ -30,3 +30,3 @@ { | ||
"license": "MIT", | ||
"version": "11.0.1", | ||
"version": "11.0.2", | ||
"main": "./lib/tedious.js", | ||
@@ -52,2 +52,3 @@ "repository": { | ||
"native-duplexpair": "^1.0.0", | ||
"node-abort-controller": "^1.1.0", | ||
"punycode": "^2.1.0", | ||
@@ -54,0 +55,0 @@ "readable-stream": "^3.6.0", |
@@ -27,3 +27,3 @@ # Tedious (node implementation of TDS) | ||
Node.js is a prerequisite for installing tedious. Once you have installed [Node.js](https://nodejs.org/), installing tedious is simple: | ||
Node.js is a prerequisite for installing tedious. Once you have installed [Node.js](https://nodejs.org/), installing tedious is simple: | ||
@@ -45,3 +45,3 @@ npm install tedious | ||
## Name | ||
_Tedious_ is simply derived from a fast, slightly garbled, pronunciation of the letters T, D and S. | ||
_Tedious_ is simply derived from a fast, slightly garbled, pronunciation of the letters T, D and S. | ||
@@ -61,3 +61,3 @@ ## Developer Survey | ||
Copyright (c) 2010-2020 Mike D Pilsbury | ||
Copyright (c) 2010-2021 Mike D Pilsbury | ||
@@ -64,0 +64,0 @@ The MIT License |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
423850
12
11952
+ Addednode-abort-controller@^1.1.0
+ Addednode-abort-controller@1.2.1(transitive)