summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/AppLockService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-09-18 03:27:08 +0900
committerGitHub <noreply@github.com>2022-09-18 03:27:08 +0900
commitb75184ec8e3436200bacdcd832e3324702553d20 (patch)
tree8b7e316f29e95df921db57289c8b8da476d18f07 /packages/backend/src/core/AppLockService.ts
parentUpdate ROADMAP.md (diff)
downloadsharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.gz
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.tar.bz2
sharkey-b75184ec8e3436200bacdcd832e3324702553d20.zip
なんかもうめっちゃ変えた
Diffstat (limited to 'packages/backend/src/core/AppLockService.ts')
-rw-r--r--packages/backend/src/core/AppLockService.ts40
1 files changed, 40 insertions, 0 deletions
diff --git a/packages/backend/src/core/AppLockService.ts b/packages/backend/src/core/AppLockService.ts
new file mode 100644
index 0000000000..f3c345493b
--- /dev/null
+++ b/packages/backend/src/core/AppLockService.ts
@@ -0,0 +1,40 @@
+import { promisify } from 'node:util';
+import { Inject, Injectable } from '@nestjs/common';
+import redisLock from 'redis-lock';
+import Redis from 'ioredis';
+import { DI } from '@/di-symbols.js';
+
+/**
+ * Retry delay (ms) for lock acquisition
+ */
+const retryDelay = 100;
+
+@Injectable()
+export class AppLockService {
+ #lock: (key: string, timeout?: number) => Promise<() => void>;
+
+ constructor(
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+ ) {
+ this.#lock = promisify(redisLock(this.redisClient, retryDelay));
+ }
+
+ /**
+ * Get AP Object lock
+ * @param uri AP object ID
+ * @param timeout Lock timeout (ms), The timeout releases previous lock.
+ * @returns Unlock function
+ */
+ public getApLock(uri: string, timeout = 30 * 1000): Promise<() => void> {
+ return this.#lock(`ap-object:${uri}`, timeout);
+ }
+
+ public getFetchInstanceMetadataLock(host: string, timeout = 30 * 1000): Promise<() => void> {
+ return this.#lock(`instance:${host}`, timeout);
+ }
+
+ public getChartInsertLock(lockKey: string, timeout = 30 * 1000): Promise<() => void> {
+ return this.#lock(`chart-insert:${lockKey}`, timeout);
+ }
+}