| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | 
							- "use strict";
 
- module.exports = function(Promise, INTERNAL, debug) {
 
- var util = require("./util");
 
- var TimeoutError = Promise.TimeoutError;
 
- function HandleWrapper(handle)  {
 
-     this.handle = handle;
 
- }
 
- HandleWrapper.prototype._resultCancelled = function() {
 
-     clearTimeout(this.handle);
 
- };
 
- var afterValue = function(value) { return delay(+this).thenReturn(value); };
 
- var delay = Promise.delay = function (ms, value) {
 
-     var ret;
 
-     var handle;
 
-     if (value !== undefined) {
 
-         ret = Promise.resolve(value)
 
-                 ._then(afterValue, null, null, ms, undefined);
 
-         if (debug.cancellation() && value instanceof Promise) {
 
-             ret._setOnCancel(value);
 
-         }
 
-     } else {
 
-         ret = new Promise(INTERNAL);
 
-         handle = setTimeout(function() { ret._fulfill(); }, +ms);
 
-         if (debug.cancellation()) {
 
-             ret._setOnCancel(new HandleWrapper(handle));
 
-         }
 
-         ret._captureStackTrace();
 
-     }
 
-     ret._setAsyncGuaranteed();
 
-     return ret;
 
- };
 
- Promise.prototype.delay = function (ms) {
 
-     return delay(ms, this);
 
- };
 
- var afterTimeout = function (promise, message, parent) {
 
-     var err;
 
-     if (typeof message !== "string") {
 
-         if (message instanceof Error) {
 
-             err = message;
 
-         } else {
 
-             err = new TimeoutError("operation timed out");
 
-         }
 
-     } else {
 
-         err = new TimeoutError(message);
 
-     }
 
-     util.markAsOriginatingFromRejection(err);
 
-     promise._attachExtraTrace(err);
 
-     promise._reject(err);
 
-     if (parent != null) {
 
-         parent.cancel();
 
-     }
 
- };
 
- function successClear(value) {
 
-     clearTimeout(this.handle);
 
-     return value;
 
- }
 
- function failureClear(reason) {
 
-     clearTimeout(this.handle);
 
-     throw reason;
 
- }
 
- Promise.prototype.timeout = function (ms, message) {
 
-     ms = +ms;
 
-     var ret, parent;
 
-     var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
 
-         if (ret.isPending()) {
 
-             afterTimeout(ret, message, parent);
 
-         }
 
-     }, ms));
 
-     if (debug.cancellation()) {
 
-         parent = this.then();
 
-         ret = parent._then(successClear, failureClear,
 
-                             undefined, handleWrapper, undefined);
 
-         ret._setOnCancel(handleWrapper);
 
-     } else {
 
-         ret = this._then(successClear, failureClear,
 
-                             undefined, handleWrapper, undefined);
 
-     }
 
-     return ret;
 
- };
 
- };
 
 
  |