@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 +1 @@
1
- {"version":3,"file":"memory-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/memory-lock-adapter/memory-lock-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  /**
2
2
  * @module Lock
3
3
  */
4
- import { type IDeinitizable, type IInitizable, type IPrunable } from "../../../../utilities/_module-exports.js";
5
- import type { IDatabaseLockAdapter, ILockData } from "../../../../lock/contracts/_module-exports.js";
4
+ import type { TimeSpan } from "../../../../utilities/_module-exports.js";
5
+ import { type IDeinitizable, type IInitizable } from "../../../../utilities/_module-exports.js";
6
+ import { type ILockAdapter, type LockRefreshResult } from "../../../../lock/contracts/_module-exports.js";
6
7
  import type { CollectionOptions, Db } from "mongodb";
8
+ import type { ObjectId } from "mongodb";
7
9
  /**
8
10
  *
9
11
  * IMPORT_PATH: `"@daiso-tech/core/lock/adapters"`
@@ -12,20 +14,31 @@ import type { CollectionOptions, Db } from "mongodb";
12
14
  export type MongodbLockAdapterSettings = {
13
15
  database: Db;
14
16
  /**
15
- * @default {"lock"}
17
+ * @default "lock"
16
18
  */
17
19
  collectionName?: string;
18
20
  collectionSettings?: CollectionOptions;
19
21
  };
20
22
  /**
21
- * To utilize the `MongodbLockAdapter`, you must install the `"mongodb"` package.
23
+ *
24
+ * IMPORT_PATH: `"@daiso-tech/core/lock/adapters"`
25
+ * @group Adapters
26
+ */
27
+ export type MongodbLockDocument = {
28
+ _id: ObjectId;
29
+ key: string;
30
+ owner: string;
31
+ expiration: Date | null;
32
+ };
33
+ /**
34
+ * To utilize the `MongodbLockAdapter`, you must install the [`"mongodb"`](https://www.npmjs.com/package/mongodb) package.
22
35
  *
23
36
  * Note in order to use `MongodbLockAdapter` correctly, ensure you use a single, consistent database across all server instances.
24
37
  *
25
38
  * IMPORT_PATH: `"@daiso-tech/core/lock/adapters"`
26
39
  * @group Adapters
27
40
  */
