@daiso-tech/core 0.38.0 → 0.40.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 (152) hide show
  1. package/README.md +5 -1
  2. package/dist/async/backof-policies/constant-backoff-policy/constant-backoff-policy.d.ts +1 -1
  3. package/dist/async/backof-policies/exponential-backoff-policy/exponential-backoff-policy.d.ts +2 -2
  4. package/dist/async/backof-policies/linear-backoff-policy/linear-backoff-policy.d.ts +1 -1
  5. package/dist/async/backof-policies/polynomial-backoff-policy/polynomial-backoff-policy.d.ts +2 -2
  6. package/dist/async/middlewares/bulkhead/bulkhead.middleware.d.ts +2 -2
  7. package/dist/async/middlewares/hedging/sequential-hedging.middleware.js +2 -2
  8. package/dist/async/middlewares/hedging/sequential-hedging.middleware.js.map +1 -1
  9. package/dist/async/middlewares/retry/retry.middleware.js +2 -2
  10. package/dist/async/middlewares/retry/retry.middleware.js.map +1 -1
  11. package/dist/async/middlewares/retry/retry.types.d.ts +1 -1
  12. package/dist/cache/contracts/cache-adapter.contract.d.ts +9 -9
  13. package/dist/cache/contracts/cache.contract.d.ts +7 -7
  14. package/dist/cache/contracts/cache.errors.d.ts +3 -26
  15. package/dist/cache/contracts/cache.errors.js +0 -47
  16. package/dist/cache/contracts/cache.errors.js.map +1 -1
  17. package/dist/cache/contracts/database-cache-adapter.contract.d.ts +10 -10
  18. package/dist/cache/implementations/adapters/kysely-cache-adapter/kysely-cache-adapter.d.ts +6 -5
  19. package/dist/cache/implementations/adapters/kysely-cache-adapter/kysely-cache-adapter.js +17 -13
  20. package/dist/cache/implementations/adapters/kysely-cache-adapter/kysely-cache-adapter.js.map +1 -1
  21. package/dist/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.d.ts +15 -3
  22. package/dist/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.js +25 -9
  23. package/dist/cache/implementations/adapters/mongodb-cache-adapter/mongodb-cache-adapter.js.map +1 -1
  24. package/dist/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.d.ts +9 -9
  25. package/dist/cache/implementations/adapters/no-op-cache-adapter/no-op-cache-adapter.js.map +1 -1
  26. package/dist/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.d.ts +1 -1
  27. package/dist/cache/implementations/adapters/redis-cache-adapter/redis-cache-adapter.js +1 -1
  28. package/dist/cache/implementations/adapters/redis-cache-adapter/utilities.js +2 -1
  29. package/dist/cache/implementations/adapters/redis-cache-adapter/utilities.js.map +1 -1
  30. package/dist/cache/implementations/derivables/cache/cache.d.ts +2 -2
  31. package/dist/cache/implementations/derivables/cache/cache.js +1 -1
  32. package/dist/cache/implementations/derivables/cache/cache.js.map +1 -1
  33. package/dist/collection/contracts/async-collection.contract.d.ts +0 -1
  34. package/dist/collection/contracts/async-collection.contract.js +3 -1
  35. package/dist/collection/contracts/async-collection.contract.js.map +1 -1
  36. package/dist/collection/contracts/collection.contract.d.ts +0 -1
  37. package/dist/collection/contracts/collection.contract.js +3 -1
  38. package/dist/collection/contracts/collection.contract.js.map +1 -1
  39. package/dist/collection/contracts/collection.errors.d.ts +1 -26
  40. package/dist/collection/contracts/collection.errors.js +0 -55
  41. package/dist/collection/contracts/collection.errors.js.map +1 -1
  42. package/dist/collection/implementations/async-iterable-collection/_shared/async-split-iterable.js +1 -1
  43. package/dist/collection/implementations/async-iterable-collection/_shared/async-split-iterable.js.map +1 -1
  44. package/dist/collection/implementations/async-iterable-collection/_shared/async-zip-iterable.js +1 -1
  45. package/dist/collection/implementations/async-iterable-collection/_shared/async-zip-iterable.js.map +1 -1
  46. package/dist/collection/implementations/async-iterable-collection/async-iterable-collection.js +9 -6
  47. package/dist/collection/implementations/async-iterable-collection/async-iterable-collection.js.map +1 -1
  48. package/dist/collection/implementations/iterable-collection/_shared/split-iterable.js +1 -1
  49. package/dist/collection/implementations/iterable-collection/_shared/split-iterable.js.map +1 -1
  50. package/dist/collection/implementations/iterable-collection/_shared/zip-iterable.js +1 -1
  51. package/dist/collection/implementations/iterable-collection/_shared/zip-iterable.js.map +1 -1
  52. package/dist/collection/implementations/iterable-collection/iterable-collection.js +9 -6
  53. package/dist/collection/implementations/iterable-collection/iterable-collection.js.map +1 -1
  54. package/dist/collection/implementations/list-collection/list-collection.js +12 -9
  55. package/dist/collection/implementations/list-collection/list-collection.js.map +1 -1
  56. package/dist/event-bus/contracts/_module-exports.d.ts +0 -1
  57. package/dist/event-bus/contracts/_module-exports.js +0 -1
  58. package/dist/event-bus/contracts/_module-exports.js.map +1 -1
  59. package/dist/event-bus/contracts/event-bus-adapter.contract.d.ts +3 -3
  60. package/dist/event-bus/implementations/adapters/no-op-event-bus-adapter/no-op-event-bus-adapter.d.ts +3 -3
  61. package/dist/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.d.ts +2 -2
  62. package/dist/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.js +3 -2
  63. package/dist/event-bus/implementations/adapters/redis-pub-sub-event-bus-adapter/redis-pub-sub-event-bus-adapter.js.map +1 -1
  64. package/dist/event-bus/implementations/derivables/event-bus/event-bus.d.ts +2 -1
  65. package/dist/event-bus/implementations/derivables/event-bus/event-bus.js +26 -26
  66. package/dist/event-bus/implementations/derivables/event-bus/event-bus.js.map +1 -1
  67. package/dist/event-bus/implementations/derivables/event-bus/listener-store.d.ts +11 -4
  68. package/dist/event-bus/implementations/derivables/event-bus/listener-store.js +17 -12
  69. package/dist/event-bus/implementations/derivables/event-bus/listener-store.js.map +1 -1
  70. package/dist/event-bus/implementations/test-utilities/event-bus-adapter.test-suite.js +17 -20
  71. package/dist/event-bus/implementations/test-utilities/event-bus-adapter.test-suite.js.map +1 -1
  72. package/dist/event-bus/implementations/test-utilities/event-bus.test-suite.js +159 -752
  73. package/dist/event-bus/implementations/test-utilities/event-bus.test-suite.js.map +1 -1
  74. package/dist/lock/contracts/database-lock-adapter.contract.d.ts +56 -16
  75. package/dist/lock/contracts/lock-adapter.contract.d.ts +32 -9
  76. package/dist/lock/contracts/lock-adapter.contract.js +10 -1
  77. package/dist/lock/contracts/lock-adapter.contract.js.map +1 -1
  78. package/dist/lock/contracts/lock.contract.d.ts +30 -25
  79. package/dist/lock/contracts/lock.errors.d.ts +11 -28
  80. package/dist/lock/contracts/lock.errors.js +10 -74
  81. package/dist/lock/contracts/lock.errors.js.map +1 -1
  82. package/dist/lock/contracts/lock.events.d.ts +15 -3
  83. package/dist/lock/contracts/lock.events.js +2 -1
  84. package/dist/lock/contracts/lock.events.js.map +1 -1
  85. package/dist/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.d.ts +40 -10
  86. package/dist/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.js +135 -37
  87. package/dist/lock/implementations/adapters/kysely-lock-adapter/kysely-lock-adapter.js.map +1 -1
  88. package/dist/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.d.ts +20 -7
  89. package/dist/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.js +59 -35
  90. package/dist/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.js.map +1 -1
  91. package/dist/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.d.ts +23 -12
  92. package/dist/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.js +152 -87
  93. package/dist/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.js.map +1 -1
  94. package/dist/lock/implementations/adapters/no-op-lock-adapter/no-op-lock-adapter.d.ts +5 -5
  95. package/dist/lock/implementations/adapters/no-op-lock-adapter/no-op-lock-adapter.js +3 -2
  96. package/dist/lock/implementations/adapters/no-op-lock-adapter/no-op-lock-adapter.js.map +1 -1
  97. package/dist/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.d.ts +6 -6
  98. package/dist/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.js +46 -24
  99. package/dist/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.js.map +1 -1
  100. package/dist/lock/implementations/derivables/lock-provider/database-lock-adapter.d.ts +4 -4
  101. package/dist/lock/implementations/derivables/lock-provider/database-lock-adapter.js +45 -12
  102. package/dist/lock/implementations/derivables/lock-provider/database-lock-adapter.js.map +1 -1
  103. package/dist/lock/implementations/derivables/lock-provider/is-database-lock-adapter.js +7 -5
  104. package/dist/lock/implementations/derivables/lock-provider/is-database-lock-adapter.js.map +1 -1
  105. package/dist/lock/implementations/derivables/lock-provider/lock-provider.d.ts +3 -3
  106. package/dist/lock/implementations/derivables/lock-provider/lock-provider.js +2 -3
  107. package/dist/lock/implementations/derivables/lock-provider/lock-provider.js.map +1 -1
  108. package/dist/lock/implementations/derivables/lock-provider/lock-serde-transformer.d.ts +1 -1
  109. package/dist/lock/implementations/derivables/lock-provider/lock-serde-transformer.js +4 -3
  110. package/dist/lock/implementations/derivables/lock-provider/lock-serde-transformer.js.map +1 -1
  111. package/dist/lock/implementations/derivables/lock-provider/lock-state.d.ts +8 -11
  112. package/dist/lock/implementations/derivables/lock-provider/lock-state.js +9 -26
  113. package/dist/lock/implementations/derivables/lock-provider/lock-state.js.map +1 -1
  114. package/dist/lock/implementations/derivables/lock-provider/lock.d.ts +14 -16
  115. package/dist/lock/implementations/derivables/lock-provider/lock.js +106 -63
  116. package/dist/lock/implementations/derivables/lock-provider/lock.js.map +1 -1
  117. package/dist/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.d.ts +2 -2
  118. package/dist/lock/implementations/derivables/lock-provider-factory/lock-provider-factory.js.map +1 -1
  119. package/dist/lock/implementations/test-utilities/database-lock-adapter.test-suite.js +184 -166
  120. package/dist/lock/implementations/test-utilities/database-lock-adapter.test-suite.js.map +1 -1
  121. package/dist/lock/implementations/test-utilities/lock-adapter.test-suite.js +240 -41
  122. package/dist/lock/implementations/test-utilities/lock-adapter.test-suite.js.map +1 -1
  123. package/dist/lock/implementations/test-utilities/lock-provider.test-suite.js +2704 -1514
  124. package/dist/lock/implementations/test-utilities/lock-provider.test-suite.js.map +1 -1
  125. package/dist/serde/implementations/derivables/serde.d.ts +22 -22
  126. package/dist/utilities/classes/kysely-table-name-transformer-plugin/kysely-table-name-transformer-plugin.js +2 -1
  127. package/dist/utilities/classes/kysely-table-name-transformer-plugin/kysely-table-name-transformer-plugin.js.map +1 -1
  128. package/dist/utilities/classes/namespace/namespace.d.ts +3 -3
  129. package/dist/utilities/classes/namespace/namespace.js +2 -2
  130. package/dist/utilities/classes/namespace/namespace.js.map +1 -1
  131. package/dist/utilities/classes/time-span/time-span.d.ts +10 -2
  132. package/dist/utilities/classes/time-span/time-span.js +10 -2
  133. package/dist/utilities/classes/time-span/time-span.js.map +1 -1
  134. package/dist/utilities/contracts/deinitizable.contract.d.ts +1 -1
  135. package/dist/utilities/contracts/initizable.contract.d.ts +1 -1
  136. package/dist/utilities/contracts/prunable.contract.d.ts +1 -1
  137. package/dist/utilities/errors.d.ts +8 -0
  138. package/dist/utilities/errors.js +11 -0
  139. package/dist/utilities/errors.js.map +1 -1
  140. package/dist/utilities/functions/_module.d.ts +1 -0
  141. package/dist/utilities/functions/_module.js +1 -0
  142. package/dist/utilities/functions/_module.js.map +1 -1
  143. package/dist/utilities/functions/is-class.d.ts +4 -0
  144. package/dist/utilities/functions/is-class.js +4 -0
  145. package/dist/utilities/functions/is-class.js.map +1 -1
  146. package/dist/utilities/functions/is-positive-nbr.d.ts +8 -0
  147. package/dist/utilities/functions/is-positive-nbr.js +19 -0
  148. package/dist/utilities/functions/is-positive-nbr.js.map +1 -0
  149. package/package.json +1 -1
  150. package/dist/event-bus/contracts/event-bus.errors.d.ts +0 -40
  151. package/dist/event-bus/contracts/event-bus.errors.js +0 -62
  152. package/dist/event-bus/contracts/event-bus.errors.js.map +0 -1
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * @module Lock
3
3
  */
4
- import {} from "vitest";
5
- import { KeyAlreadyAcquiredLockError, UnownedRefreshLockError, UnownedReleaseLockError, LOCK_EVENTS, } from "../../../lock/contracts/_module-exports.js";
4
+ import { vi, } from "vitest";
5
+ import { KeyAlreadyAcquiredLockError, UnownedRefreshLockError, UnownedReleaseLockError, LOCK_EVENTS, UnrefreshableKeyLockError, } from "../../../lock/contracts/_module-exports.js";
6
6
  import { RESULT, resultSuccess, } from "../../../utilities/_module-exports.js";
7
7
  import { TimeSpan } from "../../../utilities/_module-exports.js";
8
- import { LazyPromise } from "../../../async/_module-exports.js";
9
8
  import { NoOpSerdeAdapter } from "../../../serde/implementations/adapters/_module-exports.js";
10
9
  import { Serde } from "../../../serde/implementations/derivables/_module-exports.js";
10
+ import { LazyPromise } from "../../../async/_module-exports.js";
11
11
  /**
12
12
  * The `lockProviderTestSuite` function simplifies the process of testing your custom implementation of {@link ILock | `ILock`} with `vitest`.
13
13
  *
@@ -50,1882 +50,3072 @@ export function lockProviderTestSuite(settings) {
50
50
  beforeEach(async () => {
51
51
  lockProvider = await createLockProvider();
52
52
  });
53
- const TTL = TimeSpan.fromMilliseconds(50);
54
- const DELAY_TIME = TimeSpan.fromMilliseconds(50);
53
+ async function delay(time) {
54
+ await LazyPromise.delay(time.addMilliseconds(10));
55
+ }
56
+ const RETURN_VALUE = "RETURN_VALUE";
55
57
  describe("Api tests:", () => {
56
58
  describe("method: run", () => {
57
- test("Should return string when lock is available", async () => {
59
+ test("Should call acquire method", async () => {
58
60
  const key = "a";
59
61
  const ttl = null;
60
62
  const lock = lockProvider.create(key, {
61
63
  ttl,
62
64
  });
63
- const result = await lock.run(async () => {
64
- await LazyPromise.delay(DELAY_TIME);
65
- return "a";
65
+ const acquireSpy = vi.spyOn(lock, "acquire");
66
+ await lock.run(() => {
67
+ return Promise.resolve(RETURN_VALUE);
66
68
  });
67
- expect(result).toEqual(resultSuccess("a"));
69
+ expect(acquireSpy).toHaveBeenCalledTimes(1);
68
70
  });
69
- test("Should return null when lock is already acquired", async () => {
71
+ test("Should call acquire before release method", async () => {
70
72
  const key = "a";
71
73
  const ttl = null;
72
74
  const lock = lockProvider.create(key, {
73
75
  ttl,
74
76
  });
75
- await lock.acquire();
76
- const result = await lock.run(async () => {
77
- await LazyPromise.delay(DELAY_TIME);
78
- return "a";
77
+ const acquireSpy = vi.spyOn(lock, "acquire");
78
+ const releaseSpy = vi.spyOn(lock, "release");
79
+ await lock.run(() => {
80
+ return Promise.resolve(RETURN_VALUE);
79
81
  });
80
- expect(result.type).toBe(RESULT.FAILURE);
81
- expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
82
+ expect(acquireSpy).toHaveBeenCalledBefore(releaseSpy);
82
83
  });
83
- test("Should work with LazyPromise", async () => {
84
+ test("Should call release method", async () => {
84
85
  const key = "a";
85
86
  const ttl = null;
86
87
  const lock = lockProvider.create(key, {
87
88
  ttl,
88
89
  });
89
- const result = await lock.run(new LazyPromise(async () => {
90
- await LazyPromise.delay(DELAY_TIME);
91
- return "a";
92
- }));
93
- expect(result).toEqual(resultSuccess("a"));
90
+ const releaseSpy = vi.spyOn(lock, "release");
91
+ await lock.run(() => {
92
+ return Promise.resolve(RETURN_VALUE);
93
+ });
94
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
94
95
  });
95
- });
96
- describe("method: runOrFail", () => {
97
- test("Should return string when lock is available", async () => {
96
+ test("Should call release after acquire method", async () => {
98
97
  const key = "a";
99
98
  const ttl = null;
100
99
  const lock = lockProvider.create(key, {
101
100
  ttl,
102
101
  });
103
- const result = await lock.runOrFail(async () => {
104
- await LazyPromise.delay(DELAY_TIME);
105
- return "a";
102
+ const releaseSpy = vi.spyOn(lock, "release");
103
+ const acquireSpy = vi.spyOn(lock, "acquire");
104
+ await lock.run(() => {
105
+ return Promise.resolve(RETURN_VALUE);
106
106
  });
107
- expect(result).toBe("a");
107
+ expect(releaseSpy).toHaveBeenCalledAfter(acquireSpy);
108
108
  });
109
- test("Should throw KeyAlreadyAcquiredLockError when lock is already acquired", async () => {
109
+ test("Should call release when an error is thrown", async () => {
110
110
  const key = "a";
111
111
  const ttl = null;
112
112
  const lock = lockProvider.create(key, {
113
113
  ttl,
114
114
  });
115
- await lock.acquire();
116
- const result = lock.runOrFail(async () => {
117
- await LazyPromise.delay(DELAY_TIME);
118
- return "a";
119
- });
120
- await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
115
+ const releaseSpy = vi.spyOn(lock, "release");
116
+ try {
117
+ await lock.run(() => {
118
+ return Promise.reject(new Error());
119
+ });
120
+ }
121
+ catch {
122
+ /* EMPTY */
123
+ }
124
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
121
125
  });
