UNPKG

knex-dynamic-connection

Version:

Adds support for dynamically returning connection config for knex queries

116 lines (115 loc) 4.39 kB
"use strict"; /* * 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;