47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const TimeoutError_1 = require("./TimeoutError");
|
||
|
const utils_1 = require("./utils");
|
||
|
class PendingOperation {
|
||
|
constructor(timeoutMillis) {
|
||
|
this.timeoutMillis = timeoutMillis;
|
||
|
this.deferred = utils_1.defer();
|
||
|
this.possibleTimeoutCause = null;
|
||
|
this.promise = timeout(this.deferred.promise, timeoutMillis).catch(err => {
|
||
|
if (err instanceof TimeoutError_1.TimeoutError) {
|
||
|
if (this.possibleTimeoutCause) {
|
||
|
err = new TimeoutError_1.TimeoutError(this.possibleTimeoutCause.message);
|
||
|
}
|
||
|
else {
|
||
|
err = new TimeoutError_1.TimeoutError('operation timed out for an unknown reason');
|
||
|
}
|
||
|
}
|
||
|
return Promise.reject(err);
|
||
|
});
|
||
|
}
|
||
|
abort() {
|
||
|
this.reject(new Error('aborted'));
|
||
|
}
|
||
|
reject(err) {
|
||
|
this.deferred.reject(err);
|
||
|
}
|
||
|
resolve(value) {
|
||
|
this.deferred.resolve(value);
|
||
|
}
|
||
|
}
|
||
|
exports.PendingOperation = PendingOperation;
|
||
|
function timeout(promise, time) {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
const timeoutHandle = setTimeout(() => reject(new TimeoutError_1.TimeoutError()), time);
|
||
|
promise
|
||
|
.then(result => {
|
||
|
clearTimeout(timeoutHandle);
|
||
|
resolve(result);
|
||
|
})
|
||
|
.catch(err => {
|
||
|
clearTimeout(timeoutHandle);
|
||
|
reject(err);
|
||
|
});
|
||
|
});
|
||
|
}
|