You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							93 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							93 lines
						
					
					
						
							2.3 KiB
						
					
					
				
								"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;
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								};
							 | 
						|
								
							 |