"use strict"; var customError = require("es5-ext/error/custom") , isValue = require("es5-ext/object/is-value") , ensurePromise = require("es5-ext/object/ensure-promise") , nextTick = require("next-tick") , ensureTimeout = require("../valid-timeout"); module.exports = function (/* timeout */) { ensurePromise(this); var timeout = arguments[0]; if (isValue(timeout)) timeout = ensureTimeout(timeout); return new this.constructor( function (resolve, reject) { var isSettled = false, timeoutId; var timeoutCallback = function () { if (isSettled) return; reject(customError("Operation timeout", "PROMISE_TIMEOUT")); }; if (isValue(timeout)) timeoutId = setTimeout(timeoutCallback, timeout); else nextTick(timeoutCallback); this.then( function (value) { isSettled = true; clearTimeout(timeoutId); resolve(value); }, function (reason) { isSettled = true; clearTimeout(timeoutId); reject(reason); } ); }.bind(this) ); };