28
- export declare class MongodbLockAdapter implements IDatabaseLockAdapter, IDeinitizable, IInitizable, IPrunable {
41
+ export declare class MongodbLockAdapter implements ILockAdapter, IDeinitizable, IInitizable {
29
42
  private readonly database;
30
43
  private readonly collection;
31
44
  private readonly collectionName;
@@ -44,8 +57,7 @@ export declare class MongodbLockAdapter implements IDatabaseLockAdapter, IDeinit
44
57
  * await lockAdapter.init()
45
58
  * ```
46
59
  */
47
- constructor({ collectionName, collectionSettings, database, }: MongodbLockAdapterSettings);
48
- removeAllExpired(): Promise<void>;
60
+ constructor(settings: MongodbLockAdapterSettings);
49
61
  /**
50
62
  * Creates all related indexes.
51
63
  * Note the `init` method needs to be called before using the adapter.
@@ -56,9 +68,8 @@ export declare class MongodbLockAdapter implements IDatabaseLockAdapter, IDeinit
56
68
  * Note all lock data will be removed.
57
69
  */
58
70
  deInit(): Promise<void>;
59
- insert(key: string, owner: string, expiration: Date | null): Promise<void>;
60
- update(key: string, owner: string, expiration: Date | null): Promise<number>;
61
- remove(key: string, owner: string | null): Promise<void>;
62
- refresh(key: string, owner: string, expiration: Date): Promise<number>;
63
- find(key: string): Promise<ILockData | null>;
71
+ acquire(key: string, owner: string, ttl: TimeSpan | null): Promise<boolean>;
72
+ release(key: string, owner: string): Promise<boolean>;
73
+ forceRelease(key: string): Promise<boolean>;
74
+ refresh(key: string, owner: string, ttl: TimeSpan): Promise<LockRefreshResult>;
64
75
  }
@@ -2,10 +2,9 @@
2
2
  * @module Lock
3
3
  */
4
4
  import {} from "../../../../utilities/_module-exports.js";
5
- import { UnexpectedLockError } from "../../../../lock/contracts/_module-exports.js";
6
- import { ObjectId } from "mongodb";
5
+ import { LOCK_REFRESH_RESULT, } from "../../../../lock/contracts/_module-exports.js";
7
6
  /**
8
- * To utilize the `MongodbLockAdapter`, you must install the `"mongodb"` package.
7
+ * To utilize the `MongodbLockAdapter`, you must install the [`"mongodb"`](https://www.npmjs.com/package/mongodb) package.
9
8
  *
10
9
  * Note in order to use `MongodbLockAdapter` correctly, ensure you use a single, consistent database across all server instances.
11
10
  *
@@ -31,126 +30,192 @@ export class MongodbLockAdapter {
31
30
  * await lockAdapter.init()
32
31
  * ```
33
32
  */
34
- constructor({ collectionName = "lock", collectionSettings, database, }) {
33
+ constructor(settings) {
34
+ const { collectionName = "lock", collectionSettings, database, } = settings;
35
35
  this.collectionName = collectionName;
36
36
  this.database = database;
37
37
  this.collection = database.collection(collectionName, collectionSettings);
38
38
  }
39
- async removeAllExpired() {
40
- await this.collection.deleteMany({
41
- expiresAt: {
42
- $lte: new Date(),
43
- },
44
- });
45
- }
46
39
  /**
47
40
  * Creates all related indexes.
48
41
  * Note the `init` method needs to be called before using the adapter.
49
42
  */
50
43
  async init() {
51
- await this.collection.createIndex({
52
- key: 1,
53
- }, {
54
- unique: true,
55
- });
56
- await this.collection.createIndex("expiresAt", {
57
- expireAfterSeconds: 0,
58
- });
44
+ // Should throw if the index already exists thats why the try catch is used.
45
+ try {
46
+ await this.collection.createIndex({
47
+ key: 1,
48
+ }, {
49
+ unique: true,
50
+ });
51
+ }
52
+ catch {
53
+ /* EMPTY */
54
+ }
55
+ // Should throw if the index already exists thats why the try catch is used.
56
+ try {
57
+ await this.collection.createIndex("expiration", {
58
+ expireAfterSeconds: 0,
59
+ });
60
+ }
61
+ catch {
62
+ /* EMPTY */
63
+ }
59
64
  }
60
65
  /**
61
66
  * Removes the collection where the lock keys are stored and all it's related indexes.
62
67
  * Note all lock data will be removed.
63
68
  */
64
69
  async deInit() {
65
- await this.collection.dropIndexes();
66
- await this.database.dropCollection(this.collectionName);
67
- }
68
- async insert(key, owner, expiration) {
69
- const insertResult = await this.collection.insertOne({
70
- _id: new ObjectId(),
71
- key,
72
- owner,
73
- expiresAt: expiration,
74
- });
75
- if (!insertResult.acknowledged) {
76
- throw new UnexpectedLockError("Mongodb insertion was not acknowledged");
70
+ // Should throw if the collection already does not exists thats why the try catch is used.
71
+ try {
72
+ await this.collection.dropIndexes();
73
+ }
74
+ catch {
75
+ /* EMPTY */
76
+ }
77
+ // Should throw if the collection already does not exists thats why the try catch is used.
78
+ try {
79
+ await this.database.dropCollection(this.collectionName);
80
+ }
81
+ catch {
82
+ /* EMPTY */
77
83
  }
78
84
  }
79
- async update(key, owner, expiration) {
80
- const updateResult = await this.collection.updateOne({
81
- key,
85
+ async acquire(key, owner, ttl) {
86
+ const expiration = ttl?.toEndDate() ?? null;
87
+ const isExpiredQuery = {
82
88
  $and: [
83
89
  {
84
- expiresAt: {
85
- $ne: null,
86
- },
90
+ $ne: ["$expiration", null],
87
91
  },
88
92
  {
89
- expiresAt: {
90
- $lte: new Date(),
91
- },
93
+ $lte: ["$expiration", new Date()],
92
94
  },
93
95
  ],
94
- }, {
95
- $set: {
96
- owner,
97
- expiresAt: expiration,
96
+ };
97
+ const lockData = await this.collection.findOneAndUpdate({
98
+ key,
99
+ }, [
100
+ {
101
+ $set: {
102
+ key,
103
+ owner: {
104
+ $ifNull: ["$owner", owner],
105
+ },
106
+ expiration: {
107
+ $ifNull: ["$expiration", expiration],
108
+ },
109
+ },
110
+ },
111
+ {
112
+ $set: {
113
+ owner: {
114
+ $cond: {
115
+ if: isExpiredQuery,
116
+ then: owner,
117
+ else: "$owner",
118
+ },
119
+ },
120
+ expiration: {
121
+ $cond: {
122
+ if: isExpiredQuery,
123
+ then: expiration,
124
+ else: "$expiration",
125
+ },
126
+ },
127
+ },
98
128
  },
129
+ ], {
130
+ upsert: true,
99
131
  });
100
- if (!updateResult.acknowledged) {
101
- throw new UnexpectedLockError("Mongodb update was not acknowledged");
132
+ if (lockData === null) {
133
+ return true;
102
134
  }
103
- return updateResult.modifiedCount; // > 0;
104
- }
105
- async remove(key, owner) {
106
- if (owner === null) {
107
- const deleteResult = await this.collection.deleteOne({
108
- key,
109
- });
110
- if (!deleteResult.acknowledged) {
111
- throw new UnexpectedLockError("Mongodb deletion was not acknowledged");
112
- }
113
- return;
135
+ if (lockData.expiration === null) {
136
+ return false;
114
137
  }
115
- const deleteResult = await this.collection.deleteOne({
138
+ return lockData.expiration <= new Date();
139
+ }
140
+ async release(key, owner) {
141
+ const isUnexpirableQuery = {
142
+ expiration: {
143
+ $eq: null,
144
+ },
145
+ };
146
+ const isUnexpiredQuery = {
147
+ expiration: {
148
+ $gt: new Date(),
149
+ },
150
+ };
151
+ const lockData = await this.collection.findOneAndDelete({
116
152
  key,
117
153
  owner,
154
+ $or: [isUnexpirableQuery, isUnexpiredQuery],
118
155
  });
119
- if (!deleteResult.acknowledged) {
120
- throw new UnexpectedLockError("Mongodb deletion was not acknowledged");
156
+ if (lockData === null) {
157
+ return false;
121
158
  }
159
+ const { expiration } = lockData;
160
+ const hasNoExpiration = expiration === null;
161
+ if (hasNoExpiration) {
162
+ return true;
163
+ }
164
+ const { owner: currentOwner } = lockData;
165
+ const isNotExpired = expiration > new Date();
166
+ const isCurrentOwner = owner === currentOwner;
167
+ return isNotExpired && isCurrentOwner;
122
168
  }
123
- async refresh(key, owner, expiration) {
124
- const updateResult = await this.collection.updateOne({
125
- key,
126
- owner,
127
- }, {
128
- $set: {
129
- expiresAt: expiration,
130
- },
131
- });
132
- if (!updateResult.acknowledged) {
133
- throw new UnexpectedLockError("Mongodb update was not acknowledged");
169
+ async forceRelease(key) {
170
+ const lockData = await this.collection.findOneAndDelete({ key });
171
+ if (lockData === null) {
172
+ return false;
173
+ }
174
+ if (lockData.expiration === null) {
175
+ return true;
134
176
  }
135
- return updateResult.modifiedCount; // > 0;
177
+ const isNotExpired = lockData.expiration >= new Date();
178
+ return isNotExpired;
136
179
  }
137
- async find(key) {
138
- const document = await this.collection.findOne({
139
- key: key,
140
- }, {
141
- projection: {
142
- _id: 0,
143
- owner: 1,
144
- expiresAt: 1,
180
+ async refresh(key, owner, ttl) {
181
+ const isUnexpiredQuery = {
182
+ $and: [
183
+ {
184
+ $ne: ["$expiration", null],
185
+ },
186
+ {
187
+ $gt: ["$expiration", new Date()],
188
+ },
189
+ ],
190
+ };
191
+ const lockData = await this.collection.findOneAndUpdate({
192
+ key,
193
+ }, [
194
+ {
195
+ $set: {
196
+ expiration: {
197
+ $cond: {
198
+ if: isUnexpiredQuery,
199
+ then: ttl.toEndDate(),
200
+ else: "$expiration",
201
+ },
202
+ },
203
+ },
145
204
  },
146
- });
147
- if (document === null) {
148
- return null;
205
+ ]);
206
+ if (lockData === null) {
207
+ return LOCK_REFRESH_RESULT.UNOWNED_REFRESH;
149
208
  }
150
- return {
151
- owner: document.owner,
152
- expiration: document.expiresAt,
153
- };
209
+ if (lockData.owner !== owner) {
210
+ return LOCK_REFRESH_RESULT.UNOWNED_REFRESH;
211
+ }
212
+ if (lockData.expiration === null) {
213
+ return LOCK_REFRESH_RESULT.UNEXPIRABLE_KEY;
214
+ }
215
+ if (lockData.expiration <= new Date()) {
216
+ return LOCK_REFRESH_RESULT.UNOWNED_REFRESH;
217
+ }
218
+ return LOCK_REFRESH_RESULT.REFRESHED;
154
219
  }
155
220
  }
156
221
  //# sourceMappingURL=mongodb-lock-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mongodb-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mongodb-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/mongodb-lock-adapter/mongodb-lock-adapter.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * @module Lock
3
3
  */
4
4
  import type { TimeSpan } from "../../../../utilities/_module-exports.js";
5
- import type { ILockAdapter } from "../../../../lock/contracts/_module-exports.js";
5
+ import { type ILockAdapter, type LockRefreshResult } from "../../../../lock/contracts/_module-exports.js";
6
6
  /**
7
7
  * This `NoOpLockAdapter` will do nothing and is used for easily mocking {@link ILockProvider | `ILockProvider`} for testing.
8
8
  *
@@ -10,8 +10,8 @@ import type { ILockAdapter } from "../../../../lock/contracts/_module-exports.js
10
10
  * @group Adapters
11
11
  */
12
12
  export declare class NoOpLockAdapter implements ILockAdapter {
13
- acquire(_key: string, _owner: string, _ttl: TimeSpan | null): PromiseLike<boolean>;
14
- release(_key: string, _owner: string): PromiseLike<boolean>;
15
- forceRelease(_key: string): PromiseLike<void>;
16
- refresh(_key: string, _owner: string, _ttl: TimeSpan): PromiseLike<boolean>;
13
+ acquire(_key: string, _owner: string, _ttl: TimeSpan | null): Promise<boolean>;
14
+ release(_key: string, _owner: string): Promise<boolean>;
15
+ forceRelease(_key: string): Promise<boolean>;
16
+ refresh(_key: string, _owner: string, _ttl: TimeSpan): Promise<LockRefreshResult>;
17
17
  }
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @module Lock
3
3
  */
4
+ import { LOCK_REFRESH_RESULT, } from "../../../../lock/contracts/_module-exports.js";
4
5
  /**
5
6
  * This `NoOpLockAdapter` will do nothing and is used for easily mocking {@link ILockProvider | `ILockProvider`} for testing.
6
7
  *
@@ -15,10 +16,10 @@ export class NoOpLockAdapter {
15
16
  return Promise.resolve(true);
16
17
  }
17
18
  forceRelease(_key) {
18
- return Promise.resolve();
19
+ return Promise.resolve(true);
19
20
  }
20
21
  refresh(_key, _owner, _ttl) {
21
- return Promise.resolve(true);
22
+ return Promise.resolve(LOCK_REFRESH_RESULT.REFRESHED);
22
23
  }
23
24
  }
24
25
  //# sourceMappingURL=no-op-lock-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"no-op-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/no-op-lock-adapter/no-op-lock-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACxB,OAAO,CACH,IAAY,EACZ,MAAc,EACd,IAAqB;QAErB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,MAAc;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,IAAY;QACrB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,CACH,IAAY,EACZ,MAAc,EACd,IAAc;QAEd,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;CACJ"}
1
+ {"version":3,"file":"no-op-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/no-op-lock-adapter/no-op-lock-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACH,mBAAmB,GAGtB,MAAM,qCAAqC,CAAC;AAI7C;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACxB,OAAO,CACH,IAAY,EACZ,MAAc,EACd,IAAqB;QAErB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CAAC,IAAY,EAAE,MAAc;QAChC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,YAAY,CAAC,IAAY;QACrB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,CACH,IAAY,EACZ,MAAc,EACd,IAAc;QAEd,OAAO,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;CACJ"}
@@ -2,18 +2,18 @@
2
2
  * @module Lock
3
3
  */
4
4
  import type { TimeSpan } from "../../../../utilities/_module-exports.js";
5
- import type { ILockAdapter } from "../../../../lock/contracts/_module-exports.js";
5
+ import { LOCK_REFRESH_RESULT, type ILockAdapter, type LockRefreshResult } from "../../../../lock/contracts/_module-exports.js";
6
6
  import type { Redis } from "ioredis";
7
7
  import type { Result } from "ioredis";
8
8
  declare module "ioredis" {
9
9
  interface RedisCommander<Context> {
10
- daiso_lock_acquire(key: string, owner: string, ttl: string): Result<number, Context>;
10
+ daiso_lock_acquire(key: string, owner: string, expiration: string): Result<number, Context>;
11
11
  daiso_lock_release(key: string, owner: string): Result<number, Context>;
12
- daiso_lock_refresh(key: string, owner: string, ttl: string): Result<number, Context>;
12
+ daiso_lock_refresh(key: string, owner: string, expiration: string, REFRESHED: typeof LOCK_REFRESH_RESULT.REFRESHED, UNOWNED_REFRESH: typeof LOCK_REFRESH_RESULT.UNOWNED_REFRESH, UNEXPIRABLE_KEY: typeof LOCK_REFRESH_RESULT.UNEXPIRABLE_KEY): Result<LockRefreshResult, Context>;
13
13
  }
14
14
  }
15
15
  /**
16
- * To utilize the `RedisLockAdapter`, you must install the `"ioredis"` package.
16
+ * To utilize the `RedisLockAdapter`, you must install the [`"ioredis"`](https://www.npmjs.com/package/ioredis) package.
17
17
  *
18
18
  * Note in order to use `RedisLockAdapter` correctly, ensure you use a single, consistent database across all server instances.
19
19
  *
@@ -38,6 +38,6 @@ export declare class RedisLockAdapter implements ILockAdapter {
38
38
  private initRefreshComand;
39
39
  acquire(key: string, owner: string, ttl: TimeSpan | null): Promise<boolean>;
40
40
  release(key: string, owner: string): Promise<boolean>;
41
- forceRelease(key: string): Promise<void>;
42
- refresh(key: string, owner: string, ttl: TimeSpan): Promise<boolean>;
41
+ forceRelease(key: string): Promise<boolean>;
42
+ refresh(key: string, owner: string, ttl: TimeSpan): Promise<LockRefreshResult>;
43
43
  }
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * @module Lock
3
3
  */
4
+ import { LOCK_REFRESH_RESULT, } from "../../../../lock/contracts/_module-exports.js";
4
5
  /**
5
- * To utilize the `RedisLockAdapter`, you must install the `"ioredis"` package.
6
+ * To utilize the `RedisLockAdapter`, you must install the [`"ioredis"`](https://www.npmjs.com/package/ioredis) package.
6
7
  *
7
8
  * Note in order to use `RedisLockAdapter` correctly, ensure you use a single, consistent database across all server instances.
8
9
  *
@@ -36,21 +37,20 @@ export class RedisLockAdapter {
36
37
  lua: `
37
38
  local key = KEYS[1];
38
39
  local owner = ARGV[1];
39
- local ttl = ARGV[2]
40
-
41
- local hasKey = redis.call("exists", key)
42
- if hasKey == 1 then
40
+ local expiration = tonumber(ARGV[2])
41
+
42
+ if redis.call("exists", key) == 1 then
43
43
  return 0
44
44
  end
45
45
 
46
- if ttl == "null" then
46
+ if expiration == nil then
47
47
  redis.call("set", key, owner, "nx")
48
48
  else
49
- redis.call("set", key, owner, "px", ttl, "nx")
49
+ redis.call("set", key, owner, "px", expiration, "nx")
50
50
  end
51
51
 
52
52
  return 1
53
- `,
53
+ `,
54
54
  });
55
55
  }
56
56
  initReleaseCommand() {
@@ -63,14 +63,19 @@ export class RedisLockAdapter {
63
63
  local key = KEYS[1];
64
64
  local owner = ARGV[1];
65
65
 
66
- local owner_ = redis.call("get", key)
67
- if owner_ == owner then
68
- redis.call("del", key)
69
- return 1
66
+ if redis.call("exists", key) == 0 then
67
+ return 0
68
+ end
69
+
70
+ local isNotCurrentOwner = redis.call("get", key) ~= owner
71
+ if isNotCurrentOwner then
72
+ return 0
70
73
  end
74
+
75
+ redis.call("del", key)
71
76
 
72
- return 0
73
- `,
77
+ return 1
78
+ `,
74
79
  });
75
80
  }
76
81
  initRefreshComand() {
@@ -80,33 +85,50 @@ export class RedisLockAdapter {
80
85
  this.database.defineCommand("daiso_lock_refresh", {
81
86
  numberOfKeys: 1,
82
87
  lua: `
88
+ -- Arguments
83
89
  local key = KEYS[1];
84
90
  local owner = ARGV[1];
85
- local ttl = ARGV[2]
91
+ local expiration = ARGV[2]
86
92
 
87
- local owner_ = redis.call("get", key)
88
- if owner_ == owner then
89
- redis.call("pexpire", key, ttl)
90
- return 1
93
+ -- Constant values
94
+ local REFRESHED = ARGV[3]
95
+ local UNOWNED_REFRESH = ARGV[4]
96
+ local UNEXPIRABLE_KEY = ARGV[5]
97
+
98
+ if redis.call("exists", key) == 0 then
99
+ return UNOWNED_REFRESH
100
+ end
101
+
102
+ local isNotCurrentOwner = redis.call("get", key) ~= owner
103
+ if redis.call("get", key) ~= owner then
104
+ return UNOWNED_REFRESH
105
+ end
106
+
107
+ local currentExpiration = redis.call("pttl", key)
108
+ local isUnexpireable = currentExpiration == -1
109
+ if isUnexpireable then
110
+ return UNEXPIRABLE_KEY
91
111
  end
92
- return 0
112
+
113
+ redis.call("pexpire", key, expiration)
114
+ return REFRESHED
93
115
  `,
94
116
  });
95
117
  }
96
118
  async acquire(key, owner, ttl) {
97
119
  const result = await this.database.daiso_lock_acquire(key, owner, String(ttl?.toMilliseconds() ?? null));
98
- return result > 0;
120
+ return result === 1;
99
121
  }
100
122
  async release(key, owner) {
101
123
  const result = await this.database.daiso_lock_release(key, owner);
102
124
  return result === 1;
103
125
  }
104
126
  async forceRelease(key) {
105
- await this.database.del(key);
127
+ const result = await this.database.del(key);
128
+ return result > 0;
106
129
  }
107
130
  async refresh(key, owner, ttl) {
108
- const result = await this.database.daiso_lock_refresh(key, owner, ttl.toMilliseconds().toString());
109
- return Boolean(result);
131
+ return await this.database.daiso_lock_refresh(key, owner, ttl.toMilliseconds().toString(), LOCK_REFRESH_RESULT.REFRESHED, LOCK_REFRESH_RESULT.UNOWNED_REFRESH, LOCK_REFRESH_RESULT.UNEXPIRABLE_KEY);
110
132
  }
111
133
  }
112
134
  //# sourceMappingURL=redis-lock-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IAWI;IAV7B;;;;;;;;;OASG;IACH,YAA6B,QAAe;QAAf,aAAQ,GAAR,QAAQ,CAAO;QACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAEO,iBAAiB;QACrB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE;YAC9C,YAAY,EAAE,CAAC;YACf,GAAG,EAAE;;;;;;;;;;;;;;;;;iBAiBA;SACR,CAAC,CAAC;IACP,CAAC;IAEO,kBAAkB;QACtB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE;YAC9C,YAAY,EAAE,CAAC;YACf,GAAG,EAAE;;;;;;;;;;;iBAWA;SACR,CAAC,CAAC;IACP,CAAC;IAEO,iBAAiB;QACrB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE;YAC9C,YAAY,EAAE,CAAC;YACf,GAAG,EAAE;;;;;;;;;;;aAWJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,OAAO,CACT,GAAW,EACX,KAAa,EACb,GAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CACjD,GAAG,EACH,KAAK,EACL,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC,CACxC,CAAC;QACF,OAAO,MAAM,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO,MAAM,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,GAAa;QACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CACjD,GAAG,EACH,KAAK,EACL,GAAG,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,CAClC,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;CACJ"}
1
+ {"version":3,"file":"redis-lock-adapter.js","sourceRoot":"","sources":["../../../../../src/lock/implementations/adapters/redis-lock-adapter/redis-lock-adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACH,mBAAmB,GAGtB,MAAM,qCAAqC,CAAC;AAuB7C;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IAWI;IAV7B;;;;;;;;;OASG;IACH,YAA6B,QAAe;QAAf,aAAQ,GAAR,QAAQ,CAAO;QACxC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAEO,iBAAiB;QACrB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE;YAC9C,YAAY,EAAE,CAAC;YACf,GAAG,EAAE;;;;;;;;;;;;;;;;aAgBJ;SACJ,CAAC,CAAC;IACP,CAAC;IAEO,kBAAkB;QACtB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE;YAC9C,YAAY,EAAE,CAAC;YACf,GAAG,EAAE;;;;;;;;;;;;;;;;aAgBJ;SACJ,CAAC,CAAC;IACP,CAAC;IAEO,iBAAiB;QACrB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,oBAAoB,EAAE;YAC9C,YAAY,EAAE,CAAC;YACf,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA4BJ;SACJ,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,OAAO,CACT,GAAW,EACX,KAAa,EACb,GAAoB;QAEpB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CACjD,GAAG,EACH,KAAK,EACL,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,IAAI,CAAC,CACxC,CAAC;QACF,OAAO,MAAM,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,OAAO,MAAM,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,MAAM,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,OAAO,CACT,GAAW,EACX,KAAa,EACb,GAAa;QAEb,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CACzC,GAAG,EACH,KAAK,EACL,GAAG,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,EAC/B,mBAAmB,CAAC,SAAS,EAC7B,mBAAmB,CAAC,eAAe,EACnC,mBAAmB,CAAC,eAAe,CACtC,CAAC;IACN,CAAC;CACJ"}