summaryrefslogtreecommitdiff
path: root/packages/sw/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-04-04 14:06:57 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-04-04 14:06:57 +0900
commit30d699268450af375dabc2226ec4f3196a53f7f7 (patch)
treee6e62a4b19f190d2a51e4a5281c051b6911f97a1 /packages/sw/src
parentbuild(#10336): Storybook & Chromatic & msw (#10365) (diff)
downloadsharkey-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.ts58
-rw-r--r--packages/sw/src/sw.ts30
-rw-r--r--packages/sw/src/types.ts4
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> = {