1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.CriticalSection = exports.Semaphore = exports.OneTimeBroadcastEvent = void 0;
|
7 |
|
8 | var _Module = _interopRequireDefault(require("./Module"));
|
9 |
|
10 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
11 |
|
12 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
13 |
|
14 | const {
|
15 | MODULE_NAME,
|
16 | log,
|
17 | warn,
|
18 | error
|
19 | } = new _Module.default(__filename); // eslint-disable-line no-unused-vars
|
20 |
|
21 | class OneTimeBroadcastEvent {
|
22 | constructor(signaledInitially) {
|
23 | _defineProperty(this, "_waitingList", void 0);
|
24 |
|
25 | _defineProperty(this, "signaled", void 0);
|
26 |
|
27 | _defineProperty(this, "wait", async () => {
|
28 | if (this.signaled) return;
|
29 | await new Promise(res => this._waitingList.push(res));
|
30 | });
|
31 |
|
32 | _defineProperty(this, "signal", () => {
|
33 | this._waitingList.forEach(res => res());
|
34 |
|
35 | this.signaled = true;
|
36 | });
|
37 |
|
38 | _defineProperty(this, "reset", () => {
|
39 | this.signaled = false;
|
40 | });
|
41 |
|
42 | this._waitingList = [];
|
43 | this.signaled = signaledInitially;
|
44 | }
|
45 |
|
46 | }
|
47 |
|
48 | exports.OneTimeBroadcastEvent = OneTimeBroadcastEvent;
|
49 |
|
50 | class Semaphore {
|
51 | constructor(maxCapacity, name) {
|
52 | _defineProperty(this, "_waitingList", void 0);
|
53 |
|
54 | _defineProperty(this, "_maxCapacity", void 0);
|
55 |
|
56 | _defineProperty(this, "_name", void 0);
|
57 |
|
58 | _defineProperty(this, "takenCount", void 0);
|
59 |
|
60 | _defineProperty(this, "enter", async () => {
|
61 | if (this.takenCount >= this._maxCapacity) {
|
62 | this._name && log(`Semaphore is awaited`, {
|
63 | name: this._name,
|
64 | takenCount: this.takenCount
|
65 | });
|
66 | await new Promise(res => this._waitingList.push(res));
|
67 | this._name && log(`Semaphore awaiting completed`, {
|
68 | name: this._name,
|
69 | takenCount: this.takenCount
|
70 | });
|
71 | }
|
72 |
|
73 | this.takenCount++;
|
74 | this._name && log(`Semaphore was entered`, {
|
75 | name: this._name,
|
76 | takenCount: this.takenCount
|
77 | });
|
78 | });
|
79 |
|
80 | _defineProperty(this, "exit", () => {
|
81 | this._waitingList.length && this._waitingList.shift()();
|
82 | if (this.takenCount > 0) this.takenCount--;
|
83 | this._name && log(`Semaphore was exited`, {
|
84 | name: this._name,
|
85 | takenCount: this.takenCount
|
86 | });
|
87 | });
|
88 |
|
89 | this._maxCapacity = maxCapacity;
|
90 | this._waitingList = [];
|
91 | this._name = name;
|
92 | this._name && log(`Semaphore was created`, {
|
93 | name: this._name,
|
94 | maxCapacity: maxCapacity
|
95 | });
|
96 | this.takenCount = 0;
|
97 | }
|
98 |
|
99 | async run(asyncFunc) {
|
100 | try {
|
101 | await this.enter();
|
102 | return await asyncFunc();
|
103 | } finally {
|
104 | this.exit();
|
105 | }
|
106 | }
|
107 |
|
108 | async runConditional(asyncFunc, condition) {
|
109 | if (!condition || condition()) {
|
110 | try {
|
111 | await this.enter();
|
112 |
|
113 | if (!condition || condition()) {
|
114 | await asyncFunc();
|
115 | }
|
116 | } finally {
|
117 | this.exit();
|
118 | }
|
119 | }
|
120 | }
|
121 |
|
122 | }
|
123 |
|
124 | exports.Semaphore = Semaphore;
|
125 |
|
126 | class CriticalSection extends Semaphore {
|
127 | constructor() {
|
128 | super(1);
|
129 | }
|
130 |
|
131 | }
|
132 |
|
133 | exports.CriticalSection = CriticalSection;
|
134 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3luY1N5bmNVdGlscy5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsImxvZyIsIndhcm4iLCJlcnJvciIsIk1vZHVsZSIsIl9fZmlsZW5hbWUiLCJPbmVUaW1lQnJvYWRjYXN0RXZlbnQiLCJjb25zdHJ1Y3RvciIsInNpZ25hbGVkSW5pdGlhbGx5Iiwic2lnbmFsZWQiLCJQcm9taXNlIiwicmVzIiwiX3dhaXRpbmdMaXN0IiwicHVzaCIsImZvckVhY2giLCJTZW1hcGhvcmUiLCJtYXhDYXBhY2l0eSIsIm5hbWUiLCJ0YWtlbkNvdW50IiwiX21heENhcGFjaXR5IiwiX25hbWUiLCJsZW5ndGgiLCJzaGlmdCIsInJ1biIsImFzeW5jRnVuYyIsImVudGVyIiwiZXhpdCIsInJ1bkNvbmRpdGlvbmFsIiwiY29uZGl0aW9uIiwiQ3JpdGljYWxTZWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7Ozs7OztBQUVBLE1BQU07QUFBRUEsRUFBQUEsV0FBRjtBQUFlQyxFQUFBQSxHQUFmO0FBQW9CQyxFQUFBQSxJQUFwQjtBQUEwQkMsRUFBQUE7QUFBMUIsSUFBb0MsSUFBSUMsZUFBSixDQUFXQyxVQUFYLENBQTFDLEMsQ0FBaUU7O0FBRTFELE1BQU1DLHFCQUFOLENBQTRCO0FBTWpDQyxFQUFBQSxXQUFXLENBQUNDLGlCQUFELEVBQTZCO0FBQUE7O0FBQUE7O0FBQUEsa0NBTWpDLFlBQTJCO0FBQ2hDLFVBQUksS0FBS0MsUUFBVCxFQUNFO0FBQ0YsWUFBTSxJQUFJQyxPQUFKLENBQVlDLEdBQUcsSUFBSSxLQUFLQyxZQUFMLENBQWtCQyxJQUFsQixDQUF1QkYsR0FBdkIsQ0FBbkIsQ0FBTjtBQUNELEtBVnVDOztBQUFBLG9DQVkvQixNQUFZO0FBQ25CLFdBQUtDLFlBQUwsQ0FBa0JFLE9BQWxCLENBQTBCSCxHQUFHLElBQUlBLEdBQUcsRUFBcEM7O0FBQ0EsV0FBS0YsUUFBTCxHQUFnQixJQUFoQjtBQUNELEtBZnVDOztBQUFBLG1DQWlCaEMsTUFBWTtBQUNsQixXQUFLQSxRQUFMLEdBQWdCLEtBQWhCO0FBQ0QsS0FuQnVDOztBQUN0QyxTQUFLRyxZQUFMLEdBQW9CLEVBQXBCO0FBQ0EsU0FBS0gsUUFBTCxHQUFnQkQsaUJBQWhCO0FBQ0Q7O0FBVGdDOzs7O0FBNEI1QixNQUFNTyxTQUFOLENBQWdCO0FBUXJCUixFQUFBQSxXQUFXLENBQUNTLFdBQUQsRUFBc0JDLElBQXRCLEVBQXFDO0FBQUE7O0FBQUE7O0FBQUE7O0FBQUE7O0FBQUEsbUNBU3hDLFlBQTJCO0FBQ2pDLFVBQUksS0FBS0MsVUFBTCxJQUFtQixLQUFLQyxZQUE1QixFQUEwQztBQUN4QyxhQUFLQyxLQUFMLElBQWNuQixHQUFHLENBQUUsc0JBQUYsRUFBeUI7QUFBRWdCLFVBQUFBLElBQUksRUFBRSxLQUFLRyxLQUFiO0FBQW9CRixVQUFBQSxVQUFVLEVBQUUsS0FBS0E7QUFBckMsU0FBekIsQ0FBakI7QUFDQSxjQUFNLElBQUlSLE9BQUosQ0FBWUMsR0FBRyxJQUFJLEtBQUtDLFlBQUwsQ0FBa0JDLElBQWxCLENBQXVCRixHQUF2QixDQUFuQixDQUFOO0FBQ0EsYUFBS1MsS0FBTCxJQUFjbkIsR0FBRyxDQUFFLDhCQUFGLEVBQWlDO0FBQUVnQixVQUFBQSxJQUFJLEVBQUUsS0FBS0csS0FBYjtBQUFvQkYsVUFBQUEsVUFBVSxFQUFFLEtBQUtBO0FBQXJDLFNBQWpDLENBQWpCO0FBQ0Q7O0FBQ0QsV0FBS0EsVUFBTDtBQUNBLFdBQUtFLEtBQUwsSUFBY25CLEdBQUcsQ0FBRSx1QkFBRixFQUEwQjtBQUFFZ0IsUUFBQUEsSUFBSSxFQUFFLEtBQUtHLEtBQWI7QUFBb0JGLFFBQUFBLFVBQVUsRUFBRSxLQUFLQTtBQUFyQyxPQUExQixDQUFqQjtBQUNELEtBakIrQzs7QUFBQSxrQ0FtQnpDLE1BQVk7QUFDakIsV0FBS04sWUFBTCxDQUFrQlMsTUFBbEIsSUFBNEIsS0FBS1QsWUFBTCxDQUFrQlUsS0FBbEIsSUFBNUI7QUFDQSxVQUFJLEtBQUtKLFVBQUwsR0FBa0IsQ0FBdEIsRUFDRSxLQUFLQSxVQUFMO0FBQ0YsV0FBS0UsS0FBTCxJQUFjbkIsR0FBRyxDQUFFLHNCQUFGLEVBQXlCO0FBQUVnQixRQUFBQSxJQUFJLEVBQUUsS0FBS0csS0FBYjtBQUFvQkYsUUFBQUEsVUFBVSxFQUFFLEtBQUtBO0FBQXJDLE9BQXpCLENBQWpCO0FBQ0QsS0F4QitDOztBQUM5QyxTQUFLQyxZQUFMLEdBQW9CSCxXQUFwQjtBQUNBLFNBQUtKLFlBQUwsR0FBb0IsRUFBcEI7QUFDQSxTQUFLUSxLQUFMLEdBQWFILElBQWI7QUFDQSxTQUFLRyxLQUFMLElBQWNuQixHQUFHLENBQUUsdUJBQUYsRUFBMEI7QUFBRWdCLE1BQUFBLElBQUksRUFBRSxLQUFLRyxLQUFiO0FBQW9CSixNQUFBQSxXQUFXLEVBQUVBO0FBQWpDLEtBQTFCLENBQWpCO0FBQ0EsU0FBS0UsVUFBTCxHQUFrQixDQUFsQjtBQUNEOztBQW9CRCxRQUFNSyxHQUFOLENBQWFDLFNBQWIsRUFBc0Q7QUFDcEQsUUFBSTtBQUNGLFlBQU0sS0FBS0MsS0FBTCxFQUFOO0FBQ0EsYUFBTyxNQUFNRCxTQUFTLEVBQXRCO0FBQ0QsS0FIRCxTQUdVO0FBQ1IsV0FBS0UsSUFBTDtBQUNEO0FBQ0Y7O0FBRUQsUUFBTUMsY0FBTixDQUFxQkgsU0FBckIsRUFBcURJLFNBQXJELEVBQThGO0FBQzVGLFFBQUksQ0FBQ0EsU0FBRCxJQUFjQSxTQUFTLEVBQTNCLEVBQStCO0FBQzdCLFVBQUk7QUFDRixjQUFNLEtBQUtILEtBQUwsRUFBTjs7QUFDQSxZQUFJLENBQUNHLFNBQUQsSUFBY0EsU0FBUyxFQUEzQixFQUErQjtBQUM3QixnQkFBTUosU0FBUyxFQUFmO0FBQ0Q7QUFDRixPQUxELFNBS1U7QUFDUixhQUFLRSxJQUFMO0FBQ0Q7QUFDRjtBQUNGOztBQXREb0I7Ozs7QUF5RGhCLE1BQU1HLGVBQU4sU0FBOEJkLFNBQTlCLENBQXdDO0FBQzdDUixFQUFBQSxXQUFXLEdBQUc7QUFDWixVQUFNLENBQU47QUFDRDs7QUFINEMiLCJzb3VyY2VzQ29udGVudCI6WyIvL0BmbG93XG5cbmltcG9ydCBNb2R1bGUgZnJvbSAnLi9Nb2R1bGUnXG5cbmNvbnN0IHsgTU9EVUxFX05BTUUsIGxvZywgd2FybiwgZXJyb3IgfSA9IG5ldyBNb2R1bGUoX19maWxlbmFtZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG5leHBvcnQgY2xhc3MgT25lVGltZUJyb2FkY2FzdEV2ZW50IHtcblxuICBfd2FpdGluZ0xpc3Q6IEFycmF5PCgpID0+IHZvaWQ+XG4gIHNpZ25hbGVkOiBib29sZWFuXG5cblxuICBjb25zdHJ1Y3RvcihzaWduYWxlZEluaXRpYWxseTogYm9vbGVhbikge1xuICAgIHRoaXMuX3dhaXRpbmdMaXN0ID0gW11cbiAgICB0aGlzLnNpZ25hbGVkID0gc2lnbmFsZWRJbml0aWFsbHlcbiAgfVxuXG5cbiAgd2FpdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5zaWduYWxlZClcbiAgICAgIHJldHVyblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiB0aGlzLl93YWl0aW5nTGlzdC5wdXNoKHJlcykpXG4gIH1cblxuICBzaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5fd2FpdGluZ0xpc3QuZm9yRWFjaChyZXMgPT4gcmVzKCkpXG4gICAgdGhpcy5zaWduYWxlZCA9IHRydWVcbiAgfVxuXG4gIHJlc2V0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuc2lnbmFsZWQgPSBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZW1hcGhvcmUge1xuXG4gIF93YWl0aW5nTGlzdDogQXJyYXk8KCkgPT4gdm9pZD5cbiAgX21heENhcGFjaXR5OiBudW1iZXJcbiAgX25hbWU6ID9zdHJpbmdcblxuICB0YWtlbkNvdW50OiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihtYXhDYXBhY2l0eTogbnVtYmVyLCBuYW1lOiA/c3RyaW5nKSB7XG4gICAgdGhpcy5fbWF4Q2FwYWNpdHkgPSBtYXhDYXBhY2l0eSAgICBcbiAgICB0aGlzLl93YWl0aW5nTGlzdCA9IFtdXG4gICAgdGhpcy5fbmFtZSA9IG5hbWVcbiAgICB0aGlzLl9uYW1lICYmIGxvZyhgU2VtYXBob3JlIHdhcyBjcmVhdGVkYCwgeyBuYW1lOiB0aGlzLl9uYW1lLCBtYXhDYXBhY2l0eTogbWF4Q2FwYWNpdHkgfSlcbiAgICB0aGlzLnRha2VuQ291bnQgPSAwXG4gIH1cblxuXG4gIGVudGVyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLnRha2VuQ291bnQgPj0gdGhpcy5fbWF4Q2FwYWNpdHkpIHtcbiAgICAgIHRoaXMuX25hbWUgJiYgbG9nKGBTZW1hcGhvcmUgaXMgYXdhaXRlZGAsIHsgbmFtZTogdGhpcy5fbmFtZSwgdGFrZW5Db3VudDogdGhpcy50YWtlbkNvdW50IH0pXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gdGhpcy5fd2FpdGluZ0xpc3QucHVzaChyZXMpKVxuICAgICAgdGhpcy5fbmFtZSAmJiBsb2coYFNlbWFwaG9yZSBhd2FpdGluZyBjb21wbGV0ZWRgLCB7IG5hbWU6IHRoaXMuX25hbWUsIHRha2VuQ291bnQ6IHRoaXMudGFrZW5Db3VudCB9KVxuICAgIH1cbiAgICB0aGlzLnRha2VuQ291bnQrK1xuICAgIHRoaXMuX25hbWUgJiYgbG9nKGBTZW1hcGhvcmUgd2FzIGVudGVyZWRgLCB7IG5hbWU6IHRoaXMuX25hbWUsIHRha2VuQ291bnQ6IHRoaXMudGFrZW5Db3VudCB9KVxuICB9XG5cbiAgZXhpdCA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLl93YWl0aW5nTGlzdC5sZW5ndGggJiYgdGhpcy5fd2FpdGluZ0xpc3Quc2hpZnQoKSgpXG4gICAgaWYgKHRoaXMudGFrZW5Db3VudCA+IDApXG4gICAgICB0aGlzLnRha2VuQ291bnQtLVxuICAgIHRoaXMuX25hbWUgJiYgbG9nKGBTZW1hcGhvcmUgd2FzIGV4aXRlZGAsIHsgbmFtZTogdGhpcy5fbmFtZSwgdGFrZW5Db3VudDogdGhpcy50YWtlbkNvdW50IH0pXG4gIH1cblxuICBhc3luYyBydW48VD4oYXN5bmNGdW5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZW50ZXIoKVxuICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jRnVuYygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZXhpdCgpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuQ29uZGl0aW9uYWwoYXN5bmNGdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBjb25kaXRpb246ICgpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNvbmRpdGlvbiB8fCBjb25kaXRpb24oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnRlcigpXG4gICAgICAgIGlmICghY29uZGl0aW9uIHx8IGNvbmRpdGlvbigpKSB7XG4gICAgICAgICAgYXdhaXQgYXN5bmNGdW5jKClcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5leGl0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyaXRpY2FsU2VjdGlvbiBleHRlbmRzIFNlbWFwaG9yZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKDEpXG4gIH1cbn0iXX0= |
\ | No newline at end of file |