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