summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/stream
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-09-29 11:29:54 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-09-29 11:29:54 +0900
commitb9da1415a50f6036350c6453d4a681b58bf17d1e (patch)
tree06614d5be85f027890a969548ca816e6a36c8c78 /packages/backend/src/server/api/stream
parent.js (diff)
downloadsharkey-b9da1415a50f6036350c6453d4a681b58bf17d1e.tar.gz
sharkey-b9da1415a50f6036350c6453d4a681b58bf17d1e.tar.bz2
sharkey-b9da1415a50f6036350c6453d4a681b58bf17d1e.zip
feat: 通知の受信設定を強化
Diffstat (limited to 'packages/backend/src/server/api/stream')
-rw-r--r--packages/backend/src/server/api/stream/Connection.ts6
-rw-r--r--packages/backend/src/server/api/stream/channels/antenna.ts4
-rw-r--r--packages/backend/src/server/api/stream/channels/role-timeline.ts4
-rw-r--r--packages/backend/src/server/api/stream/types.ts259
4 files changed, 7 insertions, 266 deletions
diff --git a/packages/backend/src/server/api/stream/Connection.ts b/packages/backend/src/server/api/stream/Connection.ts
index fd91681fc1..a73071ea99 100644
--- a/packages/backend/src/server/api/stream/Connection.ts
+++ b/packages/backend/src/server/api/stream/Connection.ts
@@ -12,10 +12,10 @@ import type { NotificationService } from '@/core/NotificationService.js';
import { bindThis } from '@/decorators.js';
import { CacheService } from '@/core/CacheService.js';
import { MiUserProfile } from '@/models/_.js';
+import type { StreamEventEmitter, GlobalEvents } from '@/core/GlobalEventService.js';
import type { ChannelsService } from './ChannelsService.js';
import type { EventEmitter } from 'events';
import type Channel from './channel.js';
-import type { StreamEventEmitter, StreamMessages } from './types.js';
/**
* Main stream connection
@@ -122,7 +122,7 @@ export default class Connection {
}
@bindThis
- private onBroadcastMessage(data: StreamMessages['broadcast']['payload']) {
+ private onBroadcastMessage(data: GlobalEvents['broadcast']['payload']) {
this.sendMessageToWs(data.type, data.body);
}
@@ -196,7 +196,7 @@ export default class Connection {
}
@bindThis
- private async onNoteStreamMessage(data: StreamMessages['note']['payload']) {
+ private async onNoteStreamMessage(data: GlobalEvents['note']['payload']) {
this.sendMessageToWs('noteUpdated', {
id: data.body.id,
type: data.type,
diff --git a/packages/backend/src/server/api/stream/channels/antenna.ts b/packages/backend/src/server/api/stream/channels/antenna.ts
index 87648a3a77..a48e6ba5c6 100644
--- a/packages/backend/src/server/api/stream/channels/antenna.ts
+++ b/packages/backend/src/server/api/stream/channels/antenna.ts
@@ -7,8 +7,8 @@ import { Injectable } from '@nestjs/common';
import { isUserRelated } from '@/misc/is-user-related.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
+import type { GlobalEvents } from '@/core/GlobalEventService.js';
import Channel from '../channel.js';
-import type { StreamMessages } from '../types.js';
class AntennaChannel extends Channel {
public readonly chName = 'antenna';
@@ -35,7 +35,7 @@ class AntennaChannel extends Channel {
}
@bindThis
- private async onEvent(data: StreamMessages['antenna']['payload']) {
+ private async onEvent(data: GlobalEvents['antenna']['payload']) {
if (data.type === 'note') {
const note = await this.noteEntityService.pack(data.body.id, this.user, { detail: true });
diff --git a/packages/backend/src/server/api/stream/channels/role-timeline.ts b/packages/backend/src/server/api/stream/channels/role-timeline.ts
index 76b5875343..38d3604cc5 100644
--- a/packages/backend/src/server/api/stream/channels/role-timeline.ts
+++ b/packages/backend/src/server/api/stream/channels/role-timeline.ts
@@ -9,8 +9,8 @@ import type { Packed } from '@/misc/json-schema.js';
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
import { bindThis } from '@/decorators.js';
import { RoleService } from '@/core/RoleService.js';
+import type { GlobalEvents } from '@/core/GlobalEventService.js';
import Channel from '../channel.js';
-import { StreamMessages } from '../types.js';
class RoleTimelineChannel extends Channel {
public readonly chName = 'roleTimeline';
@@ -37,7 +37,7 @@ class RoleTimelineChannel extends Channel {
}
@bindThis
- private async onEvent(data: StreamMessages['roleTimeline']['payload']) {
+ private async onEvent(data: GlobalEvents['roleTimeline']['payload']) {
if (data.type === 'note') {
const note = data.body;
diff --git a/packages/backend/src/server/api/stream/types.ts b/packages/backend/src/server/api/stream/types.ts
deleted file mode 100644
index 2436750cd6..0000000000
--- a/packages/backend/src/server/api/stream/types.ts
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * SPDX-FileCopyrightText: syuilo and other misskey contributors
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-import type { MiChannel } from '@/models/Channel.js';
-import type { MiUser } from '@/models/User.js';
-import type { MiUserProfile } from '@/models/UserProfile.js';
-import type { MiNote } from '@/models/Note.js';
-import type { MiAntenna } from '@/models/Antenna.js';
-import type { MiDriveFile } from '@/models/DriveFile.js';
-import type { MiDriveFolder } from '@/models/DriveFolder.js';
-import type { MiUserList } from '@/models/UserList.js';
-import type { MiAbuseUserReport } from '@/models/AbuseUserReport.js';
-import type { MiSignin } from '@/models/Signin.js';
-import type { MiPage } from '@/models/Page.js';
-import type { Packed } from '@/misc/json-schema.js';
-import type { MiWebhook } from '@/models/Webhook.js';
-import type { MiMeta } from '@/models/Meta.js';
-import { MiRole, MiRoleAssignment } from '@/models/_.js';
-import type Emitter from 'strict-event-emitter-types';
-import type { EventEmitter } from 'events';
-
-//#region Stream type-body definitions
-export interface InternalStreamTypes {
- userChangeSuspendedState: { id: MiUser['id']; isSuspended: MiUser['isSuspended']; };
- userTokenRegenerated: { id: MiUser['id']; oldToken: string; newToken: string; };
- remoteUserUpdated: { id: MiUser['id']; };
- follow: { followerId: MiUser['id']; followeeId: MiUser['id']; };
- unfollow: { followerId: MiUser['id']; followeeId: MiUser['id']; };
- blockingCreated: { blockerId: MiUser['id']; blockeeId: MiUser['id']; };
- blockingDeleted: { blockerId: MiUser['id']; blockeeId: MiUser['id']; };
- policiesUpdated: MiRole['policies'];
- roleCreated: MiRole;
- roleDeleted: MiRole;
- roleUpdated: MiRole;
- userRoleAssigned: MiRoleAssignment;
- userRoleUnassigned: MiRoleAssignment;
- webhookCreated: MiWebhook;
- webhookDeleted: MiWebhook;
- webhookUpdated: MiWebhook;
- antennaCreated: MiAntenna;
- antennaDeleted: MiAntenna;
- antennaUpdated: MiAntenna;
- metaUpdated: MiMeta;
- followChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
- unfollowChannel: { userId: MiUser['id']; channelId: MiChannel['id']; };
- updateUserProfile: MiUserProfile;
- mute: { muterId: MiUser['id']; muteeId: MiUser['id']; };
- unmute: { muterId: MiUser['id']; muteeId: MiUser['id']; };
-}
-
-export interface BroadcastTypes {
- emojiAdded: {
- emoji: Packed<'EmojiDetailed'>;
- };
- emojiUpdated: {
- emojis: Packed<'EmojiDetailed'>[];
- };
- emojiDeleted: {
- emojis: {
- id?: string;
- name: string;
- [other: string]: any;
- }[];
- };
- announcementCreated: {
- announcement: Packed<'Announcement'>;
- };
-}
-
-export interface MainStreamTypes {
- notification: Packed<'Notification'>;
- mention: Packed<'Note'>;
- reply: Packed<'Note'>;
- renote: Packed<'Note'>;
- follow: Packed<'UserDetailedNotMe'>;
- followed: Packed<'User'>;
- unfollow: Packed<'User'>;
- meUpdated: Packed<'User'>;
- pageEvent: {
- pageId: MiPage['id'];
- event: string;
- var: any;
- userId: MiUser['id'];
- user: Packed<'User'>;
- };
- urlUploadFinished: {
- marker?: string | null;
- file: Packed<'DriveFile'>;
- };
- readAllNotifications: undefined;
- unreadNotification: Packed<'Notification'>;
- unreadMention: MiNote['id'];
- readAllUnreadMentions: undefined;
- unreadSpecifiedNote: MiNote['id'];
- readAllUnreadSpecifiedNotes: undefined;
- readAllAntennas: undefined;
- unreadAntenna: MiAntenna;
- readAllAnnouncements: undefined;
- myTokenRegenerated: undefined;
- signin: MiSignin;
- registryUpdated: {
- scope?: string[];
- key: string;
- value: any | null;
- };
- driveFileCreated: Packed<'DriveFile'>;
- readAntenna: MiAntenna;
- receiveFollowRequest: Packed<'User'>;
- announcementCreated: {
- announcement: Packed<'Announcement'>;
- };
-}
-
-export interface DriveStreamTypes {
- fileCreated: Packed<'DriveFile'>;
- fileDeleted: MiDriveFile['id'];
- fileUpdated: Packed<'DriveFile'>;
- folderCreated: Packed<'DriveFolder'>;
- folderDeleted: MiDriveFolder['id'];
- folderUpdated: Packed<'DriveFolder'>;
-}
-
-export interface NoteStreamTypes {
- pollVoted: {
- choice: number;
- userId: MiUser['id'];
- };
- deleted: {
- deletedAt: Date;
- };
- updated: {
- cw: string | null;
- text: string;
- };
- reacted: {
- reaction: string;
- emoji?: {
- name: string;
- url: string;
- } | null;
- userId: MiUser['id'];
- };
- unreacted: {
- reaction: string;
- userId: MiUser['id'];
- };
-}
-type NoteStreamEventTypes = {
- [key in keyof NoteStreamTypes]: {
- id: MiNote['id'];
- body: NoteStreamTypes[key];
- };
-};
-
-export interface UserListStreamTypes {
- userAdded: Packed<'User'>;
- userRemoved: Packed<'User'>;
-}
-
-export interface AntennaStreamTypes {
- note: MiNote;
-}
-
-export interface RoleTimelineStreamTypes {
- note: Packed<'Note'>;
-}
-
-export interface AdminStreamTypes {
- newAbuseUserReport: {
- id: MiAbuseUserReport['id'];
- targetUserId: MiUser['id'],
- reporterId: MiUser['id'],
- comment: string;
- };
-}
-//#endregion
-
-// 辞書(interface or type)から{ type, body }ユニオンを定義
-// https://stackoverflow.com/questions/49311989/can-i-infer-the-type-of-a-value-using-extends-keyof-type
-// VS Codeの展開を防止するためにEvents型を定義
-type Events<T extends object> = { [K in keyof T]: { type: K; body: T[K]; } };
-type EventUnionFromDictionary<
- T extends object,
- U = Events<T>
-> = U[keyof U];
-
-// redis通すとDateのインスタンスはstringに変換されるので
-export type Serialized<T> = {
- [K in keyof T]:
- T[K] extends Date
- ? string
- : T[K] extends (Date | null)
- ? (string | null)
- : T[K] extends Record<string, any>
- ? Serialized<T[K]>
- : T[K];
-};
-
-type SerializedAll<T> = {
- [K in keyof T]: Serialized<T[K]>;
-};
-
-// name/messages(spec) pairs dictionary
-export type StreamMessages = {
- internal: {
- name: 'internal';
- payload: EventUnionFromDictionary<SerializedAll<InternalStreamTypes>>;
- };
- broadcast: {
- name: 'broadcast';
- payload: EventUnionFromDictionary<SerializedAll<BroadcastTypes>>;
- };
- main: {
- name: `mainStream:${MiUser['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<MainStreamTypes>>;
- };
- drive: {
- name: `driveStream:${MiUser['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<DriveStreamTypes>>;
- };
- note: {
- name: `noteStream:${MiNote['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<NoteStreamEventTypes>>;
- };
- userList: {
- name: `userListStream:${MiUserList['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<UserListStreamTypes>>;
- };
- roleTimeline: {
- name: `roleTimelineStream:${MiRole['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<RoleTimelineStreamTypes>>;
- };
- antenna: {
- name: `antennaStream:${MiAntenna['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<AntennaStreamTypes>>;
- };
- admin: {
- name: `adminStream:${MiUser['id']}`;
- payload: EventUnionFromDictionary<SerializedAll<AdminStreamTypes>>;
- };
- notes: {
- name: 'notesStream';
- payload: Serialized<Packed<'Note'>>;
- };
-};
-
-// API event definitions
-// ストリームごとのEmitterの辞書を用意
-type EventEmitterDictionary = { [x in keyof StreamMessages]: Emitter.default<EventEmitter, { [y in StreamMessages[x]['name']]: (e: StreamMessages[x]['payload']) => void }> };
-// 共用体型を交差型にする型 https://stackoverflow.com/questions/54938141/typescript-convert-union-to-intersection
-type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
-// Emitter辞書から共用体型を作り、UnionToIntersectionで交差型にする
-export type StreamEventEmitter = UnionToIntersection<EventEmitterDictionary[keyof StreamMessages]>;
-// { [y in name]: (e: spec) => void }をまとめてその交差型をEmitterにかけるとts(2590)にひっかかる
-
-// provide stream channels union
-export type StreamChannels = StreamMessages[keyof StreamMessages]['name'];