"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.KeyPromiseQueue = void 0;
// KeyPromiseQueue is a simple promise queue
// used to queue operations per key basis.
// Once the tail promise in the key-queue fulfills,
// the chain on that key will be cleared.
class KeyPromiseQueue {
  constructor() {
    this.queue = {};
  }
  enqueue(key, operation) {
    const tuple = this.beforeOp(key);
    const toAwait = tuple[1];
    const nextOperation = toAwait.then(operation);
    const wrappedOperation = nextOperation.then(result => {
      this.afterOp(key);
      return result;
    });
    tuple[1] = wrappedOperation;
    return wrappedOperation;
  }
  beforeOp(key) {
    let tuple = this.queue[key];
    if (!tuple) {
      tuple = [0, Promise.resolve()];
      this.queue[key] = tuple;
    }
    tuple[0]++;
    return tuple;
  }
  afterOp(key) {
    const tuple = this.queue[key];
    if (!tuple) {
      return;
    }
    tuple[0]--;
    if (tuple[0] <= 0) {
      delete this.queue[key];
      return;
    }
  }
}
exports.KeyPromiseQueue = KeyPromiseQueue;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJLZXlQcm9taXNlUXVldWUiLCJjb25zdHJ1Y3RvciIsInF1ZXVlIiwiZW5xdWV1ZSIsImtleSIsIm9wZXJhdGlvbiIsInR1cGxlIiwiYmVmb3JlT3AiLCJ0b0F3YWl0IiwibmV4dE9wZXJhdGlvbiIsInRoZW4iLCJ3cmFwcGVkT3BlcmF0aW9uIiwicmVzdWx0IiwiYWZ0ZXJPcCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9LZXlQcm9taXNlUXVldWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gS2V5UHJvbWlzZVF1ZXVlIGlzIGEgc2ltcGxlIHByb21pc2UgcXVldWVcbi8vIHVzZWQgdG8gcXVldWUgb3BlcmF0aW9ucyBwZXIga2V5IGJhc2lzLlxuLy8gT25jZSB0aGUgdGFpbCBwcm9taXNlIGluIHRoZSBrZXktcXVldWUgZnVsZmlsbHMsXG4vLyB0aGUgY2hhaW4gb24gdGhhdCBrZXkgd2lsbCBiZSBjbGVhcmVkLlxuZXhwb3J0IGNsYXNzIEtleVByb21pc2VRdWV1ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucXVldWUgPSB7fTtcbiAgfVxuXG4gIGVucXVldWUoa2V5LCBvcGVyYXRpb24pIHtcbiAgICBjb25zdCB0dXBsZSA9IHRoaXMuYmVmb3JlT3Aoa2V5KTtcbiAgICBjb25zdCB0b0F3YWl0ID0gdHVwbGVbMV07XG4gICAgY29uc3QgbmV4dE9wZXJhdGlvbiA9IHRvQXdhaXQudGhlbihvcGVyYXRpb24pO1xuICAgIGNvbnN0IHdyYXBwZWRPcGVyYXRpb24gPSBuZXh0T3BlcmF0aW9uLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIHRoaXMuYWZ0ZXJPcChrZXkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICB0dXBsZVsxXSA9IHdyYXBwZWRPcGVyYXRpb247XG4gICAgcmV0dXJuIHdyYXBwZWRPcGVyYXRpb247XG4gIH1cblxuICBiZWZvcmVPcChrZXkpIHtcbiAgICBsZXQgdHVwbGUgPSB0aGlzLnF1ZXVlW2tleV07XG4gICAgaWYgKCF0dXBsZSkge1xuICAgICAgdHVwbGUgPSBbMCwgUHJvbWlzZS5yZXNvbHZlKCldO1xuICAgICAgdGhpcy5xdWV1ZVtrZXldID0gdHVwbGU7XG4gICAgfVxuICAgIHR1cGxlWzBdKys7XG4gICAgcmV0dXJuIHR1cGxlO1xuICB9XG5cbiAgYWZ0ZXJPcChrZXkpIHtcbiAgICBjb25zdCB0dXBsZSA9IHRoaXMucXVldWVba2V5XTtcbiAgICBpZiAoIXR1cGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHR1cGxlWzBdLS07XG4gICAgaWYgKHR1cGxlWzBdIDw9IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnF1ZXVlW2tleV07XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUEsZUFBZSxDQUFDO0VBQzNCQyxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDakI7RUFFQUMsT0FBT0EsQ0FBQ0MsR0FBRyxFQUFFQyxTQUFTLEVBQUU7SUFDdEIsTUFBTUMsS0FBSyxHQUFHLElBQUksQ0FBQ0MsUUFBUSxDQUFDSCxHQUFHLENBQUM7SUFDaEMsTUFBTUksT0FBTyxHQUFHRixLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU1HLGFBQWEsR0FBR0QsT0FBTyxDQUFDRSxJQUFJLENBQUNMLFNBQVMsQ0FBQztJQUM3QyxNQUFNTSxnQkFBZ0IsR0FBR0YsYUFBYSxDQUFDQyxJQUFJLENBQUNFLE1BQU0sSUFBSTtNQUNwRCxJQUFJLENBQUNDLE9BQU8sQ0FBQ1QsR0FBRyxDQUFDO01BQ2pCLE9BQU9RLE1BQU07SUFDZixDQUFDLENBQUM7SUFDRk4sS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHSyxnQkFBZ0I7SUFDM0IsT0FBT0EsZ0JBQWdCO0VBQ3pCO0VBRUFKLFFBQVFBLENBQUNILEdBQUcsRUFBRTtJQUNaLElBQUlFLEtBQUssR0FBRyxJQUFJLENBQUNKLEtBQUssQ0FBQ0UsR0FBRyxDQUFDO0lBQzNCLElBQUksQ0FBQ0UsS0FBSyxFQUFFO01BQ1ZBLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRVEsT0FBTyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO01BQzlCLElBQUksQ0FBQ2IsS0FBSyxDQUFDRSxHQUFHLENBQUMsR0FBR0UsS0FBSztJQUN6QjtJQUNBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDVixPQUFPQSxLQUFLO0VBQ2Q7RUFFQU8sT0FBT0EsQ0FBQ1QsR0FBRyxFQUFFO0lBQ1gsTUFBTUUsS0FBSyxHQUFHLElBQUksQ0FBQ0osS0FBSyxDQUFDRSxHQUFHLENBQUM7SUFDN0IsSUFBSSxDQUFDRSxLQUFLLEVBQUU7TUFDVjtJQUNGO0lBQ0FBLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNWLElBQUlBLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7TUFDakIsT0FBTyxJQUFJLENBQUNKLEtBQUssQ0FBQ0UsR0FBRyxDQUFDO01BQ3RCO0lBQ0Y7RUFDRjtBQUNGO0FBQUNZLE9BQUEsQ0FBQWhCLGVBQUEsR0FBQUEsZUFBQSIsImlnbm9yZUxpc3QiOltdfQ==