UNPKG

10.1 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.CriticalSection = exports.Semaphore = exports.OneTimeBroadcastEvent = void 0;
7
8var _Module = _interopRequireDefault(require("./Module"));
9
10function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
12function _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
14const {
15 MODULE_NAME,
16 log,
17 warn,
18 error
19} = new _Module.default(__filename); // eslint-disable-line no-unused-vars
20
21class 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
48exports.OneTimeBroadcastEvent = OneTimeBroadcastEvent;
49
50class 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
124exports.Semaphore = Semaphore;
125
126class CriticalSection extends Semaphore {
127 constructor() {
128 super(1);
129 }
130
131}
132
133exports.CriticalSection = CriticalSection;
134//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hc3luY1N5bmNVdGlscy5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsImxvZyIsIndhcm4iLCJlcnJvciIsIk1vZHVsZSIsIl9fZmlsZW5hbWUiLCJPbmVUaW1lQnJvYWRjYXN0RXZlbnQiLCJjb25zdHJ1Y3RvciIsInNpZ25hbGVkSW5pdGlhbGx5Iiwic2lnbmFsZWQiLCJQcm9taXNlIiwicmVzIiwiX3dhaXRpbmdMaXN0IiwicHVzaCIsImZvckVhY2giLCJTZW1hcGhvcmUiLCJtYXhDYXBhY2l0eSIsIm5hbWUiLCJ0YWtlbkNvdW50IiwiX21heENhcGFjaXR5IiwiX25hbWUiLCJsZW5ndGgiLCJzaGlmdCIsInJ1biIsImFzeW5jRnVuYyIsImVudGVyIiwiZXhpdCIsInJ1bkNvbmRpdGlvbmFsIiwiY29uZGl0aW9uIiwiQ3JpdGljYWxTZWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBRUE7Ozs7OztBQUVBLE1BQU07QUFBRUEsRUFBQUEsV0FBRjtBQUFlQyxFQUFBQSxHQUFmO0FBQW9CQyxFQUFBQSxJQUFwQjtBQUEwQkMsRUFBQUE7QUFBMUIsSUFBb0MsSUFBSUMsZUFBSixDQUFXQyxVQUFYLENBQTFDLEMsQ0FBaUU7O0FBRTFELE1BQU1DLHFCQUFOLENBQTRCO0FBTWpDQyxFQUFBQSxXQUFXLENBQUNDLGlCQUFELEVBQTZCO0FBQUE7O0FBQUE7O0FBQUEsa0NBTWpDLFlBQTJCO0FBQ2hDLFVBQUksS0FBS0MsUUFBVCxFQUNFO0FBQ0YsWUFBTSxJQUFJQyxPQUFKLENBQVlDLEdBQUcsSUFBSSxLQUFLQyxZQUFMLENBQWtCQyxJQUFsQixDQUF1QkYsR0FBdkIsQ0FBbkIsQ0FBTjtBQUNELEtBVnVDOztBQUFBLG9DQVkvQixNQUFZO0FBQ25CLFdBQUtDLFlBQUwsQ0FBa0JFLE9BQWxCLENBQTBCSCxHQUFHLElBQUlBLEdBQUcsRUFBcEM7O0FBQ0EsV0FBS0YsUUFBTCxHQUFnQixJQUFoQjtBQUNELEtBZnVDOztBQUFBLG1DQWlCaEMs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L0BmbG93XG5cbmltcG9ydCBNb2R1bGUgZnJvbSAnLi9Nb2R1bGUnXG5cbmNvbnN0IHsgTU9EVUxFX05BTUUsIGxvZywgd2FybiwgZXJyb3IgfSA9IG5ldyBNb2R1bGUoX19maWxlbmFtZSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuXG5leHBvcnQgY2xhc3MgT25lVGltZUJyb2FkY2FzdEV2ZW50IHtcblxuICBfd2FpdGluZ0xpc3Q6IEFycmF5PCgpID0+IHZvaWQ+XG4gIHNpZ25hbGVkOiBib29sZWFuXG5cblxuICBjb25zdHJ1Y3RvcihzaWduYWxlZEluaXRpYWxseTogYm9vbGVhbikge1xuICAgIHRoaXMuX3dhaXRpbmdMaXN0ID0gW11cbiAgICB0aGlzLnNpZ25hbGVkID0gc2lnbmFsZWRJbml0aWFsbHlcbiAgfVxuXG5cbiAgd2FpdCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5zaWduYWxlZClcbiAgICAgIHJldHVyblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiB0aGlzLl93YWl0aW5nTGlzdC5wdXNoKHJlcykpXG4gIH1cblxuICBzaWduYWwgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5fd2FpdGluZ0xpc3QuZm9yRWFjaChyZXMgPT4gcmVzKCkpXG4gICAgdGhpcy5zaWduYWxlZCA9IHRydWVcbiAgfVxuXG4gIHJlc2V0ID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuc2lnbmFsZWQgPSBmYWxzZVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZW1hcGhvcmUge1xuXG4gIF93YWl0aW5nTGlzdDogQXJyYXk8KCkgPT4gdm9pZD5cbiAgX21heENhcGFjaXR5OiBudW1iZXJcbiAgX25hbWU6ID9zdHJpbmdcblxuICB0YWtlbkNvdW50OiBudW1iZXJcblxuICBjb25zdHJ1Y3RvcihtYXhDYXBhY2l0eTogbnVtYmVyLCBuYW1lOiA/c3RyaW5nKSB7XG4gICAgdGhpcy5fbWF4Q2FwYWNpdHkgPSBtYXhDYXBhY2l0eSAgICBcbiAgICB0aGlzLl93YWl0aW5nTGlzdCA9IFtdXG4gICAgdGhpcy5fbmFtZSA9IG5hbWVcbiAgICB0aGlzLl9uYW1lICYmIGxvZyhgU2VtYXBob3JlIHdhcyBjcmVhdGVkYCwgeyBuYW1lOiB0aGlzLl9uYW1lLCBtYXhDYXBhY2l0eTogbWF4Q2FwYWNpdHkgfSlcbiAgICB0aGlzLnRha2VuQ291bnQgPSAwXG4gIH1cblxuXG4gIGVudGVyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLnRha2VuQ291bnQgPj0gdGhpcy5fbWF4Q2FwYWNpdHkpIHtcbiAgICAgIHRoaXMuX25hbWUgJiYgbG9nKGBTZW1hcGhvcmUgaXMgYXdhaXRlZGAsIHsgbmFtZTogdGhpcy5fbmFtZSwgdGFrZW5Db3VudDogdGhpcy50YWtlbkNvdW50IH0pXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gdGhpcy5fd2FpdGluZ0xpc3QucHVzaChyZXMpKVxuICAgICAgdGhpcy5fbmFtZSAmJiBsb2coYFNlbWFwaG9yZSBhd2FpdGluZyBjb21wbGV0ZWRgLCB7IG5hbWU6IHRoaXMuX25hbWUsIHRha2VuQ291bnQ6IHRoaXMudGFrZW5Db3VudCB9KVxuICAgIH1cbiAgICB0aGlzLnRha2VuQ291bnQrK1xuICAgIHRoaXMuX25hbWUgJiYgbG9nKGBTZW1hcGhvcmUgd2FzIGVudGVyZWRgLCB7IG5hbWU6IHRoaXMuX25hbWUsIHRha2VuQ291bnQ6IHRoaXMudGFrZW5Db3VudCB9KVxuICB9XG5cbiAgZXhpdCA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLl93YWl0aW5nTGlzdC5sZW5ndGggJiYgdGhpcy5fd2FpdGluZ0xpc3Quc2hpZnQoKSgpXG4gICAgaWYgKHRoaXMudGFrZW5Db3VudCA+IDApXG4gICAgICB0aGlzLnRha2VuQ291bnQtLVxuICAgIHRoaXMuX25hbWUgJiYgbG9nKGBTZW1hcGhvcmUgd2FzIGV4aXRlZGAsIHsgbmFtZTogdGhpcy5fbmFtZSwgdGFrZW5Db3VudDogdGhpcy50YWtlbkNvdW50IH0pXG4gIH1cblxuICBhc3luYyBydW48VD4oYXN5bmNGdW5jOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZW50ZXIoKVxuICAgICAgcmV0dXJuIGF3YWl0IGFzeW5jRnVuYygpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZXhpdCgpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuQ29uZGl0aW9uYWwoYXN5bmNGdW5jOiAoKSA9PiBQcm9taXNlPHZvaWQ+LCBjb25kaXRpb246ICgpID0+IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNvbmRpdGlvbiB8fCBjb25kaXRpb24oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnRlcigpXG4gICAgICAgIGlmICghY29uZGl0aW9uIHx8IGNvbmRpdGlvbigpKSB7XG4gICAgICAgICAgYXdhaXQgYXN5bmNGdW5jKClcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5leGl0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENyaXRpY2FsU2VjdGlvbiBleHRlbmRzIFNlbWFwaG9yZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKDEpXG4gIH1cbn0iXX0=
\No newline at end of file