summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc/app-lock.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/misc/app-lock.ts')
-rw-r--r--packages/backend/src/misc/app-lock.ts31
1 files changed, 31 insertions, 0 deletions
diff --git a/packages/backend/src/misc/app-lock.ts b/packages/backend/src/misc/app-lock.ts
new file mode 100644
index 0000000000..a32b600612
--- /dev/null
+++ b/packages/backend/src/misc/app-lock.ts
@@ -0,0 +1,31 @@
+import { redisClient } from '../db/redis';
+import { promisify } from 'util';
+import * as redisLock from 'redis-lock';
+
+/**
+ * Retry delay (ms) for lock acquisition
+ */
+const retryDelay = 100;
+
+const lock: (key: string, timeout?: number) => Promise<() => void>
+ = redisClient
+ ? promisify(redisLock(redisClient, retryDelay))
+ : async () => () => { };
+
+/**
+ * Get AP Object lock
+ * @param uri AP object ID
+ * @param timeout Lock timeout (ms), The timeout releases previous lock.
+ * @returns Unlock function
+ */
+export function getApLock(uri: string, timeout = 30 * 1000) {
+ return lock(`ap-object:${uri}`, timeout);
+}
+
+export function getFetchInstanceMetadataLock(host: string, timeout = 30 * 1000) {
+ return lock(`instance:${host}`, timeout);
+}
+
+export function getChartInsertLock(lockKey: string, timeout = 30 * 1000) {
+ return lock(`chart-insert:${lockKey}`, timeout);
+}