diff --git a/lib/client.js b/lib/client.js index 3228571d5..d3a2e2491 100644 --- a/lib/client.js +++ b/lib/client.js @@ -31,6 +31,7 @@ var Client = function (config) { var c = config || {} + this._Promise = c.Promise || global.Promise this._types = new TypeOverrides(c.types) this._ending = false this._connecting = false @@ -61,7 +62,7 @@ Client.prototype.connect = function (callback) { callback(err) return undefined } - return Promise.reject(err) + return this._Promise.reject(err) } this._connecting = true @@ -195,7 +196,7 @@ Client.prototype.connect = function (callback) { }) if (!callback) { - return new global.Promise((resolve, reject) => { + return new this._Promise((resolve, reject) => { this.once('error', reject) this.once('connect', () => { this.removeListener('error', reject) @@ -373,12 +374,9 @@ Client.prototype.query = function (config, values, callback) { } else { query = new Query(config, values, callback) if (!query.callback) { - let resolveOut, rejectOut - result = new Promise((resolve, reject) => { - resolveOut = resolve - rejectOut = reject + result = new this._Promise((resolve, reject) => { + query.callback = (err, res) => err ? reject(err) : resolve(res) }) - query.callback = (err, res) => err ? rejectOut(err) : resolveOut(res) } } @@ -400,13 +398,13 @@ Client.prototype.end = function (cb) { // if we have an active query we need to force a disconnect // on the socket - otherwise a hung query could block end forever this.connection.stream.destroy(new Error('Connection terminated by user')) - return cb ? cb() : Promise.resolve() + return cb ? cb() : this._Promise.resolve() } if (cb) { this.connection.end() this.connection.once('end', cb) } else { - return new global.Promise((resolve, reject) => { + return new this._Promise((resolve, reject) => { this.connection.end() this.connection.once('end', resolve) }) diff --git a/lib/native/client.js b/lib/native/client.js index bed548ad8..fbef0857f 100644 --- a/lib/native/client.js +++ b/lib/native/client.js @@ -25,6 +25,7 @@ var Client = module.exports = function (config) { EventEmitter.call(this) config = config || {} + this._Promise = config.Promise || global.Promise this._types = new TypeOverrides(config.types) this.native = new Native({ @@ -67,11 +68,8 @@ Client.prototype.connect = function (cb) { var result if (!cb) { - var resolveOut, rejectOut - cb = (err) => err ? rejectOut(err) : resolveOut() - result = new global.Promise(function (resolve, reject) { - resolveOut = resolve - rejectOut = reject + result = new this._Promise(function (resolve, reject) { + cb = (err) => err ? reject(err) : resolve() }) } @@ -142,12 +140,9 @@ Client.prototype.query = function (config, values, callback) { var query = new NativeQuery(config, values, callback) var result if (!query.callback) { - let resolveOut, rejectOut - result = new Promise((resolve, reject) => { - resolveOut = resolve - rejectOut = reject + result = new this._Promise((resolve, reject) => { + query.callback = (err, res) => err ? reject(err) : resolve(res) }) - query.callback = (err, res) => err ? rejectOut(err) : resolveOut(res) } this._queryQueue.push(query) this._pulseQueryQueue() @@ -162,11 +157,8 @@ Client.prototype.end = function (cb) { } var result if (!cb) { - var resolve, reject - cb = (err) => err ? reject(err) : resolve() - result = new global.Promise(function (res, rej) { - resolve = res - reject = rej + result = new this._Promise(function (resolve, reject) { + cb = (err) => err ? reject(err) : resolve() }) } this.native.end(function () { diff --git a/package.json b/package.json index 576b9db5c..55308379b 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ }, "devDependencies": { "async": "0.9.0", + "bluebird": "3.5.1", "co": "4.6.0", "eslint": "4.2.0", "eslint-config-standard": "10.2.1", diff --git a/test/integration/client/query-as-promise-tests.js b/test/integration/client/query-as-promise-tests.js index 625a33392..803b89099 100644 --- a/test/integration/client/query-as-promise-tests.js +++ b/test/integration/client/query-as-promise-tests.js @@ -1,4 +1,5 @@ 'use strict' +var bluebird = require('bluebird') var helper = require(__dirname + '/../test-helper') var pg = helper.pg @@ -7,10 +8,10 @@ process.on('unhandledRejection', function (e) { process.exit(1) }) -const pool = new pg.Pool() const suite = new helper.Suite() suite.test('promise API', (cb) => { + const pool = new pg.Pool() pool.connect().then((client) => { client.query('SELECT $1::text as name', ['foo']) .then(function (result) { @@ -31,3 +32,24 @@ suite.test('promise API', (cb) => { }) }) }) + +suite.test('promise API with configurable promise type', (cb) => { + const client = new pg.Client({ Promise: bluebird }) + const connectPromise = client.connect() + assert(connectPromise instanceof bluebird, 'Client connect() returns configured promise') + + connectPromise + .then(() => { + const queryPromise = client.query('SELECT 1') + assert(queryPromise instanceof bluebird, 'Client query() returns configured promise') + + return queryPromise.then(() => { + client.end(cb) + }) + }) + .catch((error) => { + process.nextTick(() => { + throw error + }) + }) +});