Guest User

Untitled

a guest
Dec 19th, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. class Cancellable {
  2.  
  3. constructor() {
  4. /**
  5. * @private
  6. * @type {!CancellationToken}
  7. */
  8. this._token = new CancellationToken(this);
  9. /**
  10. * @private
  11. * @type {boolean}
  12. */
  13. this._cancellationRequested = false;
  14. /**
  15. * @private
  16. * @type {Error|null}
  17. */
  18. this._errorOnCancelled = null;
  19. }
  20.  
  21. /**
  22. * @return {CancellationToken}
  23. */
  24. get token() {
  25. return this._token;
  26. }
  27.  
  28. /**
  29. * @return {boolean}
  30. */
  31. get isCancellationRequested() {
  32. return this._cancellationRequested;
  33. }
  34.  
  35. /**
  36. * @throws {!CancellationRequestedError}
  37. */
  38. validateNotCancelled() {
  39. if (!this._cancellationRequested) { return; }
  40. throw new CancellationRequestedError('Already cancelled.', this._errorOnCancelled);
  41. }
  42.  
  43. /**
  44. * @return {!Promise}
  45. */
  46. rejectIfCancelled() {
  47. return new Promise((resolve, reject) => {
  48. if (!this._cancellationRequested) {
  49. resolve();
  50. return;
  51. }
  52. reject(new CancellationRequestedError('Already cancelled.', this._errorOnCancelled));
  53. });
  54. }
  55.  
  56. /**
  57. * @param {string|null} message
  58. */
  59. cancel(message) {
  60. if (this._cancellationRequested) { return; }
  61. this._cancellationRequested = true;
  62. message = message || 'cancellation requested';
  63. this._errorOnCancelled = new Error(message);
  64. }
  65. }
  66.  
  67. class CancellationToken {
  68.  
  69. /**
  70. * @param {!Cancellable} source
  71. */
  72. constructor(source) {
  73. this._source = source;
  74. }
  75.  
  76. /**
  77. * @return {boolean}
  78. */
  79. get isCancellationRequested() {
  80. return this._source.isCancellationRequested;
  81. }
  82.  
  83. /**
  84. * @throws {!CancellationRequestedError}
  85. */
  86. validateNotCancelled() {
  87. this._source.validateNotCancelled();
  88. }
  89.  
  90. /**
  91. * @return {!Promise}
  92. */
  93. rejectIfCancelled() {
  94. return this._source.rejectIfCancelled();
  95. }
  96. }
  97.  
  98. class CancellationRequestedError extends Error {
  99. /**
  100. * @param {string} message
  101. * @param {Error} errorOnCancelled
  102. */
  103. constructor(message, errorOnCancelled) {
  104. super(message);
  105. this._errorOnCancelled = errorOnCancelled;
  106. }
  107.  
  108. /**
  109. * @return {Error}
  110. */
  111. errorOnCancelled() {
  112. return this._errorOnCancelled;
  113. }
  114. }
  115.  
  116. Cancellable.CancellationRequestedError = CancellationRequestedError;
  117.  
  118. module.exports = Cancellable;
Add Comment
Please, Sign In to add comment