diff --git a/packages/pg/lib/connection-parameters.js b/packages/pg/lib/connection-parameters.js index 6a535a820..0c0dbb32c 100644 --- a/packages/pg/lib/connection-parameters.js +++ b/packages/pg/lib/connection-parameters.js @@ -125,9 +125,25 @@ class ConnectionParameters { } getLibpqConnectionString(cb) { - var params = [] - add(params, this, 'user') - add(params, this, 'password') + if (typeof this.password === 'function') { + const pw = this.password(); + if (typeof pw === 'string') { + return this._getLibpqConnectionString(cb, pw) + } + pw.then((pwString) => this._getLibpqConnectionString(cb, pwString)).catch((e) => cb(e)) + return + } + this._getLibpqConnectionString(cb); + } + + _getLibpqConnectionString(cb, pw) { + var params = []; + add(params, this, 'user'); + if (pw != null) { + params.push('password=' + quoteParamValue(pw)) + } else { + add(params, this, 'password'); + } add(params, this, 'port') add(params, this, 'application_name') add(params, this, 'fallback_application_name') diff --git a/packages/pg/test/unit/connection-parameters/creation-tests.js b/packages/pg/test/unit/connection-parameters/creation-tests.js index cd27d5011..2767b4400 100644 --- a/packages/pg/test/unit/connection-parameters/creation-tests.js +++ b/packages/pg/test/unit/connection-parameters/creation-tests.js @@ -187,6 +187,30 @@ suite.testAsync('builds simple string', async function () { }) }) +suite.testAsync('builds simple string with pw function', async function () { + var config = { + user: 'brian', + password: () => 'xyz', + port: 888, + host: 'localhost', + database: 'bam', + } + var subject = new ConnectionParameters(config) + const dnsHost = await getDNSHost(config.host) + return new Promise((resolve) => { + subject.getLibpqConnectionString(function (err, constring) { + assert(!err) + var parts = constring.split(' ') + checkForPart(parts, "user='brian'") + checkForPart(parts, "password='xyz'") + checkForPart(parts, "port='888'") + checkForPart(parts, `hostaddr='${dnsHost}'`) + checkForPart(parts, "dbname='bam'") + resolve() + }) + }) +}) + suite.test('builds dns string', async function () { var config = { user: 'brian',