knex-dynamic-connection
Version:
Adds support for dynamically returning connection config for knex queries
116 lines (115 loc) • 4.39 kB
JavaScript
;
/*
* knex-dynamic-connection
*
* (c) Harminder Virk <virk@adonisjs.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.acquireRawConnection = void 0;
const debug = require('debug')('knex:patched:mssql');
const security_js_1 = require("knex/lib/util/security.js");
function isNil(value) {
return value === undefined || value === null;
}
/**
* Copy of https://github.com/knex/knex/blob/3718d647e452e3a7659ad3310a56e862f64c17be/lib/dialects/mssql/index.js#L32, but accepts the settings as an argument. I wish, they did the same
* thing too.
*
* If you ever see the KNEX version using a `this` property inside this method, then
* please report it to us. Right now, this method is pure.
* Also, ignore "this.connectionSettings"
*/
function generateConnection(settings) {
settings.options = settings.options || {};
/** @type {import('tedious').ConnectionConfig} */
const cfg = {
authentication: {
type: settings.type || 'default',
options: {
userName: settings.userName || settings.user,
password: settings.password,
domain: settings.domain,
token: settings.token,
clientId: settings.clientId,
clientSecret: settings.clientSecret,
tenantId: settings.tenantId,
msiEndpoint: settings.msiEndpoint,
},
},
server: settings.server || settings.host,
options: {
database: settings.database,
encrypt: settings.encrypt || false,
port: settings.port || 1433,
connectTimeout: settings.connectionTimeout || settings.timeout || 15000,
requestTimeout: !isNil(settings.requestTimeout) ? settings.requestTimeout : 15000,
rowCollectionOnDone: false,
rowCollectionOnRequestCompletion: false,
useColumnNames: false,
tdsVersion: settings.options.tdsVersion || '7_4',
appName: settings.options.appName || 'knex',
trustServerCertificate: false,
...settings.options,
},
};
if (cfg.authentication.options.password) {
(0, security_js_1.setHiddenProperty)(cfg.authentication.options);
}
// tedious always connect via tcp when port is specified
if (cfg.options.instanceName) {
delete cfg.options.port;
}
if (isNaN(cfg.options.requestTimeout)) {
cfg.options.requestTimeout = 15000;
}
if (cfg.options.requestTimeout === Infinity) {
cfg.options.requestTimeout = 0;
}
if (cfg.options.requestTimeout < 0) {
cfg.options.requestTimeout = 0;
}
if (settings.debug) {
cfg.options.debug = {
packet: true,
token: true,
data: true,
payload: true,
};
}
return cfg;
}
/**
* Copy of `acquireRawConnection` from knex codebase, but instead relies
* on `getRuntimeConnectionSettings` vs `connectionSettings`
*/
function acquireRawConnection() {
return new Promise((resolver, rejecter) => {
debug('connection::connection new connection requested');
const Driver = this._driver();
const settings = Object.assign({}, generateConnection(this.getRuntimeConnectionSettings()));
const connection = new Driver.Connection(settings);
connection.connect((err) => {
if (err) {
debug('connection::connect error: %s', err.message);
return rejecter(err);
}
debug('connection::connect connected to server');
connection.connected = true;
connection.on('error', (e) => {
debug('connection::error message=%s', e.message);
connection.__knex__disposed = e;
connection.connected = false;
});
connection.once('end', () => {
connection.connected = false;
connection.__knex__disposed = 'Connection to server was terminated.';
debug('connection::end connection ended.');
});
return resolver(connection);
});
});
}
exports.acquireRawConnection = acquireRawConnection;