f26431a187ce6613eb2b3bec2bf8b5bd22a7f493
[aai/esr-gui.git] /
1 "use strict";
2 module.exports = function(Promise, INTERNAL) {
3 var util = require("./util.js");
4 var TimeoutError = Promise.TimeoutError;
5
6 var afterTimeout = function (promise, message) {
7     if (!promise.isPending()) return;
8     
9     var err;
10     if(!util.isPrimitive(message) && (message instanceof Error)) {
11         err = message;
12     } else {
13         if (typeof message !== "string") {
14             message = "operation timed out";
15         }
16         err = new TimeoutError(message);
17     }
18     util.markAsOriginatingFromRejection(err);
19     promise._attachExtraTrace(err);
20     promise._cancel(err);
21 };
22
23 var afterValue = function(value) { return delay(+this).thenReturn(value); };
24 var delay = Promise.delay = function (value, ms) {
25     if (ms === undefined) {
26         ms = value;
27         value = undefined;
28         var ret = new Promise(INTERNAL);
29         setTimeout(function() { ret._fulfill(); }, ms);
30         return ret;
31     }
32     ms = +ms;
33     return Promise.resolve(value)._then(afterValue, null, null, ms, undefined);
34 };
35
36 Promise.prototype.delay = function (ms) {
37     return delay(this, ms);
38 };
39
40 function successClear(value) {
41     var handle = this;
42     if (handle instanceof Number) handle = +handle;
43     clearTimeout(handle);
44     return value;
45 }
46
47 function failureClear(reason) {
48     var handle = this;
49     if (handle instanceof Number) handle = +handle;
50     clearTimeout(handle);
51     throw reason;
52 }
53
54 Promise.prototype.timeout = function (ms, message) {
55     ms = +ms;
56     var ret = this.then().cancellable();
57     ret._cancellationParent = this;
58     var handle = setTimeout(function timeoutTimeout() {
59         afterTimeout(ret, message);
60     }, ms);
61     return ret._then(successClear, failureClear, undefined, handle, undefined);
62 };
63
64 };