diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-04-04 14:06:57 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-04-04 14:06:57 +0900 |
| commit | 30d699268450af375dabc2226ec4f3196a53f7f7 (patch) | |
| tree | e6e62a4b19f190d2a51e4a5281c051b6911f97a1 /packages/sw/src | |
| parent | build(#10336): Storybook & Chromatic & msw (#10365) (diff) | |
| download | sharkey-30d699268450af375dabc2226ec4f3196a53f7f7.tar.gz sharkey-30d699268450af375dabc2226ec4f3196a53f7f7.tar.bz2 sharkey-30d699268450af375dabc2226ec4f3196a53f7f7.zip | |
perf(backend): 通知をRedisに保存するように
Resolve #10168
Diffstat (limited to 'packages/sw/src')
| -rw-r--r-- | packages/sw/src/scripts/notification-read.ts | 58 | ||||
| -rw-r--r-- | packages/sw/src/sw.ts | 30 | ||||
| -rw-r--r-- | packages/sw/src/types.ts | 4 |
3 files changed, 3 insertions, 89 deletions
diff --git a/packages/sw/src/scripts/notification-read.ts b/packages/sw/src/scripts/notification-read.ts deleted file mode 100644 index 3b1dde0cd5..0000000000 --- a/packages/sw/src/scripts/notification-read.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { get } from 'idb-keyval'; -import { pushNotificationDataMap } from '@/types'; -import { api } from '@/scripts/operations'; - -type Accounts = { - [x: string]: { - queue: string[], - timeout: number | null - } -}; - -class SwNotificationReadManager { - private accounts: Accounts = {}; - - public async construct() { - const accounts = await get('accounts'); - if (!accounts) Error('Accounts are not recorded'); - - this.accounts = accounts.reduce((acc, e) => { - acc[e.id] = { - queue: [], - timeout: null - }; - return acc; - }, {} as Accounts); - - return this; - } - - // プッシュ通知の既読をサーバーに送信 - public async read(data: pushNotificationDataMap[keyof pushNotificationDataMap]) { - if (data.type !== 'notification' || !(data.userId in this.accounts)) return; - - const account = this.accounts[data.userId]; - - account.queue.push(data.body.id as string); - - if (account.queue.length >= 20) { - if (account.timeout) clearTimeout(account.timeout); - const notificationIds = account.queue; - account.queue = []; - await api('notifications/read', data.userId, { notificationIds }); - return; - } - - // 最後の呼び出しから200ms待ってまとめて処理する - if (account.timeout) clearTimeout(account.timeout); - account.timeout = setTimeout(() => { - account.timeout = null; - - const notificationIds = account.queue; - account.queue = []; - api('notifications/read', data.userId, { notificationIds }); - }, 200); - } -} - -export const swNotificationRead = (new SwNotificationReadManager()).construct(); diff --git a/packages/sw/src/sw.ts b/packages/sw/src/sw.ts index 6f4c487354..9ceef890dd 100644 --- a/packages/sw/src/sw.ts +++ b/packages/sw/src/sw.ts @@ -1,6 +1,6 @@ import { createEmptyNotification, createNotification } from '@/scripts/create-notification'; import { swLang } from '@/scripts/lang'; -import { swNotificationRead } from '@/scripts/notification-read'; +import { api } from '@/scripts/operations'; import { pushNotificationDataMap } from '@/types'; import * as swos from '@/scripts/operations'; import { acct as getAcct } from '@/filters/user'; @@ -54,30 +54,6 @@ globalThis.addEventListener('push', ev => { if ((new Date()).getTime() - data.dateTime > 1000 * 60 * 60 * 24) break; return createNotification(data); - case 'readAllNotifications': - for (const n of await globalThis.registration.getNotifications()) { - if (n?.data?.type === 'notification') n.close(); - } - break; - case 'readAllAntennas': - for (const n of await globalThis.registration.getNotifications()) { - if (n?.data?.type === 'unreadAntennaNote') n.close(); - } - break; - case 'readNotifications': - for (const n of await globalThis.registration.getNotifications()) { - if (data.body.notificationIds.includes(n.data.body.id)) { - n.close(); - } - } - break; - case 'readAntenna': - for (const n of await globalThis.registration.getNotifications()) { - if (n?.data?.type === 'unreadAntennaNote' && data.body.antennaId === n.data.body.antenna.id) { - n.close(); - } - } - break; } await createEmptyNotification(); @@ -154,7 +130,7 @@ globalThis.addEventListener('notificationclick', (ev: ServiceWorkerGlobalScopeEv client.focus(); } if (data.type === 'notification') { - swNotificationRead.then(that => that.read(data)); + api('notifications/mark-all-as-read', data.userId); } notification.close(); @@ -165,7 +141,7 @@ globalThis.addEventListener('notificationclose', (ev: ServiceWorkerGlobalScopeEv const data: pushNotificationDataMap[keyof pushNotificationDataMap] = ev.notification.data; if (data.type === 'notification') { - swNotificationRead.then(that => that.read(data)); + api('notifications/mark-all-as-read', data.userId); } }); diff --git a/packages/sw/src/types.ts b/packages/sw/src/types.ts index 5b53ddecac..176b181be0 100644 --- a/packages/sw/src/types.ts +++ b/packages/sw/src/types.ts @@ -17,10 +17,6 @@ type pushNotificationDataSourceMap = { antenna: { id: string, name: string }; note: Misskey.entities.Note; }; - readNotifications: { notificationIds: string[] }; - readAllNotifications: undefined; - readAntenna: { antennaId: string }; - readAllAntennas: undefined; }; export type pushNotificationData<K extends keyof pushNotificationDataSourceMap> = { |