Skip to content

Commit ed6341a

Browse files
author
Malte-Maurice Dreyer
committed
Make Promise Pool wrapper extend EventEmitter
Fix #468 Introduce a new PromisePool constructor into promise.js. PromisePool inherits from EventEmitter, and the following events are re-emitted from the underlying Pool instance to it: - acquire - connection - enqueue - release Methods like `on` can't just be bound to the Pool as `this` would be wrong in the callback: e.g. `this.query` wouldn't return a Promise.
1 parent 5f5bb7b commit ed6341a

File tree

3 files changed

+114
-62
lines changed

3 files changed

+114
-62
lines changed

promise.js

Lines changed: 69 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
var core = require('./index.js');
2+
var EventEmitter = require('events').EventEmitter;
3+
var util = require('util');
24

35
function createConnection (opts) {
46
var coreConnection = core.createConnection(opts);
@@ -165,6 +167,72 @@ PromiseConnection.prototype.prepare = function () {
165167
'unprepare'
166168
]);
167169

170+
function PromisePool(pool, Promise) {
171+
this.pool = pool;
172+
this.Promise = Promise;
173+
174+
['acquire', 'connection', 'enqueue', 'release']
175+
.forEach(function (eventName) {
176+
var t = this;
177+
178+
this.pool.on(eventName, function () {
179+
var args = [].slice.call(arguments);
180+
args.unshift(eventName);
181+
182+
t.emit.apply(t, args);
183+
});
184+
}, this);
185+
}
186+
util.inherits(PromisePool, EventEmitter);
187+
188+
PromisePool.prototype.getConnection = function () {
189+
var corePool = this.pool;
190+
191+
return new this.Promise(function (resolve, reject) {
192+
corePool.getConnection(function (err, coreConnection) {
193+
if (err) {
194+
reject(err);
195+
} else {
196+
resolve(new PromiseConnection(coreConnection, Promise));
197+
}
198+
});
199+
});
200+
};
201+
202+
PromisePool.prototype.query = function (sql, args) {
203+
var corePool = this.pool;
204+
205+
return new this.Promise(function (resolve, reject) {
206+
var done = makeDoneCb(resolve, reject);
207+
if (args) {
208+
corePool.query(sql, args, done);
209+
} else {
210+
corePool.query(sql, done);
211+
}
212+
});
213+
};
214+
215+
PromisePool.prototype.execute = function (sql, values) {
216+
var corePool = this.pool;
217+
218+
return new Promise(function (resolve, reject) {
219+
corePool.execute(sql, values, makeDoneCb(resolve, reject));
220+
});
221+
};
222+
223+
PromisePool.prototype.end = function () {
224+
var corePool = this.pool;
225+
226+
return new Promise(function (resolve, reject) {
227+
corePool.end(function (err) {
228+
if (err) {
229+
reject(err);
230+
} else {
231+
resolve();
232+
}
233+
});
234+
});
235+
};
168236

169237
function createPool (opts) {
170238
var corePool = core.createPool(opts);
@@ -175,50 +243,7 @@ function createPool (opts) {
175243
' implementation as parameter, for example: { Promise: require(\'bluebird\') }');
176244
}
177245

178-
var promisePool = {
179-
getConnection: function () {
180-
return new Promise(function (resolve, reject) {
181-
corePool.getConnection(function (err, coreConnection) {
182-
if (err) {
183-
reject(err);
184-
} else {
185-
resolve(new PromiseConnection(coreConnection, Promise));
186-
}
187-
});
188-
});
189-
},
190-
191-
query: function (sql, args) {
192-
return new Promise(function (resolve, reject) {
193-
var done = makeDoneCb(resolve, reject);
194-
if (args) {
195-
corePool.query(sql, args, done);
196-
} else {
197-
corePool.query(sql, done);
198-
}
199-
});
200-
},
201-
202-
execute: function (sql, values) {
203-
return new Promise(function (resolve, reject) {
204-
corePool.execute(sql, values, makeDoneCb(resolve, reject));
205-
});
206-
},
207-
208-
end: function () {
209-
return new Promise(function (resolve, reject) {
210-
corePool.end(function (err) {
211-
if (err) {
212-
reject(err);
213-
} else {
214-
resolve();
215-
}
216-
});
217-
});
218-
}
219-
};
220-
221-
return promisePool;
246+
return new PromisePool(corePool, Promise);
222247
}
223248

224249
module.exports.createConnection = createConnection;

test/common.js

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,22 @@ module.exports.createConnection = function(args, callback) {
5656
// c.on('connect', function() {
5757
//
5858
// });
59-
setTimeout(
60-
function() {
61-
console.log('altering client...');
62-
c.oldQuery = c.query;
63-
c.query = function(sql, callback) {
64-
var rows = [];
65-
var q = c.oldQuery(sql);
66-
q.on('result', function(res) {
67-
res.on('row', function(row) {
68-
rows.push(row);
69-
});
70-
res.on('end', function() {
71-
callback(null, rows);
72-
});
59+
setTimeout(function() {
60+
console.log('altering client...');
61+
c.oldQuery = c.query;
62+
c.query = function(sql, callback) {
63+
var rows = [];
64+
var q = c.oldQuery(sql);
65+
q.on('result', function(res) {
66+
res.on('row', function(row) {
67+
rows.push(row);
7368
});
74-
};
75-
},
76-
1000
77-
);
69+
res.on('end', function() {
70+
callback(null, rows);
71+
});
72+
});
73+
};
74+
}, 1000);
7875
return c;
7976
}
8077

test/integration/test-promise-wrappers.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ var exceptionCaught = false;
2222
var doneCalledPool = false;
2323
var exceptionCaughtPool = false;
2424

25+
var doneEventsPool = false;
26+
2527
function testBasic() {
2628
var connResolved;
2729
var connPromise = createConnection(config)
@@ -163,12 +165,39 @@ function testObjParamsPool() {
163165
});
164166
}
165167

168+
function testEventsPool() {
169+
var pool = createPool(config);
170+
var events = 0;
171+
172+
pool
173+
.once('acquire', function(connection) {
174+
++events;
175+
})
176+
.once('connection', function(connection) {
177+
++events;
178+
})
179+
.once('enqueue', function() {
180+
++events;
181+
})
182+
.once('release', function() {
183+
++events;
184+
185+
doneEventsPool = events === 4;
186+
});
187+
188+
pool.pool.emit('acquire');
189+
pool.pool.emit('connection');
190+
pool.pool.emit('enqueue');
191+
pool.pool.emit('release');
192+
}
193+
166194
testBasic();
167195
testErrors();
168196
testObjParams();
169197
testBasicPool();
170198
testErrorsPool();
171199
testObjParamsPool();
200+
testEventsPool();
172201

173202
process.on('exit', function() {
174203
if (skipTest) {
@@ -178,6 +207,7 @@ process.on('exit', function() {
178207
assert.equal(exceptionCaught, true);
179208
assert.equal(doneCalledPool, true);
180209
assert.equal(exceptionCaughtPool, true);
210+
assert.equal(doneEventsPool, true);
181211
});
182212

183213
process.on('unhandledRejection', function(err) {

0 commit comments

Comments
 (0)