var mysql = require('mysql'); // Thunkify query methods function wrapQueryMethod(fn, ctx) { return function() { // Obtain function arguments var args = [].slice.call(arguments); // Return a thunkified function that receives a done callback return function(done) { // Add a custom callback to provided args args.push(function(err, result) { // Query failed? if (err) { return done(err); } // Query succeeded done(null, result); }); // Execute the query fn.apply(ctx, args); }; }; } // Wrap a MySQL connection object's query methods function wrapConnection(conn) { // Already wrapped this function? if (conn._coWrapped) { return conn; } // Set flag to avoid re-wrapping conn._coWrapped = true; // Functions to thunkify var queryMethods = [ 'query', 'execute' ]; // Traverse query methods list queryMethods.forEach(function(name) { // Thunkify the method conn[name] = wrapQueryMethod(conn[name], conn); }); // Return co-friendly connection return conn; } module.exports = { createConnection: function(opts) { // Wrap createConnectionfunction return wrapConnection(mysql.createConnection(opts)); }, createPool: function(opts) { // Wrap createPool function return wrapConnection(mysql.createPool(opts)); } };