| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 
							- 'use strict';
 
- let call = module.exports = {
 
-   safe: safeCall,
 
-   once: callOnce,
 
- };
 
- /**
 
-  * Calls a function with the given arguments, and ensures that the error-first callback is _always_
 
-  * invoked exactly once, even if the function throws an error.
 
-  *
 
-  * @param {function} fn - The function to invoke
 
-  * @param {...*} args - The arguments to pass to the function. The final argument must be a callback function.
 
-  */
 
- function safeCall (fn, args) {
 
-   // Get the function arguments as an array
 
-   args = Array.prototype.slice.call(arguments, 1);
 
-   // Replace the callback function with a wrapper that ensures it will only be called once
 
-   let callback = call.once(args.pop());
 
-   args.push(callback);
 
-   try {
 
-     fn.apply(null, args);
 
-   }
 
-   catch (err) {
 
-     callback(err);
 
-   }
 
- }
 
- /**
 
-  * Returns a wrapper function that ensures the given callback function is only called once.
 
-  * Subsequent calls are ignored, unless the first argument is an Error, in which case the
 
-  * error is thrown.
 
-  *
 
-  * @param {function} fn - The function that should only be called once
 
-  * @returns {function}
 
-  */
 
- function callOnce (fn) {
 
-   let fulfilled = false;
 
-   return function onceWrapper (err) {
 
-     if (!fulfilled) {
 
-       fulfilled = true;
 
-       return fn.apply(this, arguments);
 
-     }
 
-     else if (err) {
 
-       // The callback has already been called, but now an error has occurred
 
-       // (most likely inside the callback function). So re-throw the error,
 
-       // so it gets handled further up the call stack
 
-       throw err;
 
-     }
 
-   };
 
- }
 
 
  |