Skip to content

Commit 21f2435

Browse files
committed
Allow a custom type to be used for Client promises
Matches the Pool API.
1 parent 9870c86 commit 21f2435

File tree

4 files changed

+38
-25
lines changed

4 files changed

+38
-25
lines changed

lib/client.js

+7-9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ var Client = function (config) {
3131

3232
var c = config || {}
3333

34+
this._Promise = c.Promise || global.Promise
3435
this._types = new TypeOverrides(c.types)
3536
this._ending = false
3637
this._connecting = false
@@ -61,7 +62,7 @@ Client.prototype.connect = function (callback) {
6162
callback(err)
6263
return undefined
6364
}
64-
return Promise.reject(err)
65+
return this._Promise.reject(err)
6566
}
6667
this._connecting = true
6768

@@ -195,7 +196,7 @@ Client.prototype.connect = function (callback) {
195196
})
196197

197198
if (!callback) {
198-
return new global.Promise((resolve, reject) => {
199+
return new this._Promise((resolve, reject) => {
199200
this.once('error', reject)
200201
this.once('connect', () => {
201202
this.removeListener('error', reject)
@@ -373,12 +374,9 @@ Client.prototype.query = function (config, values, callback) {
373374
} else {
374375
query = new Query(config, values, callback)
375376
if (!query.callback) {
376-
let resolveOut, rejectOut
377-
result = new Promise((resolve, reject) => {
378-
resolveOut = resolve
379-
rejectOut = reject
377+
result = new this._Promise((resolve, reject) => {
378+
query.callback = (err, res) => err ? reject(err) : resolve(res)
380379
})
381-
query.callback = (err, res) => err ? rejectOut(err) : resolveOut(res)
382380
}
383381
}
384382

@@ -400,13 +398,13 @@ Client.prototype.end = function (cb) {
400398
// if we have an active query we need to force a disconnect
401399
// on the socket - otherwise a hung query could block end forever
402400
this.connection.stream.destroy(new Error('Connection terminated by user'))
403-
return cb ? cb() : Promise.resolve()
401+
return cb ? cb() : this._Promise.resolve()
404402
}
405403
if (cb) {
406404
this.connection.end()
407405
this.connection.once('end', cb)
408406
} else {
409-
return new global.Promise((resolve, reject) => {
407+
return new this._Promise((resolve, reject) => {
410408
this.connection.end()
411409
this.connection.once('end', resolve)
412410
})

lib/native/client.js

+7-15
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ var Client = module.exports = function (config) {
2525
EventEmitter.call(this)
2626
config = config || {}
2727

28+
this._Promise = config.Promise || global.Promise
2829
this._types = new TypeOverrides(config.types)
2930

3031
this.native = new Native({
@@ -67,11 +68,8 @@ Client.prototype.connect = function (cb) {
6768

6869
var result
6970
if (!cb) {
70-
var resolveOut, rejectOut
71-
cb = (err) => err ? rejectOut(err) : resolveOut()
72-
result = new global.Promise(function (resolve, reject) {
73-
resolveOut = resolve
74-
rejectOut = reject
71+
result = new this._Promise(function (resolve, reject) {
72+
cb = (err) => err ? reject(err) : resolve()
7573
})
7674
}
7775

@@ -142,12 +140,9 @@ Client.prototype.query = function (config, values, callback) {
142140
var query = new NativeQuery(config, values, callback)
143141
var result
144142
if (!query.callback) {
145-
let resolveOut, rejectOut
146-
result = new Promise((resolve, reject) => {
147-
resolveOut = resolve
148-
rejectOut = reject
143+
result = new this._Promise((resolve, reject) => {
144+
query.callback = (err, res) => err ? reject(err) : resolve(res)
149145
})
150-
query.callback = (err, res) => err ? rejectOut(err) : resolveOut(res)
151146
}
152147
this._queryQueue.push(query)
153148
this._pulseQueryQueue()
@@ -162,11 +157,8 @@ Client.prototype.end = function (cb) {
162157
}
163158
var result
164159
if (!cb) {
165-
var resolve, reject
166-
cb = (err) => err ? reject(err) : resolve()
167-
result = new global.Promise(function (res, rej) {
168-
resolve = res
169-
reject = rej
160+
result = new this._Promise(function (resolve, reject) {
161+
cb = (err) => err ? reject(err) : resolve()
170162
})
171163
}
172164
this.native.end(function () {

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
},
3131
"devDependencies": {
3232
"async": "0.9.0",
33+
"bluebird": "3.5.1",
3334
"co": "4.6.0",
3435
"eslint": "4.2.0",
3536
"eslint-config-standard": "10.2.1",

test/integration/client/query-as-promise-tests.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
'use strict'
2+
var bluebird = require('bluebird')
23
var helper = require(__dirname + '/../test-helper')
34
var pg = helper.pg
45

@@ -7,10 +8,10 @@ process.on('unhandledRejection', function (e) {
78
process.exit(1)
89
})
910

10-
const pool = new pg.Pool()
1111
const suite = new helper.Suite()
1212

1313
suite.test('promise API', (cb) => {
14+
const pool = new pg.Pool()
1415
pool.connect().then((client) => {
1516
client.query('SELECT $1::text as name', ['foo'])
1617
.then(function (result) {
@@ -31,3 +32,24 @@ suite.test('promise API', (cb) => {
3132
})
3233
})
3334
})
35+
36+
suite.test('promise API with configurable promise type', (cb) => {
37+
const client = new pg.Client({ Promise: bluebird })
38+
const connectPromise = client.connect()
39+
assert(connectPromise instanceof bluebird, 'Client connect() returns configured promise')
40+
41+
connectPromise
42+
.then(() => {
43+
const queryPromise = client.query('SELECT 1')
44+
assert(queryPromise instanceof bluebird, 'Client query() returns configured promise')
45+
46+
return queryPromise.then(() => {
47+
client.end(cb)
48+
})
49+
})
50+
.catch((error) => {
51+
process.nextTick(() => {
52+
throw error
53+
})
54+
})
55+
});

0 commit comments

Comments
 (0)