AggregatedReporter.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. "use strict";
  2. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  3. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  4. return new (P || (P = Promise))(function (resolve, reject) {
  5. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  6. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  7. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  8. step((generator = generator.apply(thisArg, _arguments || [])).next());
  9. });
  10. };
  11. Object.defineProperty(exports, "__esModule", { value: true });
  12. const OperationCanceledError_1 = require("../error/OperationCanceledError");
  13. const FilesChange_1 = require("./FilesChange");
  14. /**
  15. * This higher order reporter aggregates too frequent getReport requests to avoid unnecessary computation.
  16. */
  17. function createAggregatedReporter(reporter) {
  18. let pendingPromise;
  19. let queuedIndex = 0;
  20. let queuedChanges = [];
  21. const aggregatedReporter = Object.assign(Object.assign({}, reporter), { getReport: (change) => __awaiter(this, void 0, void 0, function* () {
  22. if (!pendingPromise) {
  23. let resolvePending;
  24. pendingPromise = new Promise((resolve) => {
  25. resolvePending = () => {
  26. resolve();
  27. pendingPromise = undefined;
  28. };
  29. });
  30. return reporter
  31. .getReport(change)
  32. .then((report) => (Object.assign(Object.assign({}, report), { close() {
  33. return __awaiter(this, void 0, void 0, function* () {
  34. yield report.close();
  35. resolvePending();
  36. });
  37. } })))
  38. .catch((error) => {
  39. resolvePending();
  40. throw error;
  41. });
  42. }
  43. else {
  44. const currentIndex = ++queuedIndex;
  45. queuedChanges.push(change);
  46. return pendingPromise.then(() => {
  47. if (queuedIndex === currentIndex) {
  48. const change = FilesChange_1.aggregateFilesChanges(queuedChanges);
  49. queuedChanges = [];
  50. return aggregatedReporter.getReport(change);
  51. }
  52. else {
  53. throw new OperationCanceledError_1.OperationCanceledError('getReport canceled - new report requested.');
  54. }
  55. });
  56. }
  57. }) });
  58. return aggregatedReporter;
  59. }
  60. exports.createAggregatedReporter = createAggregatedReporter;