| 'use strict'; | 
|   | 
| Object.defineProperty(exports, "__esModule", { | 
|     value: true | 
| }); | 
| exports.default = asyncify; | 
|   | 
| var _isObject = require('lodash/isObject'); | 
|   | 
| var _isObject2 = _interopRequireDefault(_isObject); | 
|   | 
| var _initialParams = require('./internal/initialParams'); | 
|   | 
| var _initialParams2 = _interopRequireDefault(_initialParams); | 
|   | 
| var _setImmediate = require('./internal/setImmediate'); | 
|   | 
| var _setImmediate2 = _interopRequireDefault(_setImmediate); | 
|   | 
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | 
|   | 
| /** | 
|  * Take a sync function and make it async, passing its return value to a | 
|  * callback. This is useful for plugging sync functions into a waterfall, | 
|  * series, or other async functions. Any arguments passed to the generated | 
|  * function will be passed to the wrapped function (except for the final | 
|  * callback argument). Errors thrown will be passed to the callback. | 
|  * | 
|  * If the function passed to `asyncify` returns a Promise, that promises's | 
|  * resolved/rejected state will be used to call the callback, rather than simply | 
|  * the synchronous return value. | 
|  * | 
|  * This also means you can asyncify ES2017 `async` functions. | 
|  * | 
|  * @name asyncify | 
|  * @static | 
|  * @memberOf module:Utils | 
|  * @method | 
|  * @alias wrapSync | 
|  * @category Util | 
|  * @param {Function} func - The synchronous function, or Promise-returning | 
|  * function to convert to an {@link AsyncFunction}. | 
|  * @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be | 
|  * invoked with `(args..., callback)`. | 
|  * @example | 
|  * | 
|  * // passing a regular synchronous function | 
|  * async.waterfall([ | 
|  *     async.apply(fs.readFile, filename, "utf8"), | 
|  *     async.asyncify(JSON.parse), | 
|  *     function (data, next) { | 
|  *         // data is the result of parsing the text. | 
|  *         // If there was a parsing error, it would have been caught. | 
|  *     } | 
|  * ], callback); | 
|  * | 
|  * // passing a function returning a promise | 
|  * async.waterfall([ | 
|  *     async.apply(fs.readFile, filename, "utf8"), | 
|  *     async.asyncify(function (contents) { | 
|  *         return db.model.create(contents); | 
|  *     }), | 
|  *     function (model, next) { | 
|  *         // `model` is the instantiated model object. | 
|  *         // If there was an error, this function would be skipped. | 
|  *     } | 
|  * ], callback); | 
|  * | 
|  * // es2017 example, though `asyncify` is not needed if your JS environment | 
|  * // supports async functions out of the box | 
|  * var q = async.queue(async.asyncify(async function(file) { | 
|  *     var intermediateStep = await processFile(file); | 
|  *     return await somePromise(intermediateStep) | 
|  * })); | 
|  * | 
|  * q.push(files); | 
|  */ | 
| function asyncify(func) { | 
|     return (0, _initialParams2.default)(function (args, callback) { | 
|         var result; | 
|         try { | 
|             result = func.apply(this, args); | 
|         } catch (e) { | 
|             return callback(e); | 
|         } | 
|         // if result is Promise object | 
|         if ((0, _isObject2.default)(result) && typeof result.then === 'function') { | 
|             result.then(function (value) { | 
|                 invokeCallback(callback, null, value); | 
|             }, function (err) { | 
|                 invokeCallback(callback, err.message ? err : new Error(err)); | 
|             }); | 
|         } else { | 
|             callback(null, result); | 
|         } | 
|     }); | 
| } | 
|   | 
| function invokeCallback(callback, error, value) { | 
|     try { | 
|         callback(error, value); | 
|     } catch (e) { | 
|         (0, _setImmediate2.default)(rethrow, e); | 
|     } | 
| } | 
|   | 
| function rethrow(error) { | 
|     throw error; | 
| } | 
| module.exports = exports['default']; |