"use strict"; var _50ae609e_ReadWriteLock; function _50ae609e_assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); } /** * ReadWriteLock implementation for RSpade framework * Provides exclusive (write) and shared (read) locking mechanisms for asynchronous operations */ class ReadWriteLock { /** * Acquire an exclusive mutex lock by name. * Only one writer runs at a time; blocks readers until finished. * @param {string} name * @param {() => any|Promise} cb * @returns {Promise} */ static acquire(name, cb) { return new Promise((resolve, reject) => { const s = _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_get_lock).call(this, name); s.writer_q.push({ cb, resolve, reject }); _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_schedule).call(this, name); }); } /** * Acquire a shared read lock by name. * Multiple readers can run in parallel; blocks when writer is active. * @param {string} name * @param {() => any|Promise} cb * @returns {Promise} */ static acquire_read(name, cb) { return new Promise((resolve, reject) => { const s = _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_get_lock).call(this, name); if (s.writer_active || s.writer_q.length > 0) { s.reader_q.push({ cb, resolve, reject }); return _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_schedule).call(this, name); } s.readers += 1; Promise.resolve().then(cb).then(resolve, reject).finally(() => { s.readers -= 1; if (s.readers === 0) _50ae609e_assertClassBrand(ReadWriteLock, this, _50ae609e_schedule).call(this, name); }); }); } /** * Force-unlock a mutex (use with caution). * Completely removes the lock state, potentially breaking waiting operations. * @param {string} name */ static force_unlock(name) { _50ae609e_assertClassBrand(ReadWriteLock, this, _locks)._.delete(name); } /** * Get information about pending operations on a mutex. * @param {string} name * @returns {{readers: number, writer_active: boolean, reader_q: number, writer_q: number}} */ static pending(name) { const s = _50ae609e_assertClassBrand(ReadWriteLock, this, _locks)._.get(name); if (!s) return { readers: 0, writer_active: false, reader_q: 0, writer_q: 0 }; return { readers: s.readers, writer_active: s.writer_active, reader_q: s.reader_q.length, writer_q: s.writer_q.length }; } } _50ae609e_ReadWriteLock = ReadWriteLock; /** * Get or create a lock object for a given name * @private */ function _50ae609e_get_lock(name) { let s = _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _locks)._.get(name); if (!s) { s = { readers: 0, writer_active: false, reader_q: [], writer_q: [] }; _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _locks)._.set(name, s); } return s; } /** * Schedule the next operation for a lock * @private */ function _50ae609e_schedule(name) { const s = _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _50ae609e_get_lock).call(this, name); if (s.writer_active || s.readers > 0) return; // run one writer if queued if (s.writer_q.length > 0) { const { cb, resolve, reject } = s.writer_q.shift(); s.writer_active = true; Promise.resolve().then(cb).then(resolve, reject).finally(() => { s.writer_active = false; _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _50ae609e_schedule).call(this, name); }); return; } // otherwise run all queued readers in parallel if (s.reader_q.length > 0) { const batch = s.reader_q.splice(0); s.readers += batch.length; for (const { cb, resolve, reject } of batch) { Promise.resolve().then(cb).then(resolve, reject).finally(() => { s.readers -= 1; if (s.readers === 0) _50ae609e_assertClassBrand(_50ae609e_ReadWriteLock, this, _50ae609e_schedule).call(this, name); }); } } } var _locks = { _: new Map() }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFkV3JpdGVMb2NrIiwiYWNxdWlyZSIsIm5hbWUiLCJjYiIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicyIsIl81MGFlNjA5ZV9hc3NlcnRDbGFzc0JyYW5kIiwiXzUwYWU2MDllX2dldF9sb2NrIiwiY2FsbCIsIndyaXRlcl9xIiwicHVzaCIsIl81MGFlNjA5ZV9zY2hlZHVsZSIsImFjcXVpcmVfcmVhZCIsIndyaXRlcl9hY3RpdmUiLCJsZW5ndGgiLCJyZWFkZXJfcSIsInJlYWRlcnMiLCJ0aGVuIiwiZmluYWxseSIsImZvcmNlX3VubG9jayIsIl9sb2NrcyIsIl8iLCJkZWxldGUiLCJwZW5kaW5nIiwiZ2V0IiwiXzUwYWU2MDllX1JlYWRXcml0ZUxvY2siLCJzZXQiLCJzaGlmdCIsImJhdGNoIiwic3BsaWNlIiwiTWFwIl0sInNvdXJjZXMiOlsiYXBwL1JTcGFkZS9Db3JlL0pzL1JlYWRXcml0ZUxvY2suanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWFkV3JpdGVMb2NrIGltcGxlbWVudGF0aW9uIGZvciBSU3BhZGUgZnJhbWV3b3JrXG4gKiBQcm92aWRlcyBleGNsdXNpdmUgKHdyaXRlKSBhbmQgc2hhcmVkIChyZWFkKSBsb2NraW5nIG1lY2hhbmlzbXMgZm9yIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zXG4gKi9cbmNsYXNzIFJlYWRXcml0ZUxvY2sge1xuICAgIHN0YXRpYyAjbG9ja3MgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAgICAgKiBHZXQgb3IgY3JlYXRlIGEgbG9jayBvYmplY3QgZm9yIGEgZ2l2ZW4gbmFtZVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgc3RhdGljICNnZXRfbG9jayhuYW1lKSB7XG4gICAgICAgIGxldCBzID0gdGhpcy4jbG9ja3MuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIXMpIHtcbiAgICAgICAgICAgIHMgPSB7IHJlYWRlcnM6IDAsIHdyaXRlcl9hY3RpdmU6IGZhbHNlLCByZWFkZXJfcTogW10sIHdyaXRlcl9xOiBbXSB9O1xuICAgICAgICAgICAgdGhpcy4jbG9ja3Muc2V0KG5hbWUsIHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlIHRoZSBuZXh0IG9wZXJhdGlvbiBmb3IgYSBsb2NrXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgI3NjaGVkdWxlKG5hbWUpIHtcbiAgICAgICAgY29uc3QgcyA9IHRoaXMuI2dldF9sb2NrKG5hbWUpO1xuICAgICAgICBpZiAocy53cml0ZXJfYWN0aXZlIHx8IHMucmVhZGVycyA+IDApIHJldHVybjtcblxuICAgICAgICAvLyBydW4gb25lIHdyaXRlciBpZiBxdWV1ZWRcbiAgICAgICAgaWYgKHMud3JpdGVyX3EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgeyBjYiwgcmVzb2x2ZSwgcmVqZWN0IH0gPSBzLndyaXRlcl9xLnNoaWZ0KCk7XG4gICAgICAgICAgICBzLndyaXRlcl9hY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgICAgICAgICAgICAudGhlbihjYilcbiAgICAgICAgICAgICAgICAudGhlbihyZXNvbHZlLCByZWplY3QpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzLndyaXRlcl9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2NoZWR1bGUobmFtZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdGhlcndpc2UgcnVuIGFsbCBxdWV1ZWQgcmVhZGVycyBpbiBwYXJhbGxlbFxuICAgICAgICBpZiAocy5yZWFkZXJfcS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaCA9IHMucmVhZGVyX3Euc3BsaWNlKDApO1xuICAgICAgICAgICAgcy5yZWFkZXJzICs9IGJhdGNoLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgeyBjYiwgcmVzb2x2ZSwgcmVqZWN0IH0gb2YgYmF0Y2gpIHtcbiAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihjYilcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KVxuICAgICAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnJlYWRlcnMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnJlYWRlcnMgPT09IDApIHRoaXMuI3NjaGVkdWxlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFjcXVpcmUgYW4gZXhjbHVzaXZlIG11dGV4IGxvY2sgYnkgbmFtZS5cbiAgICAgKiBPbmx5IG9uZSB3cml0ZXIgcnVucyBhdCBhIHRpbWU7IGJsb2NrcyByZWFkZXJzIHVudGlsIGZpbmlzaGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHsoKSA9PiBhbnl8UHJvbWlzZTxhbnk+fSBjYlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPGFueT59XG4gICAgICovXG4gICAgc3RhdGljIGFjcXVpcmUobmFtZSwgY2IpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLiNnZXRfbG9jayhuYW1lKTtcbiAgICAgICAgICAgIHMud3JpdGVyX3EucHVzaCh7IGNiLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgICB0aGlzLiNzY2hlZHVsZShuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWNxdWlyZSBhIHNoYXJlZCByZWFkIGxvY2sgYnkgbmFtZS5cbiAgICAgKiBNdWx0aXBsZSByZWFkZXJzIGNhbiBydW4gaW4gcGFyYWxsZWw7IGJsb2NrcyB3aGVuIHdyaXRlciBpcyBhY3RpdmUuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0geygpID0+IGFueXxQcm9taXNlPGFueT59IGNiXG4gICAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn1cbiAgICAgKi9cbiAgICBzdGF0aWMgYWNxdWlyZV9yZWFkKG5hbWUsIGNiKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzID0gdGhpcy4jZ2V0X2xvY2sobmFtZSk7XG4gICAgICAgICAgICBpZiAocy53cml0ZXJfYWN0aXZlIHx8IHMud3JpdGVyX3EubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHMucmVhZGVyX3EucHVzaCh7IGNiLCByZXNvbHZlLCByZWplY3QgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuI3NjaGVkdWxlKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcy5yZWFkZXJzICs9IDE7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgIC50aGVuKGNiKVxuICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdClcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHMucmVhZGVycyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAocy5yZWFkZXJzID09PSAwKSB0aGlzLiNzY2hlZHVsZShuYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UtdW5sb2NrIGEgbXV0ZXggKHVzZSB3aXRoIGNhdXRpb24pLlxuICAgICAqIENvbXBsZXRlbHkgcmVtb3ZlcyB0aGUgbG9jayBzdGF0ZSwgcG90ZW50aWFsbHkgYnJlYWtpbmcgd2FpdGluZyBvcGVyYXRpb25zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICovXG4gICAgc3RhdGljIGZvcmNlX3VubG9jayhuYW1lKSB7XG4gICAgICAgIHRoaXMuI2xvY2tzLmRlbGV0ZShuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgcGVuZGluZyBvcGVyYXRpb25zIG9uIGEgbXV0ZXguXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7e3JlYWRlcnM6IG51bWJlciwgd3JpdGVyX2FjdGl2ZTogYm9vbGVhbiwgcmVhZGVyX3E6IG51bWJlciwgd3JpdGVyX3E6IG51bWJlcn19XG4gICAgICovXG4gICAgc3RhdGljIHBlbmRpbmcobmFtZSkge1xuICAgICAgICBjb25zdCBzID0gdGhpcy4jbG9ja3MuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoIXMpIHJldHVybiB7IHJlYWRlcnM6IDAsIHdyaXRlcl9hY3RpdmU6IGZhbHNlLCByZWFkZXJfcTogMCwgd3JpdGVyX3E6IDAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlYWRlcnM6IHMucmVhZGVycyxcbiAgICAgICAgICAgIHdyaXRlcl9hY3RpdmU6IHMud3JpdGVyX2FjdGl2ZSxcbiAgICAgICAgICAgIHJlYWRlcl9xOiBzLnJlYWRlcl9xLmxlbmd0aCxcbiAgICAgICAgICAgIHdyaXRlcl9xOiBzLndyaXRlcl9xLmxlbmd0aFxuICAgICAgICB9O1xuICAgIH1cbn0iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1BLGFBQWEsQ0FBQztFQXNEaEI7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDSSxPQUFP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