PendingOperation.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const TimeoutError_1 = require("./TimeoutError");
  4. const utils_1 = require("./utils");
  5. class PendingOperation {
  6. constructor(timeoutMillis) {
  7. this.timeoutMillis = timeoutMillis;
  8. this.deferred = utils_1.defer();
  9. this.possibleTimeoutCause = null;
  10. this.promise = timeout(this.deferred.promise, timeoutMillis).catch(err => {
  11. if (err instanceof TimeoutError_1.TimeoutError) {
  12. if (this.possibleTimeoutCause) {
  13. err = new TimeoutError_1.TimeoutError(this.possibleTimeoutCause.message);
  14. }
  15. else {
  16. err = new TimeoutError_1.TimeoutError('operation timed out for an unknown reason');
  17. }
  18. }
  19. return Promise.reject(err);
  20. });
  21. }
  22. abort() {
  23. this.reject(new Error('aborted'));
  24. }
  25. reject(err) {
  26. this.deferred.reject(err);
  27. }
  28. resolve(value) {
  29. this.deferred.resolve(value);
  30. }
  31. }
  32. exports.PendingOperation = PendingOperation;
  33. function timeout(promise, time) {
  34. return new Promise((resolve, reject) => {
  35. const timeoutHandle = setTimeout(() => reject(new TimeoutError_1.TimeoutError()), time);
  36. promise
  37. .then(result => {
  38. clearTimeout(timeoutHandle);
  39. resolve(result);
  40. })
  41. .catch(err => {
  42. clearTimeout(timeoutHandle);
  43. reject(err);
  44. });
  45. });
  46. }