@daiso-tech/core 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/_module.js +2 -0
- package/dist/cjs/_module.js.map +1 -1
- package/dist/cjs/async/utilities/lazy-promise/lazy-promise.js +16 -9
- package/dist/cjs/async/utilities/lazy-promise/lazy-promise.js.map +1 -1
- package/dist/cjs/cache/contracts/cache.events.js +13 -139
- package/dist/cjs/cache/contracts/cache.events.js.map +1 -1
- package/dist/cjs/cache/implementations/_shared/cache-adapter.test-suite.js +5 -24
- package/dist/cjs/cache/implementations/_shared/cache-adapter.test-suite.js.map +1 -1
- package/dist/cjs/cache/implementations/_shared/cache.test-suite.js +729 -21
- package/dist/cjs/cache/implementations/_shared/cache.test-suite.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/kysely-sqlite-cache-adapter/kysely-sqlite-cache-adapter.js +1 -21
- package/dist/cjs/cache/implementations/adapters/kysely-sqlite-cache-adapter/kysely-sqlite-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/libsql-cache-adapter/_module.js +0 -1
- package/dist/cjs/cache/implementations/adapters/libsql-cache-adapter/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter.js +0 -7
- package/dist/cjs/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/memory-cache-adapter/_module.js +0 -1
- package/dist/cjs/cache/implementations/adapters/memory-cache-adapter/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter.js +3 -11
- package/dist/cjs/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/mongodb-cache-adapter/_module.js +0 -1
- package/dist/cjs/cache/implementations/adapters/mongodb-cache-adapter/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.js +6 -28
- package/dist/cjs/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.js +0 -3
- package/dist/cjs/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/redis-cache-adapter/_module.js +0 -1
- package/dist/cjs/cache/implementations/adapters/redis-cache-adapter/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.js +5 -13
- package/dist/cjs/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/sqlite-cache-adapter/_module.js +0 -1
- package/dist/cjs/cache/implementations/adapters/sqlite-cache-adapter/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter.js +0 -7
- package/dist/cjs/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter.js.map +1 -1
- package/dist/cjs/cache/implementations/derivables/cache/_module.js +0 -1
- package/dist/cjs/cache/implementations/derivables/cache/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/derivables/cache/cache.js +215 -103
- package/dist/cjs/cache/implementations/derivables/cache/cache.js.map +1 -1
- package/dist/cjs/cache/implementations/derivables/cache-factory/_module.js +0 -1
- package/dist/cjs/cache/implementations/derivables/cache-factory/_module.js.map +1 -1
- package/dist/cjs/cache/implementations/derivables/cache-factory/cache-factory.js +0 -4
- package/dist/cjs/cache/implementations/derivables/cache-factory/cache-factory.js.map +1 -1
- package/dist/cjs/event-bus/contracts/_shared.js +3 -2
- package/dist/cjs/event-bus/contracts/_shared.js.map +1 -1
- package/dist/cjs/event-bus/implementations/_shared/event-bus-adapter.test-suite.js +4 -15
- package/dist/cjs/event-bus/implementations/_shared/event-bus-adapter.test-suite.js.map +1 -1
- package/dist/cjs/event-bus/implementations/_shared/event-bus.test-suite.js +6 -27
- package/dist/cjs/event-bus/implementations/_shared/event-bus.test-suite.js.map +1 -1
- package/dist/cjs/event-bus/implementations/adapters/memory-event-bus-adapter/_module.js +0 -1
- package/dist/cjs/event-bus/implementations/adapters/memory-event-bus-adapter/_module.js.map +1 -1
- package/dist/cjs/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter.js +0 -4
- package/dist/cjs/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter.js.map +1 -1
- package/dist/cjs/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/_module.js +0 -1
- package/dist/cjs/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/_module.js.map +1 -1
- package/dist/cjs/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.js +0 -4
- package/dist/cjs/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.js.map +1 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus/_module.js +0 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus/_module.js.map +1 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus/event-bus.js +0 -4
- package/dist/cjs/event-bus/implementations/derivables/event-bus/event-bus.js.map +1 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus-factory/_module.js +0 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus-factory/_module.js.map +1 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus-factory/event-bus-factory.js +0 -4
- package/dist/cjs/event-bus/implementations/derivables/event-bus-factory/event-bus-factory.js.map +1 -1
- package/dist/cjs/lock/contracts/_module.js +24 -0
- package/dist/cjs/lock/contracts/_module.js.map +1 -0
- package/dist/cjs/lock/contracts/database-lock-adapter.contract.js +3 -0
- package/dist/cjs/lock/contracts/database-lock-adapter.contract.js.map +1 -0
- package/dist/cjs/lock/contracts/lock-adapter.contract.js +3 -0
- package/dist/cjs/lock/contracts/lock-adapter.contract.js.map +1 -0
- package/dist/cjs/lock/contracts/lock-provider-factory.contract.js +3 -0
- package/dist/cjs/lock/contracts/lock-provider-factory.contract.js.map +1 -0
- package/dist/cjs/lock/contracts/lock-provider.contract.js +3 -0
- package/dist/cjs/lock/contracts/lock-provider.contract.js.map +1 -0
- package/dist/cjs/lock/contracts/lock.contract.js +3 -0
- package/dist/cjs/lock/contracts/lock.contract.js.map +1 -0
- package/dist/cjs/lock/contracts/lock.errors.js +131 -0
- package/dist/cjs/lock/contracts/lock.errors.js.map +1 -0
- package/dist/cjs/lock/contracts/lock.events.js +44 -0
- package/dist/cjs/lock/contracts/lock.events.js.map +1 -0
- package/dist/cjs/lock/implementations/_module.js +20 -0
- package/dist/cjs/lock/implementations/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/_shared/_module.js +20 -0
- package/dist/cjs/lock/implementations/_shared/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/_shared/database-lock-adapter.test-suite.js +285 -0
- package/dist/cjs/lock/implementations/_shared/database-lock-adapter.test-suite.js.map +1 -0
- package/dist/cjs/lock/implementations/_shared/lock-adapter.test-suite.js +238 -0
- package/dist/cjs/lock/implementations/_shared/lock-adapter.test-suite.js.map +1 -0
- package/dist/cjs/lock/implementations/_shared/lock-provider.test-suite.js +1841 -0
- package/dist/cjs/lock/implementations/_shared/lock-provider.test-suite.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/_module.js +22 -0
- package/dist/cjs/lock/implementations/adapters/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/kysely-lock-adapter/_module.js +18 -0
- package/dist/cjs/lock/implementations/adapters/kysely-lock-adapter/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.js +126 -0
- package/dist/cjs/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/libsql-lock-adapter/_module.js +18 -0
- package/dist/cjs/lock/implementations/adapters/libsql-lock-adapter/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/libsql-lock-adapter/libsql-lock-adapter.js +61 -0
- package/dist/cjs/lock/implementations/adapters/libsql-lock-adapter/libsql-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/memory-lock-adapter/_module.js +18 -0
- package/dist/cjs/lock/implementations/adapters/memory-lock-adapter/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.js +107 -0
- package/dist/cjs/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/mongodb-lock-adapter/_module.js +18 -0
- package/dist/cjs/lock/implementations/adapters/mongodb-lock-adapter/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.js +148 -0
- package/dist/cjs/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/redis-lock-adapter/_module.js +18 -0
- package/dist/cjs/lock/implementations/adapters/redis-lock-adapter/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.js +131 -0
- package/dist/cjs/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/sqlite-lock-adapter/_module.js +18 -0
- package/dist/cjs/lock/implementations/adapters/sqlite-lock-adapter/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/adapters/sqlite-lock-adapter/sqlite-lock-adapter.js +60 -0
- package/dist/cjs/lock/implementations/adapters/sqlite-lock-adapter/sqlite-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/_module.js +19 -0
- package/dist/cjs/lock/implementations/derivables/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/_module.js +18 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/database-lock-adapter.js +80 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/database-lock-adapter.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/lock-provider.js +162 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/lock-provider.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/lock.js +306 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider/lock.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider-factory/_module.js +18 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider-factory/_module.js.map +1 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.js +78 -0
- package/dist/cjs/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.js.map +1 -0
- package/dist/cjs/serde/implementations/no-op-serde/no-op-serde.js +3 -0
- package/dist/cjs/serde/implementations/no-op-serde/no-op-serde.js.map +1 -1
- package/dist/cjs/serde/implementations/super-json-serde/super-json-serde.js +15 -0
- package/dist/cjs/serde/implementations/super-json-serde/super-json-serde.js.map +1 -1
- package/dist/cjs/utilities/contracts/_module.js +1 -0
- package/dist/cjs/utilities/contracts/_module.js.map +1 -1
- package/dist/cjs/utilities/contracts/serde-registrable.contract.js +3 -0
- package/dist/cjs/utilities/contracts/serde-registrable.contract.js.map +1 -0
- package/dist/cjs/utilities/functions.js +4 -0
- package/dist/cjs/utilities/functions.js.map +1 -1
- package/dist/esm/_module.js +2 -0
- package/dist/esm/_module.js.map +1 -1
- package/dist/esm/async/utilities/lazy-promise/lazy-promise.js +16 -9
- package/dist/esm/async/utilities/lazy-promise/lazy-promise.js.map +1 -1
- package/dist/esm/cache/contracts/cache.events.js +11 -138
- package/dist/esm/cache/contracts/cache.events.js.map +1 -1
- package/dist/esm/cache/implementations/_shared/cache-adapter.test-suite.js +5 -24
- package/dist/esm/cache/implementations/_shared/cache-adapter.test-suite.js.map +1 -1
- package/dist/esm/cache/implementations/_shared/cache.test-suite.js +731 -23
- package/dist/esm/cache/implementations/_shared/cache.test-suite.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/kysely-sqlite-cache-adapter/kysely-sqlite-cache-adapter.js +1 -21
- package/dist/esm/cache/implementations/adapters/kysely-sqlite-cache-adapter/kysely-sqlite-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/libsql-cache-adapter/_module.js +0 -1
- package/dist/esm/cache/implementations/adapters/libsql-cache-adapter/_module.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter.js +0 -7
- package/dist/esm/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/memory-cache-adapter/_module.js +0 -1
- package/dist/esm/cache/implementations/adapters/memory-cache-adapter/_module.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter.js +3 -11
- package/dist/esm/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/mongodb-cache-adapter/_module.js +0 -1
- package/dist/esm/cache/implementations/adapters/mongodb-cache-adapter/_module.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.js +6 -28
- package/dist/esm/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.js +0 -3
- package/dist/esm/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/redis-cache-adapter/_module.js +0 -1
- package/dist/esm/cache/implementations/adapters/redis-cache-adapter/_module.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.js +5 -13
- package/dist/esm/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/sqlite-cache-adapter/_module.js +0 -1
- package/dist/esm/cache/implementations/adapters/sqlite-cache-adapter/_module.js.map +1 -1
- package/dist/esm/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter.js +0 -7
- package/dist/esm/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter.js.map +1 -1
- package/dist/esm/cache/implementations/derivables/cache/_module.js +0 -1
- package/dist/esm/cache/implementations/derivables/cache/_module.js.map +1 -1
- package/dist/esm/cache/implementations/derivables/cache/cache.js +216 -104
- package/dist/esm/cache/implementations/derivables/cache/cache.js.map +1 -1
- package/dist/esm/cache/implementations/derivables/cache-factory/_module.js +0 -1
- package/dist/esm/cache/implementations/derivables/cache-factory/_module.js.map +1 -1
- package/dist/esm/cache/implementations/derivables/cache-factory/cache-factory.js +0 -4
- package/dist/esm/cache/implementations/derivables/cache-factory/cache-factory.js.map +1 -1
- package/dist/esm/event-bus/contracts/_shared.js +3 -2
- package/dist/esm/event-bus/contracts/_shared.js.map +1 -1
- package/dist/esm/event-bus/implementations/_shared/event-bus-adapter.test-suite.js +4 -15
- package/dist/esm/event-bus/implementations/_shared/event-bus-adapter.test-suite.js.map +1 -1
- package/dist/esm/event-bus/implementations/_shared/event-bus.test-suite.js +7 -28
- package/dist/esm/event-bus/implementations/_shared/event-bus.test-suite.js.map +1 -1
- package/dist/esm/event-bus/implementations/adapters/memory-event-bus-adapter/_module.js +0 -1
- package/dist/esm/event-bus/implementations/adapters/memory-event-bus-adapter/_module.js.map +1 -1
- package/dist/esm/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter.js +0 -4
- package/dist/esm/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter.js.map +1 -1
- package/dist/esm/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/_module.js +0 -1
- package/dist/esm/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/_module.js.map +1 -1
- package/dist/esm/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.js +0 -4
- package/dist/esm/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.js.map +1 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus/_module.js +0 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus/_module.js.map +1 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus/event-bus.js +0 -4
- package/dist/esm/event-bus/implementations/derivables/event-bus/event-bus.js.map +1 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus-factory/_module.js +0 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus-factory/_module.js.map +1 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus-factory/event-bus-factory.js +0 -4
- package/dist/esm/event-bus/implementations/derivables/event-bus-factory/event-bus-factory.js.map +1 -1
- package/dist/esm/lock/contracts/_module.js +8 -0
- package/dist/esm/lock/contracts/_module.js.map +1 -0
- package/dist/esm/lock/contracts/database-lock-adapter.contract.js +1 -0
- package/dist/esm/lock/contracts/database-lock-adapter.contract.js.map +1 -0
- package/dist/esm/lock/contracts/lock-adapter.contract.js +1 -0
- package/dist/esm/lock/contracts/lock-adapter.contract.js.map +1 -0
- package/dist/esm/lock/contracts/lock-provider-factory.contract.js +1 -0
- package/dist/esm/lock/contracts/lock-provider-factory.contract.js.map +1 -0
- package/dist/esm/lock/contracts/lock-provider.contract.js +1 -0
- package/dist/esm/lock/contracts/lock-provider.contract.js.map +1 -0
- package/dist/esm/lock/contracts/lock.contract.js +1 -0
- package/dist/esm/lock/contracts/lock.contract.js.map +1 -0
- package/dist/esm/lock/contracts/lock.errors.js +120 -0
- package/dist/esm/lock/contracts/lock.errors.js.map +1 -0
- package/dist/esm/lock/contracts/lock.events.js +32 -0
- package/dist/esm/lock/contracts/lock.events.js.map +1 -0
- package/dist/esm/lock/implementations/_module.js +4 -0
- package/dist/esm/lock/implementations/_module.js.map +1 -0
- package/dist/esm/lock/implementations/_shared/_module.js +4 -0
- package/dist/esm/lock/implementations/_shared/_module.js.map +1 -0
- package/dist/esm/lock/implementations/_shared/database-lock-adapter.test-suite.js +282 -0
- package/dist/esm/lock/implementations/_shared/database-lock-adapter.test-suite.js.map +1 -0
- package/dist/esm/lock/implementations/_shared/lock-adapter.test-suite.js +235 -0
- package/dist/esm/lock/implementations/_shared/lock-adapter.test-suite.js.map +1 -0
- package/dist/esm/lock/implementations/_shared/lock-provider.test-suite.js +1838 -0
- package/dist/esm/lock/implementations/_shared/lock-provider.test-suite.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/_module.js +6 -0
- package/dist/esm/lock/implementations/adapters/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/kysely-lock-adapter/_module.js +2 -0
- package/dist/esm/lock/implementations/adapters/kysely-lock-adapter/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.js +122 -0
- package/dist/esm/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/libsql-lock-adapter/_module.js +2 -0
- package/dist/esm/lock/implementations/adapters/libsql-lock-adapter/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/libsql-lock-adapter/libsql-lock-adapter.js +57 -0
- package/dist/esm/lock/implementations/adapters/libsql-lock-adapter/libsql-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/memory-lock-adapter/_module.js +2 -0
- package/dist/esm/lock/implementations/adapters/memory-lock-adapter/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.js +103 -0
- package/dist/esm/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/mongodb-lock-adapter/_module.js +2 -0
- package/dist/esm/lock/implementations/adapters/mongodb-lock-adapter/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.js +144 -0
- package/dist/esm/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/redis-lock-adapter/_module.js +2 -0
- package/dist/esm/lock/implementations/adapters/redis-lock-adapter/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.js +127 -0
- package/dist/esm/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/sqlite-lock-adapter/_module.js +2 -0
- package/dist/esm/lock/implementations/adapters/sqlite-lock-adapter/_module.js.map +1 -0
- package/dist/esm/lock/implementations/adapters/sqlite-lock-adapter/sqlite-lock-adapter.js +56 -0
- package/dist/esm/lock/implementations/adapters/sqlite-lock-adapter/sqlite-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/_module.js +3 -0
- package/dist/esm/lock/implementations/derivables/_module.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/_module.js +2 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/_module.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/database-lock-adapter.js +76 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/database-lock-adapter.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/lock-provider.js +158 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/lock-provider.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/lock.js +302 -0
- package/dist/esm/lock/implementations/derivables/lock-provider/lock.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/lock-provider-factory/_module.js +2 -0
- package/dist/esm/lock/implementations/derivables/lock-provider-factory/_module.js.map +1 -0
- package/dist/esm/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.js +74 -0
- package/dist/esm/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.js.map +1 -0
- package/dist/esm/serde/implementations/no-op-serde/no-op-serde.js +3 -0
- package/dist/esm/serde/implementations/no-op-serde/no-op-serde.js.map +1 -1
- package/dist/esm/serde/implementations/super-json-serde/super-json-serde.js +15 -0
- package/dist/esm/serde/implementations/super-json-serde/super-json-serde.js.map +1 -1
- package/dist/esm/utilities/contracts/_module.js +1 -0
- package/dist/esm/utilities/contracts/_module.js.map +1 -1
- package/dist/esm/utilities/contracts/serde-registrable.contract.js +1 -0
- package/dist/esm/utilities/contracts/serde-registrable.contract.js.map +1 -0
- package/dist/esm/utilities/functions.js +4 -0
- package/dist/esm/utilities/functions.js.map +1 -1
- package/dist/types/_module.d.ts +2 -0
- package/dist/types/async/utilities/lazy-promise/lazy-promise.d.ts +2 -2
- package/dist/types/cache/contracts/cache-adapter.contract.d.ts +2 -6
- package/dist/types/cache/contracts/cache-factory.contract.d.ts +1 -2
- package/dist/types/cache/contracts/cache.contract.d.ts +116 -8
- package/dist/types/cache/contracts/cache.events.d.ts +24 -90
- package/dist/types/cache/implementations/_shared/cache-adapter.test-suite.d.ts +2 -9
- package/dist/types/cache/implementations/_shared/cache.test-suite.d.ts +5 -15
- package/dist/types/cache/implementations/adapters/kysely-sqlite-cache-adapter/kysely-sqlite-cache-adapter.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/libsql-cache-adapter/_module.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter.d.ts +23 -30
- package/dist/types/cache/implementations/adapters/memory-cache-adapter/_module.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter.d.ts +8 -19
- package/dist/types/cache/implementations/adapters/mongodb-cache-adapter/_module.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.d.ts +16 -27
- package/dist/types/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/redis-cache-adapter/_module.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.d.ts +12 -23
- package/dist/types/cache/implementations/adapters/sqlite-cache-adapter/_module.d.ts +0 -1
- package/dist/types/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter.d.ts +23 -30
- package/dist/types/cache/implementations/derivables/cache/_module.d.ts +0 -1
- package/dist/types/cache/implementations/derivables/cache/cache.d.ts +38 -27
- package/dist/types/cache/implementations/derivables/cache-factory/_module.d.ts +0 -1
- package/dist/types/cache/implementations/derivables/cache-factory/cache-factory.d.ts +60 -26
- package/dist/types/collection/contracts/async-collection.contract.d.ts +68 -8
- package/dist/types/event-bus/contracts/_shared.d.ts +3 -4
- package/dist/types/event-bus/contracts/event-bus-adapter.contract.d.ts +1 -1
- package/dist/types/event-bus/contracts/event-bus-factory.contract.d.ts +5 -24
- package/dist/types/event-bus/implementations/_shared/event-bus-adapter.test-suite.d.ts +2 -10
- package/dist/types/event-bus/implementations/_shared/event-bus.test-suite.d.ts +3 -13
- package/dist/types/event-bus/implementations/adapters/memory-event-bus-adapter/_module.d.ts +0 -1
- package/dist/types/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter.d.ts +8 -18
- package/dist/types/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/_module.d.ts +0 -1
- package/dist/types/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.d.ts +11 -20
- package/dist/types/event-bus/implementations/derivables/event-bus/_module.d.ts +0 -1
- package/dist/types/event-bus/implementations/derivables/event-bus/event-bus.d.ts +29 -20
- package/dist/types/event-bus/implementations/derivables/event-bus-factory/_module.d.ts +0 -1
- package/dist/types/event-bus/implementations/derivables/event-bus-factory/event-bus-factory.d.ts +49 -46
- package/dist/types/lock/contracts/_module.d.ts +7 -0
- package/dist/types/lock/contracts/database-lock-adapter.contract.d.ts +49 -0
- package/dist/types/lock/contracts/lock-adapter.contract.d.ts +48 -0
- package/dist/types/lock/contracts/lock-provider-factory.contract.d.ts +36 -0
- package/dist/types/lock/contracts/lock-provider.contract.d.ts +92 -0
- package/dist/types/lock/contracts/lock.contract.d.ts +219 -0
- package/dist/types/lock/contracts/lock.errors.d.ts +66 -0
- package/dist/types/lock/contracts/lock.events.d.ts +83 -0
- package/dist/types/lock/implementations/_module.d.ts +3 -0
- package/dist/types/lock/implementations/_shared/_module.d.ts +3 -0
- package/dist/types/lock/implementations/_shared/database-lock-adapter.test-suite.d.ts +21 -0
- package/dist/types/lock/implementations/_shared/lock-adapter.test-suite.d.ts +21 -0
- package/dist/types/lock/implementations/_shared/lock-provider.test-suite.d.ts +23 -0
- package/dist/types/lock/implementations/adapters/_module.d.ts +5 -0
- package/dist/types/lock/implementations/adapters/kysely-lock-adapter/_module.d.ts +1 -0
- package/dist/types/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.d.ts +52 -0
- package/dist/types/lock/implementations/adapters/libsql-lock-adapter/_module.d.ts +1 -0
- package/dist/types/lock/implementations/adapters/libsql-lock-adapter/libsql-lock-adapter.d.ts +58 -0
- package/dist/types/lock/implementations/adapters/memory-lock-adapter/_module.d.ts +1 -0
- package/dist/types/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.d.ts +52 -0
- package/dist/types/lock/implementations/adapters/mongodb-lock-adapter/_module.d.ts +1 -0
- package/dist/types/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.d.ts +60 -0
- package/dist/types/lock/implementations/adapters/redis-lock-adapter/_module.d.ts +1 -0
- package/dist/types/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.d.ts +57 -0
- package/dist/types/lock/implementations/adapters/sqlite-lock-adapter/_module.d.ts +1 -0
- package/dist/types/lock/implementations/adapters/sqlite-lock-adapter/sqlite-lock-adapter.d.ts +57 -0
- package/dist/types/lock/implementations/derivables/_module.d.ts +2 -0
- package/dist/types/lock/implementations/derivables/lock-provider/_module.d.ts +1 -0
- package/dist/types/lock/implementations/derivables/lock-provider/database-lock-adapter.d.ts +23 -0
- package/dist/types/lock/implementations/derivables/lock-provider/lock-provider.d.ts +89 -0
- package/dist/types/lock/implementations/derivables/lock-provider/lock.d.ts +73 -0
- package/dist/types/lock/implementations/derivables/lock-provider-factory/_module.d.ts +1 -0
- package/dist/types/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.d.ts +98 -0
- package/dist/types/serde/contracts/flexible-serde.contract.d.ts +3 -2
- package/dist/types/serde/implementations/no-op-serde/no-op-serde.d.ts +2 -1
- package/dist/types/serde/implementations/super-json-serde/super-json-serde.d.ts +2 -1
- package/dist/types/utilities/contracts/_module.d.ts +1 -0
- package/dist/types/utilities/contracts/serde-registrable.contract.d.ts +11 -0
- package/dist/types/utilities/types.d.ts +3 -1
- package/package.json +5 -3
- package/dist/cjs/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter-settings.js +0 -56
- package/dist/cjs/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter-settings.js.map +0 -1
- package/dist/cjs/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter-settings.js +0 -26
- package/dist/cjs/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter-settings.js.map +0 -1
- package/dist/cjs/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter-settings.js +0 -44
- package/dist/cjs/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter-settings.js.map +0 -1
- package/dist/cjs/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter-settings.js +0 -32
- package/dist/cjs/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter-settings.js.map +0 -1
- package/dist/cjs/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter-settings.js +0 -56
- package/dist/cjs/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter-settings.js.map +0 -1
- package/dist/cjs/cache/implementations/derivables/cache/cache-settings.js +0 -56
- package/dist/cjs/cache/implementations/derivables/cache/cache-settings.js.map +0 -1
- package/dist/cjs/cache/implementations/derivables/cache-factory/cache-factory-settings.js +0 -83
- package/dist/cjs/cache/implementations/derivables/cache-factory/cache-factory-settings.js.map +0 -1
- package/dist/cjs/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter-settings.js +0 -26
- package/dist/cjs/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter-settings.js.map +0 -1
- package/dist/cjs/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter-settings.js +0 -38
- package/dist/cjs/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter-settings.js.map +0 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus/event-bus-settings.js +0 -56
- package/dist/cjs/event-bus/implementations/derivables/event-bus/event-bus-settings.js.map +0 -1
- package/dist/cjs/event-bus/implementations/derivables/event-bus-factory/event-bus-factory-settings.js +0 -71
- package/dist/cjs/event-bus/implementations/derivables/event-bus-factory/event-bus-factory-settings.js.map +0 -1
- package/dist/esm/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter-settings.js +0 -52
- package/dist/esm/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter-settings.js.map +0 -1
- package/dist/esm/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter-settings.js +0 -22
- package/dist/esm/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter-settings.js.map +0 -1
- package/dist/esm/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter-settings.js +0 -40
- package/dist/esm/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter-settings.js.map +0 -1
- package/dist/esm/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter-settings.js +0 -28
- package/dist/esm/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter-settings.js.map +0 -1
- package/dist/esm/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter-settings.js +0 -52
- package/dist/esm/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter-settings.js.map +0 -1
- package/dist/esm/cache/implementations/derivables/cache/cache-settings.js +0 -52
- package/dist/esm/cache/implementations/derivables/cache/cache-settings.js.map +0 -1
- package/dist/esm/cache/implementations/derivables/cache-factory/cache-factory-settings.js +0 -79
- package/dist/esm/cache/implementations/derivables/cache-factory/cache-factory-settings.js.map +0 -1
- package/dist/esm/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter-settings.js +0 -22
- package/dist/esm/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter-settings.js.map +0 -1
- package/dist/esm/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter-settings.js +0 -34
- package/dist/esm/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter-settings.js.map +0 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus/event-bus-settings.js +0 -52
- package/dist/esm/event-bus/implementations/derivables/event-bus/event-bus-settings.js.map +0 -1
- package/dist/esm/event-bus/implementations/derivables/event-bus-factory/event-bus-factory-settings.js +0 -67
- package/dist/esm/event-bus/implementations/derivables/event-bus-factory/event-bus-factory-settings.js.map +0 -1
- package/dist/types/cache/implementations/adapters/libsql-cache-adapter/libsql-cache-adapter-settings.d.ts +0 -48
- package/dist/types/cache/implementations/adapters/memory-cache-adapter/memory-cache-adapter-settings.d.ts +0 -26
- package/dist/types/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter-settings.d.ts +0 -50
- package/dist/types/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter-settings.d.ts +0 -32
- package/dist/types/cache/implementations/adapters/sqlite-cache-adapter/sqlite-cache-adapter-settings.d.ts +0 -48
- package/dist/types/cache/implementations/derivables/cache/cache-settings.d.ts +0 -73
- package/dist/types/cache/implementations/derivables/cache-factory/cache-factory-settings.d.ts +0 -108
- package/dist/types/event-bus/implementations/adapters/memory-event-bus-adapter/memory-event-bus-adapter-settings.d.ts +0 -27
- package/dist/types/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter-settings.d.ts +0 -36
- package/dist/types/event-bus/implementations/derivables/event-bus/event-bus-settings.d.ts +0 -62
- package/dist/types/event-bus/implementations/derivables/event-bus-factory/event-bus-factory-settings.d.ts +0 -92
|
@@ -0,0 +1,1838 @@
|
|
|
1
|
+
import { UnownedRefreshLockEvent, KeyForceReleasedLockEvent, KeyAlreadyAcquiredLockEvent, UnownedReleaseLockEvent, KeyReleasedLockEvent, KeyAcquiredLockEvent, KeyAlreadyAcquiredLockError, UnownedExtendLockError, UnownedReleaseLockError, KeyRefreshedLockEvent, } from "../../../lock/contracts/_module";
|
|
2
|
+
import { TimeSpan } from "../../../utilities/_module";
|
|
3
|
+
import { delay, LazyPromise } from "../../../async/_module";
|
|
4
|
+
import { NoOpSerde } from "../../../serde/implementations/_module";
|
|
5
|
+
export function lockProviderTestSuite(settings) {
|
|
6
|
+
const { expect, test, createLockProvider, describe, beforeEach, serde = new NoOpSerde(), } = settings;
|
|
7
|
+
let lockProviderA;
|
|
8
|
+
let lockProviderB;
|
|
9
|
+
beforeEach(async () => {
|
|
10
|
+
const lockProvider = await createLockProvider();
|
|
11
|
+
lockProviderA = lockProvider;
|
|
12
|
+
lockProviderB = lockProvider.withGroup("b");
|
|
13
|
+
});
|
|
14
|
+
const TTL = TimeSpan.fromMilliseconds(50);
|
|
15
|
+
describe("Api tests:", () => {
|
|
16
|
+
describe("class: Lock", () => {
|
|
17
|
+
describe("method: run", () => {
|
|
18
|
+
test("Should return string when lock is available", async () => {
|
|
19
|
+
const key = "a";
|
|
20
|
+
const ttl = null;
|
|
21
|
+
const lock = lockProviderA.create(key, {
|
|
22
|
+
ttl,
|
|
23
|
+
});
|
|
24
|
+
const [result, error] = await lock.run(async () => {
|
|
25
|
+
await delay(TTL);
|
|
26
|
+
return "a";
|
|
27
|
+
});
|
|
28
|
+
expect(result).toBe("a");
|
|
29
|
+
expect(error).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
test("Should return null when lock is already acquired", async () => {
|
|
32
|
+
const key = "a";
|
|
33
|
+
const ttl = null;
|
|
34
|
+
const lock = lockProviderA.create(key, {
|
|
35
|
+
ttl,
|
|
36
|
+
});
|
|
37
|
+
await lock.acquire();
|
|
38
|
+
const [result, error] = await lock.run(async () => {
|
|
39
|
+
await delay(TTL);
|
|
40
|
+
return "a";
|
|
41
|
+
});
|
|
42
|
+
expect(result).toBeNull();
|
|
43
|
+
expect(error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
|
|
44
|
+
});
|
|
45
|
+
test("Should work with LazyPromise", async () => {
|
|
46
|
+
const key = "a";
|
|
47
|
+
const ttl = null;
|
|
48
|
+
const lock = lockProviderA.create(key, {
|
|
49
|
+
ttl,
|
|
50
|
+
});
|
|
51
|
+
const [result, error] = await lock.run(new LazyPromise(async () => {
|
|
52
|
+
await delay(TTL);
|
|
53
|
+
return "a";
|
|
54
|
+
}));
|
|
55
|
+
expect(result).toBe("a");
|
|
56
|
+
expect(error).toBeNull();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe("method: runOrFail", () => {
|
|
60
|
+
test("Should return string when lock is available", async () => {
|
|
61
|
+
const key = "a";
|
|
62
|
+
const ttl = null;
|
|
63
|
+
const lock = lockProviderA.create(key, {
|
|
64
|
+
ttl,
|
|
65
|
+
});
|
|
66
|
+
const result = await lock.runOrFail(async () => {
|
|
67
|
+
await delay(TTL);
|
|
68
|
+
return "a";
|
|
69
|
+
});
|
|
70
|
+
expect(result).toBe("a");
|
|
71
|
+
});
|
|
72
|
+
test("Should throw KeyAlreadyAcquiredLockError when lock is already acquired", async () => {
|
|
73
|
+
const key = "a";
|
|
74
|
+
const ttl = null;
|
|
75
|
+
const lock = lockProviderA.create(key, {
|
|
76
|
+
ttl,
|
|
77
|
+
});
|
|
78
|
+
await lock.acquire();
|
|
79
|
+
const result = lock.runOrFail(async () => {
|
|
80
|
+
await delay(TTL);
|
|
81
|
+
return "a";
|
|
82
|
+
});
|
|
83
|
+
await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
|
|
84
|
+
});
|
|
85
|
+
test("Should work with LazyPromise", async () => {
|
|
86
|
+
const key = "a";
|
|
87
|
+
const ttl = null;
|
|
88
|
+
const lock = lockProviderA.create(key, {
|
|
89
|
+
ttl,
|
|
90
|
+
});
|
|
91
|
+
const result = await lock.runOrFail(new LazyPromise(async () => {
|
|
92
|
+
await delay(TTL);
|
|
93
|
+
return "a";
|
|
94
|
+
}));
|
|
95
|
+
expect(result).toBe("a");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe("method: acquire", () => {
|
|
99
|
+
test("Should return true when lock is available", async () => {
|
|
100
|
+
const key = "a";
|
|
101
|
+
const ttl = null;
|
|
102
|
+
const lock = lockProviderA.create(key, {
|
|
103
|
+
ttl,
|
|
104
|
+
});
|
|
105
|
+
const result = await lock.acquire();
|
|
106
|
+
expect(result).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
test("Should return false when lock is already acquired", async () => {
|
|
109
|
+
const key = "a";
|
|
110
|
+
const ttl = null;
|
|
111
|
+
const lock = lockProviderA.create(key, {
|
|
112
|
+
ttl,
|
|
113
|
+
});
|
|
114
|
+
await lock.acquire();
|
|
115
|
+
const result = await lock.acquire();
|
|
116
|
+
expect(result).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
test("Should not be expired when released by same owner", async () => {
|
|
119
|
+
const key = "a";
|
|
120
|
+
const ttl = null;
|
|
121
|
+
const owner = "b";
|
|
122
|
+
const lock = lockProviderA.create(key, {
|
|
123
|
+
ttl,
|
|
124
|
+
owner,
|
|
125
|
+
});
|
|
126
|
+
await lock.acquire();
|
|
127
|
+
const result = await lock.isExpired();
|
|
128
|
+
expect(result).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
test("Should be loked when released by same owner", async () => {
|
|
131
|
+
const key = "a";
|
|
132
|
+
const ttl = null;
|
|
133
|
+
const owner = "b";
|
|
134
|
+
const lock = lockProviderA.create(key, {
|
|
135
|
+
ttl,
|
|
136
|
+
owner,
|
|
137
|
+
});
|
|
138
|
+
await lock.acquire();
|
|
139
|
+
const result = await lock.isLocked();
|
|
140
|
+
expect(result).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe("method: acquireOrFail", () => {
|
|
144
|
+
test("Should not throw KeyAlreadyAcquiredLockError when lock is available", async () => {
|
|
145
|
+
const key = "a";
|
|
146
|
+
const ttl = null;
|
|
147
|
+
const lock = lockProviderA.create(key, {
|
|
148
|
+
ttl,
|
|
149
|
+
});
|
|
150
|
+
const result = lock.acquireOrFail();
|
|
151
|
+
await expect(result).resolves.toBeUndefined();
|
|
152
|
+
});
|
|
153
|
+
test("Should throw KeyAlreadyAcquiredLockError when lock is already acquired", async () => {
|
|
154
|
+
const key = "a";
|
|
155
|
+
const ttl = null;
|
|
156
|
+
const lock = lockProviderA.create(key, {
|
|
157
|
+
ttl,
|
|
158
|
+
});
|
|
159
|
+
await lock.acquireOrFail();
|
|
160
|
+
const result = lock.acquireOrFail();
|
|
161
|
+
await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe("method: release", () => {
|
|
165
|
+
test("Should return true when released by same owner", async () => {
|
|
166
|
+
const key = "a";
|
|
167
|
+
const ttl = null;
|
|
168
|
+
const owner = "b";
|
|
169
|
+
const lock = lockProviderA.create(key, {
|
|
170
|
+
ttl,
|
|
171
|
+
owner,
|
|
172
|
+
});
|
|
173
|
+
await lock.acquire();
|
|
174
|
+
const result = await lock.release();
|
|
175
|
+
expect(result).toBe(true);
|
|
176
|
+
});
|
|
177
|
+
test("Should return false when released by different owner", async () => {
|
|
178
|
+
const key = "a";
|
|
179
|
+
const ttl = null;
|
|
180
|
+
const owner1 = "b";
|
|
181
|
+
const lock1 = lockProviderA.create(key, {
|
|
182
|
+
ttl,
|
|
183
|
+
owner: owner1,
|
|
184
|
+
});
|
|
185
|
+
await lock1.acquire();
|
|
186
|
+
const owner2 = "c";
|
|
187
|
+
const lock2 = lockProviderA.create(key, {
|
|
188
|
+
ttl,
|
|
189
|
+
owner: owner2,
|
|
190
|
+
});
|
|
191
|
+
const result = await lock2.release();
|
|
192
|
+
expect(result).toBe(false);
|
|
193
|
+
});
|
|
194
|
+
test("Should be expired when released by same owner", async () => {
|
|
195
|
+
const key = "a";
|
|
196
|
+
const ttl = null;
|
|
197
|
+
const owner = "b";
|
|
198
|
+
const lock = lockProviderA.create(key, {
|
|
199
|
+
ttl,
|
|
200
|
+
owner,
|
|
201
|
+
});
|
|
202
|
+
await lock.acquire();
|
|
203
|
+
await lock.release();
|
|
204
|
+
const result = await lock.isExpired();
|
|
205
|
+
expect(result).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
test("Should be not loked when released by same owner", async () => {
|
|
208
|
+
const key = "a";
|
|
209
|
+
const ttl = null;
|
|
210
|
+
const owner = "b";
|
|
211
|
+
const lock = lockProviderA.create(key, {
|
|
212
|
+
ttl,
|
|
213
|
+
owner,
|
|
214
|
+
});
|
|
215
|
+
await lock.acquire();
|
|
216
|
+
await lock.release();
|
|
217
|
+
const result = await lock.isLocked();
|
|
218
|
+
expect(result).toBe(false);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
describe("method: releaseOrFail", () => {
|
|
222
|
+
test("Should not throw UnownedReleaseLockError when released by same owner", async () => {
|
|
223
|
+
const key = "a";
|
|
224
|
+
const ttl = null;
|
|
225
|
+
const owner = "b";
|
|
226
|
+
const lock = lockProviderA.create(key, {
|
|
227
|
+
ttl,
|
|
228
|
+
owner,
|
|
229
|
+
});
|
|
230
|
+
await lock.acquire();
|
|
231
|
+
const result = lock.releaseOrFail();
|
|
232
|
+
await expect(result).resolves.toBeUndefined();
|
|
233
|
+
});
|
|
234
|
+
test("Should throw UnownedReleaseLockError when released by different owner", async () => {
|
|
235
|
+
const key = "a";
|
|
236
|
+
const ttl = null;
|
|
237
|
+
const owner1 = "b";
|
|
238
|
+
const lock1 = lockProviderA.create(key, {
|
|
239
|
+
ttl,
|
|
240
|
+
owner: owner1,
|
|
241
|
+
});
|
|
242
|
+
await lock1.acquire();
|
|
243
|
+
const owner2 = "c";
|
|
244
|
+
const lock2 = lockProviderA.create(key, {
|
|
245
|
+
ttl,
|
|
246
|
+
owner: owner2,
|
|
247
|
+
});
|
|
248
|
+
const result = lock2.releaseOrFail();
|
|
249
|
+
await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
|
|
250
|
+
});
|
|
251
|
+
test("Should be expired when released by same owner", async () => {
|
|
252
|
+
const key = "a";
|
|
253
|
+
const ttl = null;
|
|
254
|
+
const owner = "b";
|
|
255
|
+
const lock = lockProviderA.create(key, {
|
|
256
|
+
ttl,
|
|
257
|
+
owner,
|
|
258
|
+
});
|
|
259
|
+
await lock.acquire();
|
|
260
|
+
await lock.releaseOrFail();
|
|
261
|
+
const result = await lock.isExpired();
|
|
262
|
+
expect(result).toBe(true);
|
|
263
|
+
});
|
|
264
|
+
test("Should be not loked when released by same owner", async () => {
|
|
265
|
+
const key = "a";
|
|
266
|
+
const ttl = null;
|
|
267
|
+
const owner = "b";
|
|
268
|
+
const lock = lockProviderA.create(key, {
|
|
269
|
+
ttl,
|
|
270
|
+
owner,
|
|
271
|
+
});
|
|
272
|
+
await lock.acquire();
|
|
273
|
+
await lock.releaseOrFail();
|
|
274
|
+
const result = await lock.isLocked();
|
|
275
|
+
expect(result).toBe(false);
|
|
276
|
+
});
|
|
277
|
+
});
|
|
278
|
+
describe("method: forceRelease", () => {
|
|
279
|
+
test("Should release lock no regardless of the owner", async () => {
|
|
280
|
+
const key = "a";
|
|
281
|
+
const ttl = null;
|
|
282
|
+
const owner1 = "b";
|
|
283
|
+
const lock1 = lockProviderA.create(key, {
|
|
284
|
+
ttl,
|
|
285
|
+
owner: owner1,
|
|
286
|
+
});
|
|
287
|
+
await lock1.acquire();
|
|
288
|
+
const owner2 = "c";
|
|
289
|
+
const lock2 = lockProviderA.create(key, {
|
|
290
|
+
ttl,
|
|
291
|
+
owner: owner2,
|
|
292
|
+
});
|
|
293
|
+
await lock2.forceRelease();
|
|
294
|
+
const result = await lock1.acquire();
|
|
295
|
+
expect(result).toBe(true);
|
|
296
|
+
});
|
|
297
|
+
test("Should be expired when released", async () => {
|
|
298
|
+
const key = "a";
|
|
299
|
+
const ttl = null;
|
|
300
|
+
const owner = "b";
|
|
301
|
+
const lock = lockProviderA.create(key, {
|
|
302
|
+
ttl,
|
|
303
|
+
owner,
|
|
304
|
+
});
|
|
305
|
+
await lock.acquire();
|
|
306
|
+
await lock.forceRelease();
|
|
307
|
+
const result = await lock.isExpired();
|
|
308
|
+
expect(result).toBe(true);
|
|
309
|
+
});
|
|
310
|
+
test("Should be not loked when released", async () => {
|
|
311
|
+
const key = "a";
|
|
312
|
+
const ttl = null;
|
|
313
|
+
const owner = "b";
|
|
314
|
+
const lock = lockProviderA.create(key, {
|
|
315
|
+
ttl,
|
|
316
|
+
owner,
|
|
317
|
+
});
|
|
318
|
+
await lock.acquire();
|
|
319
|
+
await lock.forceRelease();
|
|
320
|
+
const result = await lock.isLocked();
|
|
321
|
+
expect(result).toBe(false);
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
describe("method: isExpired", () => {
|
|
325
|
+
test("Should return false when lock has no expiration", async () => {
|
|
326
|
+
const key = "a";
|
|
327
|
+
const ttl = null;
|
|
328
|
+
const owner = "b";
|
|
329
|
+
const lock = lockProviderA.create(key, {
|
|
330
|
+
ttl,
|
|
331
|
+
owner,
|
|
332
|
+
});
|
|
333
|
+
await lock.acquire();
|
|
334
|
+
const result = await lock.isExpired();
|
|
335
|
+
expect(result).toBe(false);
|
|
336
|
+
});
|
|
337
|
+
test("Should return false when lock has not expired", async () => {
|
|
338
|
+
const key = "a";
|
|
339
|
+
const owner = "b";
|
|
340
|
+
const ttl = TTL;
|
|
341
|
+
const lock = lockProviderA.create(key, {
|
|
342
|
+
ttl,
|
|
343
|
+
owner,
|
|
344
|
+
});
|
|
345
|
+
await lock.acquire();
|
|
346
|
+
const result = await lock.isExpired();
|
|
347
|
+
expect(result).toBe(false);
|
|
348
|
+
});
|
|
349
|
+
test("Should return true when lock has expired", async () => {
|
|
350
|
+
const key = "a";
|
|
351
|
+
const owner = "b";
|
|
352
|
+
const ttl = TTL;
|
|
353
|
+
const lock = lockProviderA.create(key, {
|
|
354
|
+
ttl,
|
|
355
|
+
owner,
|
|
356
|
+
});
|
|
357
|
+
await lock.acquire();
|
|
358
|
+
await delay(ttl.addMilliseconds(25));
|
|
359
|
+
const result = await lock.isExpired();
|
|
360
|
+
expect(result).toBe(true);
|
|
361
|
+
});
|
|
362
|
+
});
|
|
363
|
+
describe("method: isLocked", () => {
|
|
364
|
+
test("Should return true when lock has no expiration", async () => {
|
|
365
|
+
const key = "a";
|
|
366
|
+
const ttl = null;
|
|
367
|
+
const owner = "b";
|
|
368
|
+
const lock = lockProviderA.create(key, {
|
|
369
|
+
ttl,
|
|
370
|
+
owner,
|
|
371
|
+
});
|
|
372
|
+
await lock.acquire();
|
|
373
|
+
const result = await lock.isLocked();
|
|
374
|
+
expect(result).toBe(true);
|
|
375
|
+
});
|
|
376
|
+
test("Should return true when lock has not expired", async () => {
|
|
377
|
+
const key = "a";
|
|
378
|
+
const owner = "b";
|
|
379
|
+
const ttl = TTL;
|
|
380
|
+
const lock = lockProviderA.create(key, {
|
|
381
|
+
ttl,
|
|
382
|
+
owner,
|
|
383
|
+
});
|
|
384
|
+
await lock.acquire();
|
|
385
|
+
const result = await lock.isLocked();
|
|
386
|
+
expect(result).toBe(true);
|
|
387
|
+
});
|
|
388
|
+
test("Should return false when lock has expired", async () => {
|
|
389
|
+
const key = "a";
|
|
390
|
+
const owner = "b";
|
|
391
|
+
const ttl = TTL;
|
|
392
|
+
const lock = lockProviderA.create(key, {
|
|
393
|
+
ttl,
|
|
394
|
+
owner,
|
|
395
|
+
});
|
|
396
|
+
await lock.acquire();
|
|
397
|
+
await delay(ttl.addMilliseconds(25));
|
|
398
|
+
const result = await lock.isLocked();
|
|
399
|
+
expect(result).toBe(false);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
describe("method: refresh", () => {
|
|
403
|
+
test("Should return true when refreshed by same owner", async () => {
|
|
404
|
+
const key = "a";
|
|
405
|
+
const ttl = TTL;
|
|
406
|
+
const owner = "b";
|
|
407
|
+
const lock = lockProviderA.create(key, {
|
|
408
|
+
ttl,
|
|
409
|
+
owner,
|
|
410
|
+
});
|
|
411
|
+
await lock.acquire();
|
|
412
|
+
await delay(ttl);
|
|
413
|
+
const result = await lock.refresh();
|
|
414
|
+
expect(result).toBe(true);
|
|
415
|
+
});
|
|
416
|
+
test("Should return false when refreshed by different owner", async () => {
|
|
417
|
+
const key = "a";
|
|
418
|
+
const ttl = TTL;
|
|
419
|
+
const owner1 = "b";
|
|
420
|
+
const lock1 = lockProviderA.create(key, {
|
|
421
|
+
ttl,
|
|
422
|
+
owner: owner1,
|
|
423
|
+
});
|
|
424
|
+
await lock1.acquire();
|
|
425
|
+
const owner2 = "c";
|
|
426
|
+
const lock2 = lockProviderA.create(key, {
|
|
427
|
+
ttl,
|
|
428
|
+
owner: owner2,
|
|
429
|
+
});
|
|
430
|
+
const result = await lock2.refresh();
|
|
431
|
+
expect(result).toBe(false);
|
|
432
|
+
});
|
|
433
|
+
test("Should refresh expiration by same owner", async () => {
|
|
434
|
+
const key = "a";
|
|
435
|
+
const ttl = TTL;
|
|
436
|
+
const owner = "b";
|
|
437
|
+
const lock = lockProviderA.create(key, {
|
|
438
|
+
ttl,
|
|
439
|
+
owner,
|
|
440
|
+
});
|
|
441
|
+
await lock.acquire();
|
|
442
|
+
await delay(ttl.subtractMilliseconds(10));
|
|
443
|
+
await lock.refresh();
|
|
444
|
+
const time = await lock.getRemainingTime();
|
|
445
|
+
expect(time?.toMilliseconds()).toBeGreaterThan(0);
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
describe("method: refreshOrFail", () => {
|
|
449
|
+
test("Should not throw UnownedExtendLockError when refreshed by same owner", async () => {
|
|
450
|
+
const key = "a";
|
|
451
|
+
const ttl = TTL;
|
|
452
|
+
const owner = "b";
|
|
453
|
+
const lock = lockProviderA.create(key, {
|
|
454
|
+
ttl,
|
|
455
|
+
owner,
|
|
456
|
+
});
|
|
457
|
+
await lock.acquire();
|
|
458
|
+
await delay(ttl);
|
|
459
|
+
const result = lock.refreshOrFail();
|
|
460
|
+
await expect(result).resolves.toBeUndefined();
|
|
461
|
+
});
|
|
462
|
+
test("Should throw UnownedExtendLockError when refreshed by different owner", async () => {
|
|
463
|
+
const key = "a";
|
|
464
|
+
const ttl = TTL;
|
|
465
|
+
const owner1 = "b";
|
|
466
|
+
const lock1 = lockProviderA.create(key, {
|
|
467
|
+
ttl,
|
|
468
|
+
owner: owner1,
|
|
469
|
+
});
|
|
470
|
+
await lock1.acquire();
|
|
471
|
+
const owner2 = "c";
|
|
472
|
+
const lock2 = lockProviderA.create(key, {
|
|
473
|
+
ttl,
|
|
474
|
+
owner: owner2,
|
|
475
|
+
});
|
|
476
|
+
const result = lock2.refreshOrFail();
|
|
477
|
+
await expect(result).rejects.toBeInstanceOf(UnownedExtendLockError);
|
|
478
|
+
});
|
|
479
|
+
test("Should refresh expiration by same owner", async () => {
|
|
480
|
+
const key = "a";
|
|
481
|
+
const ttl = TTL;
|
|
482
|
+
const owner = "b";
|
|
483
|
+
const lock = lockProviderA.create(key, {
|
|
484
|
+
ttl,
|
|
485
|
+
owner,
|
|
486
|
+
});
|
|
487
|
+
await lock.acquireOrFail();
|
|
488
|
+
await delay(ttl.subtractMilliseconds(10));
|
|
489
|
+
await lock.refresh();
|
|
490
|
+
const time = await lock.getRemainingTime();
|
|
491
|
+
expect(time?.toMilliseconds()).toBeGreaterThan(0);
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
describe("method: getRemainingTime", () => {
|
|
495
|
+
test("Should return null when lock is not acquired", async () => {
|
|
496
|
+
const key = "a";
|
|
497
|
+
const ttl = null;
|
|
498
|
+
const owner = "b";
|
|
499
|
+
const lock = lockProviderA.create(key, {
|
|
500
|
+
ttl,
|
|
501
|
+
owner,
|
|
502
|
+
});
|
|
503
|
+
const result = await lock.getRemainingTime();
|
|
504
|
+
expect(result).toBeNull();
|
|
505
|
+
});
|
|
506
|
+
test("Should return null when lock is acquired and has expiration", async () => {
|
|
507
|
+
const key = "a";
|
|
508
|
+
const ttl = null;
|
|
509
|
+
const owner = "b";
|
|
510
|
+
const lock = lockProviderA.create(key, {
|
|
511
|
+
ttl,
|
|
512
|
+
owner,
|
|
513
|
+
});
|
|
514
|
+
await lock.acquire();
|
|
515
|
+
const result = await lock.getRemainingTime();
|
|
516
|
+
expect(result).toBeNull();
|
|
517
|
+
});
|
|
518
|
+
test("Should return remaining time when lock is not acquired", async () => {
|
|
519
|
+
const key = "a";
|
|
520
|
+
const ttl = TTL;
|
|
521
|
+
const owner = "b";
|
|
522
|
+
const lock = lockProviderA.create(key, {
|
|
523
|
+
ttl,
|
|
524
|
+
owner,
|
|
525
|
+
});
|
|
526
|
+
await lock.acquire();
|
|
527
|
+
const result = await lock.getRemainingTime();
|
|
528
|
+
expect(result?.toMilliseconds()).toBe(ttl.toMilliseconds());
|
|
529
|
+
});
|
|
530
|
+
});
|
|
531
|
+
describe("method: getOwner", () => {
|
|
532
|
+
test("Should return the owner", async () => {
|
|
533
|
+
const key = "a";
|
|
534
|
+
const owner = "b";
|
|
535
|
+
const lock = lockProviderA.create(key, {
|
|
536
|
+
owner,
|
|
537
|
+
});
|
|
538
|
+
const result = await lock.getOwner();
|
|
539
|
+
expect(result).toBe(owner);
|
|
540
|
+
});
|
|
541
|
+
test("Should return the auto generated owner", async () => {
|
|
542
|
+
const key = "a";
|
|
543
|
+
const lock = lockProviderA.create(key);
|
|
544
|
+
const result = await lock.getOwner();
|
|
545
|
+
expect(result).toBeDefined();
|
|
546
|
+
expect(typeof result).toBe("string");
|
|
547
|
+
});
|
|
548
|
+
});
|
|
549
|
+
});
|
|
550
|
+
});
|
|
551
|
+
describe("Event tests:", () => {
|
|
552
|
+
describe("calss: Lock", () => {
|
|
553
|
+
describe("method: run", () => {
|
|
554
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
555
|
+
const key = "a";
|
|
556
|
+
const owner = "b";
|
|
557
|
+
const lock = lockProviderA.create(key, {
|
|
558
|
+
owner,
|
|
559
|
+
ttl: TTL,
|
|
560
|
+
});
|
|
561
|
+
let event_ = null;
|
|
562
|
+
const unsubscribe = await lock.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
563
|
+
event_ = event;
|
|
564
|
+
});
|
|
565
|
+
await lock.run(async () => {
|
|
566
|
+
await delay(TTL);
|
|
567
|
+
});
|
|
568
|
+
await delay(TTL);
|
|
569
|
+
expect(event_?.fields.key).toBe("a");
|
|
570
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
571
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
572
|
+
await unsubscribe();
|
|
573
|
+
});
|
|
574
|
+
test("Should dispatch KeyReleasedLockEvent when lock is not acquired", async () => {
|
|
575
|
+
const key = "a";
|
|
576
|
+
const owner = "b";
|
|
577
|
+
const lock = lockProviderA.create(key, {
|
|
578
|
+
owner,
|
|
579
|
+
ttl: TTL,
|
|
580
|
+
});
|
|
581
|
+
let event_ = null;
|
|
582
|
+
const unsubscribe = await lock.subscribe(KeyReleasedLockEvent, (event) => {
|
|
583
|
+
event_ = event;
|
|
584
|
+
});
|
|
585
|
+
await lock.run(async () => {
|
|
586
|
+
await delay(TTL);
|
|
587
|
+
});
|
|
588
|
+
await delay(TTL);
|
|
589
|
+
expect(event_?.fields.key).toBe(key);
|
|
590
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
591
|
+
await unsubscribe();
|
|
592
|
+
});
|
|
593
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
594
|
+
const key = "a";
|
|
595
|
+
const owner = "b";
|
|
596
|
+
const lock = lockProviderA.create(key, {
|
|
597
|
+
owner,
|
|
598
|
+
});
|
|
599
|
+
let event_ = null;
|
|
600
|
+
await lock.acquire();
|
|
601
|
+
const unsubscribe = await lock.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
602
|
+
event_ = event;
|
|
603
|
+
});
|
|
604
|
+
await lock.run(async () => {
|
|
605
|
+
await delay(TTL);
|
|
606
|
+
});
|
|
607
|
+
await delay(TTL);
|
|
608
|
+
expect(event_?.fields.key).toBe("a");
|
|
609
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
610
|
+
await unsubscribe();
|
|
611
|
+
});
|
|
612
|
+
});
|
|
613
|
+
describe("method: runOrFail", () => {
|
|
614
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
615
|
+
const key = "a";
|
|
616
|
+
const owner = "b";
|
|
617
|
+
const lock = lockProviderA.create(key, {
|
|
618
|
+
owner,
|
|
619
|
+
ttl: TTL,
|
|
620
|
+
});
|
|
621
|
+
let event_ = null;
|
|
622
|
+
const unsubscribe = await lock.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
623
|
+
event_ = event;
|
|
624
|
+
});
|
|
625
|
+
await lock.runOrFail(async () => {
|
|
626
|
+
await delay(TTL);
|
|
627
|
+
});
|
|
628
|
+
await delay(TTL);
|
|
629
|
+
expect(event_?.fields.key).toBe("a");
|
|
630
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
631
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
632
|
+
await unsubscribe();
|
|
633
|
+
});
|
|
634
|
+
test("Should dispatch KeyReleasedLockEvent when lock is not acquired", async () => {
|
|
635
|
+
const key = "a";
|
|
636
|
+
const owner = "b";
|
|
637
|
+
const lock = lockProviderA.create(key, {
|
|
638
|
+
owner,
|
|
639
|
+
ttl: TTL,
|
|
640
|
+
});
|
|
641
|
+
let event_ = null;
|
|
642
|
+
const unsubscribe = await lock.subscribe(KeyReleasedLockEvent, (event) => {
|
|
643
|
+
event_ = event;
|
|
644
|
+
});
|
|
645
|
+
await lock.runOrFail(async () => {
|
|
646
|
+
await delay(TTL);
|
|
647
|
+
});
|
|
648
|
+
await delay(TTL);
|
|
649
|
+
expect(event_?.fields.key).toBe(key);
|
|
650
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
651
|
+
await unsubscribe();
|
|
652
|
+
});
|
|
653
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
654
|
+
const key = "a";
|
|
655
|
+
const owner = "b";
|
|
656
|
+
const lock = lockProviderA.create(key, {
|
|
657
|
+
owner,
|
|
658
|
+
});
|
|
659
|
+
let event_ = null;
|
|
660
|
+
await lock.acquire();
|
|
661
|
+
const unsubscribe = await lock.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
662
|
+
event_ = event;
|
|
663
|
+
});
|
|
664
|
+
try {
|
|
665
|
+
await lock.runOrFail(async () => {
|
|
666
|
+
await delay(TTL);
|
|
667
|
+
});
|
|
668
|
+
await delay(TTL);
|
|
669
|
+
}
|
|
670
|
+
catch {
|
|
671
|
+
}
|
|
672
|
+
expect(event_?.fields.key).toBe("a");
|
|
673
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
674
|
+
await unsubscribe();
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
describe("method: acquire", () => {
|
|
678
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
679
|
+
const key = "a";
|
|
680
|
+
const owner = "b";
|
|
681
|
+
const lock = lockProviderA.create(key, {
|
|
682
|
+
owner,
|
|
683
|
+
ttl: TTL,
|
|
684
|
+
});
|
|
685
|
+
let event_ = null;
|
|
686
|
+
const unsubscribe = await lock.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
687
|
+
event_ = event;
|
|
688
|
+
});
|
|
689
|
+
await lock.acquire();
|
|
690
|
+
await delay(TTL);
|
|
691
|
+
expect(event_?.fields.key).toBe("a");
|
|
692
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
693
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
694
|
+
await unsubscribe();
|
|
695
|
+
});
|
|
696
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
697
|
+
const key = "a";
|
|
698
|
+
const owner = "b";
|
|
699
|
+
const lock = lockProviderA.create(key, {
|
|
700
|
+
owner,
|
|
701
|
+
});
|
|
702
|
+
let event_ = null;
|
|
703
|
+
await lock.acquire();
|
|
704
|
+
const unsubscribe = await lock.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
705
|
+
event_ = event;
|
|
706
|
+
});
|
|
707
|
+
await lock.acquire();
|
|
708
|
+
await delay(TTL);
|
|
709
|
+
expect(event_?.fields.key).toBe("a");
|
|
710
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
711
|
+
await unsubscribe();
|
|
712
|
+
});
|
|
713
|
+
});
|
|
714
|
+
describe("method: acquireOrFail", () => {
|
|
715
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
716
|
+
const key = "a";
|
|
717
|
+
const owner = "b";
|
|
718
|
+
const lock = lockProviderA.create(key, {
|
|
719
|
+
owner,
|
|
720
|
+
ttl: TTL,
|
|
721
|
+
});
|
|
722
|
+
let event_ = null;
|
|
723
|
+
const unsubscribe = await lock.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
724
|
+
event_ = event;
|
|
725
|
+
});
|
|
726
|
+
await lock.acquireOrFail();
|
|
727
|
+
await delay(TTL);
|
|
728
|
+
expect(event_?.fields.key).toBe("a");
|
|
729
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
730
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
731
|
+
await unsubscribe();
|
|
732
|
+
});
|
|
733
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
734
|
+
const key = "a";
|
|
735
|
+
const owner = "b";
|
|
736
|
+
const lock = lockProviderA.create(key, {
|
|
737
|
+
owner,
|
|
738
|
+
});
|
|
739
|
+
let event_ = null;
|
|
740
|
+
await lock.acquireOrFail();
|
|
741
|
+
const unsubscribe = await lock.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
742
|
+
event_ = event;
|
|
743
|
+
});
|
|
744
|
+
try {
|
|
745
|
+
await lock.acquireOrFail();
|
|
746
|
+
await delay(TTL);
|
|
747
|
+
}
|
|
748
|
+
catch {
|
|
749
|
+
}
|
|
750
|
+
expect(event_?.fields.key).toBe("a");
|
|
751
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
752
|
+
await unsubscribe();
|
|
753
|
+
});
|
|
754
|
+
});
|
|
755
|
+
describe("method: release", () => {
|
|
756
|
+
test("Should dispatch KeyReleasedLockEvent when released by same owner", async () => {
|
|
757
|
+
const key = "a";
|
|
758
|
+
const owner = "b";
|
|
759
|
+
const lock = lockProviderA.create(key, {
|
|
760
|
+
owner,
|
|
761
|
+
});
|
|
762
|
+
await lock.acquire();
|
|
763
|
+
let event_ = null;
|
|
764
|
+
const unsubscribe = await lock.subscribe(KeyReleasedLockEvent, (event) => {
|
|
765
|
+
event_ = event;
|
|
766
|
+
});
|
|
767
|
+
await lock.release();
|
|
768
|
+
await delay(TTL);
|
|
769
|
+
expect(event_?.fields.key).toBe(key);
|
|
770
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
771
|
+
await unsubscribe();
|
|
772
|
+
});
|
|
773
|
+
test("Should dispatch UnownedReleaseLockEvent when released by same owner", async () => {
|
|
774
|
+
const key = "a";
|
|
775
|
+
const owner1 = "b";
|
|
776
|
+
const lock1 = lockProviderA.create(key, {
|
|
777
|
+
owner: owner1,
|
|
778
|
+
});
|
|
779
|
+
await lock1.acquire();
|
|
780
|
+
const owner2 = "c";
|
|
781
|
+
const lock2 = lockProviderA.create(key, {
|
|
782
|
+
owner: owner2,
|
|
783
|
+
});
|
|
784
|
+
let event_ = null;
|
|
785
|
+
const unsubscribe = await lock1.subscribe(UnownedReleaseLockEvent, (event) => {
|
|
786
|
+
event_ = event;
|
|
787
|
+
});
|
|
788
|
+
await lock2.release();
|
|
789
|
+
await delay(TTL);
|
|
790
|
+
expect(event_?.fields.key).toBe(key);
|
|
791
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
792
|
+
await unsubscribe();
|
|
793
|
+
});
|
|
794
|
+
});
|
|
795
|
+
describe("method: releaseOrFail", () => {
|
|
796
|
+
test("Should dispatch KeyReleasedLockEvent when released by same owner", async () => {
|
|
797
|
+
const key = "a";
|
|
798
|
+
const owner = "b";
|
|
799
|
+
const lock = lockProviderA.create(key, {
|
|
800
|
+
owner,
|
|
801
|
+
});
|
|
802
|
+
await lock.acquire();
|
|
803
|
+
let event_ = null;
|
|
804
|
+
const unsubscribe = await lock.subscribe(KeyReleasedLockEvent, (event) => {
|
|
805
|
+
event_ = event;
|
|
806
|
+
});
|
|
807
|
+
await lock.releaseOrFail();
|
|
808
|
+
await delay(TTL);
|
|
809
|
+
expect(event_?.fields.key).toBe(key);
|
|
810
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
811
|
+
await unsubscribe();
|
|
812
|
+
});
|
|
813
|
+
test("Should dispatch UnownedReleaseLockEvent when released by same owner", async () => {
|
|
814
|
+
const key = "a";
|
|
815
|
+
const owner1 = "b";
|
|
816
|
+
const lock1 = lockProviderA.create(key, {
|
|
817
|
+
owner: owner1,
|
|
818
|
+
});
|
|
819
|
+
await lock1.acquire();
|
|
820
|
+
const owner2 = "c";
|
|
821
|
+
const lock2 = lockProviderA.create(key, {
|
|
822
|
+
owner: owner2,
|
|
823
|
+
});
|
|
824
|
+
let event_ = null;
|
|
825
|
+
const unsubscribe = await lock1.subscribe(UnownedReleaseLockEvent, (event) => {
|
|
826
|
+
event_ = event;
|
|
827
|
+
});
|
|
828
|
+
try {
|
|
829
|
+
await lock2.releaseOrFail();
|
|
830
|
+
await delay(TTL);
|
|
831
|
+
}
|
|
832
|
+
catch {
|
|
833
|
+
}
|
|
834
|
+
expect(event_?.fields.key).toBe(key);
|
|
835
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
836
|
+
await unsubscribe();
|
|
837
|
+
});
|
|
838
|
+
});
|
|
839
|
+
describe("method: forceRelease", () => {
|
|
840
|
+
test("Should dispatch KeyForceReleasedLockEvent when lock forcefully released", async () => {
|
|
841
|
+
const key = "a";
|
|
842
|
+
const owner1 = "b";
|
|
843
|
+
const lock1 = lockProviderA.create(key, {
|
|
844
|
+
owner: owner1,
|
|
845
|
+
});
|
|
846
|
+
await lock1.acquire();
|
|
847
|
+
const owner2 = "c";
|
|
848
|
+
const lock2 = lockProviderA.create(key, {
|
|
849
|
+
owner: owner2,
|
|
850
|
+
});
|
|
851
|
+
let event_ = null;
|
|
852
|
+
const unsubscribe = await lock1.subscribe(KeyForceReleasedLockEvent, (event) => {
|
|
853
|
+
event_ = event;
|
|
854
|
+
});
|
|
855
|
+
await lock2.forceRelease();
|
|
856
|
+
await delay(TTL);
|
|
857
|
+
expect(event_?.fields.key).toBe(key);
|
|
858
|
+
await unsubscribe();
|
|
859
|
+
});
|
|
860
|
+
});
|
|
861
|
+
describe("method: refresh", () => {
|
|
862
|
+
test("Should dispatch KeyRefreshedLockEvent when refreshed by same owner", async () => {
|
|
863
|
+
const key = "a";
|
|
864
|
+
const owner = "b";
|
|
865
|
+
const lock = lockProviderA.create(key, {
|
|
866
|
+
owner,
|
|
867
|
+
ttl: TTL,
|
|
868
|
+
});
|
|
869
|
+
await lock.acquire();
|
|
870
|
+
let event_ = null;
|
|
871
|
+
const unsubscribe = await lock.subscribe(KeyRefreshedLockEvent, (event) => {
|
|
872
|
+
event_ = event;
|
|
873
|
+
});
|
|
874
|
+
await delay(TTL.divide(2));
|
|
875
|
+
const newTTL = TTL.multiply(2);
|
|
876
|
+
await lock.refresh(newTTL);
|
|
877
|
+
await delay(TTL);
|
|
878
|
+
expect(event_?.fields.key).toBe(key);
|
|
879
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
880
|
+
expect(event_?.fields.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
|
|
881
|
+
await unsubscribe();
|
|
882
|
+
});
|
|
883
|
+
test("Should dispatch UnownedRefreshLockEvent when refreshed by different owner", async () => {
|
|
884
|
+
const key = "a";
|
|
885
|
+
const owner1 = "b";
|
|
886
|
+
const lock1 = lockProviderA.create(key, {
|
|
887
|
+
owner: owner1,
|
|
888
|
+
ttl: TTL,
|
|
889
|
+
});
|
|
890
|
+
await lock1.acquire();
|
|
891
|
+
const owner2 = "c";
|
|
892
|
+
const lock2 = lockProviderA.create(key, {
|
|
893
|
+
owner: owner2,
|
|
894
|
+
});
|
|
895
|
+
let event_ = null;
|
|
896
|
+
const unsubscribe = await lock1.subscribe(UnownedRefreshLockEvent, (event) => {
|
|
897
|
+
event_ = event;
|
|
898
|
+
});
|
|
899
|
+
await delay(TTL.divide(2));
|
|
900
|
+
const newTTL = TTL.multiply(2);
|
|
901
|
+
await lock2.refresh(newTTL);
|
|
902
|
+
await delay(TTL);
|
|
903
|
+
expect(event_?.fields.key).toBe(key);
|
|
904
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
905
|
+
await unsubscribe();
|
|
906
|
+
});
|
|
907
|
+
});
|
|
908
|
+
describe("method: refreshOrFail", () => {
|
|
909
|
+
test("Should dispatch KeyRefreshedLockEvent when refreshed by same owner", async () => {
|
|
910
|
+
const key = "a";
|
|
911
|
+
const owner = "b";
|
|
912
|
+
const lock = lockProviderA.create(key, {
|
|
913
|
+
owner,
|
|
914
|
+
ttl: TTL,
|
|
915
|
+
});
|
|
916
|
+
await lock.acquire();
|
|
917
|
+
let event_ = null;
|
|
918
|
+
const unsubscribe = await lock.subscribe(KeyRefreshedLockEvent, (event) => {
|
|
919
|
+
event_ = event;
|
|
920
|
+
});
|
|
921
|
+
await delay(TTL.divide(2));
|
|
922
|
+
const newTTL = TTL.multiply(2);
|
|
923
|
+
await lock.refreshOrFail(newTTL);
|
|
924
|
+
await delay(TTL);
|
|
925
|
+
expect(event_?.fields.key).toBe(key);
|
|
926
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
927
|
+
expect(event_?.fields.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
|
|
928
|
+
await unsubscribe();
|
|
929
|
+
});
|
|
930
|
+
test("Should dispatch UnownedRefreshLockEvent when refreshed by different owner", async () => {
|
|
931
|
+
const key = "a";
|
|
932
|
+
const owner1 = "b";
|
|
933
|
+
const lock1 = lockProviderA.create(key, {
|
|
934
|
+
owner: owner1,
|
|
935
|
+
ttl: TTL,
|
|
936
|
+
});
|
|
937
|
+
await lock1.acquire();
|
|
938
|
+
const owner2 = "c";
|
|
939
|
+
const lock2 = lockProviderA.create(key, {
|
|
940
|
+
owner: owner2,
|
|
941
|
+
});
|
|
942
|
+
let event_ = null;
|
|
943
|
+
const unsubscribe = await lock1.subscribe(UnownedRefreshLockEvent, (event) => {
|
|
944
|
+
event_ = event;
|
|
945
|
+
});
|
|
946
|
+
await delay(TTL.divide(2));
|
|
947
|
+
const newTTL = TTL.multiply(2);
|
|
948
|
+
try {
|
|
949
|
+
await lock2.refreshOrFail(newTTL);
|
|
950
|
+
await delay(TTL);
|
|
951
|
+
}
|
|
952
|
+
catch {
|
|
953
|
+
}
|
|
954
|
+
expect(event_?.fields.key).toBe(key);
|
|
955
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
956
|
+
await unsubscribe();
|
|
957
|
+
});
|
|
958
|
+
});
|
|
959
|
+
});
|
|
960
|
+
describe("LockProvider:", () => {
|
|
961
|
+
describe("method: run", () => {
|
|
962
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
963
|
+
const key = "a";
|
|
964
|
+
const owner = "b";
|
|
965
|
+
const lock = lockProviderA.create(key, {
|
|
966
|
+
owner,
|
|
967
|
+
ttl: TTL,
|
|
968
|
+
});
|
|
969
|
+
let event_ = null;
|
|
970
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
971
|
+
event_ = event;
|
|
972
|
+
});
|
|
973
|
+
await lock.run(async () => {
|
|
974
|
+
await delay(TTL);
|
|
975
|
+
});
|
|
976
|
+
await delay(TTL);
|
|
977
|
+
expect(event_?.fields.key).toBe("a");
|
|
978
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
979
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
980
|
+
await unsubscribe();
|
|
981
|
+
});
|
|
982
|
+
test("Should dispatch KeyReleasedLockEvent when lock is not acquired", async () => {
|
|
983
|
+
const key = "a";
|
|
984
|
+
const owner = "b";
|
|
985
|
+
const lock = lockProviderA.create(key, {
|
|
986
|
+
owner,
|
|
987
|
+
ttl: TTL,
|
|
988
|
+
});
|
|
989
|
+
let event_ = null;
|
|
990
|
+
const unsubscribe = await lockProviderA.subscribe(KeyReleasedLockEvent, (event) => {
|
|
991
|
+
event_ = event;
|
|
992
|
+
});
|
|
993
|
+
await lock.run(async () => {
|
|
994
|
+
await delay(TTL);
|
|
995
|
+
});
|
|
996
|
+
await delay(TTL);
|
|
997
|
+
expect(event_?.fields.key).toBe(key);
|
|
998
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
999
|
+
await unsubscribe();
|
|
1000
|
+
});
|
|
1001
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
1002
|
+
const key = "a";
|
|
1003
|
+
const owner = "b";
|
|
1004
|
+
const lock = lockProviderA.create(key, {
|
|
1005
|
+
owner,
|
|
1006
|
+
});
|
|
1007
|
+
let event_ = null;
|
|
1008
|
+
await lock.acquire();
|
|
1009
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
1010
|
+
event_ = event;
|
|
1011
|
+
});
|
|
1012
|
+
await lock.run(async () => {
|
|
1013
|
+
await delay(TTL);
|
|
1014
|
+
});
|
|
1015
|
+
await delay(TTL);
|
|
1016
|
+
expect(event_?.fields.key).toBe("a");
|
|
1017
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1018
|
+
await unsubscribe();
|
|
1019
|
+
});
|
|
1020
|
+
});
|
|
1021
|
+
describe("method: runOrFail", () => {
|
|
1022
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
1023
|
+
const key = "a";
|
|
1024
|
+
const owner = "b";
|
|
1025
|
+
const lock = lockProviderA.create(key, {
|
|
1026
|
+
owner,
|
|
1027
|
+
ttl: TTL,
|
|
1028
|
+
});
|
|
1029
|
+
let event_ = null;
|
|
1030
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
1031
|
+
event_ = event;
|
|
1032
|
+
});
|
|
1033
|
+
await lock.runOrFail(async () => {
|
|
1034
|
+
await delay(TTL);
|
|
1035
|
+
});
|
|
1036
|
+
await delay(TTL);
|
|
1037
|
+
expect(event_?.fields.key).toBe("a");
|
|
1038
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1039
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
1040
|
+
await unsubscribe();
|
|
1041
|
+
});
|
|
1042
|
+
test("Should dispatch KeyReleasedLockEvent when lock is not acquired", async () => {
|
|
1043
|
+
const key = "a";
|
|
1044
|
+
const owner = "b";
|
|
1045
|
+
const lock = lockProviderA.create(key, {
|
|
1046
|
+
owner,
|
|
1047
|
+
ttl: TTL,
|
|
1048
|
+
});
|
|
1049
|
+
let event_ = null;
|
|
1050
|
+
const unsubscribe = await lockProviderA.subscribe(KeyReleasedLockEvent, (event) => {
|
|
1051
|
+
event_ = event;
|
|
1052
|
+
});
|
|
1053
|
+
await lock.runOrFail(async () => {
|
|
1054
|
+
await delay(TTL);
|
|
1055
|
+
});
|
|
1056
|
+
await delay(TTL);
|
|
1057
|
+
expect(event_?.fields.key).toBe(key);
|
|
1058
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1059
|
+
await unsubscribe();
|
|
1060
|
+
});
|
|
1061
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
1062
|
+
const key = "a";
|
|
1063
|
+
const owner = "b";
|
|
1064
|
+
const lock = lockProviderA.create(key, {
|
|
1065
|
+
owner,
|
|
1066
|
+
});
|
|
1067
|
+
let event_ = null;
|
|
1068
|
+
await lock.acquire();
|
|
1069
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
1070
|
+
event_ = event;
|
|
1071
|
+
});
|
|
1072
|
+
try {
|
|
1073
|
+
await lock.runOrFail(async () => {
|
|
1074
|
+
await delay(TTL);
|
|
1075
|
+
});
|
|
1076
|
+
await delay(TTL);
|
|
1077
|
+
}
|
|
1078
|
+
catch {
|
|
1079
|
+
}
|
|
1080
|
+
expect(event_?.fields.key).toBe("a");
|
|
1081
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1082
|
+
await unsubscribe();
|
|
1083
|
+
});
|
|
1084
|
+
});
|
|
1085
|
+
describe("method: acquire", () => {
|
|
1086
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
1087
|
+
const key = "a";
|
|
1088
|
+
const owner = "b";
|
|
1089
|
+
const lock = lockProviderA.create(key, {
|
|
1090
|
+
owner,
|
|
1091
|
+
ttl: TTL,
|
|
1092
|
+
});
|
|
1093
|
+
let event_ = null;
|
|
1094
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
1095
|
+
event_ = event;
|
|
1096
|
+
});
|
|
1097
|
+
await lock.acquire();
|
|
1098
|
+
await delay(TTL);
|
|
1099
|
+
expect(event_?.fields.key).toBe("a");
|
|
1100
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1101
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
1102
|
+
await unsubscribe();
|
|
1103
|
+
});
|
|
1104
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
1105
|
+
const key = "a";
|
|
1106
|
+
const owner = "b";
|
|
1107
|
+
const lock = lockProviderA.create(key, {
|
|
1108
|
+
owner,
|
|
1109
|
+
});
|
|
1110
|
+
let event_ = null;
|
|
1111
|
+
await lock.acquire();
|
|
1112
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
1113
|
+
event_ = event;
|
|
1114
|
+
});
|
|
1115
|
+
await lock.acquire();
|
|
1116
|
+
await delay(TTL);
|
|
1117
|
+
expect(event_?.fields.key).toBe("a");
|
|
1118
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1119
|
+
await unsubscribe();
|
|
1120
|
+
});
|
|
1121
|
+
});
|
|
1122
|
+
describe("method: acquireOrFail", () => {
|
|
1123
|
+
test("Should dispatch KeyAcquiredLockEvent when lock is not acquired", async () => {
|
|
1124
|
+
const key = "a";
|
|
1125
|
+
const owner = "b";
|
|
1126
|
+
const lock = lockProviderA.create(key, {
|
|
1127
|
+
owner,
|
|
1128
|
+
ttl: TTL,
|
|
1129
|
+
});
|
|
1130
|
+
let event_ = null;
|
|
1131
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
1132
|
+
event_ = event;
|
|
1133
|
+
});
|
|
1134
|
+
await lock.acquireOrFail();
|
|
1135
|
+
await delay(TTL);
|
|
1136
|
+
expect(event_?.fields.key).toBe("a");
|
|
1137
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1138
|
+
expect(event_?.fields.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
|
|
1139
|
+
await unsubscribe();
|
|
1140
|
+
});
|
|
1141
|
+
test("Should dispatch KeyAlreadyAcquiredLockEvent when lock is acquired", async () => {
|
|
1142
|
+
const key = "a";
|
|
1143
|
+
const owner = "b";
|
|
1144
|
+
const lock = lockProviderA.create(key, {
|
|
1145
|
+
owner,
|
|
1146
|
+
});
|
|
1147
|
+
let event_ = null;
|
|
1148
|
+
await lock.acquireOrFail();
|
|
1149
|
+
const unsubscribe = await lockProviderA.subscribe(KeyAlreadyAcquiredLockEvent, (event) => {
|
|
1150
|
+
event_ = event;
|
|
1151
|
+
});
|
|
1152
|
+
try {
|
|
1153
|
+
await lock.acquireOrFail();
|
|
1154
|
+
await delay(TTL);
|
|
1155
|
+
}
|
|
1156
|
+
catch {
|
|
1157
|
+
}
|
|
1158
|
+
expect(event_?.fields.key).toBe("a");
|
|
1159
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1160
|
+
await unsubscribe();
|
|
1161
|
+
});
|
|
1162
|
+
});
|
|
1163
|
+
describe("method: release", () => {
|
|
1164
|
+
test("Should dispatch KeyReleasedLockEvent when released by same owner", async () => {
|
|
1165
|
+
const key = "a";
|
|
1166
|
+
const owner = "b";
|
|
1167
|
+
const lock = lockProviderA.create(key, {
|
|
1168
|
+
owner,
|
|
1169
|
+
});
|
|
1170
|
+
await lock.acquire();
|
|
1171
|
+
let event_ = null;
|
|
1172
|
+
const unsubscribe = await lockProviderA.subscribe(KeyReleasedLockEvent, (event) => {
|
|
1173
|
+
event_ = event;
|
|
1174
|
+
});
|
|
1175
|
+
await lock.release();
|
|
1176
|
+
await delay(TTL);
|
|
1177
|
+
expect(event_?.fields.key).toBe(key);
|
|
1178
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1179
|
+
await unsubscribe();
|
|
1180
|
+
});
|
|
1181
|
+
test("Should dispatch UnownedReleaseLockEvent when released by same owner", async () => {
|
|
1182
|
+
const key = "a";
|
|
1183
|
+
const owner1 = "b";
|
|
1184
|
+
const lock1 = lockProviderA.create(key, {
|
|
1185
|
+
owner: owner1,
|
|
1186
|
+
});
|
|
1187
|
+
await lock1.acquire();
|
|
1188
|
+
const owner2 = "c";
|
|
1189
|
+
const lock2 = lockProviderA.create(key, {
|
|
1190
|
+
owner: owner2,
|
|
1191
|
+
});
|
|
1192
|
+
let event_ = null;
|
|
1193
|
+
const unsubscribe = await lock1.subscribe(UnownedReleaseLockEvent, (event) => {
|
|
1194
|
+
event_ = event;
|
|
1195
|
+
});
|
|
1196
|
+
await lock2.release();
|
|
1197
|
+
await delay(TTL);
|
|
1198
|
+
expect(event_?.fields.key).toBe(key);
|
|
1199
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
1200
|
+
await unsubscribe();
|
|
1201
|
+
});
|
|
1202
|
+
});
|
|
1203
|
+
describe("method: releaseOrFail", () => {
|
|
1204
|
+
test("Should dispatch KeyReleasedLockEvent when released by same owner", async () => {
|
|
1205
|
+
const key = "a";
|
|
1206
|
+
const owner = "b";
|
|
1207
|
+
const lock = lockProviderA.create(key, {
|
|
1208
|
+
owner,
|
|
1209
|
+
});
|
|
1210
|
+
await lock.acquire();
|
|
1211
|
+
let event_ = null;
|
|
1212
|
+
const unsubscribe = await lockProviderA.subscribe(KeyReleasedLockEvent, (event) => {
|
|
1213
|
+
event_ = event;
|
|
1214
|
+
});
|
|
1215
|
+
await lock.releaseOrFail();
|
|
1216
|
+
await delay(TTL);
|
|
1217
|
+
expect(event_?.fields.key).toBe(key);
|
|
1218
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1219
|
+
await unsubscribe();
|
|
1220
|
+
});
|
|
1221
|
+
test("Should dispatch UnownedReleaseLockEvent when released by same owner", async () => {
|
|
1222
|
+
const key = "a";
|
|
1223
|
+
const owner1 = "b";
|
|
1224
|
+
const lock1 = lockProviderA.create(key, {
|
|
1225
|
+
owner: owner1,
|
|
1226
|
+
});
|
|
1227
|
+
await lock1.acquire();
|
|
1228
|
+
const owner2 = "c";
|
|
1229
|
+
const lock2 = lockProviderA.create(key, {
|
|
1230
|
+
owner: owner2,
|
|
1231
|
+
});
|
|
1232
|
+
let event_ = null;
|
|
1233
|
+
const unsubscribe = await lock1.subscribe(UnownedReleaseLockEvent, (event) => {
|
|
1234
|
+
event_ = event;
|
|
1235
|
+
});
|
|
1236
|
+
try {
|
|
1237
|
+
await lock2.releaseOrFail();
|
|
1238
|
+
await delay(TTL);
|
|
1239
|
+
}
|
|
1240
|
+
catch {
|
|
1241
|
+
}
|
|
1242
|
+
expect(event_?.fields.key).toBe(key);
|
|
1243
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
1244
|
+
await unsubscribe();
|
|
1245
|
+
});
|
|
1246
|
+
});
|
|
1247
|
+
describe("method: forceRelease", () => {
|
|
1248
|
+
test("Should dispatch KeyForceReleasedLockEvent when lock forcefully released", async () => {
|
|
1249
|
+
const key = "a";
|
|
1250
|
+
const owner1 = "b";
|
|
1251
|
+
const lock1 = lockProviderA.create(key, {
|
|
1252
|
+
owner: owner1,
|
|
1253
|
+
});
|
|
1254
|
+
await lock1.acquire();
|
|
1255
|
+
const owner2 = "c";
|
|
1256
|
+
const lock2 = lockProviderA.create(key, {
|
|
1257
|
+
owner: owner2,
|
|
1258
|
+
});
|
|
1259
|
+
let event_ = null;
|
|
1260
|
+
const unsubscribe = await lock1.subscribe(KeyForceReleasedLockEvent, (event) => {
|
|
1261
|
+
event_ = event;
|
|
1262
|
+
});
|
|
1263
|
+
await lock2.forceRelease();
|
|
1264
|
+
await delay(TTL);
|
|
1265
|
+
expect(event_?.fields.key).toBe(key);
|
|
1266
|
+
await unsubscribe();
|
|
1267
|
+
});
|
|
1268
|
+
});
|
|
1269
|
+
describe("method: refresh", () => {
|
|
1270
|
+
test("Should dispatch KeyRefreshedLockEvent when refreshed by same owner", async () => {
|
|
1271
|
+
const key = "a";
|
|
1272
|
+
const owner = "b";
|
|
1273
|
+
const lock = lockProviderA.create(key, {
|
|
1274
|
+
owner,
|
|
1275
|
+
ttl: TTL,
|
|
1276
|
+
});
|
|
1277
|
+
await lock.acquire();
|
|
1278
|
+
let event_ = null;
|
|
1279
|
+
const unsubscribe = await lockProviderA.subscribe(KeyRefreshedLockEvent, (event) => {
|
|
1280
|
+
event_ = event;
|
|
1281
|
+
});
|
|
1282
|
+
await delay(TTL.divide(2));
|
|
1283
|
+
const newTTL = TTL.multiply(2);
|
|
1284
|
+
await lock.refresh(newTTL);
|
|
1285
|
+
await delay(TTL);
|
|
1286
|
+
expect(event_?.fields.key).toBe(key);
|
|
1287
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1288
|
+
expect(event_?.fields.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
|
|
1289
|
+
await unsubscribe();
|
|
1290
|
+
});
|
|
1291
|
+
test("Should dispatch UnownedRefreshLockEvent when refreshed by different owner", async () => {
|
|
1292
|
+
const key = "a";
|
|
1293
|
+
const owner1 = "b";
|
|
1294
|
+
const lock1 = lockProviderA.create(key, {
|
|
1295
|
+
owner: owner1,
|
|
1296
|
+
ttl: TTL,
|
|
1297
|
+
});
|
|
1298
|
+
await lock1.acquire();
|
|
1299
|
+
const owner2 = "c";
|
|
1300
|
+
const lock2 = lockProviderA.create(key, {
|
|
1301
|
+
owner: owner2,
|
|
1302
|
+
});
|
|
1303
|
+
let event_ = null;
|
|
1304
|
+
const unsubscribe = await lock1.subscribe(UnownedRefreshLockEvent, (event) => {
|
|
1305
|
+
event_ = event;
|
|
1306
|
+
});
|
|
1307
|
+
await delay(TTL.divide(2));
|
|
1308
|
+
const newTTL = TTL.multiply(2);
|
|
1309
|
+
await lock2.refresh(newTTL);
|
|
1310
|
+
await delay(TTL);
|
|
1311
|
+
expect(event_?.fields.key).toBe(key);
|
|
1312
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
1313
|
+
await unsubscribe();
|
|
1314
|
+
});
|
|
1315
|
+
});
|
|
1316
|
+
describe("method: refreshOrFail", () => {
|
|
1317
|
+
test("Should dispatch KeyRefreshedLockEvent when refreshed by same owner", async () => {
|
|
1318
|
+
const key = "a";
|
|
1319
|
+
const owner = "b";
|
|
1320
|
+
const lock = lockProviderA.create(key, {
|
|
1321
|
+
owner,
|
|
1322
|
+
ttl: TTL,
|
|
1323
|
+
});
|
|
1324
|
+
await lock.acquire();
|
|
1325
|
+
let event_ = null;
|
|
1326
|
+
const unsubscribe = await lockProviderA.subscribe(KeyRefreshedLockEvent, (event) => {
|
|
1327
|
+
event_ = event;
|
|
1328
|
+
});
|
|
1329
|
+
await delay(TTL.divide(2));
|
|
1330
|
+
const newTTL = TTL.multiply(2);
|
|
1331
|
+
await lock.refreshOrFail(newTTL);
|
|
1332
|
+
await delay(TTL);
|
|
1333
|
+
expect(event_?.fields.key).toBe(key);
|
|
1334
|
+
expect(event_?.fields.owner).toBe(owner);
|
|
1335
|
+
expect(event_?.fields.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
|
|
1336
|
+
await unsubscribe();
|
|
1337
|
+
});
|
|
1338
|
+
test("Should dispatch UnownedRefreshLockEvent when refreshed by different owner", async () => {
|
|
1339
|
+
const key = "a";
|
|
1340
|
+
const owner1 = "b";
|
|
1341
|
+
const lock1 = lockProviderA.create(key, {
|
|
1342
|
+
owner: owner1,
|
|
1343
|
+
ttl: TTL,
|
|
1344
|
+
});
|
|
1345
|
+
await lock1.acquire();
|
|
1346
|
+
const owner2 = "c";
|
|
1347
|
+
const lock2 = lockProviderA.create(key, {
|
|
1348
|
+
owner: owner2,
|
|
1349
|
+
});
|
|
1350
|
+
let event_ = null;
|
|
1351
|
+
const unsubscribe = await lock1.subscribe(UnownedRefreshLockEvent, (event) => {
|
|
1352
|
+
event_ = event;
|
|
1353
|
+
});
|
|
1354
|
+
await delay(TTL.divide(2));
|
|
1355
|
+
const newTTL = TTL.multiply(2);
|
|
1356
|
+
try {
|
|
1357
|
+
await lock2.refreshOrFail(newTTL);
|
|
1358
|
+
await delay(TTL);
|
|
1359
|
+
}
|
|
1360
|
+
catch {
|
|
1361
|
+
}
|
|
1362
|
+
expect(event_?.fields.key).toBe(key);
|
|
1363
|
+
expect(event_?.fields.owner).toBe(owner2);
|
|
1364
|
+
await unsubscribe();
|
|
1365
|
+
});
|
|
1366
|
+
});
|
|
1367
|
+
});
|
|
1368
|
+
});
|
|
1369
|
+
describe("Group tests:", () => {
|
|
1370
|
+
test("method: run", async () => {
|
|
1371
|
+
const key = "a";
|
|
1372
|
+
const ownerA = "b";
|
|
1373
|
+
const lockA = lockProviderA.create(key, {
|
|
1374
|
+
owner: ownerA,
|
|
1375
|
+
});
|
|
1376
|
+
const promiseA = lockA.run(async () => {
|
|
1377
|
+
await delay(TTL);
|
|
1378
|
+
return "a";
|
|
1379
|
+
});
|
|
1380
|
+
const ownerB = "c";
|
|
1381
|
+
const lockB = lockProviderB.create(key, {
|
|
1382
|
+
owner: ownerB,
|
|
1383
|
+
});
|
|
1384
|
+
const promiseB = lockB.run(async () => {
|
|
1385
|
+
await delay(TTL);
|
|
1386
|
+
return "a";
|
|
1387
|
+
});
|
|
1388
|
+
const [[resultA, errorA], [resultB, errorB]] = await Promise.all([
|
|
1389
|
+
promiseA,
|
|
1390
|
+
promiseB,
|
|
1391
|
+
]);
|
|
1392
|
+
expect(resultA).toBe("a");
|
|
1393
|
+
expect(errorA).toBeNull();
|
|
1394
|
+
expect(resultB).toBe("a");
|
|
1395
|
+
expect(errorB).toBeNull();
|
|
1396
|
+
});
|
|
1397
|
+
test("method: runOrFail", async () => {
|
|
1398
|
+
const key = "a";
|
|
1399
|
+
const ownerA = "b";
|
|
1400
|
+
const lockA = lockProviderA.create(key, {
|
|
1401
|
+
owner: ownerA,
|
|
1402
|
+
});
|
|
1403
|
+
const promiseA = lockA.runOrFail(async () => {
|
|
1404
|
+
await delay(TTL);
|
|
1405
|
+
return "a";
|
|
1406
|
+
});
|
|
1407
|
+
const ownerB = "c";
|
|
1408
|
+
const lockB = lockProviderB.create(key, {
|
|
1409
|
+
owner: ownerB,
|
|
1410
|
+
});
|
|
1411
|
+
const promiseB = lockB.runOrFail(async () => {
|
|
1412
|
+
await delay(TTL);
|
|
1413
|
+
return "a";
|
|
1414
|
+
});
|
|
1415
|
+
const [resultA, resultB] = await Promise.all([promiseA, promiseB]);
|
|
1416
|
+
expect(resultA).toBe("a");
|
|
1417
|
+
expect(resultB).toBe("a");
|
|
1418
|
+
});
|
|
1419
|
+
test("method: acquire", async () => {
|
|
1420
|
+
const key = "a";
|
|
1421
|
+
const ownerA = "b";
|
|
1422
|
+
const lockA = lockProviderA.create(key, {
|
|
1423
|
+
owner: ownerA,
|
|
1424
|
+
});
|
|
1425
|
+
const resultA = await lockA.acquire();
|
|
1426
|
+
const ownerB = "c";
|
|
1427
|
+
const lockB = lockProviderB.create(key, {
|
|
1428
|
+
owner: ownerB,
|
|
1429
|
+
});
|
|
1430
|
+
const resultB = await lockB.acquire();
|
|
1431
|
+
expect(resultA).toBe(true);
|
|
1432
|
+
expect(resultB).toBe(true);
|
|
1433
|
+
});
|
|
1434
|
+
test("method: acquireOrFail", async () => {
|
|
1435
|
+
const key = "a";
|
|
1436
|
+
const ownerA = "b";
|
|
1437
|
+
const lockA = lockProviderA.create(key, {
|
|
1438
|
+
owner: ownerA,
|
|
1439
|
+
});
|
|
1440
|
+
const promiseA = lockA.acquireOrFail();
|
|
1441
|
+
const ownerB = "c";
|
|
1442
|
+
const lockB = lockProviderB.create(key, {
|
|
1443
|
+
owner: ownerB,
|
|
1444
|
+
});
|
|
1445
|
+
const promiseB = lockB.acquireOrFail();
|
|
1446
|
+
await expect(promiseA).resolves.toBeUndefined();
|
|
1447
|
+
await expect(promiseB).resolves.toBeUndefined();
|
|
1448
|
+
});
|
|
1449
|
+
test("method: release", async () => {
|
|
1450
|
+
const key = "a";
|
|
1451
|
+
const owner = "b";
|
|
1452
|
+
const lockA = lockProviderA.create(key, {
|
|
1453
|
+
owner,
|
|
1454
|
+
});
|
|
1455
|
+
await lockA.acquire();
|
|
1456
|
+
const lockB = lockProviderB.create(key, {
|
|
1457
|
+
owner,
|
|
1458
|
+
});
|
|
1459
|
+
await lockB.acquire();
|
|
1460
|
+
await lockA.release();
|
|
1461
|
+
const resultA = await lockA.isLocked();
|
|
1462
|
+
const resultB = await lockB.isLocked();
|
|
1463
|
+
expect(resultA).toBe(false);
|
|
1464
|
+
expect(resultB).toBe(true);
|
|
1465
|
+
});
|
|
1466
|
+
test("method: releaseOrFail", async () => {
|
|
1467
|
+
const key = "a";
|
|
1468
|
+
const owner = "b";
|
|
1469
|
+
const lockA = lockProviderA.create(key, {
|
|
1470
|
+
owner,
|
|
1471
|
+
});
|
|
1472
|
+
await lockA.acquire();
|
|
1473
|
+
const lockB = lockProviderB.create(key, {
|
|
1474
|
+
owner,
|
|
1475
|
+
});
|
|
1476
|
+
await lockB.acquire();
|
|
1477
|
+
await lockA.releaseOrFail();
|
|
1478
|
+
const resultA = await lockA.isLocked();
|
|
1479
|
+
const resultB = await lockB.isLocked();
|
|
1480
|
+
expect(resultA).toBe(false);
|
|
1481
|
+
expect(resultB).toBe(true);
|
|
1482
|
+
});
|
|
1483
|
+
test("method: forceRelease", async () => {
|
|
1484
|
+
const key = "a";
|
|
1485
|
+
const owner = "b";
|
|
1486
|
+
const lockA = lockProviderA.create(key, {
|
|
1487
|
+
owner,
|
|
1488
|
+
});
|
|
1489
|
+
await lockA.acquire();
|
|
1490
|
+
const lockB = lockProviderB.create(key, {
|
|
1491
|
+
owner,
|
|
1492
|
+
});
|
|
1493
|
+
await lockB.acquire();
|
|
1494
|
+
await lockA.forceRelease();
|
|
1495
|
+
const resultA = await lockA.isLocked();
|
|
1496
|
+
const resultB = await lockB.isLocked();
|
|
1497
|
+
expect(resultA).toBe(false);
|
|
1498
|
+
expect(resultB).toBe(true);
|
|
1499
|
+
});
|
|
1500
|
+
test("method: isExpired", async () => {
|
|
1501
|
+
const key = "a";
|
|
1502
|
+
const owner = "b";
|
|
1503
|
+
const lockA = lockProviderA.create(key, { owner });
|
|
1504
|
+
const lockB = lockProviderB.create(key, { owner });
|
|
1505
|
+
await lockA.acquire();
|
|
1506
|
+
await lockB.acquire();
|
|
1507
|
+
await lockA.release();
|
|
1508
|
+
const resultA = await lockA.isExpired();
|
|
1509
|
+
const resultB = await lockB.isExpired();
|
|
1510
|
+
expect(resultA).toBe(true);
|
|
1511
|
+
expect(resultB).toBe(false);
|
|
1512
|
+
});
|
|
1513
|
+
test("method: isLocked", async () => {
|
|
1514
|
+
const key = "a";
|
|
1515
|
+
const owner = "b";
|
|
1516
|
+
const lockA = lockProviderA.create(key, { owner });
|
|
1517
|
+
const lockB = lockProviderB.create(key, { owner });
|
|
1518
|
+
await lockA.acquire();
|
|
1519
|
+
await lockB.acquire();
|
|
1520
|
+
await lockA.release();
|
|
1521
|
+
const resultA = await lockA.isLocked();
|
|
1522
|
+
const resultB = await lockB.isLocked();
|
|
1523
|
+
expect(resultA).toBe(false);
|
|
1524
|
+
expect(resultB).toBe(true);
|
|
1525
|
+
});
|
|
1526
|
+
test("method: refresh", async () => {
|
|
1527
|
+
const key = "a";
|
|
1528
|
+
const owner = "b";
|
|
1529
|
+
const ttl = TTL;
|
|
1530
|
+
const lockA = lockProviderA.create(key, {
|
|
1531
|
+
owner,
|
|
1532
|
+
ttl,
|
|
1533
|
+
});
|
|
1534
|
+
const lockB = lockProviderB.create(key, {
|
|
1535
|
+
owner,
|
|
1536
|
+
ttl,
|
|
1537
|
+
});
|
|
1538
|
+
await Promise.all([lockA.acquire(), lockB.acquire()]);
|
|
1539
|
+
await delay(ttl.divide(2));
|
|
1540
|
+
await lockA.refresh();
|
|
1541
|
+
await delay(ttl.divide(2));
|
|
1542
|
+
const resultA = await lockA.isExpired();
|
|
1543
|
+
const resultB = await lockB.isExpired();
|
|
1544
|
+
expect(resultA).toBe(false);
|
|
1545
|
+
expect(resultB).toBe(true);
|
|
1546
|
+
});
|
|
1547
|
+
test("method: refreshOrFail", async () => {
|
|
1548
|
+
const key = "a";
|
|
1549
|
+
const owner = "b";
|
|
1550
|
+
const ttl = TTL;
|
|
1551
|
+
const lockA = lockProviderA.create(key, {
|
|
1552
|
+
owner,
|
|
1553
|
+
ttl,
|
|
1554
|
+
});
|
|
1555
|
+
const lockB = lockProviderB.create(key, {
|
|
1556
|
+
owner,
|
|
1557
|
+
ttl,
|
|
1558
|
+
});
|
|
1559
|
+
await Promise.all([lockA.acquire(), lockB.acquire()]);
|
|
1560
|
+
await delay(ttl.divide(2));
|
|
1561
|
+
await lockA.refreshOrFail();
|
|
1562
|
+
await delay(ttl.divide(2));
|
|
1563
|
+
const resultA = await lockA.isExpired();
|
|
1564
|
+
const resultB = await lockB.isExpired();
|
|
1565
|
+
expect(resultA).toBe(false);
|
|
1566
|
+
expect(resultB).toBe(true);
|
|
1567
|
+
});
|
|
1568
|
+
describe("class: Lock", () => {
|
|
1569
|
+
test("method: addListener / dispatch", async () => {
|
|
1570
|
+
let result_a = null;
|
|
1571
|
+
const key = "a";
|
|
1572
|
+
const lockA = lockProviderA.create(key);
|
|
1573
|
+
await lockA.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1574
|
+
result_a = event;
|
|
1575
|
+
});
|
|
1576
|
+
let result_b = null;
|
|
1577
|
+
const lockB = lockProviderB.create(key);
|
|
1578
|
+
await lockB.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1579
|
+
result_b = event;
|
|
1580
|
+
});
|
|
1581
|
+
await lockA.acquire();
|
|
1582
|
+
await delay(TTL);
|
|
1583
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1584
|
+
expect(result_b).toBeNull();
|
|
1585
|
+
});
|
|
1586
|
+
test("method: addListenerMany / dispatch", async () => {
|
|
1587
|
+
let result_a = null;
|
|
1588
|
+
const key = "a";
|
|
1589
|
+
const lockA = lockProviderA.create(key);
|
|
1590
|
+
await lockA.addListenerMany([KeyAcquiredLockEvent], (event) => {
|
|
1591
|
+
result_a = event;
|
|
1592
|
+
});
|
|
1593
|
+
let result_b = null;
|
|
1594
|
+
const lockB = lockProviderB.create(key);
|
|
1595
|
+
await lockB.addListenerMany([KeyAcquiredLockEvent], (event) => {
|
|
1596
|
+
result_b = event;
|
|
1597
|
+
});
|
|
1598
|
+
await lockA.acquire();
|
|
1599
|
+
await delay(TTL);
|
|
1600
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1601
|
+
expect(result_b).toBeNull();
|
|
1602
|
+
});
|
|
1603
|
+
test("method: removeListener / addListener / dispatch", async () => {
|
|
1604
|
+
let result_a = null;
|
|
1605
|
+
const key = "a";
|
|
1606
|
+
const lockA = lockProviderA.create(key);
|
|
1607
|
+
await lockA.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1608
|
+
result_a = event;
|
|
1609
|
+
});
|
|
1610
|
+
let result_b = null;
|
|
1611
|
+
const listenerB = (event) => {
|
|
1612
|
+
result_b = event;
|
|
1613
|
+
};
|
|
1614
|
+
const lockB = lockProviderB.create(key);
|
|
1615
|
+
await lockB.addListener(KeyAcquiredLockEvent, listenerB);
|
|
1616
|
+
await lockB.removeListener(KeyAcquiredLockEvent, listenerB);
|
|
1617
|
+
await lockA.acquire();
|
|
1618
|
+
await lockB.acquire();
|
|
1619
|
+
await delay(TTL);
|
|
1620
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1621
|
+
expect(result_b).toBeNull();
|
|
1622
|
+
});
|
|
1623
|
+
test("method: removeListenerMany / addListener / dispatch", async () => {
|
|
1624
|
+
let result_a = null;
|
|
1625
|
+
const key = "a";
|
|
1626
|
+
const lockA = lockProviderA.create(key);
|
|
1627
|
+
await lockA.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1628
|
+
result_a = event;
|
|
1629
|
+
});
|
|
1630
|
+
let result_b = null;
|
|
1631
|
+
const listenerB = (event) => {
|
|
1632
|
+
result_b = event;
|
|
1633
|
+
};
|
|
1634
|
+
const lockB = lockProviderB.create(key);
|
|
1635
|
+
await lockB.addListener(KeyAcquiredLockEvent, listenerB);
|
|
1636
|
+
await lockB.removeListenerMany([KeyAcquiredLockEvent], listenerB);
|
|
1637
|
+
await lockA.acquire();
|
|
1638
|
+
await lockB.acquire();
|
|
1639
|
+
await delay(TTL);
|
|
1640
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1641
|
+
expect(result_b).toBeNull();
|
|
1642
|
+
});
|
|
1643
|
+
test("method: subscribe / dispatch", async () => {
|
|
1644
|
+
let result_a = null;
|
|
1645
|
+
const key = "a";
|
|
1646
|
+
const lockA = lockProviderA.create(key);
|
|
1647
|
+
await lockA.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
1648
|
+
result_a = event;
|
|
1649
|
+
});
|
|
1650
|
+
let result_b = null;
|
|
1651
|
+
const listenerB = (event) => {
|
|
1652
|
+
result_b = event;
|
|
1653
|
+
};
|
|
1654
|
+
const lockB = lockProviderB.create(key);
|
|
1655
|
+
const unsubscribe = await lockB.subscribe(KeyAcquiredLockEvent, listenerB);
|
|
1656
|
+
await unsubscribe();
|
|
1657
|
+
await lockA.acquire();
|
|
1658
|
+
await lockB.acquire();
|
|
1659
|
+
await delay(TTL);
|
|
1660
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1661
|
+
expect(result_b).toBeNull();
|
|
1662
|
+
});
|
|
1663
|
+
test("method: subscribeMany / dispatch", async () => {
|
|
1664
|
+
let result_a = null;
|
|
1665
|
+
const key = "a";
|
|
1666
|
+
const lockA = lockProviderA.create(key);
|
|
1667
|
+
await lockA.subscribeMany([KeyAcquiredLockEvent], (event) => {
|
|
1668
|
+
result_a = event;
|
|
1669
|
+
});
|
|
1670
|
+
let result_b = null;
|
|
1671
|
+
const listenerB = (event) => {
|
|
1672
|
+
result_b = event;
|
|
1673
|
+
};
|
|
1674
|
+
const lockB = lockProviderB.create(key);
|
|
1675
|
+
const unsubscribe = await lockB.subscribeMany([KeyAcquiredLockEvent], listenerB);
|
|
1676
|
+
await unsubscribe();
|
|
1677
|
+
await lockA.acquire();
|
|
1678
|
+
await lockB.acquire();
|
|
1679
|
+
await delay(TTL);
|
|
1680
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1681
|
+
expect(result_b).toBeNull();
|
|
1682
|
+
});
|
|
1683
|
+
});
|
|
1684
|
+
describe("class: LockProvider", () => {
|
|
1685
|
+
test("method: addListener / dispatch", async () => {
|
|
1686
|
+
let result_a = null;
|
|
1687
|
+
const key = "a";
|
|
1688
|
+
const lockA = lockProviderA.create(key);
|
|
1689
|
+
await lockProviderA.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1690
|
+
result_a = event;
|
|
1691
|
+
});
|
|
1692
|
+
let result_b = null;
|
|
1693
|
+
await lockProviderB.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1694
|
+
result_b = event;
|
|
1695
|
+
});
|
|
1696
|
+
await lockA.acquire();
|
|
1697
|
+
await delay(TTL);
|
|
1698
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1699
|
+
expect(result_b).toBeNull();
|
|
1700
|
+
});
|
|
1701
|
+
test("method: addListenerMany / dispatch", async () => {
|
|
1702
|
+
let result_a = null;
|
|
1703
|
+
const key = "a";
|
|
1704
|
+
const lockA = lockProviderA.create(key);
|
|
1705
|
+
await lockProviderA.addListenerMany([KeyAcquiredLockEvent], (event) => {
|
|
1706
|
+
result_a = event;
|
|
1707
|
+
});
|
|
1708
|
+
let result_b = null;
|
|
1709
|
+
await lockProviderB.addListenerMany([KeyAcquiredLockEvent], (event) => {
|
|
1710
|
+
result_b = event;
|
|
1711
|
+
});
|
|
1712
|
+
await lockA.acquire();
|
|
1713
|
+
await delay(TTL);
|
|
1714
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1715
|
+
expect(result_b).toBeNull();
|
|
1716
|
+
});
|
|
1717
|
+
test("method: removeListener / addListener / dispatch", async () => {
|
|
1718
|
+
let result_a = null;
|
|
1719
|
+
const key = "a";
|
|
1720
|
+
const lockA = lockProviderA.create(key);
|
|
1721
|
+
await lockProviderA.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1722
|
+
result_a = event;
|
|
1723
|
+
});
|
|
1724
|
+
let result_b = null;
|
|
1725
|
+
const listenerB = (event) => {
|
|
1726
|
+
result_b = event;
|
|
1727
|
+
};
|
|
1728
|
+
const lockB = lockProviderB.create(key);
|
|
1729
|
+
await lockProviderB.addListener(KeyAcquiredLockEvent, listenerB);
|
|
1730
|
+
await lockProviderB.removeListener(KeyAcquiredLockEvent, listenerB);
|
|
1731
|
+
await lockA.acquire();
|
|
1732
|
+
await lockB.acquire();
|
|
1733
|
+
await delay(TTL);
|
|
1734
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1735
|
+
expect(result_b).toBeNull();
|
|
1736
|
+
});
|
|
1737
|
+
test("method: removeListenerMany / addListener / dispatch", async () => {
|
|
1738
|
+
let result_a = null;
|
|
1739
|
+
const key = "a";
|
|
1740
|
+
const lockA = lockProviderA.create(key);
|
|
1741
|
+
await lockProviderA.addListener(KeyAcquiredLockEvent, (event) => {
|
|
1742
|
+
result_a = event;
|
|
1743
|
+
});
|
|
1744
|
+
let result_b = null;
|
|
1745
|
+
const listenerB = (event) => {
|
|
1746
|
+
result_b = event;
|
|
1747
|
+
};
|
|
1748
|
+
const lockB = lockProviderB.create(key);
|
|
1749
|
+
await lockProviderB.addListener(KeyAcquiredLockEvent, listenerB);
|
|
1750
|
+
await lockProviderB.removeListenerMany([KeyAcquiredLockEvent], listenerB);
|
|
1751
|
+
await lockA.acquire();
|
|
1752
|
+
await lockB.acquire();
|
|
1753
|
+
await delay(TTL);
|
|
1754
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1755
|
+
expect(result_b).toBeNull();
|
|
1756
|
+
});
|
|
1757
|
+
test("method: subscribe / dispatch", async () => {
|
|
1758
|
+
let result_a = null;
|
|
1759
|
+
const key = "a";
|
|
1760
|
+
const lockA = lockProviderA.create(key);
|
|
1761
|
+
await lockProviderA.subscribe(KeyAcquiredLockEvent, (event) => {
|
|
1762
|
+
result_a = event;
|
|
1763
|
+
});
|
|
1764
|
+
let result_b = null;
|
|
1765
|
+
const listenerB = (event) => {
|
|
1766
|
+
result_b = event;
|
|
1767
|
+
};
|
|
1768
|
+
const lockB = lockProviderB.create(key);
|
|
1769
|
+
const unsubscribe = await lockProviderB.subscribe(KeyAcquiredLockEvent, listenerB);
|
|
1770
|
+
await unsubscribe();
|
|
1771
|
+
await lockA.acquire();
|
|
1772
|
+
await lockB.acquire();
|
|
1773
|
+
await delay(TTL);
|
|
1774
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1775
|
+
expect(result_b).toBeNull();
|
|
1776
|
+
});
|
|
1777
|
+
test("method: subscribeMany / dispatch", async () => {
|
|
1778
|
+
let result_a = null;
|
|
1779
|
+
const key = "a";
|
|
1780
|
+
const lockA = lockProviderA.create(key);
|
|
1781
|
+
await lockProviderA.subscribeMany([KeyAcquiredLockEvent], (event) => {
|
|
1782
|
+
result_a = event;
|
|
1783
|
+
});
|
|
1784
|
+
let result_b = null;
|
|
1785
|
+
const listenerB = (event) => {
|
|
1786
|
+
result_b = event;
|
|
1787
|
+
};
|
|
1788
|
+
const lockB = lockProviderB.create(key);
|
|
1789
|
+
const unsubscribe = await lockProviderB.subscribeMany([KeyAcquiredLockEvent], listenerB);
|
|
1790
|
+
await unsubscribe();
|
|
1791
|
+
await lockA.acquire();
|
|
1792
|
+
await lockB.acquire();
|
|
1793
|
+
await delay(TTL);
|
|
1794
|
+
expect(result_a).toBeInstanceOf(KeyAcquiredLockEvent);
|
|
1795
|
+
expect(result_b).toBeNull();
|
|
1796
|
+
});
|
|
1797
|
+
});
|
|
1798
|
+
});
|
|
1799
|
+
describe("Serde tests:", () => {
|
|
1800
|
+
test("Should preserve state", async () => {
|
|
1801
|
+
const key = "a";
|
|
1802
|
+
const owner = "b";
|
|
1803
|
+
const lock = lockProviderB.create(key, {
|
|
1804
|
+
owner,
|
|
1805
|
+
});
|
|
1806
|
+
await lock.acquire();
|
|
1807
|
+
const deserializedLock = serde.deserialize(serde.serialize(lock));
|
|
1808
|
+
expect(await deserializedLock.isLocked()).toBe(true);
|
|
1809
|
+
expect(await deserializedLock.isExpired()).toBe(false);
|
|
1810
|
+
});
|
|
1811
|
+
test("Should preserve owner", async () => {
|
|
1812
|
+
const key = "a";
|
|
1813
|
+
const owner = "b";
|
|
1814
|
+
const lock = lockProviderB.create(key, {
|
|
1815
|
+
owner,
|
|
1816
|
+
});
|
|
1817
|
+
const deserializedLock = serde.deserialize(serde.serialize(lock));
|
|
1818
|
+
expect(await deserializedLock.getOwner()).toBe(owner);
|
|
1819
|
+
});
|
|
1820
|
+
test("Should preserve ttl", async () => {
|
|
1821
|
+
const key = "a";
|
|
1822
|
+
const owner = "b";
|
|
1823
|
+
const ttl = TTL.multiply(2);
|
|
1824
|
+
const lock = lockProviderB.create(key, {
|
|
1825
|
+
owner,
|
|
1826
|
+
ttl,
|
|
1827
|
+
});
|
|
1828
|
+
await lock.acquire();
|
|
1829
|
+
const deserializedLock = serde.deserialize(serde.serialize(lock));
|
|
1830
|
+
const delayTime = TTL;
|
|
1831
|
+
await delay(delayTime);
|
|
1832
|
+
expect(await deserializedLock.isLocked()).toBe(true);
|
|
1833
|
+
await delay(delayTime);
|
|
1834
|
+
expect(await deserializedLock.isLocked()).toBe(false);
|
|
1835
|
+
});
|
|
1836
|
+
});
|
|
1837
|
+
}
|
|
1838
|
+
//# sourceMappingURL=lock-provider.test-suite.js.map
|