diff options
Diffstat (limited to 'packages/backend/src/misc/app-lock.ts')
| -rw-r--r-- | packages/backend/src/misc/app-lock.ts | 31 |
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); +} |