summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/PushNotificationService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-04-11 14:20:16 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-04-11 14:20:16 +0900
commitc10d591bd09f18f939f21650def76a422d01d78b (patch)
treeb35ed528a30b7da3825693acdbcd02cf166fe31b /packages/backend/src/core/PushNotificationService.ts
parentsw: なんかもうめっちゃ変えた (#10570) (diff)
downloadsharkey-c10d591bd09f18f939f21650def76a422d01d78b.tar.gz
sharkey-c10d591bd09f18f939f21650def76a422d01d78b.tar.bz2
sharkey-c10d591bd09f18f939f21650def76a422d01d78b.zip
perf(backend): cache swSubscriptions
Diffstat (limited to 'packages/backend/src/core/PushNotificationService.ts')
-rw-r--r--packages/backend/src/core/PushNotificationService.ts21
1 files changed, 16 insertions, 5 deletions
diff --git a/packages/backend/src/core/PushNotificationService.ts b/packages/backend/src/core/PushNotificationService.ts
index fd24831fbc..9b44cf6413 100644
--- a/packages/backend/src/core/PushNotificationService.ts
+++ b/packages/backend/src/core/PushNotificationService.ts
@@ -1,12 +1,14 @@
import { Inject, Injectable } from '@nestjs/common';
import push from 'web-push';
+import Redis from 'ioredis';
import { DI } from '@/di-symbols.js';
import type { Config } from '@/config.js';
import type { Packed } from '@/misc/json-schema';
import { getNoteSummary } from '@/misc/get-note-summary.js';
-import type { SwSubscriptionsRepository } from '@/models/index.js';
+import type { SwSubscription, SwSubscriptionsRepository } from '@/models/index.js';
import { MetaService } from '@/core/MetaService.js';
import { bindThis } from '@/decorators.js';
+import { RedisKVCache } from '@/misc/cache.js';
// Defined also packages/sw/types.ts#L13
type PushNotificationsTypes = {
@@ -41,15 +43,27 @@ function truncateBody<T extends keyof PushNotificationsTypes>(type: T, body: Pus
@Injectable()
export class PushNotificationService {
+ private subscriptionsCache: RedisKVCache<SwSubscription[]>;
+
constructor(
@Inject(DI.config)
private config: Config,
+ @Inject(DI.redis)
+ private redisClient: Redis.Redis,
+
@Inject(DI.swSubscriptionsRepository)
private swSubscriptionsRepository: SwSubscriptionsRepository,
private metaService: MetaService,
) {
+ this.subscriptionsCache = new RedisKVCache<SwSubscription[]>(this.redisClient, 'userSwSubscriptions', {
+ lifetime: 1000 * 60 * 60 * 1, // 1h
+ memoryCacheLifetime: 1000 * 60 * 3, // 3m
+ fetcher: (key) => this.swSubscriptionsRepository.findBy({ userId: key }),
+ toRedisConverter: (value) => JSON.stringify(value),
+ fromRedisConverter: (value) => JSON.parse(value),
+ });
}
@bindThis
@@ -63,10 +77,7 @@ export class PushNotificationService {
meta.swPublicKey,
meta.swPrivateKey);
- // Fetch
- const subscriptions = await this.swSubscriptionsRepository.findBy({
- userId: userId,
- });
+ const subscriptions = await this.subscriptionsCache.fetch(userId);
for (const subscription of subscriptions) {
if ([