122
- test("Should work with LazyPromise", async () => {
126
+ test("Should propagate thrown error", async () => {
123
127
  const key = "a";
124
128
  const ttl = null;
125
129
  const lock = lockProvider.create(key, {
126
130
  ttl,
127
131
  });
128
- const result = await lock.runOrFail(new LazyPromise(async () => {
129
- await LazyPromise.delay(DELAY_TIME);
130
- return "a";
131
- }));
132
- expect(result).toBe("a");
132
+ class CustomError extends Error {
133
+ }
134
+ const error = lock.run(() => {
135
+ return Promise.reject(new CustomError());
136
+ });
137
+ await expect(error).rejects.toBeInstanceOf(CustomError);
133
138
  });
134
- });
135
- describe("method: runBlocking", () => {
136
- test("Should return string when lock is available", async () => {
139
+ test("Should call handler function when key doesnt exists", async () => {
137
140
  const key = "a";
138
141
  const ttl = null;
139
- const lock = lockProvider.create(key, {
140
- ttl,
142
+ const handlerFn = vi.fn(() => {
143
+ return Promise.resolve(RETURN_VALUE);
141
144
  });
142
- const result = await lock.runBlocking(async () => {
143
- await LazyPromise.delay(DELAY_TIME);
144
- return "a";
145
- }, {
146
- time: TimeSpan.fromMilliseconds(5),
147
- interval: TimeSpan.fromMilliseconds(5),
145
+ await lockProvider
146
+ .create(key, {
147
+ ttl,
148
+ })
149
+ .run(handlerFn);
150
+ expect(handlerFn).toHaveBeenCalledTimes(1);
151
+ });
152
+ test("Should call handler function when key is expired", async () => {
153
+ const key = "a";
154
+ const ttl = TimeSpan.fromMilliseconds(50);
155
+ await lockProvider.create(key, { ttl }).acquire();
156
+ await delay(ttl);
157
+ const handlerFn = vi.fn(() => {
158
+ return Promise.resolve(RETURN_VALUE);
148
159
  });
149
- expect(result).toEqual(resultSuccess("a"));
160
+ await lockProvider.create(key, { ttl }).run(handlerFn);
161
+ expect(handlerFn).toHaveBeenCalledTimes(1);
150
162
  });
151
- test("Should return null when lock is already acquired", async () => {
163
+ test("Should not call handler function when key is unexpireable and acquired by same owner", async () => {
152
164
  const key = "a";
153
165
  const ttl = null;
166
+ const lock = lockProvider.create(key, { ttl });
167
+ await lock.acquire();
168
+ const handlerFn = vi.fn(() => {
169
+ return Promise.resolve(RETURN_VALUE);
170
+ });
171
+ await lock.run(handlerFn);
172
+ expect(handlerFn).toHaveBeenCalledTimes(0);
173
+ });
174
+ test("Should not call handler function when key is unexpired and acquired by same owner", async () => {
175
+ const key = "a";
176
+ const ttl = TimeSpan.fromMilliseconds(50);
154
177
  const lock = lockProvider.create(key, {
155
178
  ttl,
156
179
  });
157
180
  await lock.acquire();
158
- const result = await lock.runBlocking(async () => {
159
- await LazyPromise.delay(DELAY_TIME);
160
- return "a";
161
- }, {
162
- time: TimeSpan.fromMilliseconds(5),
163
- interval: TimeSpan.fromMilliseconds(5),
181
+ const handlerFn = vi.fn(() => {
182
+ return Promise.resolve(RETURN_VALUE);
164
183
  });
165
- expect(result.type).toBe(RESULT.FAILURE);
166
- expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
184
+ await lock.run(handlerFn);
185
+ expect(handlerFn).toHaveBeenCalledTimes(0);
167
186
  });
168
- test("Should work with LazyPromise", async () => {
187
+ test("Should not call handler function when key is unexpireable and acquired by different owner", async () => {
169
188
  const key = "a";
170
189
  const ttl = null;
171
- const lock = lockProvider.create(key, {
190
+ await lockProvider.create(key, { ttl }).acquire();
191
+ const handlerFn = vi.fn(() => {
192
+ return Promise.resolve(RETURN_VALUE);
193
+ });
194
+ await lockProvider.create(key, { ttl }).run(handlerFn);
195
+ expect(handlerFn).not.toHaveBeenCalled();
196
+ });
197
+ test("Should not call handler function when key is unexpired and acquired by different owner", async () => {
198
+ const key = "a";
199
+ const ttl = TimeSpan.fromMilliseconds(50);
200
+ await lockProvider.create(key, { ttl }).acquire();
201
+ const handlerFn = vi.fn(() => {
202
+ return Promise.resolve(RETURN_VALUE);
203
+ });
204
+ await lockProvider.create(key, { ttl }).run(handlerFn);
205
+ expect(handlerFn).not.toHaveBeenCalled();
206
+ });
207
+ test("Should return ResultSuccess<string> when key doesnt exists", async () => {
208
+ const key = "a";
209
+ const ttl = null;
210
+ const result = await lockProvider
211
+ .create(key, {
172
212
  ttl,
213
+ })
214
+ .run(() => {
215
+ return Promise.resolve(RETURN_VALUE);
173
216
  });
174
- const result = await lock.runBlocking(new LazyPromise(async () => {
175
- await LazyPromise.delay(DELAY_TIME);
176
- return "a";
177
- }), {
178
- time: TimeSpan.fromMilliseconds(5),
179
- interval: TimeSpan.fromMilliseconds(5),
217
+ expect(result).toEqual(resultSuccess(RETURN_VALUE));
218
+ });
219
+ test("Should return ResultSuccess<string> when key is expired", async () => {
220
+ const key = "a";
221
+ const ttl = TimeSpan.fromMilliseconds(50);
222
+ await lockProvider.create(key, { ttl }).acquire();
223
+ await delay(ttl);
224
+ const result = await lockProvider
225
+ .create(key, { ttl })
226
+ .run(() => {
227
+ return Promise.resolve(RETURN_VALUE);
180
228
  });
181
- expect(result).toEqual(resultSuccess("a"));
229
+ expect(result).toEqual(resultSuccess(RETURN_VALUE));
182
230
  });
183
- test("Should retry acquire the lock", async () => {
231
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpireable and acquired by same owner", async () => {
232
+ const key = "a";
233
+ const ttl = null;
234
+ const lock = lockProvider.create(key, { ttl });
235
+ await lock.acquire();
236
+ const result = await lock.run(() => {
237
+ return Promise.resolve(RETURN_VALUE);
238
+ });
239
+ expect(result.type).toBe(RESULT.FAILURE);
240
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
241
+ });
242
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpired and acquired by same owner", async () => {
184
243
  const key = "a";
185
244
  const ttl = TimeSpan.fromMilliseconds(50);
186
245
  const lock = lockProvider.create(key, {
187
246
  ttl,
188
247
  });
189
248
  await lock.acquire();
190
- let index = 0;
191
- await lockProvider.addListener(LOCK_EVENTS.NOT_AVAILABLE, (_event) => {
192
- index++;
249
+ const result = await lock.run(() => {
250
+ return Promise.resolve(RETURN_VALUE);
193
251
  });
194
- await lock.runBlocking(async () => {
195
- await LazyPromise.delay(DELAY_TIME);
196
- }, {
197
- time: TimeSpan.fromMilliseconds(55),
198
- interval: TimeSpan.fromMilliseconds(5),
252
+ expect(result.type).toBe(RESULT.FAILURE);
253
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
254
+ });
255
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpireable and acquired by different owner", async () => {
256
+ const key = "a";
257
+ const ttl = null;
258
+ await lockProvider.create(key, { ttl }).acquire();
259
+ const result = await lockProvider
260
+ .create(key, { ttl })
261
+ .run(() => {
262
+ return Promise.resolve(RETURN_VALUE);
199
263
  });
200
- expect(index).toBeGreaterThan(1);
264
+ expect(result.type).toBe(RESULT.FAILURE);
265
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
266
+ });
267
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpired and acquired by different owner", async () => {
268
+ const key = "a";
269
+ const ttl = TimeSpan.fromMilliseconds(50);
270
+ await lockProvider.create(key, { ttl }).acquire();
271
+ const result = await lockProvider
272
+ .create(key, { ttl })
273
+ .run(() => {
274
+ return Promise.resolve(RETURN_VALUE);
275
+ });
276
+ expect(result.type).toBe(RESULT.FAILURE);
277
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
201
278
  });
202
279
  });
203
- describe("method: runBlockingOrFail", () => {
204
- test("Should return string when lock is available", async () => {
280
+ describe("method: runOrFail", () => {
281
+ test("Should call acquireOrFail method", async () => {
205
282
  const key = "a";
206
283
  const ttl = null;
207
284
  const lock = lockProvider.create(key, {
208
285
  ttl,
209
286
  });
210
- const result = await lock.runBlockingOrFail(async () => {
211
- await LazyPromise.delay(DELAY_TIME);
212
- return "a";
213
- }, {
214
- time: TimeSpan.fromMilliseconds(5),
215
- interval: TimeSpan.fromMilliseconds(5),
287
+ const acquireSpy = vi.spyOn(lock, "acquireOrFail");
288
+ await lock.runOrFail(() => {
289
+ return Promise.resolve(RETURN_VALUE);
216
290
  });
217
- expect(result).toBe("a");
291
+ expect(acquireSpy).toHaveBeenCalledTimes(1);
218
292
  });
219
- test("Should throw KeyAlreadyAcquiredLockError when lock is already acquired", async () => {
293
+ test("Should call acquireOrFail before release method", async () => {
220
294
  const key = "a";
221
295
  const ttl = null;
222
296
  const lock = lockProvider.create(key, {
223
297
  ttl,
224
298
  });
225
- await lock.acquire();
226
- const promise = lock.runBlockingOrFail(async () => {
227
- await LazyPromise.delay(DELAY_TIME);
228
- return "a";
229
- }, {
230
- time: TimeSpan.fromMilliseconds(5),
231
- interval: TimeSpan.fromMilliseconds(5),
299
+ const acquireSpy = vi.spyOn(lock, "acquireOrFail");
300
+ const releaseSpy = vi.spyOn(lock, "release");
301
+ await lock.runOrFail(() => {
302
+ return Promise.resolve(RETURN_VALUE);
232
303
  });
233
- await expect(promise).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
304
+ expect(acquireSpy).toHaveBeenCalledBefore(releaseSpy);
234
305
  });
235
- test("Should work with LazyPromise", async () => {
306
+ test("Should call release method", async () => {
236
307
  const key = "a";
237
308
  const ttl = null;
238
309
  const lock = lockProvider.create(key, {
239
310
  ttl,
240
311
  });
241
- const result = await lock.runBlockingOrFail(new LazyPromise(async () => {
242
- await LazyPromise.delay(DELAY_TIME);
243
- return "a";
244
- }), {
245
- time: TimeSpan.fromMilliseconds(5),
246
- interval: TimeSpan.fromMilliseconds(5),
312
+ const releaseSpy = vi.spyOn(lock, "release");
313
+ await lock.runOrFail(() => {
314
+ return Promise.resolve(RETURN_VALUE);
247
315
  });
248
- expect(result).toBe("a");
316
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
249
317
  });
250
- test("Should retry acquire the lock", async () => {
318
+ test("Should call release after acquireOrFail method", async () => {
251
319
  const key = "a";
252
- const ttl = TimeSpan.fromMilliseconds(50);
320
+ const ttl = null;
253
321
  const lock = lockProvider.create(key, {
254
322
  ttl,
255
323
  });
256
- await lock.acquire();
257
- let index = 0;
258
- await lockProvider.addListener(LOCK_EVENTS.NOT_AVAILABLE, (_event) => {
259
- index++;
324
+ const releaseSpy = vi.spyOn(lock, "release");
325
+ const acquireSpy = vi.spyOn(lock, "acquireOrFail");
326
+ await lock.runOrFail(() => {
327
+ return Promise.resolve(RETURN_VALUE);
328
+ });
329
+ expect(releaseSpy).toHaveBeenCalledAfter(acquireSpy);
330
+ });
331
+ test("Should call release when an error is thrown", async () => {
332
+ const key = "a";
333
+ const ttl = null;
334
+ const lock = lockProvider.create(key, {
335
+ ttl,
260
336
  });
337
+ const releaseSpy = vi.spyOn(lock, "release");
261
338
  try {
262
- await lock.runBlockingOrFail(async () => {
263
- await LazyPromise.delay(DELAY_TIME);
264
- }, {
265
- time: TimeSpan.fromMilliseconds(55),
266
- interval: TimeSpan.fromMilliseconds(5),
339
+ await lock.runOrFail(() => {
340
+ return Promise.reject(new Error());
267
341
  });
268
342
  }
269
343
  catch {
270
- /* Empty */
344
+ /* EMPTY */
271
345
  }
272
- expect(index).toBeGreaterThan(1);
346
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
273
347
  });
274
- });
275
- describe("method: acquire", () => {
276
- test("Should return true when lock is available", async () => {
348
+ test("Should propagate thrown error", async () => {
277
349
  const key = "a";
278
350
  const ttl = null;
279
351
  const lock = lockProvider.create(key, {
280
352
  ttl,
281
353
  });
282
- const result = await lock.acquire();
283
- expect(result).toBe(true);
354
+ class CustomError extends Error {
355
+ }
356
+ const error = lock.runOrFail(() => {
357
+ return Promise.reject(new CustomError());
358
+ });
359
+ await expect(error).rejects.toBeInstanceOf(CustomError);
284
360
  });
285
- test("Should return false when lock is already acquired", async () => {
361
+ test("Should call handler function when key doesnt exists", async () => {
286
362
  const key = "a";
287
363
  const ttl = null;
288
- const lock = lockProvider.create(key, {
364
+ const handlerFn = vi.fn(() => {
365
+ return Promise.resolve(RETURN_VALUE);
366
+ });
367
+ await lockProvider
368
+ .create(key, {
289
369
  ttl,
370
+ })
371
+ .runOrFail(handlerFn);
372
+ expect(handlerFn).toHaveBeenCalledTimes(1);
373
+ });
374
+ test("Should call handler function when key is expired", async () => {
375
+ const key = "a";
376
+ const ttl = TimeSpan.fromMilliseconds(50);
377
+ await lockProvider.create(key, { ttl }).acquire();
378
+ await delay(ttl);
379
+ const handlerFn = vi.fn(() => {
380
+ return Promise.resolve(RETURN_VALUE);
290
381
  });
291
- await lock.acquire();
292
- const result = await lock.acquire();
293
- expect(result).toBe(false);
382
+ await lockProvider.create(key, { ttl }).runOrFail(handlerFn);
383
+ expect(handlerFn).toHaveBeenCalledTimes(1);
294
384
  });
295
- test("Should not be expired when released by same owner", async () => {
385
+ test("Should not call handler function when key is unexpireable and acquired by same owner", async () => {
296
386
  const key = "a";
297
387
  const ttl = null;
298
- const owner = "b";
388
+ const lock = lockProvider.create(key, { ttl });
389
+ await lock.acquire();
390
+ const handlerFn = vi.fn(() => {
391
+ return Promise.resolve(RETURN_VALUE);
392
+ });
393
+ try {
394
+ await lock.runOrFail(handlerFn);
395
+ }
396
+ catch {
397
+ /* EMPTY */
398
+ }
399
+ expect(handlerFn).toHaveBeenCalledTimes(0);
400
+ });
401
+ test("Should not call handler function when key is unexpired and acquired by same owner", async () => {
402
+ const key = "a";
403
+ const ttl = TimeSpan.fromMilliseconds(50);
299
404
  const lock = lockProvider.create(key, {
300
405
  ttl,
301
- owner,
302
406
  });
303
407
  await lock.acquire();
304
- const result = await lock.isExpired();
305
- expect(result).toBe(false);
408
+ const handlerFn = vi.fn(() => {
409
+ return Promise.resolve(RETURN_VALUE);
410
+ });
411
+ try {
412
+ await lock.runOrFail(handlerFn);
413
+ }
414
+ catch {
415
+ /* EMPTY */
416
+ }
417
+ expect(handlerFn).toHaveBeenCalledTimes(0);
306
418
  });
307
- test("Should be loked when released by same owner", async () => {
419
+ test("Should not call handler function when key is unexpireable and acquired by different owner", async () => {
308
420
  const key = "a";
309
421
  const ttl = null;
310
- const owner = "b";
311
- const lock = lockProvider.create(key, {
312
- ttl,
313
- owner,
422
+ await lockProvider.create(key, { ttl }).acquire();
423
+ const handlerFn = vi.fn(() => {
424
+ return Promise.resolve(RETURN_VALUE);
314
425
  });
315
- await lock.acquire();
316
- const result = await lock.isLocked();
317
- expect(result).toBe(true);
426
+ try {
427
+ await lockProvider
428
+ .create(key, { ttl })
429
+ .runOrFail(handlerFn);
430
+ }
431
+ catch {
432
+ /* EMPTY */
433
+ }
434
+ expect(handlerFn).not.toHaveBeenCalled();
318
435
  });
319
- });
320
- describe("method: acquireOrFail", () => {
321
- test("Should not throw KeyAlreadyAcquiredLockError when lock is available", async () => {
436
+ test("Should not call handler function when key is unexpired and acquired by different owner", async () => {
437
+ const key = "a";
438
+ const ttl = TimeSpan.fromMilliseconds(50);
439
+ await lockProvider.create(key, { ttl }).acquire();
440
+ const handlerFn = vi.fn(() => {
441
+ return Promise.resolve(RETURN_VALUE);
442
+ });
443
+ try {
444
+ await lockProvider
445
+ .create(key, { ttl })
446
+ .runOrFail(handlerFn);
447
+ }
448
+ catch {
449
+ /* EMPTY */
450
+ }
451
+ expect(handlerFn).not.toHaveBeenCalled();
452
+ });
453
+ test("Should return value when key doesnt exists", async () => {
322
454
  const key = "a";
323
455
  const ttl = null;
324
- const lock = lockProvider.create(key, {
456
+ const result = await lockProvider
457
+ .create(key, {
325
458
  ttl,
459
+ })
460
+ .runOrFail(() => {
461
+ return Promise.resolve(RETURN_VALUE);
326
462
  });
327
- const result = lock.acquireOrFail();
328
- await expect(result).resolves.toBeUndefined();
463
+ expect(result).toBe(RETURN_VALUE);
464
+ });
465
+ test("Should return value when key is expired", async () => {
466
+ const key = "a";
467
+ const ttl = TimeSpan.fromMilliseconds(50);
468
+ await lockProvider.create(key, { ttl }).acquire();
469
+ await delay(ttl);
470
+ const result = await lockProvider
471
+ .create(key, { ttl })
472
+ .runOrFail(() => {
473
+ return Promise.resolve(RETURN_VALUE);
474
+ });
475
+ expect(result).toBe(RETURN_VALUE);
329
476
  });
330
- test("Should throw KeyAlreadyAcquiredLockError when lock is already acquired", async () => {
477
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by same owner", async () => {
331
478
  const key = "a";
332
479
  const ttl = null;
480
+ const lock = lockProvider.create(key, { ttl });
481
+ await lock.acquire();
482
+ const result = lock.runOrFail(() => {
483
+ return Promise.resolve(RETURN_VALUE);
484
+ });
485
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
486
+ });
487
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by same owner", async () => {
488
+ const key = "a";
489
+ const ttl = TimeSpan.fromMilliseconds(50);
333
490
  const lock = lockProvider.create(key, {
334
491
  ttl,
335
492
  });
336
- await lock.acquireOrFail();
337
- const result = lock.acquireOrFail();
493
+ await lock.acquire();
494
+ const result = lock.runOrFail(() => {
495
+ return Promise.resolve(RETURN_VALUE);
496
+ });
497
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
498
+ });
499
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by different owner", async () => {
500
+ const key = "a";
501
+ const ttl = null;
502
+ await lockProvider.create(key, { ttl }).acquire();
503
+ const result = lockProvider
504
+ .create(key, { ttl })
505
+ .runOrFail(() => {
506
+ return Promise.resolve(RETURN_VALUE);
507
+ });
508
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
509
+ });
510
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by different owner", async () => {
511
+ const key = "a";
512
+ const ttl = TimeSpan.fromMilliseconds(50);
513
+ await lockProvider.create(key, { ttl }).acquire();
514
+ const result = lockProvider
515
+ .create(key, { ttl })
516
+ .runOrFail(() => {
517
+ return Promise.resolve(RETURN_VALUE);
518
+ });
338
519
  await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
339
520
  });
340
521
  });
341
- describe("method: acquireBlocking", () => {
342
- test("Should return true when lock is available", async () => {
522
+ describe("method: runBlocking", () => {
523
+ test("Should call acquireBlocking method", async () => {
343
524
  const key = "a";
344
525
  const ttl = null;
345
526
  const lock = lockProvider.create(key, {
346
527
  ttl,
347
528
  });
348
- const result = await lock.acquireBlocking({
529
+ const acquireSpy = vi.spyOn(lock, "acquireBlocking");
530
+ await lock.runBlocking(() => {
531
+ return Promise.resolve(RETURN_VALUE);
532
+ }, {
349
533
  time: TimeSpan.fromMilliseconds(5),
350
534
  interval: TimeSpan.fromMilliseconds(5),
351
535
  });
352
- expect(result).toBe(true);
536
+ expect(acquireSpy).toHaveBeenCalledTimes(1);
353
537
  });
354
- test("Should return false when lock is already acquired", async () => {
538
+ test("Should call acquireBlocking before release method", async () => {
355
539
  const key = "a";
356
540
  const ttl = null;
357
541
  const lock = lockProvider.create(key, {
358
542
  ttl,
359
543
  });
360
- await lock.acquireBlocking({
361
- time: TimeSpan.fromMilliseconds(5),
362
- interval: TimeSpan.fromMilliseconds(5),
363
- });
364
- const result = await lock.acquireBlocking({
544
+ const acquireSpy = vi.spyOn(lock, "acquireBlocking");
545
+ const releaseSpy = vi.spyOn(lock, "release");
546
+ await lock.runBlocking(() => {
547
+ return Promise.resolve(RETURN_VALUE);
548
+ }, {
365
549
  time: TimeSpan.fromMilliseconds(5),
366
550
  interval: TimeSpan.fromMilliseconds(5),
367
551
  });
368
- expect(result).toBe(false);
552
+ expect(acquireSpy).toHaveBeenCalledBefore(releaseSpy);
369
553
  });
370
- test("Should not be expired when released by same owner", async () => {
554
+ test("Should call release method", async () => {
371
555
  const key = "a";
372
556
  const ttl = null;
373
- const owner = "b";
374
557
  const lock = lockProvider.create(key, {
375
558
  ttl,
376
- owner,
377
559
  });
378
- await lock.acquireBlocking({
560
+ const releaseSpy = vi.spyOn(lock, "release");
561
+ await lock.runBlocking(() => {
562
+ return Promise.resolve(RETURN_VALUE);
563
+ }, {
379
564
  time: TimeSpan.fromMilliseconds(5),
380
565
  interval: TimeSpan.fromMilliseconds(5),
381
566
  });
382
- const result = await lock.isExpired();
383
- expect(result).toBe(false);
567
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
384
568
  });
385
- test("Should be loked when released by same owner", async () => {
569
+ test("Should call release after acquireBlocking method", async () => {
386
570
  const key = "a";
387
571
  const ttl = null;
388
- const owner = "b";
389
572
  const lock = lockProvider.create(key, {
390
573
  ttl,
391
- owner,
392
574
  });
393
- await lock.acquireBlocking({
575
+ const releaseSpy = vi.spyOn(lock, "release");
576
+ const acquireSpy = vi.spyOn(lock, "acquireBlocking");
577
+ await lock.runBlocking(() => {
578
+ return Promise.resolve(RETURN_VALUE);
579
+ }, {
394
580
  time: TimeSpan.fromMilliseconds(5),
395
581
  interval: TimeSpan.fromMilliseconds(5),
396
582
  });
397
- const result = await lock.isLocked();
398
- expect(result).toBe(true);
583
+ expect(releaseSpy).toHaveBeenCalledAfter(acquireSpy);
399
584
  });
400
- test("Should retry acquire the lock", async () => {
585
+ test("Should call release when an error is thrown", async () => {
401
586
  const key = "a";
402
- const ttl = TimeSpan.fromMilliseconds(50);
587
+ const ttl = null;
403
588
  const lock = lockProvider.create(key, {
404
589
  ttl,
405
590
  });
406
- await lock.acquire();
407
- let index = 0;
408
- await lockProvider.addListener(LOCK_EVENTS.NOT_AVAILABLE, (_event) => {
409
- index++;
410
- });
411
- await lock.acquireBlocking({
412
- time: TimeSpan.fromMilliseconds(55),
413
- interval: TimeSpan.fromMilliseconds(5),
414
- });
415
- expect(index).toBeGreaterThan(1);
591
+ const releaseSpy = vi.spyOn(lock, "release");
592
+ try {
593
+ await lock.runBlocking(() => {
594
+ return Promise.reject(new Error());
595
+ }, {
596
+ time: TimeSpan.fromMilliseconds(5),
597
+ interval: TimeSpan.fromMilliseconds(5),
598
+ });
599
+ }
600
+ catch {
601
+ /* EMPTY */
602
+ }
603
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
416
604
  });
417
- });
418
- describe("method: acquireBlockingOrFail", () => {
419
- test("Should not throw KeyAlreadyAcquiredLockError when lock is available", async () => {
605
+ test("Should propagate thrown error", async () => {
420
606
  const key = "a";
421
607
  const ttl = null;
422
608
  const lock = lockProvider.create(key, {
423
609
  ttl,
424
610
  });
425
- const promise = lock.acquireBlockingOrFail({
611
+ class CustomError extends Error {
612
+ }
613
+ const error = lock.runBlocking(() => {
614
+ return Promise.reject(new CustomError());
615
+ }, {
426
616
  time: TimeSpan.fromMilliseconds(5),
427
617
  interval: TimeSpan.fromMilliseconds(5),
428
618
  });
429
- await expect(promise).resolves.toBeUndefined();
619
+ await expect(error).rejects.toBeInstanceOf(CustomError);
430
620
  });
431
- test("Should throw KeyAlreadyAcquiredLockError when lock is already acquired", async () => {
621
+ test("Should call handler function when key doesnt exists", async () => {
432
622
  const key = "a";
433
623
  const ttl = null;
434
- const lock = lockProvider.create(key, {
435
- ttl,
624
+ const handlerFn = vi.fn(() => {
625
+ return Promise.resolve(RETURN_VALUE);
436
626
  });
437
- await lock.acquireBlockingOrFail({
438
- time: TimeSpan.fromMilliseconds(5),
439
- interval: TimeSpan.fromMilliseconds(5),
440
- });
441
- const promise = lock.acquireBlockingOrFail({
627
+ await lockProvider
628
+ .create(key, {
629
+ ttl,
630
+ })
631
+ .runBlocking(handlerFn, {
442
632
  time: TimeSpan.fromMilliseconds(5),
443
633
  interval: TimeSpan.fromMilliseconds(5),
444
634
  });
445
- await expect(promise).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
635
+ expect(handlerFn).toHaveBeenCalledTimes(1);
446
636
  });
447
- test("Should not be expired when released by same owner", async () => {
637
+ test("Should call handler function when key is expired", async () => {
448
638
  const key = "a";
449
- const ttl = null;
450
- const owner = "b";
451
- const lock = lockProvider.create(key, {
452
- ttl,
453
- owner,
639
+ const ttl = TimeSpan.fromMilliseconds(50);
640
+ await lockProvider.create(key, { ttl }).acquire();
641
+ await delay(ttl);
642
+ const handlerFn = vi.fn(() => {
643
+ return Promise.resolve(RETURN_VALUE);
454
644
  });
455
- await lock.acquireBlockingOrFail({
645
+ await lockProvider.create(key, { ttl }).runBlocking(handlerFn, {
456
646
  time: TimeSpan.fromMilliseconds(5),
457
647
  interval: TimeSpan.fromMilliseconds(5),
458
648
  });
459
- const result = await lock.isExpired();
460
- expect(result).toBe(false);
649
+ expect(handlerFn).toHaveBeenCalledTimes(1);
461
650
  });
462
- test("Should be loked when released by same owner", async () => {
651
+ test("Should not call handler function when key is unexpireable and acquired by same owner", async () => {
463
652
  const key = "a";
464
653
  const ttl = null;
465
- const owner = "b";
466
- const lock = lockProvider.create(key, {
467
- ttl,
468
- owner,
654
+ const lock = lockProvider.create(key, { ttl });
655
+ await lock.acquire();
656
+ const handlerFn = vi.fn(() => {
657
+ return Promise.resolve(RETURN_VALUE);
469
658
  });
470
- await lock.acquireBlockingOrFail({
659
+ await lock.runBlocking(handlerFn, {
471
660
  time: TimeSpan.fromMilliseconds(5),
472
661
  interval: TimeSpan.fromMilliseconds(5),
473
662
  });
474
- const result = await lock.isLocked();
475
- expect(result).toBe(true);
663
+ expect(handlerFn).toHaveBeenCalledTimes(0);
476
664
  });
477
- test("Should retry acquire the lock", async () => {
665
+ test("Should not call handler function when key is unexpired and acquired by same owner", async () => {
478
666
  const key = "a";
479
667
  const ttl = TimeSpan.fromMilliseconds(50);
480
668
  const lock = lockProvider.create(key, {
481
669
  ttl,
482
670
  });
483
671
  await lock.acquire();
484
- let index = 0;
485
- await lockProvider.addListener(LOCK_EVENTS.NOT_AVAILABLE, (_event) => {
486
- index++;
672
+ const handlerFn = vi.fn(() => {
673
+ return Promise.resolve(RETURN_VALUE);
487
674
  });
488
- try {
489
- await lock.acquireBlockingOrFail({
490
- time: TimeSpan.fromMilliseconds(55),
491
- interval: TimeSpan.fromMilliseconds(5),
492
- });
493
- }
494
- catch {
495
- /* Empty */
496
- }
497
- expect(index).toBeGreaterThan(1);
675
+ await lock.runBlocking(handlerFn, {
676
+ time: TimeSpan.fromMilliseconds(5),
677
+ interval: TimeSpan.fromMilliseconds(5),
678
+ });
679
+ expect(handlerFn).toHaveBeenCalledTimes(0);
498
680
  });
499
- });
500
- describe("method: release", () => {
501
- test("Should return true when released by same owner", async () => {
681
+ test("Should not call handler function when key is unexpireable and acquired by different owner", async () => {
502
682
  const key = "a";
503
683
  const ttl = null;
504
- const owner = "b";
505
- const lock = lockProvider.create(key, {
506
- ttl,
507
- owner,
684
+ await lockProvider.create(key, { ttl }).acquire();
685
+ const handlerFn = vi.fn(() => {
686
+ return Promise.resolve(RETURN_VALUE);
508
687
  });
509
- await lock.acquire();
510
- const result = await lock.release();
511
- expect(result).toBe(true);
688
+ await lockProvider.create(key, { ttl }).runBlocking(handlerFn, {
689
+ time: TimeSpan.fromMilliseconds(5),
690
+ interval: TimeSpan.fromMilliseconds(5),
691
+ });
692
+ expect(handlerFn).not.toHaveBeenCalled();
512
693
  });
513
- test("Should return false when released by different owner", async () => {
694
+ test("Should not call handler function when key is unexpired and acquired by different owner", async () => {
514
695
  const key = "a";
515
- const ttl = null;
516
- const owner1 = "b";
517
- const lock1 = lockProvider.create(key, {
518
- ttl,
519
- owner: owner1,
696
+ const ttl = TimeSpan.fromMilliseconds(50);
697
+ await lockProvider.create(key, { ttl }).acquire();
698
+ const handlerFn = vi.fn(() => {
699
+ return Promise.resolve(RETURN_VALUE);
520
700
  });
521
- await lock1.acquire();
522
- const owner2 = "c";
523
- const lock2 = lockProvider.create(key, {
524
- ttl,
525
- owner: owner2,
701
+ await lockProvider.create(key, { ttl }).runBlocking(handlerFn, {
702
+ time: TimeSpan.fromMilliseconds(5),
703
+ interval: TimeSpan.fromMilliseconds(5),
526
704
  });
527
- const result = await lock2.release();
528
- expect(result).toBe(false);
705
+ expect(handlerFn).not.toHaveBeenCalled();
529
706
  });
530
- test("Should be expired when released by same owner", async () => {
707
+ test("Should return ResultSuccess<string> when key doesnt exists", async () => {
531
708
  const key = "a";
532
709
  const ttl = null;
533
- const owner = "b";
534
- const lock = lockProvider.create(key, {
710
+ const result = await lockProvider
711
+ .create(key, {
535
712
  ttl,
536
- owner,
713
+ })
714
+ .runBlocking(() => {
715
+ return Promise.resolve(RETURN_VALUE);
716
+ }, {
717
+ time: TimeSpan.fromMilliseconds(5),
718
+ interval: TimeSpan.fromMilliseconds(5),
537
719
  });
538
- await lock.acquire();
539
- await lock.release();
540
- const result = await lock.isExpired();
541
- expect(result).toBe(true);
720
+ expect(result).toEqual(resultSuccess(RETURN_VALUE));
542
721
  });
543
- test("Should be not loked when released by same owner", async () => {
722
+ test("Should return ResultSuccess<string> when key is expired", async () => {
544
723
  const key = "a";
545
- const ttl = null;
546
- const owner = "b";
547
- const lock = lockProvider.create(key, {
548
- ttl,
549
- owner,
724
+ const ttl = TimeSpan.fromMilliseconds(50);
725
+ await lockProvider.create(key, { ttl }).acquire();
726
+ await delay(ttl);
727
+ const result = await lockProvider
728
+ .create(key, { ttl })
729
+ .runBlocking(() => {
730
+ return Promise.resolve(RETURN_VALUE);
731
+ }, {
732
+ time: TimeSpan.fromMilliseconds(5),
733
+ interval: TimeSpan.fromMilliseconds(5),
550
734
  });
551
- await lock.acquire();
552
- await lock.release();
553
- const result = await lock.isLocked();
554
- expect(result).toBe(false);
735
+ expect(result).toEqual(resultSuccess(RETURN_VALUE));
555
736
  });
556
- });
557
- describe("method: releaseOrFail", () => {
558
- test("Should not throw UnownedReleaseLockError when released by same owner", async () => {
737
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpireable and acquired by same owner", async () => {
559
738
  const key = "a";
560
739
  const ttl = null;
561
- const owner = "b";
562
- const lock = lockProvider.create(key, {
563
- ttl,
564
- owner,
565
- });
740
+ const lock = lockProvider.create(key, { ttl });
566
741
  await lock.acquire();
567
- const result = lock.releaseOrFail();
568
- await expect(result).resolves.toBeUndefined();
742
+ const result = await lock.runBlocking(() => {
743
+ return Promise.resolve(RETURN_VALUE);
744
+ }, {
745
+ time: TimeSpan.fromMilliseconds(5),
746
+ interval: TimeSpan.fromMilliseconds(5),
747
+ });
748
+ expect(result.type).toBe(RESULT.FAILURE);
749
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
569
750
  });
570
- test("Should throw UnownedReleaseLockError when released by different owner", async () => {
751
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpired and acquired by same owner", async () => {
571
752
  const key = "a";
572
- const ttl = null;
573
- const owner1 = "b";
574
- const lock1 = lockProvider.create(key, {
753
+ const ttl = TimeSpan.fromMilliseconds(50);
754
+ const lock = lockProvider.create(key, {
575
755
  ttl,
576
- owner: owner1,
577
756
  });
578
- await lock1.acquire();
579
- const owner2 = "c";
580
- const lock2 = lockProvider.create(key, {
581
- ttl,
582
- owner: owner2,
757
+ await lock.acquire();
758
+ const result = await lock.runBlocking(() => {
759
+ return Promise.resolve(RETURN_VALUE);
760
+ }, {
761
+ time: TimeSpan.fromMilliseconds(5),
762
+ interval: TimeSpan.fromMilliseconds(5),
583
763
  });
584
- const result = lock2.releaseOrFail();
585
- await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
764
+ expect(result.type).toBe(RESULT.FAILURE);
765
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
586
766
  });
587
- test("Should be expired when released by same owner", async () => {
767
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpireable and acquired by different owner", async () => {
588
768
  const key = "a";
589
769
  const ttl = null;
590
- const owner = "b";
591
- const lock = lockProvider.create(key, {
592
- ttl,
593
- owner,
770
+ await lockProvider.create(key, { ttl }).acquire();
771
+ const result = await lockProvider
772
+ .create(key, { ttl })
773
+ .runBlocking(() => {
774
+ return Promise.resolve(RETURN_VALUE);
775
+ }, {
776
+ time: TimeSpan.fromMilliseconds(5),
777
+ interval: TimeSpan.fromMilliseconds(5),
594
778
  });
595
- await lock.acquire();
596
- await lock.releaseOrFail();
597
- const result = await lock.isExpired();
598
- expect(result).toBe(true);
779
+ expect(result.type).toBe(RESULT.FAILURE);
780
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
599
781
  });
600
- test("Should be not loked when released by same owner", async () => {
782
+ test("Should return ResultFailure<KeyAlreadyAcquiredLockError> when key is unexpired and acquired by different owner", async () => {
601
783
  const key = "a";
602
- const ttl = null;
603
- const owner = "b";
604
- const lock = lockProvider.create(key, {
605
- ttl,
606
- owner,
784
+ const ttl = TimeSpan.fromMilliseconds(50);
785
+ await lockProvider.create(key, { ttl }).acquire();
786
+ const result = await lockProvider
787
+ .create(key, { ttl })
788
+ .runBlocking(() => {
789
+ return Promise.resolve(RETURN_VALUE);
790
+ }, {
791
+ time: TimeSpan.fromMilliseconds(5),
792
+ interval: TimeSpan.fromMilliseconds(5),
607
793
  });
608
- await lock.acquire();
609
- await lock.releaseOrFail();
610
- const result = await lock.isLocked();
611
- expect(result).toBe(false);
794
+ expect(result.type).toBe(RESULT.FAILURE);
795
+ expect(result.error).toBeInstanceOf(KeyAlreadyAcquiredLockError);
612
796
  });
613
- });
614
- describe("method: forceRelease", () => {
615
- test("Should release lock no regardless of the owner", async () => {
797
+ test("Should retry acquire the lock", async () => {
616
798
  const key = "a";
617
- const ttl = null;
618
- const owner1 = "b";
799
+ const ttl = TimeSpan.fromMilliseconds(50);
619
800
  const lock1 = lockProvider.create(key, {
620
801
  ttl,
621
- owner: owner1,
622
802
  });
623
803
  await lock1.acquire();
624
- const owner2 = "c";
804
+ let index = 0;
805
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, (_event) => {
806
+ index++;
807
+ });
625
808
  const lock2 = lockProvider.create(key, {
626
809
  ttl,
627
- owner: owner2,
628
810
  });
629
- await lock2.forceRelease();
630
- const result = await lock1.acquire();
631
- expect(result).toBe(true);
811
+ await lock2.runBlocking(() => {
812
+ return Promise.resolve(RETURN_VALUE);
813
+ }, {
814
+ time: TimeSpan.fromMilliseconds(55),
815
+ interval: TimeSpan.fromMilliseconds(5),
816
+ });
817
+ expect(index).toBeGreaterThan(1);
632
818
  });
633
- test("Should be expired when released", async () => {
819
+ });
820
+ describe("method: runBlockingOrFail", () => {
821
+ test("Should call acquireBlockingOrFail method", async () => {
634
822
  const key = "a";
635
823
  const ttl = null;
636
- const owner = "b";
637
824
  const lock = lockProvider.create(key, {
638
825
  ttl,
639
- owner,
640
826
  });
641
- await lock.acquire();
642
- await lock.forceRelease();
643
- const result = await lock.isExpired();
644
- expect(result).toBe(true);
827
+ const acquireSpy = vi.spyOn(lock, "acquireBlockingOrFail");
828
+ await lock.runBlockingOrFail(() => {
829
+ return Promise.resolve(RETURN_VALUE);
830
+ }, {
831
+ time: TimeSpan.fromMilliseconds(5),
832
+ interval: TimeSpan.fromMilliseconds(5),
833
+ });
834
+ expect(acquireSpy).toHaveBeenCalledTimes(1);
645
835
  });
646
- test("Should be not loked when released", async () => {
836
+ test("Should call acquireBlockingOrFail before release method", async () => {
647
837
  const key = "a";
648
838
  const ttl = null;
649
- const owner = "b";
650
839
  const lock = lockProvider.create(key, {
651
840
  ttl,
652
- owner,
653
841
  });
654
- await lock.acquire();
655
- await lock.forceRelease();
656
- const result = await lock.isLocked();
657
- expect(result).toBe(false);
842
+ const acquireSpy = vi.spyOn(lock, "acquireBlockingOrFail");
843
+ const releaseSpy = vi.spyOn(lock, "release");
844
+ await lock.runBlockingOrFail(() => {
845
+ return Promise.resolve(RETURN_VALUE);
846
+ }, {
847
+ time: TimeSpan.fromMilliseconds(5),
848
+ interval: TimeSpan.fromMilliseconds(5),
849
+ });
850
+ expect(acquireSpy).toHaveBeenCalledBefore(releaseSpy);
658
851
  });
659
- });
660
- describe("method: isExpired", () => {
661
- test("Should return false when lock has no expiration", async () => {
852
+ test("Should call release method", async () => {
662
853
  const key = "a";
663
854
  const ttl = null;
664
- const owner = "b";
665
855
  const lock = lockProvider.create(key, {
666
856
  ttl,
667
- owner,
668
857
  });
669
- await lock.acquire();
670
- const result = await lock.isExpired();
671
- expect(result).toBe(false);
672
- });
673
- test("Should return false when lock has not expired", async () => {
674
- const key = "a";
675
- const owner = "b";
676
- const ttl = TTL;
677
- const lock = lockProvider.create(key, {
678
- ttl,
679
- owner,
858
+ const releaseSpy = vi.spyOn(lock, "release");
859
+ await lock.runBlockingOrFail(() => {
860
+ return Promise.resolve(RETURN_VALUE);
861
+ }, {
862
+ time: TimeSpan.fromMilliseconds(5),
863
+ interval: TimeSpan.fromMilliseconds(5),
680
864
  });
681
- await lock.acquire();
682
- const result = await lock.isExpired();
683
- expect(result).toBe(false);
865
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
684
866
  });
685
- test("Should return true when lock has expired", async () => {
867
+ test("Should call release after acquireBlockingOrFail method", async () => {
686
868
  const key = "a";
687
- const owner = "b";
688
- const ttl = TTL;
869
+ const ttl = null;
689
870
  const lock = lockProvider.create(key, {
690
871
  ttl,
691
- owner,
692
872
  });
693
- await lock.acquire();
694
- await LazyPromise.delay(ttl.addMilliseconds(25));
695
- const result = await lock.isExpired();
696
- expect(result).toBe(true);
873
+ const releaseSpy = vi.spyOn(lock, "release");
874
+ const acquireSpy = vi.spyOn(lock, "acquireBlockingOrFail");
875
+ await lock.runBlockingOrFail(() => {
876
+ return Promise.resolve(RETURN_VALUE);
877
+ }, {
878
+ time: TimeSpan.fromMilliseconds(5),
879
+ interval: TimeSpan.fromMilliseconds(5),
880
+ });
881
+ expect(releaseSpy).toHaveBeenCalledAfter(acquireSpy);
697
882
  });
698
- });
699
- describe("method: isLocked", () => {
700
- test("Should return true when lock has no expiration", async () => {
883
+ test("Should call release when an error is thrown", async () => {
701
884
  const key = "a";
702
885
  const ttl = null;
703
- const owner = "b";
704
886
  const lock = lockProvider.create(key, {
705
887
  ttl,
706
- owner,
707
888
  });
708
- await lock.acquire();
709
- const result = await lock.isLocked();
710
- expect(result).toBe(true);
889
+ const releaseSpy = vi.spyOn(lock, "release");
890
+ try {
891
+ await lock.runBlockingOrFail(() => {
892
+ return Promise.reject(new Error());
893
+ }, {
894
+ time: TimeSpan.fromMilliseconds(5),
895
+ interval: TimeSpan.fromMilliseconds(5),
896
+ });
897
+ }
898
+ catch {
899
+ /* EMPTY */
900
+ }
901
+ expect(releaseSpy).toHaveBeenCalledTimes(1);
711
902
  });
712
- test("Should return true when lock has not expired", async () => {
903
+ test("Should propagate thrown error", async () => {
713
904
  const key = "a";
714
- const owner = "b";
715
- const ttl = TTL;
905
+ const ttl = null;
716
906
  const lock = lockProvider.create(key, {
717
907
  ttl,
718
- owner,
719
908
  });
720
- await lock.acquire();
721
- const result = await lock.isLocked();
722
- expect(result).toBe(true);
909
+ class CustomError extends Error {
910
+ }
911
+ const error = lock.runBlockingOrFail(() => {
912
+ return Promise.reject(new CustomError());
913
+ }, {
914
+ time: TimeSpan.fromMilliseconds(5),
915
+ interval: TimeSpan.fromMilliseconds(5),
916
+ });
917
+ await expect(error).rejects.toBeInstanceOf(CustomError);
723
918
  });
724
- test("Should return false when lock has expired", async () => {
919
+ test("Should call handler function when key doesnt exists", async () => {
725
920
  const key = "a";
726
- const owner = "b";
727
- const ttl = TTL;
728
- const lock = lockProvider.create(key, {
921
+ const ttl = null;
922
+ const handlerFn = vi.fn(() => {
923
+ return Promise.resolve(RETURN_VALUE);
924
+ });
925
+ await lockProvider
926
+ .create(key, {
729
927
  ttl,
730
- owner,
928
+ })
929
+ .runBlockingOrFail(handlerFn, {
930
+ time: TimeSpan.fromMilliseconds(5),
931
+ interval: TimeSpan.fromMilliseconds(5),
731
932
  });
732
- await lock.acquire();
733
- await LazyPromise.delay(ttl.addMilliseconds(25));
734
- const result = await lock.isLocked();
735
- expect(result).toBe(false);
933
+ expect(handlerFn).toHaveBeenCalledTimes(1);
736
934
  });
737
- });
738
- describe("method: refresh", () => {
739
- test("Should return true when refreshed by same owner", async () => {
935
+ test("Should call handler function when key is expired", async () => {
740
936
  const key = "a";
741
- const ttl = TTL;
742
- const owner = "b";
743
- const lock = lockProvider.create(key, {
744
- ttl,
745
- owner,
937
+ const ttl = TimeSpan.fromMilliseconds(50);
938
+ await lockProvider.create(key, { ttl }).acquire();
939
+ await delay(ttl);
940
+ const handlerFn = vi.fn(() => {
941
+ return Promise.resolve(RETURN_VALUE);
942
+ });
943
+ await lockProvider
944
+ .create(key, { ttl })
945
+ .runBlockingOrFail(handlerFn, {
946
+ time: TimeSpan.fromMilliseconds(5),
947
+ interval: TimeSpan.fromMilliseconds(5),
746
948
  });
747
- await lock.acquire();
748
- await LazyPromise.delay(ttl);
749
- const result = await lock.refresh();
750
- expect(result).toBe(true);
949
+ expect(handlerFn).toHaveBeenCalledTimes(1);
751
950
  });
752
- test("Should return false when refreshed by different owner", async () => {
951
+ test("Should not call handler function when key is unexpireable and acquired by same owner", async () => {
753
952
  const key = "a";
754
- const ttl = TTL;
755
- const owner1 = "b";
756
- const lock1 = lockProvider.create(key, {
757
- ttl,
758
- owner: owner1,
759
- });
760
- await lock1.acquire();
761
- const owner2 = "c";
762
- const lock2 = lockProvider.create(key, {
763
- ttl,
764
- owner: owner2,
953
+ const ttl = null;
954
+ const lock = lockProvider.create(key, { ttl });
955
+ await lock.acquire();
956
+ const handlerFn = vi.fn(() => {
957
+ return Promise.resolve(RETURN_VALUE);
765
958
  });
766
- const result = await lock2.refresh();
767
- expect(result).toBe(false);
959
+ try {
960
+ await lock.runBlockingOrFail(handlerFn, {
961
+ time: TimeSpan.fromMilliseconds(5),
962
+ interval: TimeSpan.fromMilliseconds(5),
963
+ });
964
+ }
965
+ catch {
966
+ /* EMPTY */
967
+ }
968
+ expect(handlerFn).toHaveBeenCalledTimes(0);
768
969
  });
769
- test("Should refresh expiration by same owner", async () => {
970
+ test("Should not call handler function when key is unexpired and acquired by same owner", async () => {
770
971
  const key = "a";
771
- const ttl = TTL;
772
- const owner = "b";
972
+ const ttl = TimeSpan.fromMilliseconds(50);
773
973
  const lock = lockProvider.create(key, {
774
974
  ttl,
775
- owner,
776
975
  });
777
976
  await lock.acquire();
778
- await LazyPromise.delay(ttl.subtractMilliseconds(10));
779
- await lock.refresh();
780
- const time = await lock.getRemainingTime();
781
- expect(time?.toMilliseconds()).toBeGreaterThan(0);
782
- });
783
- });
784
- describe("method: refreshOrFail", () => {
785
- test("Should not throw UnownedRefreshLockError when refreshed by same owner", async () => {
977
+ const handlerFn = vi.fn(() => {
978
+ return Promise.resolve(RETURN_VALUE);
979
+ });
980
+ try {
981
+ await lock.runBlockingOrFail(handlerFn, {
982
+ time: TimeSpan.fromMilliseconds(5),
983
+ interval: TimeSpan.fromMilliseconds(5),
984
+ });
985
+ }
986
+ catch {
987
+ /* EMPTY */
988
+ }
989
+ expect(handlerFn).toHaveBeenCalledTimes(0);
990
+ });
991
+ test("Should not call handler function when key is unexpireable and acquired by different owner", async () => {
786
992
  const key = "a";
787
- const ttl = TTL;
788
- const owner = "b";
993
+ const ttl = null;
994
+ await lockProvider.create(key, { ttl }).acquire();
995
+ const handlerFn = vi.fn(() => {
996
+ return Promise.resolve(RETURN_VALUE);
997
+ });
998
+ try {
999
+ await lockProvider
1000
+ .create(key, { ttl })
1001
+ .runBlockingOrFail(handlerFn, {
1002
+ time: TimeSpan.fromMilliseconds(5),
1003
+ interval: TimeSpan.fromMilliseconds(5),
1004
+ });
1005
+ }
1006
+ catch {
1007
+ /* EMPTY */
1008
+ }
1009
+ expect(handlerFn).not.toHaveBeenCalled();
1010
+ });
1011
+ test("Should not call handler function when key is unexpired and acquired by different owner", async () => {
1012
+ const key = "a";
1013
+ const ttl = TimeSpan.fromMilliseconds(50);
1014
+ await lockProvider.create(key, { ttl }).acquire();
1015
+ const handlerFn = vi.fn(() => {
1016
+ return Promise.resolve(RETURN_VALUE);
1017
+ });
1018
+ try {
1019
+ await lockProvider
1020
+ .create(key, { ttl })
1021
+ .runBlockingOrFail(handlerFn, {
1022
+ time: TimeSpan.fromMilliseconds(5),
1023
+ interval: TimeSpan.fromMilliseconds(5),
1024
+ });
1025
+ }
1026
+ catch {
1027
+ /* EMPTY */
1028
+ }
1029
+ expect(handlerFn).not.toHaveBeenCalled();
1030
+ });
1031
+ test("Should return value when key doesnt exists", async () => {
1032
+ const key = "a";
1033
+ const ttl = null;
1034
+ const result = await lockProvider
1035
+ .create(key, {
1036
+ ttl,
1037
+ })
1038
+ .runBlockingOrFail(() => {
1039
+ return Promise.resolve(RETURN_VALUE);
1040
+ }, {
1041
+ time: TimeSpan.fromMilliseconds(5),
1042
+ interval: TimeSpan.fromMilliseconds(5),
1043
+ });
1044
+ expect(result).toBe(RETURN_VALUE);
1045
+ });
1046
+ test("Should return value when key is expired", async () => {
1047
+ const key = "a";
1048
+ const ttl = TimeSpan.fromMilliseconds(50);
1049
+ await lockProvider.create(key, { ttl }).acquire();
1050
+ await delay(ttl);
1051
+ const result = await lockProvider
1052
+ .create(key, { ttl })
1053
+ .runBlockingOrFail(() => {
1054
+ return Promise.resolve(RETURN_VALUE);
1055
+ }, {
1056
+ time: TimeSpan.fromMilliseconds(5),
1057
+ interval: TimeSpan.fromMilliseconds(5),
1058
+ });
1059
+ expect(result).toBe(RETURN_VALUE);
1060
+ });
1061
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by same owner", async () => {
1062
+ const key = "a";
1063
+ const ttl = null;
1064
+ const lock = lockProvider.create(key, { ttl });
1065
+ await lock.acquire();
1066
+ const result = lock.runBlockingOrFail(() => {
1067
+ return Promise.resolve(RETURN_VALUE);
1068
+ }, {
1069
+ time: TimeSpan.fromMilliseconds(5),
1070
+ interval: TimeSpan.fromMilliseconds(5),
1071
+ });
1072
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1073
+ });
1074
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by same owner", async () => {
1075
+ const key = "a";
1076
+ const ttl = TimeSpan.fromMilliseconds(50);
789
1077
  const lock = lockProvider.create(key, {
790
1078
  ttl,
791
- owner,
792
1079
  });
793
1080
  await lock.acquire();
794
- await LazyPromise.delay(ttl);
795
- const result = lock.refreshOrFail();
796
- await expect(result).resolves.toBeUndefined();
1081
+ const result = lock.runBlockingOrFail(() => {
1082
+ return Promise.resolve(RETURN_VALUE);
1083
+ }, {
1084
+ time: TimeSpan.fromMilliseconds(5),
1085
+ interval: TimeSpan.fromMilliseconds(5),
1086
+ });
1087
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
797
1088
  });
798
- test("Should throw UnownedRefreshLockError when refreshed by different owner", async () => {
1089
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by different owner", async () => {
799
1090
  const key = "a";
800
- const ttl = TTL;
801
- const owner1 = "b";
1091
+ const ttl = null;
1092
+ await lockProvider.create(key, { ttl }).acquire();
1093
+ const result = lockProvider
1094
+ .create(key, { ttl })
1095
+ .runBlockingOrFail(() => {
1096
+ return Promise.resolve(RETURN_VALUE);
1097
+ }, {
1098
+ time: TimeSpan.fromMilliseconds(5),
1099
+ interval: TimeSpan.fromMilliseconds(5),
1100
+ });
1101
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1102
+ });
1103
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by different owner", async () => {
1104
+ const key = "a";
1105
+ const ttl = TimeSpan.fromMilliseconds(50);
1106
+ await lockProvider.create(key, { ttl }).acquire();
1107
+ const result = lockProvider
1108
+ .create(key, { ttl })
1109
+ .runBlockingOrFail(() => {
1110
+ return Promise.resolve(RETURN_VALUE);
1111
+ }, {
1112
+ time: TimeSpan.fromMilliseconds(5),
1113
+ interval: TimeSpan.fromMilliseconds(5),
1114
+ });
1115
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1116
+ });
1117
+ test("Should retry acquire the lock", async () => {
1118
+ const key = "a";
1119
+ const ttl = TimeSpan.fromMilliseconds(50);
802
1120
  const lock1 = lockProvider.create(key, {
803
1121
  ttl,
804
- owner: owner1,
805
1122
  });
806
1123
  await lock1.acquire();
807
- const owner2 = "c";
1124
+ let index = 0;
1125
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, (_event) => {
1126
+ index++;
1127
+ });
808
1128
  const lock2 = lockProvider.create(key, {
809
1129
  ttl,
810
- owner: owner2,
811
1130
  });
812
- const result = lock2.refreshOrFail();
813
- await expect(result).rejects.toBeInstanceOf(UnownedRefreshLockError);
1131
+ try {
1132
+ await lock2.runBlockingOrFail(() => {
1133
+ return Promise.resolve(RETURN_VALUE);
1134
+ }, {
1135
+ time: TimeSpan.fromMilliseconds(55),
1136
+ interval: TimeSpan.fromMilliseconds(5),
1137
+ });
1138
+ }
1139
+ catch {
1140
+ /* EMPTY */
1141
+ }
1142
+ expect(index).toBeGreaterThan(1);
1143
+ });
1144
+ });
1145
+ describe("method: acquire", () => {
1146
+ test("Should return true when key doesnt exists", async () => {
1147
+ const key = "a";
1148
+ const ttl = null;
1149
+ const result = await lockProvider
1150
+ .create(key, {
1151
+ ttl,
1152
+ })
1153
+ .acquire();
1154
+ expect(result).toBe(true);
814
1155
  });
815
- test("Should refresh expiration by same owner", async () => {
1156
+ test("Should return true when key is expired", async () => {
816
1157
  const key = "a";
817
- const ttl = TTL;
818
- const owner = "b";
1158
+ const ttl = TimeSpan.fromMilliseconds(50);
1159
+ await lockProvider.create(key, { ttl }).acquire();
1160
+ await delay(ttl);
1161
+ const result = await lockProvider
1162
+ .create(key, { ttl })
1163
+ .acquire();
1164
+ expect(result).toBe(true);
1165
+ });
1166
+ test("Should return false when key is unexpireable and acquired by same owner", async () => {
1167
+ const key = "a";
1168
+ const ttl = null;
1169
+ const lock = lockProvider.create(key, { ttl });
1170
+ await lock.acquire();
1171
+ const result = await lock.acquire();
1172
+ expect(result).toBe(false);
1173
+ });
1174
+ test("Should return false when key is unexpired and acquired by same owner", async () => {
1175
+ const key = "a";
1176
+ const ttl = TimeSpan.fromMilliseconds(50);
819
1177
  const lock = lockProvider.create(key, {
820
1178
  ttl,
821
- owner,
822
1179
  });
823
- await lock.acquireOrFail();
824
- await LazyPromise.delay(ttl.subtractMilliseconds(10));
825
- await lock.refresh();
826
- const time = await lock.getRemainingTime();
827
- expect(time?.toMilliseconds()).toBeGreaterThan(0);
1180
+ await lock.acquire();
1181
+ const result = await lock.acquire();
1182
+ expect(result).toBe(false);
1183
+ });
1184
+ test("Should return false when key is unexpireable and acquired by different owner", async () => {
1185
+ const key = "a";
1186
+ const ttl = null;
1187
+ await lockProvider.create(key, { ttl }).acquire();
1188
+ const result = await lockProvider
1189
+ .create(key, { ttl })
1190
+ .acquire();
1191
+ expect(result).toBe(false);
1192
+ });
1193
+ test("Should return false when key is unexpired and acquired by different owner", async () => {
1194
+ const key = "a";
1195
+ const ttl = TimeSpan.fromMilliseconds(50);
1196
+ await lockProvider.create(key, { ttl }).acquire();
1197
+ const result = await lockProvider
1198
+ .create(key, { ttl })
1199
+ .acquire();
1200
+ expect(result).toBe(false);
828
1201
  });
829
1202
  });
830
- describe("method: getRemainingTime", () => {
831
- test("Should return null when lock is not acquired", async () => {
1203
+ describe("method: acquireOrFail", () => {
1204
+ test("Should not throw error when key doesnt exists", async () => {
832
1205
  const key = "a";
833
1206
  const ttl = null;
834
- const owner = "b";
1207
+ const result = lockProvider
1208
+ .create(key, {
1209
+ ttl,
1210
+ })
1211
+ .acquireOrFail();
1212
+ await expect(result).resolves.toBeUndefined();
1213
+ });
1214
+ test("Should not throw error when key is expired", async () => {
1215
+ const key = "a";
1216
+ const ttl = TimeSpan.fromMilliseconds(50);
1217
+ await lockProvider.create(key, { ttl }).acquire();
1218
+ await delay(ttl);
1219
+ const result = lockProvider
1220
+ .create(key, { ttl })
1221
+ .acquireOrFail();
1222
+ await expect(result).resolves.toBeUndefined();
1223
+ });
1224
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by same owner", async () => {
1225
+ const key = "a";
1226
+ const ttl = null;
1227
+ const lock = lockProvider.create(key, { ttl });
1228
+ await lock.acquire();
1229
+ const result = lock.acquireOrFail();
1230
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1231
+ });
1232
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by same owner", async () => {
1233
+ const key = "a";
1234
+ const ttl = TimeSpan.fromMilliseconds(50);
835
1235
  const lock = lockProvider.create(key, {
836
1236
  ttl,
837
- owner,
838
1237
  });
839
- const result = await lock.getRemainingTime();
840
- expect(result).toBeNull();
1238
+ await lock.acquire();
1239
+ const result = lock.acquireOrFail();
1240
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
841
1241
  });
842
- test("Should return null when lock is acquired and has expiration", async () => {
1242
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by different owner", async () => {
843
1243
  const key = "a";
844
1244
  const ttl = null;
845
- const owner = "b";
846
- const lock = lockProvider.create(key, {
1245
+ await lockProvider.create(key, { ttl }).acquire();
1246
+ const result = lockProvider
1247
+ .create(key, { ttl })
1248
+ .acquireOrFail();
1249
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1250
+ });
1251
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by different owner", async () => {
1252
+ const key = "a";
1253
+ const ttl = TimeSpan.fromMilliseconds(50);
1254
+ await lockProvider.create(key, { ttl }).acquire();
1255
+ const result = lockProvider
1256
+ .create(key, { ttl })
1257
+ .acquireOrFail();
1258
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1259
+ });
1260
+ });
1261
+ describe("method: acquireBlocking", () => {
1262
+ test("Should return true when key doesnt exists", async () => {
1263
+ const key = "a";
1264
+ const ttl = null;
1265
+ const result = await lockProvider
1266
+ .create(key, {
847
1267
  ttl,
848
- owner,
1268
+ })
1269
+ .acquireBlocking({
1270
+ time: TimeSpan.fromMilliseconds(5),
1271
+ interval: TimeSpan.fromMilliseconds(5),
1272
+ });
1273
+ expect(result).toBe(true);
1274
+ });
1275
+ test("Should return true when key is expired", async () => {
1276
+ const key = "a";
1277
+ const ttl = TimeSpan.fromMilliseconds(50);
1278
+ await lockProvider.create(key, { ttl }).acquire();
1279
+ await delay(ttl);
1280
+ const result = await lockProvider
1281
+ .create(key, { ttl })
1282
+ .acquireBlocking({
1283
+ time: TimeSpan.fromMilliseconds(5),
1284
+ interval: TimeSpan.fromMilliseconds(5),
849
1285
  });
1286
+ expect(result).toBe(true);
1287
+ });
1288
+ test("Should return false when key is unexpireable and acquired by same owner", async () => {
1289
+ const key = "a";
1290
+ const ttl = null;
1291
+ const lock = lockProvider.create(key, { ttl });
850
1292
  await lock.acquire();
851
- const result = await lock.getRemainingTime();
852
- expect(result).toBeNull();
1293
+ const result = await lock.acquireBlocking({
1294
+ time: TimeSpan.fromMilliseconds(5),
1295
+ interval: TimeSpan.fromMilliseconds(5),
1296
+ });
1297
+ expect(result).toBe(false);
853
1298
  });
854
- test("Should return remaining time when lock is not acquired", async () => {
1299
+ test("Should return false when key is unexpired and acquired by same owner", async () => {
855
1300
  const key = "a";
856
- const ttl = TTL;
857
- const owner = "b";
1301
+ const ttl = TimeSpan.fromMilliseconds(50);
858
1302
  const lock = lockProvider.create(key, {
859
1303
  ttl,
860
- owner,
861
1304
  });
862
1305
  await lock.acquire();
863
- const result = await lock.getRemainingTime();
864
- expect(result?.toMilliseconds()).toBe(ttl.toMilliseconds());
1306
+ const result = await lock.acquireBlocking({
1307
+ time: TimeSpan.fromMilliseconds(5),
1308
+ interval: TimeSpan.fromMilliseconds(5),
1309
+ });
1310
+ expect(result).toBe(false);
865
1311
  });
866
- });
867
- describe("method: getOwner", () => {
868
- test("Should return the owner", async () => {
1312
+ test("Should return false when key is unexpireable and acquired by different owner", async () => {
869
1313
  const key = "a";
870
- const owner = "b";
871
- const lock = lockProvider.create(key, {
872
- owner,
1314
+ const ttl = null;
1315
+ await lockProvider.create(key, { ttl }).acquire();
1316
+ const result = await lockProvider
1317
+ .create(key, { ttl })
1318
+ .acquireBlocking({
1319
+ time: TimeSpan.fromMilliseconds(5),
1320
+ interval: TimeSpan.fromMilliseconds(5),
873
1321
  });
874
- const result = await lock.getOwner();
875
- expect(result).toBe(owner);
1322
+ expect(result).toBe(false);
876
1323
  });
877
- test("Should return the auto generated owner", async () => {
1324
+ test("Should return false when key is unexpired and acquired by different owner", async () => {
878
1325
  const key = "a";
879
- const lock = lockProvider.create(key);
880
- const result = await lock.getOwner();
881
- expect(result).toBeDefined();
882
- expect(typeof result).toBe("string");
1326
+ const ttl = TimeSpan.fromMilliseconds(50);
1327
+ await lockProvider.create(key, { ttl }).acquire();
1328
+ const result = await lockProvider
1329
+ .create(key, { ttl })
1330
+ .acquireBlocking({
1331
+ time: TimeSpan.fromMilliseconds(5),
1332
+ interval: TimeSpan.fromMilliseconds(5),
1333
+ });
1334
+ expect(result).toBe(false);
1335
+ });
1336
+ test("Should retry acquire the lock", async () => {
1337
+ const key = "a";
1338
+ const ttl = TimeSpan.fromMilliseconds(50);
1339
+ const lock1 = lockProvider.create(key, {
1340
+ ttl,
1341
+ });
1342
+ await lock1.acquire();
1343
+ let index = 0;
1344
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, (_event) => {
1345
+ index++;
1346
+ });
1347
+ const lock2 = lockProvider.create(key, {
1348
+ ttl,
1349
+ });
1350
+ await lock2.acquireBlocking({
1351
+ time: TimeSpan.fromMilliseconds(55),
1352
+ interval: TimeSpan.fromMilliseconds(5),
1353
+ });
1354
+ expect(index).toBeGreaterThan(1);
883
1355
  });
884
1356
  });
885
- });
886
- describe("Event tests:", () => {
887
- describe("class: Lock", () => {
888
- describe("method: run", () => {
889
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
890
- const key = "a";
891
- const owner = "b";
892
- const lock = lockProvider.create(key, {
893
- owner,
894
- ttl: TTL,
895
- });
896
- let event_ = null;
897
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
898
- event_ = event;
899
- });
900
- await lock.run(async () => {
901
- await LazyPromise.delay(DELAY_TIME);
902
- });
903
- await LazyPromise.delay(DELAY_TIME);
904
- expect(event_?.key).toBe("a");
905
- expect(event_?.owner).toBe(owner);
906
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
907
- await unsubscribe();
908
- });
909
- test("Should dispatch ReleasedLockEvent when lock is not acquired", async () => {
910
- const key = "a";
911
- const owner = "b";
912
- const lock = lockProvider.create(key, {
913
- owner,
914
- ttl: TTL,
915
- });
916
- let event_ = null;
917
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
918
- event_ = event;
919
- });
920
- await lock.run(async () => {
921
- await LazyPromise.delay(DELAY_TIME);
922
- });
923
- await LazyPromise.delay(DELAY_TIME);
924
- expect(event_?.key).toBe(key);
925
- expect(event_?.owner).toBe(owner);
926
- await unsubscribe();
927
- });
928
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
929
- const key = "a";
930
- const owner = "b";
931
- const lock = lockProvider.create(key, {
932
- owner,
933
- });
934
- let event_ = null;
935
- await lock.acquire();
936
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
937
- event_ = event;
938
- });
939
- await lock.run(async () => {
940
- await LazyPromise.delay(DELAY_TIME);
941
- });
942
- await LazyPromise.delay(DELAY_TIME);
943
- expect(event_?.key).toBe("a");
944
- expect(event_?.owner).toBe(owner);
945
- await unsubscribe();
946
- });
947
- });
948
- describe("method: runBlocking", () => {
949
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
950
- const key = "a";
951
- const owner = "b";
952
- const lock = lockProvider.create(key, {
953
- owner,
954
- ttl: TTL,
955
- });
956
- let event_ = null;
957
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
958
- event_ = event;
959
- });
960
- await lock.runBlocking(async () => {
961
- await LazyPromise.delay(DELAY_TIME);
962
- }, {
963
- time: TimeSpan.fromMilliseconds(5),
964
- interval: TimeSpan.fromMilliseconds(5),
965
- });
966
- await LazyPromise.delay(DELAY_TIME);
967
- expect(event_?.key).toBe("a");
968
- expect(event_?.owner).toBe(owner);
969
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
970
- await unsubscribe();
971
- });
972
- test("Should dispatch ReleasedLockEvent when lock is not acquired", async () => {
973
- const key = "a";
974
- const owner = "b";
975
- const lock = lockProvider.create(key, {
976
- owner,
977
- ttl: TTL,
978
- });
979
- let event_ = null;
980
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
981
- event_ = event;
982
- });
983
- await lock.runBlocking(async () => {
984
- await LazyPromise.delay(DELAY_TIME);
985
- }, {
986
- time: TimeSpan.fromMilliseconds(5),
1357
+ describe("method: acquireBlockingOrFail", () => {
1358
+ test("Should not throw error when key doesnt exists", async () => {
1359
+ const key = "a";
1360
+ const ttl = null;
1361
+ const result = lockProvider
1362
+ .create(key, {
1363
+ ttl,
1364
+ })
1365
+ .acquireBlockingOrFail({
1366
+ time: TimeSpan.fromMilliseconds(5),
1367
+ interval: TimeSpan.fromMilliseconds(5),
1368
+ });
1369
+ await expect(result).resolves.toBeUndefined();
1370
+ });
1371
+ test("Should not throw error when key is expired", async () => {
1372
+ const key = "a";
1373
+ const ttl = TimeSpan.fromMilliseconds(50);
1374
+ await lockProvider.create(key, { ttl }).acquire();
1375
+ await delay(ttl);
1376
+ const result = lockProvider
1377
+ .create(key, { ttl })
1378
+ .acquireBlockingOrFail({
1379
+ time: TimeSpan.fromMilliseconds(5),
1380
+ interval: TimeSpan.fromMilliseconds(5),
1381
+ });
1382
+ await expect(result).resolves.toBeUndefined();
1383
+ });
1384
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by same owner", async () => {
1385
+ const key = "a";
1386
+ const ttl = null;
1387
+ const lock = lockProvider.create(key, { ttl });
1388
+ await lock.acquire();
1389
+ const result = lock.acquireBlockingOrFail({
1390
+ time: TimeSpan.fromMilliseconds(5),
1391
+ interval: TimeSpan.fromMilliseconds(5),
1392
+ });
1393
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1394
+ });
1395
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by same owner", async () => {
1396
+ const key = "a";
1397
+ const ttl = TimeSpan.fromMilliseconds(50);
1398
+ const lock = lockProvider.create(key, {
1399
+ ttl,
1400
+ });
1401
+ await lock.acquire();
1402
+ const result = lock.acquireBlockingOrFail({
1403
+ time: TimeSpan.fromMilliseconds(5),
1404
+ interval: TimeSpan.fromMilliseconds(5),
1405
+ });
1406
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1407
+ });
1408
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpireable and acquired by different owner", async () => {
1409
+ const key = "a";
1410
+ const ttl = null;
1411
+ await lockProvider.create(key, { ttl }).acquire();
1412
+ const result = lockProvider
1413
+ .create(key, { ttl })
1414
+ .acquireBlockingOrFail({
1415
+ time: TimeSpan.fromMilliseconds(5),
1416
+ interval: TimeSpan.fromMilliseconds(5),
1417
+ });
1418
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1419
+ });
1420
+ test("Should throw KeyAlreadyAcquiredLockError when key is unexpired and acquired by different owner", async () => {
1421
+ const key = "a";
1422
+ const ttl = TimeSpan.fromMilliseconds(50);
1423
+ await lockProvider.create(key, { ttl }).acquire();
1424
+ const result = lockProvider
1425
+ .create(key, { ttl })
1426
+ .acquireBlockingOrFail({
1427
+ time: TimeSpan.fromMilliseconds(5),
1428
+ interval: TimeSpan.fromMilliseconds(5),
1429
+ });
1430
+ await expect(result).rejects.toBeInstanceOf(KeyAlreadyAcquiredLockError);
1431
+ });
1432
+ test("Should retry acquire the lock", async () => {
1433
+ const key = "a";
1434
+ const ttl = TimeSpan.fromMilliseconds(50);
1435
+ const lock1 = lockProvider.create(key, {
1436
+ ttl,
1437
+ });
1438
+ await lock1.acquire();
1439
+ let index = 0;
1440
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, (_event) => {
1441
+ index++;
1442
+ });
1443
+ const lock2 = lockProvider.create(key, {
1444
+ ttl,
1445
+ });
1446
+ try {
1447
+ await lock2.acquireBlockingOrFail({
1448
+ time: TimeSpan.fromMilliseconds(55),
987
1449
  interval: TimeSpan.fromMilliseconds(5),
988
1450
  });
989
- await LazyPromise.delay(DELAY_TIME);
990
- expect(event_?.key).toBe(key);
991
- expect(event_?.owner).toBe(owner);
992
- await unsubscribe();
993
- });
994
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
995
- const key = "a";
996
- const owner = "b";
997
- const lock = lockProvider.create(key, {
998
- owner,
999
- });
1000
- let event_ = null;
1001
- await lock.acquire();
1002
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1003
- event_ = event;
1004
- });
1005
- await lock.runBlocking(async () => {
1006
- await LazyPromise.delay(DELAY_TIME);
1007
- }, {
1451
+ }
1452
+ catch {
1453
+ /* EMPTY */
1454
+ }
1455
+ expect(index).toBeGreaterThan(1);
1456
+ });
1457
+ });
1458
+ describe("method: release", () => {
1459
+ test("Should return false when key doesnt exists", async () => {
1460
+ const key = "a";
1461
+ const result = await lockProvider.create(key).release();
1462
+ expect(result).toBe(false);
1463
+ });
1464
+ test("Should return false when key is unexpireable and released by different owner", async () => {
1465
+ const key = "a";
1466
+ const ttl = null;
1467
+ await lockProvider.create(key, { ttl }).acquire();
1468
+ const result = await lockProvider
1469
+ .create(key, { ttl })
1470
+ .release();
1471
+ expect(result).toBe(false);
1472
+ });
1473
+ test("Should return false when key is unexpired and released by different owner", async () => {
1474
+ const key = "a";
1475
+ const ttl = TimeSpan.fromMilliseconds(50);
1476
+ await lockProvider.create(key, { ttl }).acquire();
1477
+ const result = await lockProvider
1478
+ .create(key, { ttl })
1479
+ .release();
1480
+ expect(result).toBe(false);
1481
+ });
1482
+ test("Should return false when key is expired and released by different owner", async () => {
1483
+ const key = "a";
1484
+ const ttl = TimeSpan.fromMilliseconds(50);
1485
+ await lockProvider.create(key, { ttl }).acquire();
1486
+ const result = await lockProvider
1487
+ .create(key, { ttl })
1488
+ .release();
1489
+ await delay(ttl);
1490
+ expect(result).toBe(false);
1491
+ });
1492
+ test("Should return false when key is expired and released by same owner", async () => {
1493
+ const key = "a";
1494
+ const ttl = TimeSpan.fromMilliseconds(50);
1495
+ const lock = lockProvider.create(key, { ttl });
1496
+ await lock.acquire();
1497
+ await delay(ttl);
1498
+ const result = await lock.release();
1499
+ expect(result).toBe(false);
1500
+ });
1501
+ test("Should return true when key is unexpireable and released by same owner", async () => {
1502
+ const key = "a";
1503
+ const ttl = null;
1504
+ const lock = lockProvider.create(key, { ttl });
1505
+ await lock.acquire();
1506
+ const result = await lock.release();
1507
+ expect(result).toBe(true);
1508
+ });
1509
+ test("Should return true when key is unexpired and released by same owner", async () => {
1510
+ const key = "a";
1511
+ const ttl = TimeSpan.fromMilliseconds(50);
1512
+ const lock = lockProvider.create(key, { ttl });
1513
+ await lock.acquire();
1514
+ const result = await lock.release();
1515
+ expect(result).toBe(true);
1516
+ });
1517
+ test("Should not be reacquirable when key is unexpireable and released by different owner", async () => {
1518
+ const key = "a";
1519
+ const ttl = null;
1520
+ const lock1 = lockProvider.create(key, { ttl });
1521
+ await lock1.acquire();
1522
+ const lock2 = lockProvider.create(key, { ttl });
1523
+ await lock2.release();
1524
+ const result = await lock2.acquire();
1525
+ expect(result).toBe(false);
1526
+ });
1527
+ test("Should not be reacquirable when key is unexpired and released by different owner", async () => {
1528
+ const key = "a";
1529
+ const ttl = TimeSpan.fromMilliseconds(50);
1530
+ const lock1 = lockProvider.create(key, { ttl });
1531
+ await lock1.acquire();
1532
+ const lock2 = lockProvider.create(key, { ttl });
1533
+ await lock2.release();
1534
+ const result = await lock2.acquire();
1535
+ expect(result).toBe(false);
1536
+ });
1537
+ test("Should be reacquirable when key is unexpireable and released by same owner", async () => {
1538
+ const key = "a";
1539
+ const ttl = null;
1540
+ const lock1 = lockProvider.create(key, { ttl });
1541
+ await lock1.acquire();
1542
+ await lock1.release();
1543
+ const lock2 = lockProvider.create(key, { ttl });
1544
+ const result = await lock2.acquire();
1545
+ expect(result).toBe(true);
1546
+ });
1547
+ test("Should be reacquirable when key is unexpired and released by same owner", async () => {
1548
+ const key = "a";
1549
+ const ttl = TimeSpan.fromMilliseconds(50);
1550
+ const lock1 = lockProvider.create(key, { ttl });
1551
+ await lock1.acquire();
1552
+ await lock1.release();
1553
+ const lock2 = lockProvider.create(key, { ttl });
1554
+ const result = await lock2.acquire();
1555
+ expect(result).toBe(true);
1556
+ });
1557
+ });
1558
+ describe("method: releaseOrFail", () => {
1559
+ test("Should throw UnownedReleaseLockError when key doesnt exists", async () => {
1560
+ const key = "a";
1561
+ const result = lockProvider.create(key).releaseOrFail();
1562
+ await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
1563
+ });
1564
+ test("Should throw UnownedReleaseLockError when key is unexpireable and released by different owner", async () => {
1565
+ const key = "a";
1566
+ const ttl = null;
1567
+ await lockProvider.create(key, { ttl }).acquire();
1568
+ const result = lockProvider
1569
+ .create(key, { ttl })
1570
+ .releaseOrFail();
1571
+ await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
1572
+ });
1573
+ test("Should throw UnownedReleaseLockError when key is unexpired and released by different owner", async () => {
1574
+ const key = "a";
1575
+ const ttl = TimeSpan.fromMilliseconds(50);
1576
+ await lockProvider.create(key, { ttl }).acquire();
1577
+ const result = lockProvider
1578
+ .create(key, { ttl })
1579
+ .releaseOrFail();
1580
+ await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
1581
+ });
1582
+ test("Should throw UnownedReleaseLockError when key is expired and released by different owner", async () => {
1583
+ const key = "a";
1584
+ const ttl = TimeSpan.fromMilliseconds(50);
1585
+ await lockProvider.create(key, { ttl }).acquire();
1586
+ const result = lockProvider
1587
+ .create(key, { ttl })
1588
+ .releaseOrFail();
1589
+ await delay(ttl);
1590
+ await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
1591
+ });
1592
+ test("Should throw UnownedReleaseLockError when key is expired and released by same owner", async () => {
1593
+ const key = "a";
1594
+ const ttl = TimeSpan.fromMilliseconds(50);
1595
+ const lock = lockProvider.create(key, { ttl });
1596
+ await lock.acquire();
1597
+ await delay(ttl);
1598
+ const result = lock.releaseOrFail();
1599
+ await expect(result).rejects.toBeInstanceOf(UnownedReleaseLockError);
1600
+ });
1601
+ test("Should not throw error when key is unexpireable and released by same owner", async () => {
1602
+ const key = "a";
1603
+ const ttl = null;
1604
+ const lock = lockProvider.create(key, { ttl });
1605
+ await lock.acquire();
1606
+ const result = lock.releaseOrFail();
1607
+ await expect(result).resolves.toBeUndefined();
1608
+ });
1609
+ test("Should not throw error when key is unexpired and released by same owner", async () => {
1610
+ const key = "a";
1611
+ const ttl = TimeSpan.fromMilliseconds(50);
1612
+ const lock = lockProvider.create(key, { ttl });
1613
+ await lock.acquire();
1614
+ const result = lock.releaseOrFail();
1615
+ await expect(result).resolves.toBeUndefined();
1616
+ });
1617
+ test("Should not be reacquirable when key is unexpireable and released by different owner", async () => {
1618
+ const key = "a";
1619
+ const ttl = null;
1620
+ const lock1 = lockProvider.create(key, { ttl });
1621
+ await lock1.acquire();
1622
+ const lock2 = lockProvider.create(key, { ttl });
1623
+ try {
1624
+ await lock2.releaseOrFail();
1625
+ }
1626
+ catch {
1627
+ /* EMPTY */
1628
+ }
1629
+ const result = await lock2.acquire();
1630
+ expect(result).toBe(false);
1631
+ });
1632
+ test("Should not be reacquirable when key is unexpired and released by different owner", async () => {
1633
+ const key = "a";
1634
+ const ttl = TimeSpan.fromMilliseconds(50);
1635
+ const lock1 = lockProvider.create(key, { ttl });
1636
+ await lock1.acquire();
1637
+ const lock2 = lockProvider.create(key, { ttl });
1638
+ try {
1639
+ await lock2.releaseOrFail();
1640
+ }
1641
+ catch {
1642
+ /* EMPTY */
1643
+ }
1644
+ const result = await lock2.acquire();
1645
+ expect(result).toBe(false);
1646
+ });
1647
+ test("Should be reacquirable when key is unexpireable and released by same owner", async () => {
1648
+ const key = "a";
1649
+ const ttl = null;
1650
+ const lock1 = lockProvider.create(key, { ttl });
1651
+ await lock1.acquire();
1652
+ await lock1.releaseOrFail();
1653
+ const lock2 = lockProvider.create(key, { ttl });
1654
+ const result = await lock2.acquire();
1655
+ expect(result).toBe(true);
1656
+ });
1657
+ test("Should be reacquirable when key is unexpired and released by same owner", async () => {
1658
+ const key = "a";
1659
+ const ttl = TimeSpan.fromMilliseconds(50);
1660
+ const lock1 = lockProvider.create(key, { ttl });
1661
+ await lock1.acquire();
1662
+ await lock1.releaseOrFail();
1663
+ const lock2 = lockProvider.create(key, { ttl });
1664
+ const result = await lock2.acquire();
1665
+ expect(result).toBe(true);
1666
+ });
1667
+ });
1668
+ describe("method: forceRelease", () => {
1669
+ test("Should return false when key doesnt exists", async () => {
1670
+ const key = "a";
1671
+ const result = await lockProvider.create(key).forceRelease();
1672
+ expect(result).toBe(false);
1673
+ });
1674
+ test("Should return false when key is expired", async () => {
1675
+ const key = "a";
1676
+ const ttl = TimeSpan.fromMilliseconds(50);
1677
+ const lock = lockProvider.create(key, {
1678
+ ttl,
1679
+ });
1680
+ await lock.acquire();
1681
+ await delay(ttl);
1682
+ const result = await lock.forceRelease();
1683
+ expect(result).toBe(false);
1684
+ });
1685
+ test("Should return true when key is uenxpired", async () => {
1686
+ const key = "a";
1687
+ const ttl = TimeSpan.fromMilliseconds(50);
1688
+ const lock = lockProvider.create(key, { ttl });
1689
+ await lock.acquire();
1690
+ const result = await lock.forceRelease();
1691
+ expect(result).toBe(true);
1692
+ });
1693
+ test("Should return true when key is unexpireable", async () => {
1694
+ const key = "a";
1695
+ const ttl = null;
1696
+ const lock = lockProvider.create(key, { ttl });
1697
+ await lock.acquire();
1698
+ const result = await lock.forceRelease();
1699
+ expect(result).toBe(true);
1700
+ });
1701
+ test("Should be reacquirable when key is uenxpired", async () => {
1702
+ const key = "a";
1703
+ const ttl = TimeSpan.fromMilliseconds(50);
1704
+ const lock = lockProvider.create(key, { ttl });
1705
+ await lock.acquire();
1706
+ await lock.forceRelease();
1707
+ const result = await lock.acquire();
1708
+ expect(result).toBe(true);
1709
+ });
1710
+ test("Should be reacquirable when key is unexpireable", async () => {
1711
+ const key = "a";
1712
+ const ttl = null;
1713
+ const lock = lockProvider.create(key, { ttl });
1714
+ await lock.acquire();
1715
+ await lock.forceRelease();
1716
+ const result = await lock.acquire();
1717
+ expect(result).toBe(true);
1718
+ });
1719
+ });
1720
+ describe("method: isExpired", () => {
1721
+ test("Should return false when lock has no expiration", async () => {
1722
+ const key = "a";
1723
+ const ttl = null;
1724
+ const owner = "b";
1725
+ const lock = lockProvider.create(key, {
1726
+ ttl,
1727
+ owner,
1728
+ });
1729
+ await lock.acquire();
1730
+ const result = await lock.isExpired();
1731
+ expect(result).toBe(false);
1732
+ });
1733
+ test("Should return false when lock has not expired", async () => {
1734
+ const key = "a";
1735
+ const owner = "b";
1736
+ const ttl = TimeSpan.fromMilliseconds(50);
1737
+ const lock = lockProvider.create(key, {
1738
+ ttl,
1739
+ owner,
1740
+ });
1741
+ await lock.acquire();
1742
+ const result = await lock.isExpired();
1743
+ expect(result).toBe(false);
1744
+ });
1745
+ test("Should return true when lock has expired", async () => {
1746
+ const key = "a";
1747
+ const owner = "b";
1748
+ const ttl = TimeSpan.fromMilliseconds(50);
1749
+ const lock = lockProvider.create(key, {
1750
+ ttl,
1751
+ owner,
1752
+ });
1753
+ await lock.acquire();
1754
+ await delay(ttl);
1755
+ const result = await lock.isExpired();
1756
+ expect(result).toBe(true);
1757
+ });
1758
+ });
1759
+ describe("method: isLocked", () => {
1760
+ test("Should return true when lock has no expiration", async () => {
1761
+ const key = "a";
1762
+ const ttl = null;
1763
+ const owner = "b";
1764
+ const lock = lockProvider.create(key, {
1765
+ ttl,
1766
+ owner,
1767
+ });
1768
+ await lock.acquire();
1769
+ const result = await lock.isLocked();
1770
+ expect(result).toBe(true);
1771
+ });
1772
+ test("Should return true when lock has not expired", async () => {
1773
+ const key = "a";
1774
+ const owner = "b";
1775
+ const ttl = TimeSpan.fromMilliseconds(50);
1776
+ const lock = lockProvider.create(key, {
1777
+ ttl,
1778
+ owner,
1779
+ });
1780
+ await lock.acquire();
1781
+ const result = await lock.isLocked();
1782
+ expect(result).toBe(true);
1783
+ });
1784
+ test("Should return false when lock has expired", async () => {
1785
+ const key = "a";
1786
+ const owner = "b";
1787
+ const ttl = TimeSpan.fromMilliseconds(50);
1788
+ const lock = lockProvider.create(key, {
1789
+ ttl,
1790
+ owner,
1791
+ });
1792
+ await lock.acquire();
1793
+ await delay(ttl);
1794
+ const result = await lock.isLocked();
1795
+ expect(result).toBe(false);
1796
+ });
1797
+ });
1798
+ describe("method: refresh", () => {
1799
+ test("Should return false when key doesnt exists", async () => {
1800
+ const key = "a";
1801
+ const newTtl = TimeSpan.fromMinutes(1);
1802
+ const result = await lockProvider.create(key).refresh(newTtl);
1803
+ expect(result).toBe(false);
1804
+ });
1805
+ test("Should return false when key is unexpireable and refreshed by different owner", async () => {
1806
+ const key = "a";
1807
+ const ttl = null;
1808
+ const lock1 = lockProvider.create(key, { ttl });
1809
+ await lock1.acquire();
1810
+ const newTtl = TimeSpan.fromMinutes(1);
1811
+ const lock2 = lockProvider.create(key, { ttl });
1812
+ const result = await lock2.refresh(newTtl);
1813
+ expect(result).toBe(false);
1814
+ });
1815
+ test("Should return false when key is unexpired and refreshed by different owner", async () => {
1816
+ const key = "a";
1817
+ const ttl = TimeSpan.fromMilliseconds(50);
1818
+ const lock1 = lockProvider.create(key, { ttl });
1819
+ await lock1.acquire();
1820
+ const newTtl = TimeSpan.fromMinutes(1);
1821
+ const lock2 = lockProvider.create(key, { ttl });
1822
+ const result = await lock2.refresh(newTtl);
1823
+ expect(result).toBe(false);
1824
+ });
1825
+ test("Should return false when key is expired and refreshed by different owner", async () => {
1826
+ const key = "a";
1827
+ const ttl = TimeSpan.fromMilliseconds(50);
1828
+ const lock1 = lockProvider.create(key, { ttl });
1829
+ await lock1.acquire();
1830
+ await delay(ttl);
1831
+ const newTtl = TimeSpan.fromMinutes(1);
1832
+ const lock2 = lockProvider.create(key, { ttl });
1833
+ const result = await lock2.refresh(newTtl);
1834
+ expect(result).toBe(false);
1835
+ });
1836
+ test("Should return false when key is expired and refreshed by same owner", async () => {
1837
+ const key = "a";
1838
+ const ttl = TimeSpan.fromMilliseconds(50);
1839
+ const lock = lockProvider.create(key, {
1840
+ ttl,
1841
+ });
1842
+ await lock.acquire();
1843
+ await delay(ttl);
1844
+ const newTtl = TimeSpan.fromMinutes(1);
1845
+ const result = await lock.refresh(newTtl);
1846
+ expect(result).toBe(false);
1847
+ });
1848
+ test("Should return false when key is unexpireable and refreshed by same owner", async () => {
1849
+ const key = "a";
1850
+ const ttl = null;
1851
+ const lock = lockProvider.create(key, { ttl });
1852
+ await lock.acquire();
1853
+ const newTtl = TimeSpan.fromMinutes(1);
1854
+ const result = await lock.refresh(newTtl);
1855
+ expect(result).toBe(false);
1856
+ });
1857
+ test("Should return true when key is unexpired and refreshed by same owner", async () => {
1858
+ const key = "a";
1859
+ const ttl = TimeSpan.fromMilliseconds(50);
1860
+ const lock = lockProvider.create(key, { ttl });
1861
+ await lock.acquire();
1862
+ const newTtl = TimeSpan.fromMinutes(1);
1863
+ const result = await lock.refresh(newTtl);
1864
+ expect(result).toBe(true);
1865
+ });
1866
+ test("Should not update expiration when key is unexpireable and refreshed by same owner", async () => {
1867
+ const key = "a";
1868
+ const ttl = null;
1869
+ const lock1 = lockProvider.create(key, { ttl });
1870
+ await lock1.acquire();
1871
+ const newTtl = TimeSpan.fromMilliseconds(50);
1872
+ await lock1.refresh(newTtl);
1873
+ await delay(newTtl);
1874
+ const lock2 = lockProvider.create(key, { ttl });
1875
+ const result = await lock2.acquire();
1876
+ expect(result).toBe(false);
1877
+ });
1878
+ test("Should update expiration when key is unexpired and refreshed by same owner", async () => {
1879
+ const key = "a";
1880
+ const ttl = TimeSpan.fromMilliseconds(50);
1881
+ const lock1 = lockProvider.create(key, { ttl });
1882
+ await lock1.acquire();
1883
+ const newTtl = TimeSpan.fromMilliseconds(100);
1884
+ await lock1.refresh(newTtl);
1885
+ await delay(newTtl.divide(2));
1886
+ const lock2 = lockProvider.create(key, { ttl });
1887
+ const result1 = await lock2.acquire();
1888
+ expect(result1).toBe(false);
1889
+ await delay(newTtl.divide(2));
1890
+ const result2 = await lock2.acquire();
1891
+ expect(result2).toBe(true);
1892
+ });
1893
+ });
1894
+ describe("method: refreshOrFail", () => {
1895
+ test("Should throw UnownedRefreshLockError when key doesnt exists", async () => {
1896
+ const key = "a";
1897
+ const newTtl = TimeSpan.fromMinutes(1);
1898
+ const result = lockProvider.create(key).refreshOrFail(newTtl);
1899
+ await expect(result).rejects.toBeInstanceOf(UnownedRefreshLockError);
1900
+ });
1901
+ test("Should throw UnownedRefreshLockError when key is unexpireable and refreshed by different owner", async () => {
1902
+ const key = "a";
1903
+ const ttl = null;
1904
+ const lock1 = lockProvider.create(key, { ttl });
1905
+ await lock1.acquire();
1906
+ const newTtl = TimeSpan.fromMinutes(1);
1907
+ const lock2 = lockProvider.create(key, { ttl });
1908
+ const result = lock2.refreshOrFail(newTtl);
1909
+ await expect(result).rejects.toBeInstanceOf(UnownedRefreshLockError);
1910
+ });
1911
+ test("Should throw UnownedRefreshLockError when key is unexpired and refreshed by different owner", async () => {
1912
+ const key = "a";
1913
+ const ttl = TimeSpan.fromMilliseconds(50);
1914
+ const lock1 = lockProvider.create(key, { ttl });
1915
+ await lock1.acquire();
1916
+ const newTtl = TimeSpan.fromMinutes(1);
1917
+ const lock2 = lockProvider.create(key, { ttl });
1918
+ const result = lock2.refreshOrFail(newTtl);
1919
+ await expect(result).rejects.toBeInstanceOf(UnownedRefreshLockError);
1920
+ });
1921
+ test("Should throw UnownedRefreshLockError when key is expired and refreshed by different owner", async () => {
1922
+ const key = "a";
1923
+ const ttl = TimeSpan.fromMilliseconds(50);
1924
+ const lock1 = lockProvider.create(key, { ttl });
1925
+ await lock1.acquire();
1926
+ await delay(ttl);
1927
+ const newTtl = TimeSpan.fromMinutes(1);
1928
+ const lock2 = lockProvider.create(key, { ttl });
1929
+ const result = lock2.refreshOrFail(newTtl);
1930
+ await expect(result).rejects.toBeInstanceOf(UnownedRefreshLockError);
1931
+ });
1932
+ test("Should throw UnownedRefreshLockError when key is expired and refreshed by same owner", async () => {
1933
+ const key = "a";
1934
+ const ttl = TimeSpan.fromMilliseconds(50);
1935
+ const lock = lockProvider.create(key, {
1936
+ ttl,
1937
+ });
1938
+ await lock.acquire();
1939
+ await delay(ttl);
1940
+ const newTtl = TimeSpan.fromMinutes(1);
1941
+ const result = lock.refreshOrFail(newTtl);
1942
+ await expect(result).rejects.toBeInstanceOf(UnownedRefreshLockError);
1943
+ });
1944
+ test("Should throw UnrefreshableKeyLockError when key is unexpireable and refreshed by same owner", async () => {
1945
+ const key = "a";
1946
+ const ttl = null;
1947
+ const lock = lockProvider.create(key, { ttl });
1948
+ await lock.acquire();
1949
+ const newTtl = TimeSpan.fromMinutes(1);
1950
+ const result = lock.refreshOrFail(newTtl);
1951
+ await expect(result).rejects.toBeInstanceOf(UnrefreshableKeyLockError);
1952
+ });
1953
+ test("Should not throw error when key is unexpired and refreshed by same owner", async () => {
1954
+ const key = "a";
1955
+ const ttl = TimeSpan.fromMilliseconds(50);
1956
+ const lock = lockProvider.create(key, { ttl });
1957
+ await lock.acquire();
1958
+ const newTtl = TimeSpan.fromMinutes(1);
1959
+ const result = lock.refreshOrFail(newTtl);
1960
+ await expect(result).resolves.toBeUndefined();
1961
+ });
1962
+ test("Should not update expiration when key is unexpireable and refreshed by same owner", async () => {
1963
+ const key = "a";
1964
+ const ttl = null;
1965
+ const lock1 = lockProvider.create(key, { ttl });
1966
+ await lock1.acquire();
1967
+ const newTtl = TimeSpan.fromMilliseconds(50);
1968
+ try {
1969
+ await lock1.refreshOrFail(newTtl);
1970
+ }
1971
+ catch {
1972
+ /* EMPTY */
1973
+ }
1974
+ await delay(newTtl);
1975
+ const lock2 = lockProvider.create(key, { ttl });
1976
+ const result = await lock2.acquire();
1977
+ expect(result).toBe(false);
1978
+ });
1979
+ test("Should update expiration when key is unexpired and refreshed by same owner", async () => {
1980
+ const key = "a";
1981
+ const ttl = TimeSpan.fromMilliseconds(50);
1982
+ const lock1 = lockProvider.create(key, { ttl });
1983
+ await lock1.acquire();
1984
+ const newTtl = TimeSpan.fromMilliseconds(100);
1985
+ await lock1.refreshOrFail(newTtl);
1986
+ await delay(newTtl.divide(2));
1987
+ const lock2 = lockProvider.create(key, { ttl });
1988
+ const result1 = await lock2.acquire();
1989
+ expect(result1).toBe(false);
1990
+ await delay(newTtl.divide(2));
1991
+ const result2 = await lock2.acquire();
1992
+ expect(result2).toBe(true);
1993
+ });
1994
+ });
1995
+ describe("method: getRemainingTime", () => {
1996
+ test("Should return null when lock is not acquired", async () => {
1997
+ const key = "a";
1998
+ const ttl = null;
1999
+ const owner = "b";
2000
+ const lock = lockProvider.create(key, {
2001
+ ttl,
2002
+ owner,
2003
+ });
2004
+ const result = await lock.getRemainingTime();
2005
+ expect(result).toBeNull();
2006
+ });
2007
+ test("Should return null when lock is acquired and has expiration", async () => {
2008
+ const key = "a";
2009
+ const ttl = null;
2010
+ const owner = "b";
2011
+ const lock = lockProvider.create(key, {
2012
+ ttl,
2013
+ owner,
2014
+ });
2015
+ await lock.acquire();
2016
+ const result = await lock.getRemainingTime();
2017
+ expect(result).toBeNull();
2018
+ });
2019
+ test("Should return remaining time when lock is not acquired", async () => {
2020
+ const key = "a";
2021
+ const ttl = TimeSpan.fromMilliseconds(50);
2022
+ const owner = "b";
2023
+ const lock = lockProvider.create(key, {
2024
+ ttl,
2025
+ owner,
2026
+ });
2027
+ await lock.acquire();
2028
+ const result = await lock.getRemainingTime();
2029
+ expect(result?.toMilliseconds()).toBe(ttl.toMilliseconds());
2030
+ });
2031
+ });
2032
+ describe("method: getOwner", () => {
2033
+ test("Should return the owner", async () => {
2034
+ const key = "a";
2035
+ const owner = "b";
2036
+ const lock = lockProvider.create(key, {
2037
+ owner,
2038
+ });
2039
+ const result = await lock.getOwner();
2040
+ expect(result).toBe(owner);
2041
+ });
2042
+ test("Should return the auto generated owner", async () => {
2043
+ const key = "a";
2044
+ const lock = lockProvider.create(key);
2045
+ const result = await lock.getOwner();
2046
+ expect(result).toBeDefined();
2047
+ expect(typeof result).toBe("string");
2048
+ });
2049
+ });
2050
+ });
2051
+ describe("Event tests:", () => {
2052
+ describe("method: acquire", () => {
2053
+ test("Should dispatch AcquiredLockEvent when key doesnt exists", async () => {
2054
+ const key = "a";
2055
+ const owner = "b";
2056
+ const ttl = null;
2057
+ const handlerFn = vi.fn((_event) => { });
2058
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2059
+ await lockProvider
2060
+ .create(key, {
2061
+ ttl,
2062
+ owner,
2063
+ })
2064
+ .acquire();
2065
+ await delay(TimeSpan.fromMilliseconds(10));
2066
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2067
+ expect(handlerFn).toHaveBeenCalledWith({
2068
+ key,
2069
+ owner,
2070
+ ttl,
2071
+ });
2072
+ });
2073
+ test("Should dispatch AcquiredLockEvent when key is expired", async () => {
2074
+ const key = "a";
2075
+ const ttl = TimeSpan.fromMilliseconds(50);
2076
+ await lockProvider.create(key, { ttl }).acquire();
2077
+ await delay(ttl);
2078
+ const handlerFn = vi.fn((_event) => { });
2079
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2080
+ const owner = "b";
2081
+ const ttl2 = null;
2082
+ await lockProvider.create(key, { ttl: ttl2, owner }).acquire();
2083
+ await delay(TimeSpan.fromMilliseconds(10));
2084
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2085
+ expect(handlerFn).toHaveBeenCalledWith({
2086
+ key,
2087
+ owner,
2088
+ ttl: ttl2,
2089
+ });
2090
+ });
2091
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by same owner", async () => {
2092
+ const key = "a";
2093
+ const owner = "b";
2094
+ const ttl = null;
2095
+ const lock = lockProvider.create(key, { ttl, owner });
2096
+ await lock.acquire();
2097
+ const handlerFn = vi.fn((_event) => { });
2098
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2099
+ await lock.acquire();
2100
+ await delay(TimeSpan.fromMilliseconds(10));
2101
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2102
+ expect(handlerFn).toHaveBeenCalledWith({
2103
+ key,
2104
+ owner,
2105
+ });
2106
+ });
2107
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by same owner", async () => {
2108
+ const key = "a";
2109
+ const owner = "b";
2110
+ const ttl = TimeSpan.fromMilliseconds(50);
2111
+ const lock = lockProvider.create(key, {
2112
+ ttl,
2113
+ owner,
2114
+ });
2115
+ await lock.acquire();
2116
+ const handlerFn = vi.fn((_event) => { });
2117
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2118
+ await lock.acquire();
2119
+ await delay(TimeSpan.fromMilliseconds(10));
2120
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2121
+ expect(handlerFn).toHaveBeenCalledWith({
2122
+ key,
2123
+ owner,
2124
+ });
2125
+ });
2126
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by different owner", async () => {
2127
+ const key = "a";
2128
+ const ttl = null;
2129
+ await lockProvider.create(key, { ttl }).acquire();
2130
+ const handlerFn = vi.fn((_event) => { });
2131
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2132
+ const owner = "b";
2133
+ await lockProvider.create(key, { ttl, owner }).acquire();
2134
+ await delay(TimeSpan.fromMilliseconds(10));
2135
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2136
+ expect(handlerFn).toHaveBeenCalledWith({
2137
+ key,
2138
+ owner,
2139
+ });
2140
+ });
2141
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by different owner", async () => {
2142
+ const key = "a";
2143
+ const ttl = TimeSpan.fromMilliseconds(50);
2144
+ await lockProvider.create(key, { ttl }).acquire();
2145
+ const handlerFn = vi.fn((_event) => { });
2146
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2147
+ const owner = "b";
2148
+ await lockProvider.create(key, { ttl, owner }).acquire();
2149
+ await delay(TimeSpan.fromMilliseconds(10));
2150
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2151
+ expect(handlerFn).toHaveBeenCalledWith({
2152
+ key,
2153
+ owner,
2154
+ });
2155
+ });
2156
+ });
2157
+ describe("method: acquireOrFail", () => {
2158
+ test("Should dispatch AcquiredLockEvent when key doesnt exists", async () => {
2159
+ const key = "a";
2160
+ const owner = "b";
2161
+ const ttl = null;
2162
+ const handlerFn = vi.fn((_event) => { });
2163
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2164
+ await lockProvider
2165
+ .create(key, {
2166
+ ttl,
2167
+ owner,
2168
+ })
2169
+ .acquireOrFail();
2170
+ await delay(TimeSpan.fromMilliseconds(10));
2171
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2172
+ expect(handlerFn).toHaveBeenCalledWith({
2173
+ key,
2174
+ owner,
2175
+ ttl,
2176
+ });
2177
+ });
2178
+ test("Should dispatch AcquiredLockEvent when key is expired", async () => {
2179
+ const key = "a";
2180
+ const ttl = TimeSpan.fromMilliseconds(50);
2181
+ await lockProvider.create(key, { ttl }).acquire();
2182
+ await delay(ttl);
2183
+ const handlerFn = vi.fn((_event) => { });
2184
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2185
+ const owner = "b";
2186
+ const ttl2 = null;
2187
+ await lockProvider
2188
+ .create(key, { ttl: ttl2, owner })
2189
+ .acquireOrFail();
2190
+ await delay(TimeSpan.fromMilliseconds(10));
2191
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2192
+ expect(handlerFn).toHaveBeenCalledWith({
2193
+ key,
2194
+ owner,
2195
+ ttl: ttl2,
2196
+ });
2197
+ });
2198
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by same owner", async () => {
2199
+ const key = "a";
2200
+ const owner = "b";
2201
+ const ttl = null;
2202
+ const lock = lockProvider.create(key, { ttl, owner });
2203
+ await lock.acquire();
2204
+ const handlerFn = vi.fn((_event) => { });
2205
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2206
+ try {
2207
+ await lock.acquireOrFail();
2208
+ }
2209
+ catch {
2210
+ /* EMPTY */
2211
+ }
2212
+ await delay(TimeSpan.fromMilliseconds(10));
2213
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2214
+ expect(handlerFn).toHaveBeenCalledWith({
2215
+ key,
2216
+ owner,
2217
+ });
2218
+ });
2219
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by same owner", async () => {
2220
+ const key = "a";
2221
+ const owner = "b";
2222
+ const ttl = TimeSpan.fromMilliseconds(50);
2223
+ const lock = lockProvider.create(key, {
2224
+ ttl,
2225
+ owner,
2226
+ });
2227
+ await lock.acquire();
2228
+ const handlerFn = vi.fn((_event) => { });
2229
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2230
+ try {
2231
+ await lock.acquireOrFail();
2232
+ }
2233
+ catch {
2234
+ /* EMPTY */
2235
+ }
2236
+ await delay(TimeSpan.fromMilliseconds(10));
2237
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2238
+ expect(handlerFn).toHaveBeenCalledWith({
2239
+ key,
2240
+ owner,
2241
+ });
2242
+ });
2243
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by different owner", async () => {
2244
+ const key = "a";
2245
+ const ttl = null;
2246
+ await lockProvider.create(key, { ttl }).acquire();
2247
+ const handlerFn = vi.fn((_event) => { });
2248
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2249
+ const owner = "b";
2250
+ try {
2251
+ await lockProvider
2252
+ .create(key, { ttl, owner })
2253
+ .acquireOrFail();
2254
+ }
2255
+ catch {
2256
+ /* EMPTY */
2257
+ }
2258
+ await delay(TimeSpan.fromMilliseconds(10));
2259
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2260
+ expect(handlerFn).toHaveBeenCalledWith({
2261
+ key,
2262
+ owner,
2263
+ });
2264
+ });
2265
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by different owner", async () => {
2266
+ const key = "a";
2267
+ const ttl = TimeSpan.fromMilliseconds(50);
2268
+ await lockProvider.create(key, { ttl }).acquire();
2269
+ const handlerFn = vi.fn((_event) => { });
2270
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2271
+ const owner = "b";
2272
+ try {
2273
+ await lockProvider
2274
+ .create(key, { ttl, owner })
2275
+ .acquireOrFail();
2276
+ }
2277
+ catch {
2278
+ /* EMPTY */
2279
+ }
2280
+ await delay(TimeSpan.fromMilliseconds(10));
2281
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2282
+ expect(handlerFn).toHaveBeenCalledWith({
2283
+ key,
2284
+ owner,
2285
+ });
2286
+ });
2287
+ });
2288
+ describe("method: acquireBlocking", () => {
2289
+ test("Should dispatch AcquiredLockEvent when key doesnt exists", async () => {
2290
+ const key = "a";
2291
+ const owner = "b";
2292
+ const ttl = null;
2293
+ const handlerFn = vi.fn((_event) => { });
2294
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2295
+ await lockProvider
2296
+ .create(key, {
2297
+ ttl,
2298
+ owner,
2299
+ })
2300
+ .acquireBlocking();
2301
+ await delay(TimeSpan.fromMilliseconds(10));
2302
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2303
+ expect(handlerFn).toHaveBeenCalledWith({
2304
+ key,
2305
+ owner,
2306
+ ttl,
2307
+ });
2308
+ });
2309
+ test("Should dispatch AcquiredLockEvent when key is expired", async () => {
2310
+ const key = "a";
2311
+ const ttl = TimeSpan.fromMilliseconds(50);
2312
+ await lockProvider.create(key, { ttl }).acquire();
2313
+ await delay(ttl);
2314
+ const handlerFn = vi.fn((_event) => { });
2315
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2316
+ const owner = "b";
2317
+ const ttl2 = null;
2318
+ await lockProvider
2319
+ .create(key, { ttl: ttl2, owner })
2320
+ .acquireBlocking({
2321
+ time: TimeSpan.fromMilliseconds(5),
2322
+ interval: TimeSpan.fromMilliseconds(5),
2323
+ });
2324
+ await delay(TimeSpan.fromMilliseconds(10));
2325
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2326
+ expect(handlerFn).toHaveBeenCalledWith({
2327
+ key,
2328
+ owner,
2329
+ ttl: ttl2,
2330
+ });
2331
+ });
2332
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by same owner", async () => {
2333
+ const key = "a";
2334
+ const owner = "b";
2335
+ const ttl = null;
2336
+ const lock = lockProvider.create(key, { ttl, owner });
2337
+ await lock.acquire();
2338
+ const handlerFn = vi.fn((_event) => { });
2339
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2340
+ await lock.acquireBlocking({
2341
+ time: TimeSpan.fromMilliseconds(5),
2342
+ interval: TimeSpan.fromMilliseconds(5),
2343
+ });
2344
+ await delay(TimeSpan.fromMilliseconds(10));
2345
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2346
+ expect(handlerFn).toHaveBeenCalledWith({
2347
+ key,
2348
+ owner,
2349
+ });
2350
+ });
2351
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by same owner", async () => {
2352
+ const key = "a";
2353
+ const owner = "b";
2354
+ const ttl = TimeSpan.fromMilliseconds(50);
2355
+ const lock = lockProvider.create(key, {
2356
+ ttl,
2357
+ owner,
2358
+ });
2359
+ await lock.acquire();
2360
+ const handlerFn = vi.fn((_event) => { });
2361
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2362
+ await lock.acquireBlocking({
2363
+ time: TimeSpan.fromMilliseconds(5),
2364
+ interval: TimeSpan.fromMilliseconds(5),
2365
+ });
2366
+ await delay(TimeSpan.fromMilliseconds(10));
2367
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2368
+ expect(handlerFn).toHaveBeenCalledWith({
2369
+ key,
2370
+ owner,
2371
+ });
2372
+ });
2373
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by different owner", async () => {
2374
+ const key = "a";
2375
+ const ttl = null;
2376
+ await lockProvider.create(key, { ttl }).acquire();
2377
+ const handlerFn = vi.fn((_event) => { });
2378
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2379
+ const owner = "b";
2380
+ await lockProvider.create(key, { ttl, owner }).acquireBlocking({
2381
+ time: TimeSpan.fromMilliseconds(5),
2382
+ interval: TimeSpan.fromMilliseconds(5),
2383
+ });
2384
+ await delay(TimeSpan.fromMilliseconds(10));
2385
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2386
+ expect(handlerFn).toHaveBeenCalledWith({
2387
+ key,
2388
+ owner,
2389
+ });
2390
+ });
2391
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by different owner", async () => {
2392
+ const key = "a";
2393
+ const ttl = TimeSpan.fromMilliseconds(50);
2394
+ await lockProvider.create(key, { ttl }).acquire();
2395
+ const handlerFn = vi.fn((_event) => { });
2396
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2397
+ const owner = "b";
2398
+ await lockProvider.create(key, { ttl, owner }).acquireBlocking({
2399
+ time: TimeSpan.fromMilliseconds(5),
2400
+ interval: TimeSpan.fromMilliseconds(5),
2401
+ });
2402
+ await delay(TimeSpan.fromMilliseconds(10));
2403
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2404
+ expect(handlerFn).toHaveBeenCalledWith({
2405
+ key,
2406
+ owner,
2407
+ });
2408
+ });
2409
+ });
2410
+ describe("method: acquireBlockingOrFail", () => {
2411
+ test("Should dispatch AcquiredLockEvent when key doesnt exists", async () => {
2412
+ const key = "a";
2413
+ const owner = "b";
2414
+ const ttl = null;
2415
+ const handlerFn = vi.fn((_event) => { });
2416
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2417
+ await lockProvider
2418
+ .create(key, {
2419
+ ttl,
2420
+ owner,
2421
+ })
2422
+ .acquireBlockingOrFail({
2423
+ time: TimeSpan.fromMilliseconds(5),
2424
+ interval: TimeSpan.fromMilliseconds(5),
2425
+ });
2426
+ await delay(TimeSpan.fromMilliseconds(10));
2427
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2428
+ expect(handlerFn).toHaveBeenCalledWith({
2429
+ key,
2430
+ owner,
2431
+ ttl,
2432
+ });
2433
+ });
2434
+ test("Should dispatch AcquiredLockEvent when key is expired", async () => {
2435
+ const key = "a";
2436
+ const ttl = TimeSpan.fromMilliseconds(50);
2437
+ await lockProvider.create(key, { ttl }).acquire();
2438
+ await delay(ttl);
2439
+ const handlerFn = vi.fn((_event) => { });
2440
+ await lockProvider.addListener(LOCK_EVENTS.ACQUIRED, handlerFn);
2441
+ const owner = "b";
2442
+ const ttl2 = null;
2443
+ await lockProvider
2444
+ .create(key, { ttl: ttl2, owner })
2445
+ .acquireBlockingOrFail({
2446
+ time: TimeSpan.fromMilliseconds(5),
2447
+ interval: TimeSpan.fromMilliseconds(5),
2448
+ });
2449
+ await delay(TimeSpan.fromMilliseconds(10));
2450
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2451
+ expect(handlerFn).toHaveBeenCalledWith({
2452
+ key,
2453
+ owner,
2454
+ ttl: ttl2,
2455
+ });
2456
+ });
2457
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by same owner", async () => {
2458
+ const key = "a";
2459
+ const owner = "b";
2460
+ const ttl = null;
2461
+ const lock = lockProvider.create(key, { ttl, owner });
2462
+ await lock.acquire();
2463
+ const handlerFn = vi.fn((_event) => { });
2464
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2465
+ try {
2466
+ await lock.acquireBlockingOrFail({
1008
2467
  time: TimeSpan.fromMilliseconds(5),
1009
2468
  interval: TimeSpan.fromMilliseconds(5),
1010
2469
  });
1011
- await LazyPromise.delay(DELAY_TIME);
1012
- expect(event_?.key).toBe("a");
1013
- expect(event_?.owner).toBe(owner);
1014
- await unsubscribe();
1015
- });
1016
- });
1017
- describe("method: runOrFail", () => {
1018
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1019
- const key = "a";
1020
- const owner = "b";
1021
- const lock = lockProvider.create(key, {
1022
- owner,
1023
- ttl: TTL,
1024
- });
1025
- let event_ = null;
1026
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1027
- event_ = event;
1028
- });
1029
- await lock.runOrFail(async () => {
1030
- await LazyPromise.delay(DELAY_TIME);
1031
- });
1032
- await LazyPromise.delay(DELAY_TIME);
1033
- expect(event_?.key).toBe("a");
1034
- expect(event_?.owner).toBe(owner);
1035
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1036
- await unsubscribe();
1037
- });
1038
- test("Should dispatch ReleasedLockEvent when lock is not acquired", async () => {
1039
- const key = "a";
1040
- const owner = "b";
1041
- const lock = lockProvider.create(key, {
1042
- owner,
1043
- ttl: TTL,
1044
- });
1045
- let event_ = null;
1046
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1047
- event_ = event;
1048
- });
1049
- await lock.runOrFail(async () => {
1050
- await LazyPromise.delay(DELAY_TIME);
1051
- });
1052
- await LazyPromise.delay(DELAY_TIME);
1053
- expect(event_?.key).toBe(key);
1054
- expect(event_?.owner).toBe(owner);
1055
- await unsubscribe();
1056
- });
1057
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1058
- const key = "a";
1059
- const owner = "b";
1060
- const lock = lockProvider.create(key, {
1061
- owner,
1062
- });
1063
- let event_ = null;
1064
- await lock.acquire();
1065
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1066
- event_ = event;
1067
- });
1068
- try {
1069
- await lock.runOrFail(async () => {
1070
- await LazyPromise.delay(DELAY_TIME);
1071
- });
1072
- await LazyPromise.delay(DELAY_TIME);
1073
- }
1074
- catch {
1075
- /* Empty */
1076
- }
1077
- expect(event_?.key).toBe("a");
1078
- expect(event_?.owner).toBe(owner);
1079
- await unsubscribe();
1080
- });
1081
- });
1082
- describe("method: acquire", () => {
1083
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1084
- const key = "a";
1085
- const owner = "b";
1086
- const lock = lockProvider.create(key, {
1087
- owner,
1088
- ttl: TTL,
1089
- });
1090
- let event_ = null;
1091
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1092
- event_ = event;
1093
- });
1094
- await lock.acquire();
1095
- await LazyPromise.delay(DELAY_TIME);
1096
- expect(event_?.key).toBe("a");
1097
- expect(event_?.owner).toBe(owner);
1098
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1099
- await unsubscribe();
1100
- });
1101
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1102
- const key = "a";
1103
- const owner = "b";
1104
- const lock = lockProvider.create(key, {
1105
- owner,
1106
- });
1107
- let event_ = null;
1108
- await lock.acquire();
1109
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1110
- event_ = event;
1111
- });
1112
- await lock.acquire();
1113
- await LazyPromise.delay(DELAY_TIME);
1114
- expect(event_?.key).toBe("a");
1115
- expect(event_?.owner).toBe(owner);
1116
- await unsubscribe();
1117
- });
1118
- });
1119
- describe("method: acquireBlocking", () => {
1120
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1121
- const key = "a";
1122
- const owner = "b";
1123
- const lock = lockProvider.create(key, {
1124
- owner,
1125
- ttl: TTL,
1126
- });
1127
- let event_ = null;
1128
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1129
- event_ = event;
1130
- });
1131
- await lock.acquireBlocking({
2470
+ }
2471
+ catch {
2472
+ /* EMPTY */
2473
+ }
2474
+ await delay(TimeSpan.fromMilliseconds(10));
2475
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2476
+ expect(handlerFn).toHaveBeenCalledWith({
2477
+ key,
2478
+ owner,
2479
+ });
2480
+ });
2481
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by same owner", async () => {
2482
+ const key = "a";
2483
+ const owner = "b";
2484
+ const ttl = TimeSpan.fromMilliseconds(50);
2485
+ const lock = lockProvider.create(key, {
2486
+ ttl,
2487
+ owner,
2488
+ });
2489
+ await lock.acquire();
2490
+ const handlerFn = vi.fn((_event) => { });
2491
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2492
+ try {
2493
+ await lock.acquireBlockingOrFail({
1132
2494
  time: TimeSpan.fromMilliseconds(5),
1133
2495
  interval: TimeSpan.fromMilliseconds(5),
1134
2496
  });
1135
- await LazyPromise.delay(DELAY_TIME);
1136
- expect(event_?.key).toBe("a");
1137
- expect(event_?.owner).toBe(owner);
1138
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1139
- await unsubscribe();
1140
- });
1141
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1142
- const key = "a";
1143
- const owner = "b";
1144
- const lock = lockProvider.create(key, {
1145
- owner,
1146
- });
1147
- let event_ = null;
1148
- await lock.acquireBlocking({
2497
+ }
2498
+ catch {
2499
+ /* EMPTY */
2500
+ }
2501
+ await delay(TimeSpan.fromMilliseconds(10));
2502
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2503
+ expect(handlerFn).toHaveBeenCalledWith({
2504
+ key,
2505
+ owner,
2506
+ });
2507
+ });
2508
+ test("Should dispatch UnavailableLockEvent when key is unexpireable and acquired by different owner", async () => {
2509
+ const key = "a";
2510
+ const ttl = null;
2511
+ await lockProvider.create(key, { ttl }).acquire();
2512
+ const handlerFn = vi.fn((_event) => { });
2513
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2514
+ const owner = "b";
2515
+ try {
2516
+ await lockProvider
2517
+ .create(key, { ttl, owner })
2518
+ .acquireBlockingOrFail({
1149
2519
  time: TimeSpan.fromMilliseconds(5),
1150
2520
  interval: TimeSpan.fromMilliseconds(5),
1151
2521
  });
1152
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1153
- event_ = event;
1154
- });
1155
- await lock.acquireBlocking({
2522
+ }
2523
+ catch {
2524
+ /* EMPTY */
2525
+ }
2526
+ await delay(TimeSpan.fromMilliseconds(10));
2527
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2528
+ expect(handlerFn).toHaveBeenCalledWith({
2529
+ key,
2530
+ owner,
2531
+ });
2532
+ });
2533
+ test("Should dispatch UnavailableLockEvent when key is unexpired and acquired by different owner", async () => {
2534
+ const key = "a";
2535
+ const ttl = TimeSpan.fromMilliseconds(50);
2536
+ await lockProvider.create(key, { ttl }).acquire();
2537
+ const handlerFn = vi.fn((_event) => { });
2538
+ await lockProvider.addListener(LOCK_EVENTS.UNAVAILABLE, handlerFn);
2539
+ const owner = "b";
2540
+ try {
2541
+ await lockProvider
2542
+ .create(key, { ttl, owner })
2543
+ .acquireBlockingOrFail({
1156
2544
  time: TimeSpan.fromMilliseconds(5),
1157
2545
  interval: TimeSpan.fromMilliseconds(5),
1158
2546
  });
1159
- await LazyPromise.delay(DELAY_TIME);
1160
- expect(event_?.key).toBe("a");
1161
- expect(event_?.owner).toBe(owner);
1162
- await unsubscribe();
1163
- });
1164
- });
1165
- describe("method: acquireOrFail", () => {
1166
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1167
- const key = "a";
1168
- const owner = "b";
1169
- const lock = lockProvider.create(key, {
1170
- owner,
1171
- ttl: TTL,
1172
- });
1173
- let event_ = null;
1174
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1175
- event_ = event;
1176
- });
1177
- await lock.acquireOrFail();
1178
- await LazyPromise.delay(DELAY_TIME);
1179
- expect(event_?.key).toBe("a");
1180
- expect(event_?.owner).toBe(owner);
1181
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1182
- await unsubscribe();
1183
- });
1184
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1185
- const key = "a";
1186
- const owner = "b";
1187
- const lock = lockProvider.create(key, {
1188
- owner,
1189
- });
1190
- let event_ = null;
1191
- await lock.acquireOrFail();
1192
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1193
- event_ = event;
1194
- });
1195
- try {
1196
- await lock.acquireOrFail();
1197
- await LazyPromise.delay(DELAY_TIME);
1198
- }
1199
- catch {
1200
- /* Empty */
1201
- }
1202
- expect(event_?.key).toBe("a");
1203
- expect(event_?.owner).toBe(owner);
1204
- await unsubscribe();
1205
- });
1206
- });
1207
- describe("method: release", () => {
1208
- test("Should dispatch ReleasedLockEvent when released by same owner", async () => {
1209
- const key = "a";
1210
- const owner = "b";
1211
- const lock = lockProvider.create(key, {
1212
- owner,
1213
- });
1214
- await lock.acquire();
1215
- let event_ = null;
1216
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1217
- event_ = event;
1218
- });
1219
- await lock.release();
1220
- await LazyPromise.delay(DELAY_TIME);
1221
- expect(event_?.key).toBe(key);
1222
- expect(event_?.owner).toBe(owner);
1223
- await unsubscribe();
1224
- });
1225
- test("Should dispatch UnownedReleaseTryLockEvent when released by same owner", async () => {
1226
- const key = "a";
1227
- const owner1 = "b";
1228
- const lock1 = lockProvider.create(key, {
1229
- owner: owner1,
1230
- });
1231
- await lock1.acquire();
1232
- const owner2 = "c";
1233
- const lock2 = lockProvider.create(key, {
1234
- owner: owner2,
1235
- });
1236
- let event_ = null;
1237
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_RELEASE_TRY, (event) => {
1238
- event_ = event;
1239
- });
1240
- await lock2.release();
1241
- await LazyPromise.delay(DELAY_TIME);
1242
- expect(event_?.key).toBe(key);
1243
- expect(event_?.owner).toBe(owner2);
1244
- await unsubscribe();
1245
- });
1246
- });
1247
- describe("method: releaseOrFail", () => {
1248
- test("Should dispatch ReleasedLockEvent when released by same owner", async () => {
1249
- const key = "a";
1250
- const owner = "b";
1251
- const lock = lockProvider.create(key, {
1252
- owner,
1253
- });
1254
- await lock.acquire();
1255
- let event_ = null;
1256
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1257
- event_ = event;
1258
- });
2547
+ }
2548
+ catch {
2549
+ /* EMPTY */
2550
+ }
2551
+ await delay(TimeSpan.fromMilliseconds(10));
2552
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2553
+ expect(handlerFn).toHaveBeenCalledWith({
2554
+ key,
2555
+ owner,
2556
+ });
2557
+ });
2558
+ });
2559
+ describe("method: release", () => {
2560
+ test("Should dispatch UnownedReleaseTryLockEvent when key doesnt exists", async () => {
2561
+ const key = "a";
2562
+ const owner = "b";
2563
+ const handlerFn = vi.fn((_event) => { });
2564
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2565
+ await lockProvider.create(key, { owner }).release();
2566
+ await delay(TimeSpan.fromMilliseconds(10));
2567
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2568
+ expect(handlerFn).toHaveBeenCalledWith({
2569
+ key,
2570
+ owner,
2571
+ });
2572
+ });
2573
+ test("Should dispatch UnownedReleaseTryLockEvent when key is unexpireable and released by different owner", async () => {
2574
+ const key = "a";
2575
+ const ttl = null;
2576
+ await lockProvider.create(key, { ttl }).acquire();
2577
+ const handlerFn = vi.fn((_event) => { });
2578
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2579
+ const owner = "b";
2580
+ await lockProvider.create(key, { ttl, owner }).release();
2581
+ await delay(TimeSpan.fromMilliseconds(10));
2582
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2583
+ expect(handlerFn).toHaveBeenCalledWith({
2584
+ key,
2585
+ owner,
2586
+ });
2587
+ });
2588
+ test("Should dispatch UnownedReleaseTryLockEvent when key is unexpired and released by different owner", async () => {
2589
+ const key = "a";
2590
+ const ttl = TimeSpan.fromMilliseconds(50);
2591
+ await lockProvider.create(key, { ttl }).acquire();
2592
+ const handlerFn = vi.fn((_event) => { });
2593
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2594
+ const owner = "b";
2595
+ await lockProvider.create(key, { ttl, owner }).release();
2596
+ await delay(TimeSpan.fromMilliseconds(10));
2597
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2598
+ expect(handlerFn).toHaveBeenCalledWith({
2599
+ key,
2600
+ owner,
2601
+ });
2602
+ });
2603
+ test("Should dispatch UnownedReleaseTryLockEvent when key is expired and released by different owner", async () => {
2604
+ const key = "a";
2605
+ const ttl = TimeSpan.fromMilliseconds(50);
2606
+ await lockProvider.create(key, { ttl }).acquire();
2607
+ const handlerFn = vi.fn((_event) => { });
2608
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2609
+ const owner = "b";
2610
+ await lockProvider.create(key, { ttl, owner }).release();
2611
+ await delay(ttl);
2612
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2613
+ expect(handlerFn).toHaveBeenCalledWith({
2614
+ key,
2615
+ owner,
2616
+ });
2617
+ });
2618
+ test("Should dispatch UnownedReleaseTryLockEvent when key is expired and released by same owner", async () => {
2619
+ const key = "a";
2620
+ const ttl = TimeSpan.fromMilliseconds(50);
2621
+ const owner = "b";
2622
+ const lock = lockProvider.create(key, { ttl, owner });
2623
+ await lock.acquire();
2624
+ await delay(ttl);
2625
+ const handlerFn = vi.fn((_event) => { });
2626
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2627
+ await lock.release();
2628
+ await delay(TimeSpan.fromMilliseconds(10));
2629
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2630
+ expect(handlerFn).toHaveBeenCalledWith({
2631
+ key,
2632
+ owner,
2633
+ });
2634
+ });
2635
+ test("Should dispatch ReleasedLockEvent when key is unexpireable and released by same owner", async () => {
2636
+ const key = "a";
2637
+ const ttl = null;
2638
+ const owner = "b";
2639
+ const lock = lockProvider.create(key, { ttl, owner });
2640
+ await lock.acquire();
2641
+ const handlerFn = vi.fn((_event) => { });
2642
+ await lockProvider.addListener(LOCK_EVENTS.RELEASED, handlerFn);
2643
+ await lock.release();
2644
+ await delay(TimeSpan.fromMilliseconds(10));
2645
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2646
+ expect(handlerFn).toHaveBeenCalledWith({
2647
+ key,
2648
+ owner,
2649
+ });
2650
+ });
2651
+ test("Should dispatch ReleasedLockEvent when key is unexpired and released by same owner", async () => {
2652
+ const key = "a";
2653
+ const ttl = TimeSpan.fromMilliseconds(50);
2654
+ const owner = "b";
2655
+ const lock = lockProvider.create(key, { ttl, owner });
2656
+ await lock.acquire();
2657
+ const handlerFn = vi.fn((_event) => { });
2658
+ await lockProvider.addListener(LOCK_EVENTS.RELEASED, handlerFn);
2659
+ await lock.release();
2660
+ await delay(TimeSpan.fromMilliseconds(10));
2661
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2662
+ expect(handlerFn).toHaveBeenCalledWith({
2663
+ key,
2664
+ owner,
2665
+ });
2666
+ });
2667
+ });
2668
+ describe("method: releaseOrFail", () => {
2669
+ test("Should dispatch UnownedReleaseTryLockEvent when key doesnt exists", async () => {
2670
+ const key = "a";
2671
+ const owner = "b";
2672
+ const handlerFn = vi.fn((_event) => { });
2673
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2674
+ try {
2675
+ await lockProvider.create(key, { owner }).releaseOrFail();
2676
+ }
2677
+ catch {
2678
+ /* EMPTY */
2679
+ }
2680
+ await delay(TimeSpan.fromMilliseconds(10));
2681
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2682
+ expect(handlerFn).toHaveBeenCalledWith({
2683
+ key,
2684
+ owner,
2685
+ });
2686
+ });
2687
+ test("Should dispatch UnownedReleaseTryLockEvent when key is unexpireable and released by different owner", async () => {
2688
+ const key = "a";
2689
+ const ttl = null;
2690
+ await lockProvider.create(key, { ttl }).acquire();
2691
+ const handlerFn = vi.fn((_event) => { });
2692
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2693
+ const owner = "b";
2694
+ try {
2695
+ await lockProvider
2696
+ .create(key, { ttl, owner })
2697
+ .releaseOrFail();
2698
+ }
2699
+ catch {
2700
+ /* EMPTY */
2701
+ }
2702
+ await delay(TimeSpan.fromMilliseconds(10));
2703
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2704
+ expect(handlerFn).toHaveBeenCalledWith({
2705
+ key,
2706
+ owner,
2707
+ });
2708
+ });
2709
+ test("Should dispatch UnownedReleaseTryLockEvent when key is unexpired and released by different owner", async () => {
2710
+ const key = "a";
2711
+ const ttl = TimeSpan.fromMilliseconds(50);
2712
+ await lockProvider.create(key, { ttl }).acquire();
2713
+ const handlerFn = vi.fn((_event) => { });
2714
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2715
+ const owner = "b";
2716
+ try {
2717
+ await lockProvider
2718
+ .create(key, { ttl, owner })
2719
+ .releaseOrFail();
2720
+ }
2721
+ catch {
2722
+ /* EMPTY */
2723
+ }
2724
+ await delay(TimeSpan.fromMilliseconds(10));
2725
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2726
+ expect(handlerFn).toHaveBeenCalledWith({
2727
+ key,
2728
+ owner,
2729
+ });
2730
+ });
2731
+ test("Should dispatch UnownedReleaseTryLockEvent when key is expired and released by different owner", async () => {
2732
+ const key = "a";
2733
+ const ttl = TimeSpan.fromMilliseconds(50);
2734
+ await lockProvider.create(key, { ttl }).acquire();
2735
+ const handlerFn = vi.fn((_event) => { });
2736
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2737
+ const owner = "b";
2738
+ try {
2739
+ await lockProvider
2740
+ .create(key, { ttl, owner })
2741
+ .releaseOrFail();
2742
+ }
2743
+ catch {
2744
+ /* EMPTY */
2745
+ }
2746
+ await delay(ttl);
2747
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2748
+ expect(handlerFn).toHaveBeenCalledWith({
2749
+ key,
2750
+ owner,
2751
+ });
2752
+ });
2753
+ test("Should dispatch UnownedReleaseTryLockEvent when key is expired and released by same owner", async () => {
2754
+ const key = "a";
2755
+ const ttl = TimeSpan.fromMilliseconds(50);
2756
+ const owner = "b";
2757
+ const lock = lockProvider.create(key, { ttl, owner });
2758
+ await lock.acquire();
2759
+ await delay(ttl);
2760
+ const handlerFn = vi.fn((_event) => { });
2761
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_RELEASE_TRY, handlerFn);
2762
+ try {
2763
+ await lock.releaseOrFail();
2764
+ }
2765
+ catch {
2766
+ /* EMPTY */
2767
+ }
2768
+ await delay(TimeSpan.fromMilliseconds(10));
2769
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2770
+ expect(handlerFn).toHaveBeenCalledWith({
2771
+ key,
2772
+ owner,
2773
+ });
2774
+ });
2775
+ test("Should dispatch ReleasedLockEvent when key is unexpireable and released by same owner", async () => {
2776
+ const key = "a";
2777
+ const ttl = null;
2778
+ const owner = "b";
2779
+ const lock = lockProvider.create(key, { ttl, owner });
2780
+ await lock.acquire();
2781
+ const handlerFn = vi.fn((_event) => { });
2782
+ await lockProvider.addListener(LOCK_EVENTS.RELEASED, handlerFn);
2783
+ try {
1259
2784
  await lock.releaseOrFail();
1260
- await LazyPromise.delay(DELAY_TIME);
1261
- expect(event_?.key).toBe(key);
1262
- expect(event_?.owner).toBe(owner);
1263
- await unsubscribe();
1264
- });
1265
- test("Should dispatch UnownedReleaseTryLockEvent when released by same owner", async () => {
1266
- const key = "a";
1267
- const owner1 = "b";
1268
- const lock1 = lockProvider.create(key, {
1269
- owner: owner1,
1270
- });
1271
- await lock1.acquire();
1272
- const owner2 = "c";
1273
- const lock2 = lockProvider.create(key, {
1274
- owner: owner2,
1275
- });
1276
- let event_ = null;
1277
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_RELEASE_TRY, (event) => {
1278
- event_ = event;
1279
- });
1280
- try {
1281
- await lock2.releaseOrFail();
1282
- await LazyPromise.delay(DELAY_TIME);
1283
- }
1284
- catch {
1285
- /* Empty */
1286
- }
1287
- expect(event_?.key).toBe(key);
1288
- expect(event_?.owner).toBe(owner2);
1289
- await unsubscribe();
1290
- });
1291
- });
1292
- describe("method: forceRelease", () => {
1293
- test("Should dispatch ForceReleasedLockEvent when lock forcefully released", async () => {
1294
- const key = "a";
1295
- const owner1 = "b";
1296
- const lock1 = lockProvider.create(key, {
1297
- owner: owner1,
1298
- });
1299
- await lock1.acquire();
1300
- const owner2 = "c";
1301
- const lock2 = lockProvider.create(key, {
1302
- owner: owner2,
1303
- });
1304
- let event_ = null;
1305
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.FORCE_RELEASED, (event) => {
1306
- event_ = event;
1307
- });
1308
- await lock2.forceRelease();
1309
- await LazyPromise.delay(DELAY_TIME);
1310
- expect(event_?.key).toBe(key);
1311
- await unsubscribe();
1312
- });
1313
- });
1314
- describe("method: refresh", () => {
1315
- test("Should dispatch RefreshedLockEvent when refreshed by same owner", async () => {
1316
- const key = "a";
1317
- const owner = "b";
1318
- const lock = lockProvider.create(key, {
1319
- owner,
1320
- ttl: TTL,
1321
- });
1322
- await lock.acquire();
1323
- let event_ = null;
1324
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.REFRESHED, (event) => {
1325
- event_ = event;
1326
- });
1327
- await LazyPromise.delay(TTL.divide(2));
1328
- const newTTL = TTL.multiply(2);
1329
- await lock.refresh(newTTL);
1330
- await LazyPromise.delay(DELAY_TIME);
1331
- expect(event_?.key).toBe(key);
1332
- expect(event_?.owner).toBe(owner);
1333
- expect(event_?.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
1334
- await unsubscribe();
1335
- });
1336
- test("Should dispatch UnownedRefreshTryLockEvent when refreshed by different owner", async () => {
1337
- const key = "a";
1338
- const owner1 = "b";
1339
- const lock1 = lockProvider.create(key, {
1340
- owner: owner1,
1341
- ttl: TTL,
1342
- });
1343
- await lock1.acquire();
1344
- const owner2 = "c";
1345
- const lock2 = lockProvider.create(key, {
1346
- owner: owner2,
1347
- });
1348
- let event_ = null;
1349
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_REFRESH_TRY, (event) => {
1350
- event_ = event;
1351
- });
1352
- await LazyPromise.delay(TTL.divide(2));
1353
- const newTTL = TTL.multiply(2);
1354
- await lock2.refresh(newTTL);
1355
- await LazyPromise.delay(DELAY_TIME);
1356
- expect(event_?.key).toBe(key);
1357
- expect(event_?.owner).toBe(owner2);
1358
- await unsubscribe();
1359
- });
1360
- });
1361
- describe("method: refreshOrFail", () => {
1362
- test("Should dispatch RefreshedLockEvent when refreshed by same owner", async () => {
1363
- const key = "a";
1364
- const owner = "b";
1365
- const lock = lockProvider.create(key, {
1366
- owner,
1367
- ttl: TTL,
1368
- });
1369
- await lock.acquire();
1370
- let event_ = null;
1371
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.REFRESHED, (event) => {
1372
- event_ = event;
1373
- });
1374
- await LazyPromise.delay(TTL.divide(2));
1375
- const newTTL = TTL.multiply(2);
1376
- await lock.refreshOrFail(newTTL);
1377
- await LazyPromise.delay(DELAY_TIME);
1378
- expect(event_?.key).toBe(key);
1379
- expect(event_?.owner).toBe(owner);
1380
- expect(event_?.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
1381
- await unsubscribe();
1382
- });
1383
- test("Should dispatch UnownedRefreshTryLockEvent when refreshed by different owner", async () => {
1384
- const key = "a";
1385
- const owner1 = "b";
1386
- const lock1 = lockProvider.create(key, {
1387
- owner: owner1,
1388
- ttl: TTL,
1389
- });
1390
- await lock1.acquire();
1391
- const owner2 = "c";
1392
- const lock2 = lockProvider.create(key, {
1393
- owner: owner2,
1394
- });
1395
- let event_ = null;
1396
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_REFRESH_TRY, (event) => {
1397
- event_ = event;
1398
- });
1399
- await LazyPromise.delay(TTL.divide(2));
1400
- const newTTL = TTL.multiply(2);
1401
- try {
1402
- await lock2.refreshOrFail(newTTL);
1403
- await LazyPromise.delay(DELAY_TIME);
1404
- }
1405
- catch {
1406
- /* Empty */
1407
- }
1408
- expect(event_?.key).toBe(key);
1409
- expect(event_?.owner).toBe(owner2);
1410
- await unsubscribe();
2785
+ }
2786
+ catch {
2787
+ /* EMPTY */
2788
+ }
2789
+ await delay(TimeSpan.fromMilliseconds(10));
2790
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2791
+ expect(handlerFn).toHaveBeenCalledWith({
2792
+ key,
2793
+ owner,
2794
+ });
2795
+ });
2796
+ test("Should dispatch ReleasedLockEvent when key is unexpired and released by same owner", async () => {
2797
+ const key = "a";
2798
+ const ttl = TimeSpan.fromMilliseconds(50);
2799
+ const owner = "b";
2800
+ const lock = lockProvider.create(key, { ttl, owner });
2801
+ await lock.acquire();
2802
+ const handlerFn = vi.fn((_event) => { });
2803
+ await lockProvider.addListener(LOCK_EVENTS.RELEASED, handlerFn);
2804
+ await lock.releaseOrFail();
2805
+ await delay(TimeSpan.fromMilliseconds(10));
2806
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2807
+ expect(handlerFn).toHaveBeenCalledWith({
2808
+ key,
2809
+ owner,
1411
2810
  });
1412
2811
  });
1413
2812
  });
1414
- describe("LockProvider:", () => {
1415
- describe("method: run", () => {
1416
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1417
- const key = "a";
1418
- const owner = "b";
1419
- const lock = lockProvider.create(key, {
1420
- owner,
1421
- ttl: TTL,
1422
- });
1423
- let event_ = null;
1424
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1425
- event_ = event;
1426
- });
1427
- await lock.run(async () => {
1428
- await LazyPromise.delay(DELAY_TIME);
1429
- });
1430
- await LazyPromise.delay(DELAY_TIME);
1431
- expect(event_?.key).toBe("a");
1432
- expect(event_?.owner).toBe(owner);
1433
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1434
- await unsubscribe();
1435
- });
1436
- test("Should dispatch ReleasedLockEvent when lock is not acquired", async () => {
1437
- const key = "a";
1438
- const owner = "b";
1439
- const lock = lockProvider.create(key, {
1440
- owner,
1441
- ttl: TTL,
1442
- });
1443
- let event_ = null;
1444
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1445
- event_ = event;
1446
- });
1447
- await lock.run(async () => {
1448
- await LazyPromise.delay(DELAY_TIME);
1449
- });
1450
- await LazyPromise.delay(DELAY_TIME);
1451
- expect(event_?.key).toBe(key);
1452
- expect(event_?.owner).toBe(owner);
1453
- await unsubscribe();
1454
- });
1455
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1456
- const key = "a";
1457
- const owner = "b";
1458
- const lock = lockProvider.create(key, {
1459
- owner,
1460
- });
1461
- let event_ = null;
1462
- await lock.acquire();
1463
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1464
- event_ = event;
1465
- });
1466
- await lock.run(async () => {
1467
- await LazyPromise.delay(DELAY_TIME);
1468
- });
1469
- await LazyPromise.delay(DELAY_TIME);
1470
- expect(event_?.key).toBe("a");
1471
- expect(event_?.owner).toBe(owner);
1472
- await unsubscribe();
1473
- });
1474
- });
1475
- describe("method: runBlocking", () => {
1476
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1477
- const key = "a";
1478
- const owner = "b";
1479
- const lock = lockProvider.create(key, {
1480
- owner,
1481
- ttl: TTL,
1482
- });
1483
- let event_ = null;
1484
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1485
- event_ = event;
1486
- });
1487
- await lock.runBlocking(async () => {
1488
- await LazyPromise.delay(DELAY_TIME);
1489
- }, {
1490
- time: TimeSpan.fromMilliseconds(5),
1491
- interval: TimeSpan.fromMilliseconds(5),
1492
- });
1493
- await LazyPromise.delay(DELAY_TIME);
1494
- expect(event_?.key).toBe("a");
1495
- expect(event_?.owner).toBe(owner);
1496
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1497
- await unsubscribe();
1498
- });
1499
- test("Should dispatch ReleasedLockEvent when lock is not acquired", async () => {
1500
- const key = "a";
1501
- const owner = "b";
1502
- const lock = lockProvider.create(key, {
1503
- owner,
1504
- ttl: TTL,
1505
- });
1506
- let event_ = null;
1507
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1508
- event_ = event;
1509
- });
1510
- await lock.runBlocking(async () => {
1511
- await LazyPromise.delay(DELAY_TIME);
1512
- }, {
1513
- time: TimeSpan.fromMilliseconds(5),
1514
- interval: TimeSpan.fromMilliseconds(5),
1515
- });
1516
- await LazyPromise.delay(DELAY_TIME);
1517
- expect(event_?.key).toBe(key);
1518
- expect(event_?.owner).toBe(owner);
1519
- await unsubscribe();
1520
- });
1521
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1522
- const key = "a";
1523
- const owner = "b";
1524
- const lock = lockProvider.create(key, {
1525
- owner,
1526
- });
1527
- let event_ = null;
1528
- await lock.acquire();
1529
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1530
- event_ = event;
1531
- });
1532
- await lock.runBlocking(async () => {
1533
- await LazyPromise.delay(DELAY_TIME);
1534
- }, {
1535
- time: TimeSpan.fromMilliseconds(5),
1536
- interval: TimeSpan.fromMilliseconds(5),
1537
- });
1538
- await LazyPromise.delay(DELAY_TIME);
1539
- expect(event_?.key).toBe("a");
1540
- expect(event_?.owner).toBe(owner);
1541
- await unsubscribe();
1542
- });
1543
- });
1544
- describe("method: runOrFail", () => {
1545
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1546
- const key = "a";
1547
- const owner = "b";
1548
- const lock = lockProvider.create(key, {
1549
- owner,
1550
- ttl: TTL,
1551
- });
1552
- let event_ = null;
1553
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1554
- event_ = event;
1555
- });
1556
- await lock.runOrFail(async () => {
1557
- await LazyPromise.delay(DELAY_TIME);
1558
- });
1559
- await LazyPromise.delay(DELAY_TIME);
1560
- expect(event_?.key).toBe("a");
1561
- expect(event_?.owner).toBe(owner);
1562
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1563
- await unsubscribe();
1564
- });
1565
- test("Should dispatch ReleasedLockEvent when lock is not acquired", async () => {
1566
- const key = "a";
1567
- const owner = "b";
1568
- const lock = lockProvider.create(key, {
1569
- owner,
1570
- ttl: TTL,
1571
- });
1572
- let event_ = null;
1573
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1574
- event_ = event;
1575
- });
1576
- await lock.runOrFail(async () => {
1577
- await LazyPromise.delay(DELAY_TIME);
1578
- });
1579
- await LazyPromise.delay(DELAY_TIME);
1580
- expect(event_?.key).toBe(key);
1581
- expect(event_?.owner).toBe(owner);
1582
- await unsubscribe();
1583
- });
1584
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1585
- const key = "a";
1586
- const owner = "b";
1587
- const lock = lockProvider.create(key, {
1588
- owner,
1589
- });
1590
- let event_ = null;
1591
- await lock.acquire();
1592
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1593
- event_ = event;
1594
- });
1595
- try {
1596
- await lock.runOrFail(async () => {
1597
- await LazyPromise.delay(DELAY_TIME);
1598
- });
1599
- await LazyPromise.delay(DELAY_TIME);
1600
- }
1601
- catch {
1602
- /* Empty */
1603
- }
1604
- expect(event_?.key).toBe("a");
1605
- expect(event_?.owner).toBe(owner);
1606
- await unsubscribe();
1607
- });
1608
- });
1609
- describe("method: acquire", () => {
1610
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1611
- const key = "a";
1612
- const owner = "b";
1613
- const lock = lockProvider.create(key, {
1614
- owner,
1615
- ttl: TTL,
1616
- });
1617
- let event_ = null;
1618
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1619
- event_ = event;
1620
- });
1621
- await lock.acquire();
1622
- await LazyPromise.delay(DELAY_TIME);
1623
- expect(event_?.key).toBe("a");
1624
- expect(event_?.owner).toBe(owner);
1625
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1626
- await unsubscribe();
1627
- });
1628
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1629
- const key = "a";
1630
- const owner = "b";
1631
- const lock = lockProvider.create(key, {
1632
- owner,
1633
- });
1634
- let event_ = null;
1635
- await lock.acquire();
1636
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1637
- event_ = event;
1638
- });
1639
- await lock.acquire();
1640
- await LazyPromise.delay(DELAY_TIME);
1641
- expect(event_?.key).toBe("a");
1642
- expect(event_?.owner).toBe(owner);
1643
- await unsubscribe();
1644
- });
1645
- });
1646
- describe("method: acquireBlocking", () => {
1647
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1648
- const key = "a";
1649
- const owner = "b";
1650
- const lock = lockProvider.create(key, {
1651
- owner,
1652
- ttl: TTL,
1653
- });
1654
- let event_ = null;
1655
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1656
- event_ = event;
1657
- });
1658
- await lock.acquire();
1659
- await LazyPromise.delay(DELAY_TIME);
1660
- expect(event_?.key).toBe("a");
1661
- expect(event_?.owner).toBe(owner);
1662
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1663
- await unsubscribe();
1664
- });
1665
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1666
- const key = "a";
1667
- const owner = "b";
1668
- const lock = lockProvider.create(key, {
1669
- owner,
1670
- });
1671
- let event_ = null;
1672
- await lock.acquire();
1673
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1674
- event_ = event;
1675
- });
1676
- await lock.acquire();
1677
- await LazyPromise.delay(DELAY_TIME);
1678
- expect(event_?.key).toBe("a");
1679
- expect(event_?.owner).toBe(owner);
1680
- await unsubscribe();
1681
- });
1682
- });
1683
- describe("method: acquireOrFail", () => {
1684
- test("Should dispatch AcquiredLockEvent when lock is not acquired", async () => {
1685
- const key = "a";
1686
- const owner = "b";
1687
- const lock = lockProvider.create(key, {
1688
- owner,
1689
- ttl: TTL,
1690
- });
1691
- let event_ = null;
1692
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.ACQUIRED, (event) => {
1693
- event_ = event;
1694
- });
1695
- await lock.acquireOrFail();
1696
- await LazyPromise.delay(DELAY_TIME);
1697
- expect(event_?.key).toBe("a");
1698
- expect(event_?.owner).toBe(owner);
1699
- expect(event_?.ttl?.toMilliseconds()).toBe(TTL.toMilliseconds());
1700
- await unsubscribe();
1701
- });
1702
- test("Should dispatch NotAvailableLockEvent when lock is acquired", async () => {
1703
- const key = "a";
1704
- const owner = "b";
1705
- const lock = lockProvider.create(key, {
1706
- owner,
1707
- });
1708
- let event_ = null;
1709
- await lock.acquireOrFail();
1710
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.NOT_AVAILABLE, (event) => {
1711
- event_ = event;
1712
- });
1713
- try {
1714
- await lock.acquireOrFail();
1715
- await LazyPromise.delay(DELAY_TIME);
1716
- }
1717
- catch {
1718
- /* Empty */
1719
- }
1720
- expect(event_?.key).toBe("a");
1721
- expect(event_?.owner).toBe(owner);
1722
- await unsubscribe();
1723
- });
1724
- });
1725
- describe("method: release", () => {
1726
- test("Should dispatch ReleasedLockEvent when released by same owner", async () => {
1727
- const key = "a";
1728
- const owner = "b";
1729
- const lock = lockProvider.create(key, {
1730
- owner,
1731
- });
1732
- await lock.acquire();
1733
- let event_ = null;
1734
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1735
- event_ = event;
1736
- });
1737
- await lock.release();
1738
- await LazyPromise.delay(DELAY_TIME);
1739
- expect(event_?.key).toBe(key);
1740
- expect(event_?.owner).toBe(owner);
1741
- await unsubscribe();
1742
- });
1743
- test("Should dispatch UnownedReleaseTryLockEvent when released by same owner", async () => {
1744
- const key = "a";
1745
- const owner1 = "b";
1746
- const lock1 = lockProvider.create(key, {
1747
- owner: owner1,
1748
- });
1749
- await lock1.acquire();
1750
- const owner2 = "c";
1751
- const lock2 = lockProvider.create(key, {
1752
- owner: owner2,
1753
- });
1754
- let event_ = null;
1755
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_RELEASE_TRY, (event) => {
1756
- event_ = event;
1757
- });
1758
- await lock2.release();
1759
- await LazyPromise.delay(DELAY_TIME);
1760
- expect(event_?.key).toBe(key);
1761
- expect(event_?.owner).toBe(owner2);
1762
- await unsubscribe();
1763
- });
1764
- });
1765
- describe("method: releaseOrFail", () => {
1766
- test("Should dispatch ReleasedLockEvent when released by same owner", async () => {
1767
- const key = "a";
1768
- const owner = "b";
1769
- const lock = lockProvider.create(key, {
1770
- owner,
1771
- });
1772
- await lock.acquire();
1773
- let event_ = null;
1774
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.RELEASED, (event) => {
1775
- event_ = event;
1776
- });
1777
- await lock.releaseOrFail();
1778
- await LazyPromise.delay(DELAY_TIME);
1779
- expect(event_?.key).toBe(key);
1780
- expect(event_?.owner).toBe(owner);
1781
- await unsubscribe();
1782
- });
1783
- test("Should dispatch UnownedReleaseTryLockEvent when released by same owner", async () => {
1784
- const key = "a";
1785
- const owner1 = "b";
1786
- const lock1 = lockProvider.create(key, {
1787
- owner: owner1,
1788
- });
1789
- await lock1.acquire();
1790
- const owner2 = "c";
1791
- const lock2 = lockProvider.create(key, {
1792
- owner: owner2,
1793
- });
1794
- let event_ = null;
1795
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_RELEASE_TRY, (event) => {
1796
- event_ = event;
1797
- });
1798
- try {
1799
- await lock2.releaseOrFail();
1800
- await LazyPromise.delay(DELAY_TIME);
1801
- }
1802
- catch {
1803
- /* Empty */
1804
- }
1805
- expect(event_?.key).toBe(key);
1806
- expect(event_?.owner).toBe(owner2);
1807
- await unsubscribe();
1808
- });
1809
- });
1810
- describe("method: forceRelease", () => {
1811
- test("Should dispatch ForceReleasedLockEvent when lock forcefully released", async () => {
1812
- const key = "a";
1813
- const owner1 = "b";
1814
- const lock1 = lockProvider.create(key, {
1815
- owner: owner1,
1816
- });
1817
- await lock1.acquire();
1818
- const owner2 = "c";
1819
- const lock2 = lockProvider.create(key, {
1820
- owner: owner2,
1821
- });
1822
- let event_ = null;
1823
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.FORCE_RELEASED, (event) => {
1824
- event_ = event;
1825
- });
1826
- await lock2.forceRelease();
1827
- await LazyPromise.delay(DELAY_TIME);
1828
- expect(event_?.key).toBe(key);
1829
- await unsubscribe();
1830
- });
1831
- });
1832
- describe("method: refresh", () => {
1833
- test("Should dispatch RefreshedLockEvent when refreshed by same owner", async () => {
1834
- const key = "a";
1835
- const owner = "b";
1836
- const lock = lockProvider.create(key, {
1837
- owner,
1838
- ttl: TTL,
1839
- });
1840
- await lock.acquire();
1841
- let event_ = null;
1842
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.REFRESHED, (event) => {
1843
- event_ = event;
1844
- });
1845
- await LazyPromise.delay(TTL.divide(2));
1846
- const newTTL = TTL.multiply(2);
1847
- await lock.refresh(newTTL);
1848
- await LazyPromise.delay(DELAY_TIME);
1849
- expect(event_?.key).toBe(key);
1850
- expect(event_?.owner).toBe(owner);
1851
- expect(event_?.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
1852
- await unsubscribe();
1853
- });
1854
- test("Should dispatch UnownedRefreshTryLockEvent when refreshed by different owner", async () => {
1855
- const key = "a";
1856
- const owner1 = "b";
1857
- const lock1 = lockProvider.create(key, {
1858
- owner: owner1,
1859
- ttl: TTL,
1860
- });
1861
- await lock1.acquire();
1862
- const owner2 = "c";
1863
- const lock2 = lockProvider.create(key, {
1864
- owner: owner2,
1865
- });
1866
- let event_ = null;
1867
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_REFRESH_TRY, (event) => {
1868
- event_ = event;
1869
- });
1870
- await LazyPromise.delay(TTL.divide(2));
1871
- const newTTL = TTL.multiply(2);
1872
- await lock2.refresh(newTTL);
1873
- await LazyPromise.delay(DELAY_TIME);
1874
- expect(event_?.key).toBe(key);
1875
- expect(event_?.owner).toBe(owner2);
1876
- await unsubscribe();
1877
- });
1878
- });
1879
- describe("method: refreshOrFail", () => {
1880
- test("Should dispatch RefreshedLockEvent when refreshed by same owner", async () => {
1881
- const key = "a";
1882
- const owner = "b";
1883
- const lock = lockProvider.create(key, {
1884
- owner,
1885
- ttl: TTL,
1886
- });
1887
- await lock.acquire();
1888
- let event_ = null;
1889
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.REFRESHED, (event) => {
1890
- event_ = event;
1891
- });
1892
- await LazyPromise.delay(TTL.divide(2));
1893
- const newTTL = TTL.multiply(2);
1894
- await lock.refreshOrFail(newTTL);
1895
- await LazyPromise.delay(DELAY_TIME);
1896
- expect(event_?.key).toBe(key);
1897
- expect(event_?.owner).toBe(owner);
1898
- expect(event_?.ttl.toMilliseconds()).toBe(newTTL.toMilliseconds());
1899
- await unsubscribe();
1900
- });
1901
- test("Should dispatch UnownedRefreshTryLockEvent when refreshed by different owner", async () => {
1902
- const key = "a";
1903
- const owner1 = "b";
1904
- const lock1 = lockProvider.create(key, {
1905
- owner: owner1,
1906
- ttl: TTL,
1907
- });
1908
- await lock1.acquire();
1909
- const owner2 = "c";
1910
- const lock2 = lockProvider.create(key, {
1911
- owner: owner2,
1912
- });
1913
- let event_ = null;
1914
- const unsubscribe = await lockProvider.subscribe(LOCK_EVENTS.UNOWNED_REFRESH_TRY, (event) => {
1915
- event_ = event;
1916
- });
1917
- await LazyPromise.delay(TTL.divide(2));
1918
- const newTTL = TTL.multiply(2);
1919
- try {
1920
- await lock2.refreshOrFail(newTTL);
1921
- await LazyPromise.delay(DELAY_TIME);
1922
- }
1923
- catch {
1924
- /* Empty */
1925
- }
1926
- expect(event_?.key).toBe(key);
1927
- expect(event_?.owner).toBe(owner2);
1928
- await unsubscribe();
2813
+ describe("method: forceRelease", () => {
2814
+ test("Should not dispatch ForceReleasedLockEvent when key doesnt exists", async () => {
2815
+ const key = "a";
2816
+ const ttl = TimeSpan.fromMilliseconds(50);
2817
+ const lock = lockProvider.create(key, { ttl });
2818
+ const handlerFn = vi.fn((_event) => { });
2819
+ await lockProvider.addListener(LOCK_EVENTS.FORCE_RELEASED, handlerFn);
2820
+ await lock.forceRelease();
2821
+ expect(handlerFn).toHaveBeenCalledTimes(0);
2822
+ });
2823
+ test("Should dispatch ForceReleasedLockEvent when key is uenxpired", async () => {
2824
+ const key = "a";
2825
+ const ttl = TimeSpan.fromMilliseconds(50);
2826
+ const lock = lockProvider.create(key, { ttl });
2827
+ await lock.acquire();
2828
+ const handlerFn = vi.fn((_event) => { });
2829
+ await lockProvider.addListener(LOCK_EVENTS.FORCE_RELEASED, handlerFn);
2830
+ await lock.forceRelease();
2831
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2832
+ expect(handlerFn).toHaveBeenCalledWith({
2833
+ key,
2834
+ });
2835
+ });
2836
+ test("Should dispatch ForceReleasedLockEvent when key is unexpireable", async () => {
2837
+ const key = "a";
2838
+ const ttl = null;
2839
+ const lock = lockProvider.create(key, { ttl });
2840
+ await lock.acquire();
2841
+ const handlerFn = vi.fn((_event) => { });
2842
+ await lockProvider.addListener(LOCK_EVENTS.FORCE_RELEASED, handlerFn);
2843
+ await lock.forceRelease();
2844
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2845
+ expect(handlerFn).toHaveBeenCalledWith({
2846
+ key,
2847
+ });
2848
+ });
2849
+ });
2850
+ describe("method: refresh", () => {
2851
+ test("Should dispatch UnownedRefreshTryLockEvent when key doesnt exists", async () => {
2852
+ const key = "a";
2853
+ const newTtl = TimeSpan.fromMinutes(1);
2854
+ const handlerFn = vi.fn((_event) => { });
2855
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
2856
+ const owner = "b";
2857
+ await lockProvider.create(key, { owner }).refresh(newTtl);
2858
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2859
+ expect(handlerFn).toHaveBeenCalledWith({
2860
+ key,
2861
+ owner,
2862
+ });
2863
+ });
2864
+ test("Should dispatch UnownedRefreshTryLockEvent when key is unexpireable and refreshed by different owner", async () => {
2865
+ const key = "a";
2866
+ const ttl = null;
2867
+ const lock1 = lockProvider.create(key, { ttl });
2868
+ await lock1.acquire();
2869
+ const newTtl = TimeSpan.fromMinutes(1);
2870
+ const owner = "b";
2871
+ const lock2 = lockProvider.create(key, { ttl, owner });
2872
+ const handlerFn = vi.fn((_event) => { });
2873
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
2874
+ await lock2.refresh(newTtl);
2875
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2876
+ expect(handlerFn).toHaveBeenCalledWith({
2877
+ key,
2878
+ owner,
2879
+ });
2880
+ });
2881
+ test("Should dispatch UnownedRefreshTryLockEvent when key is unexpired and refreshed by different owner", async () => {
2882
+ const key = "a";
2883
+ const ttl = TimeSpan.fromMilliseconds(50);
2884
+ const lock1 = lockProvider.create(key, { ttl });
2885
+ await lock1.acquire();
2886
+ const newTtl = TimeSpan.fromMinutes(1);
2887
+ const owner = "b";
2888
+ const lock2 = lockProvider.create(key, { ttl, owner });
2889
+ const handlerFn = vi.fn((_event) => { });
2890
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
2891
+ await lock2.refresh(newTtl);
2892
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2893
+ expect(handlerFn).toHaveBeenCalledWith({
2894
+ key,
2895
+ owner,
2896
+ });
2897
+ });
2898
+ test("Should dispatch UnownedRefreshTryLockEvent when key is expired and refreshed by different owner", async () => {
2899
+ const key = "a";
2900
+ const ttl = TimeSpan.fromMilliseconds(50);
2901
+ const lock1 = lockProvider.create(key, { ttl });
2902
+ await lock1.acquire();
2903
+ await delay(ttl);
2904
+ const newTtl = TimeSpan.fromMinutes(1);
2905
+ const owner = "b";
2906
+ const lock2 = lockProvider.create(key, { ttl, owner });
2907
+ const handlerFn = vi.fn((_event) => { });
2908
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
2909
+ await lock2.refresh(newTtl);
2910
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2911
+ expect(handlerFn).toHaveBeenCalledWith({
2912
+ key,
2913
+ owner,
2914
+ });
2915
+ });
2916
+ test("Should dispatch UnownedRefreshTryLockEvent when key is expired and refreshed by same owner", async () => {
2917
+ const key = "a";
2918
+ const ttl = TimeSpan.fromMilliseconds(50);
2919
+ const owner = "b";
2920
+ const lock = lockProvider.create(key, {
2921
+ ttl,
2922
+ owner,
2923
+ });
2924
+ await lock.acquire();
2925
+ await delay(ttl);
2926
+ const newTtl = TimeSpan.fromMinutes(1);
2927
+ const handlerFn = vi.fn((_event) => { });
2928
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
2929
+ await lock.refresh(newTtl);
2930
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2931
+ expect(handlerFn).toHaveBeenCalledWith({
2932
+ key,
2933
+ owner,
2934
+ });
2935
+ });
2936
+ test("Should dispatch UnexpireableKeyRefreshTryLockEvent when key is unexpireable and refreshed by same owner", async () => {
2937
+ const key = "a";
2938
+ const ttl = null;
2939
+ const owner = "b";
2940
+ const lock = lockProvider.create(key, { ttl, owner });
2941
+ await lock.acquire();
2942
+ const newTtl = TimeSpan.fromMinutes(1);
2943
+ const handlerFn = vi.fn((_event) => { });
2944
+ await lockProvider.addListener(LOCK_EVENTS.UNEXPIREABLE_KEY_REFRESH_TRY, handlerFn);
2945
+ await lock.refresh(newTtl);
2946
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2947
+ expect(handlerFn).toHaveBeenCalledWith({
2948
+ key,
2949
+ owner,
2950
+ });
2951
+ });
2952
+ test("Should dispatch RefreshedLockEvent when key is unexpired and refreshed by same owner", async () => {
2953
+ const key = "a";
2954
+ const ttl = TimeSpan.fromMilliseconds(50);
2955
+ const owner = "b";
2956
+ const lock = lockProvider.create(key, { ttl, owner });
2957
+ await lock.acquire();
2958
+ const newTtl = TimeSpan.fromMinutes(1);
2959
+ const handlerFn = vi.fn((_event) => { });
2960
+ await lockProvider.addListener(LOCK_EVENTS.REFRESHED, handlerFn);
2961
+ await lock.refresh(newTtl);
2962
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2963
+ expect(handlerFn).toHaveBeenCalledWith({
2964
+ key,
2965
+ owner,
2966
+ ttl: newTtl,
2967
+ });
2968
+ });
2969
+ });
2970
+ describe("method: refreshOrFail", () => {
2971
+ test("Should dispatch UnownedRefreshTryLockEvent when key doesnt exists", async () => {
2972
+ const key = "a";
2973
+ const newTtl = TimeSpan.fromMinutes(1);
2974
+ const handlerFn = vi.fn((_event) => { });
2975
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
2976
+ const owner = "b";
2977
+ try {
2978
+ await lockProvider
2979
+ .create(key, { owner })
2980
+ .refreshOrFail(newTtl);
2981
+ }
2982
+ catch {
2983
+ /* EMPTY */
2984
+ }
2985
+ expect(handlerFn).toHaveBeenCalledTimes(1);
2986
+ expect(handlerFn).toHaveBeenCalledWith({
2987
+ key,
2988
+ owner,
2989
+ });
2990
+ });
2991
+ test("Should dispatch UnownedRefreshTryLockEvent when key is unexpireable and refreshed by different owner", async () => {
2992
+ const key = "a";
2993
+ const ttl = null;
2994
+ const lock1 = lockProvider.create(key, { ttl });
2995
+ await lock1.acquire();
2996
+ const newTtl = TimeSpan.fromMinutes(1);
2997
+ const owner = "b";
2998
+ const lock2 = lockProvider.create(key, { ttl, owner });
2999
+ const handlerFn = vi.fn((_event) => { });
3000
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
3001
+ try {
3002
+ await lock2.refreshOrFail(newTtl);
3003
+ }
3004
+ catch {
3005
+ /* EMPTY */
3006
+ }
3007
+ expect(handlerFn).toHaveBeenCalledTimes(1);
3008
+ expect(handlerFn).toHaveBeenCalledWith({
3009
+ key,
3010
+ owner,
3011
+ });
3012
+ });
3013
+ test("Should dispatch UnownedRefreshTryLockEvent when key is unexpired and refreshed by different owner", async () => {
3014
+ const key = "a";
3015
+ const ttl = TimeSpan.fromMilliseconds(50);
3016
+ const lock1 = lockProvider.create(key, { ttl });
3017
+ await lock1.acquire();
3018
+ const newTtl = TimeSpan.fromMinutes(1);
3019
+ const owner = "b";
3020
+ const lock2 = lockProvider.create(key, { ttl, owner });
3021
+ const handlerFn = vi.fn((_event) => { });
3022
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
3023
+ try {
3024
+ await lock2.refreshOrFail(newTtl);
3025
+ }
3026
+ catch {
3027
+ /* EMPTY */
3028
+ }
3029
+ expect(handlerFn).toHaveBeenCalledTimes(1);
3030
+ expect(handlerFn).toHaveBeenCalledWith({
3031
+ key,
3032
+ owner,
3033
+ });
3034
+ });
3035
+ test("Should dispatch UnownedRefreshTryLockEvent when key is expired and refreshed by different owner", async () => {
3036
+ const key = "a";
3037
+ const ttl = TimeSpan.fromMilliseconds(50);
3038
+ const lock1 = lockProvider.create(key, { ttl });
3039
+ await lock1.acquire();
3040
+ await delay(ttl);
3041
+ const newTtl = TimeSpan.fromMinutes(1);
3042
+ const owner = "b";
3043
+ const lock2 = lockProvider.create(key, { ttl, owner });
3044
+ const handlerFn = vi.fn((_event) => { });
3045
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
3046
+ try {
3047
+ await lock2.refreshOrFail(newTtl);
3048
+ }
3049
+ catch {
3050
+ /* EMPTY */
3051
+ }
3052
+ expect(handlerFn).toHaveBeenCalledTimes(1);
3053
+ expect(handlerFn).toHaveBeenCalledWith({
3054
+ key,
3055
+ owner,
3056
+ });
3057
+ });
3058
+ test("Should dispatch UnownedRefreshTryLockEvent when key is expired and refreshed by same owner", async () => {
3059
+ const key = "a";
3060
+ const ttl = TimeSpan.fromMilliseconds(50);
3061
+ const owner = "b";
3062
+ const lock = lockProvider.create(key, {
3063
+ ttl,
3064
+ owner,
3065
+ });
3066
+ await lock.acquire();
3067
+ await delay(ttl);
3068
+ const newTtl = TimeSpan.fromMinutes(1);
3069
+ const handlerFn = vi.fn((_event) => { });
3070
+ await lockProvider.addListener(LOCK_EVENTS.UNOWNED_REFRESH_TRY, handlerFn);
3071
+ try {
3072
+ await lock.refreshOrFail(newTtl);
3073
+ }
3074
+ catch {
3075
+ /* EMPTY */
3076
+ }
3077
+ expect(handlerFn).toHaveBeenCalledTimes(1);
3078
+ expect(handlerFn).toHaveBeenCalledWith({
3079
+ key,
3080
+ owner,
3081
+ });
3082
+ });
3083
+ test("Should dispatch UnexpireableKeyRefreshTryLockEvent when key is unexpireable and refreshed by same owner", async () => {
3084
+ const key = "a";
3085
+ const ttl = null;
3086
+ const owner = "b";
3087
+ const lock = lockProvider.create(key, { ttl, owner });
3088
+ await lock.acquire();
3089
+ const newTtl = TimeSpan.fromMinutes(1);
3090
+ const handlerFn = vi.fn((_event) => { });
3091
+ await lockProvider.addListener(LOCK_EVENTS.UNEXPIREABLE_KEY_REFRESH_TRY, handlerFn);
3092
+ try {
3093
+ await lock.refreshOrFail(newTtl);
3094
+ }
3095
+ catch {
3096
+ /* EMPTY */
3097
+ }
3098
+ expect(handlerFn).toHaveBeenCalledTimes(1);
3099
+ expect(handlerFn).toHaveBeenCalledWith({
3100
+ key,
3101
+ owner,
3102
+ });
3103
+ });
3104
+ test("Should dispatch RefreshedLockEvent when key is unexpired and refreshed by same owner", async () => {
3105
+ const key = "a";
3106
+ const ttl = TimeSpan.fromMilliseconds(50);
3107
+ const owner = "b";
3108
+ const lock = lockProvider.create(key, { ttl, owner });
3109
+ await lock.acquire();
3110
+ const newTtl = TimeSpan.fromMinutes(1);
3111
+ const handlerFn = vi.fn((_event) => { });
3112
+ await lockProvider.addListener(LOCK_EVENTS.REFRESHED, handlerFn);
3113
+ await lock.refreshOrFail(newTtl);
3114
+ expect(handlerFn).toHaveBeenCalledTimes(1);
3115
+ expect(handlerFn).toHaveBeenCalledWith({
3116
+ key,
3117
+ owner,
3118
+ ttl: newTtl,
1929
3119
  });
1930
3120
  });
1931
3121
  });
@@ -1954,17 +3144,17 @@ export function lockProviderTestSuite(settings) {
1954
3144
  test("Should preserve ttl", async () => {
1955
3145
  const key = "a";
1956
3146
  const owner = "b";
1957
- const ttl = TTL.multiply(2);
3147
+ const ttl = TimeSpan.fromMilliseconds(50).multiply(2);
1958
3148
  const lock = lockProvider.create(key, {
1959
3149
  owner,
1960
3150
  ttl,
1961
3151
  });
1962
3152
  await lock.acquire();
1963
3153
  const deserializedLock = serde.deserialize(serde.serialize(lock));
1964
- const delayTime = TTL;
1965
- await LazyPromise.delay(delayTime);
3154
+ const delayTime = TimeSpan.fromMilliseconds(50);
3155
+ await delay(delayTime);
1966
3156
  expect(await deserializedLock.isLocked()).toBe(true);
1967
- await LazyPromise.delay(delayTime);
3157
+ await delay(delayTime);
1968
3158
  expect(await deserializedLock.isLocked()).toBe(false);
1969
3159
  });
1970
3160
  });