'use strict'; import initialParams from './internal/initialParams'; export default function timeout(asyncFn, miliseconds, info) { var originalCallback, timer; var timedOut = false; function injectedCallback() { if (!timedOut) { originalCallback.apply(null, arguments); clearTimeout(timer); } } function timeoutCallback() { var name = asyncFn.name || 'anonymous'; var error = new Error('Callback function "' + name + '" timed out.'); error.code = 'ETIMEDOUT'; if (info) { error.info = info; } timedOut = true; originalCallback(error); } return initialParams(function (args, origCallback) { originalCallback = origCallback; // setup timer and call original function timer = setTimeout(timeoutCallback, miliseconds); asyncFn.apply(null, args.concat(injectedCallback)); }); }