'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _promise = require('./promise');
var _promise2 = _interopRequireDefault(_promise);
var _argsarray = require('argsarray');
var _argsarray2 = _interopRequireDefault(_argsarray);
var _clone = require('./clone');
var _clone2 = _interopRequireDefault(_clone);
var _once = require('./once');
var _once2 = _interopRequireDefault(_once);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function toPromise(func) {
//create the function we will be returning
return (0, _argsarray2.default)(function (args) {
// Clone arguments
args = (0, _clone2.default)(args);
var self = this;
var tempCB = typeof args[args.length - 1] === 'function' ? args.pop() : false;
// if the last argument is a function, assume its a callback
var usedCB;
if (tempCB) {
// if it was a callback, create a new callback which calls it,
// but do so async so we don't trap any errors
usedCB = function (err, resp) {
process.nextTick(function () {
tempCB(err, resp);
});
};
}
var promise = new _promise2.default(function (fulfill, reject) {
var resp;
try {
var callback = (0, _once2.default)(function (err, mesg) {
if (err) {
reject(err);
} else {
fulfill(mesg);
}
});
// create a callback for this invocation
// apply the function in the orig context
args.push(callback);
resp = func.apply(self, args);
if (resp && typeof resp.then === 'function') {
fulfill(resp);
}
} catch (e) {
reject(e);
}
});
// if there is a callback, call it back
if (usedCB) {
promise.then(function (result) {
usedCB(null, result);
}, usedCB);
}
return promise;
});
}
exports.default = toPromise;
module.exports = exports['default']; |