From 8129d4dc2366aea07da60e21abe3440230387bfe Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 5 Feb 2019 14:14:23 +0900 Subject: Refactoring --- src/notify.ts | 62 ----------- src/push-sw.ts | 61 ----------- src/queue/processors/http/process-inbox.ts | 2 +- src/remote/activitypub/request.ts | 2 +- src/server/api/common/read-messaging-message.ts | 6 +- src/server/api/common/read-notification.ts | 2 +- src/server/api/endpoints/drive/files/delete.ts | 2 +- src/server/api/endpoints/drive/files/update.ts | 2 +- src/server/api/endpoints/drive/folders/create.ts | 2 +- src/server/api/endpoints/drive/folders/delete.ts | 2 +- src/server/api/endpoints/drive/folders/update.ts | 2 +- .../api/endpoints/games/reversi/games/surrender.ts | 2 +- src/server/api/endpoints/games/reversi/match.ts | 2 +- .../api/endpoints/i/read_all_messaging_messages.ts | 2 +- .../api/endpoints/i/read_all_unread_notes.ts | 2 +- src/server/api/endpoints/i/regenerate_token.ts | 2 +- src/server/api/endpoints/i/update.ts | 2 +- .../api/endpoints/i/update_client_setting.ts | 2 +- src/server/api/endpoints/i/update_email.ts | 2 +- src/server/api/endpoints/i/update_home.ts | 2 +- src/server/api/endpoints/i/update_mobile_home.ts | 2 +- src/server/api/endpoints/i/update_widget.ts | 2 +- .../api/endpoints/messaging/messages/create.ts | 6 +- .../api/endpoints/messaging/messages/delete.ts | 2 +- src/server/api/endpoints/notes/polls/vote.ts | 4 +- .../endpoints/notifications/mark_all_as_read.ts | 2 +- src/server/api/endpoints/users/lists/pull.ts | 2 +- src/server/api/endpoints/users/lists/push.ts | 2 +- src/server/api/endpoints/users/report-abuse.ts | 2 +- src/server/api/private/signin.ts | 2 +- src/server/api/service/discord.ts | 2 +- src/server/api/service/github.ts | 2 +- src/server/api/service/twitter.ts | 2 +- .../api/stream/channels/games/reversi-game.ts | 2 +- src/server/api/stream/channels/games/reversi.ts | 2 +- src/services/blocking/create.ts | 2 +- src/services/create-notification.ts | 62 +++++++++++ src/services/drive/add-file.ts | 2 +- src/services/following/create.ts | 4 +- src/services/following/delete.ts | 2 +- src/services/following/requests/accept.ts | 2 +- src/services/following/requests/cancel.ts | 2 +- src/services/following/requests/create.ts | 4 +- src/services/following/requests/reject.ts | 2 +- src/services/note/create.ts | 4 +- src/services/note/delete.ts | 2 +- src/services/note/polls/vote.ts | 4 +- src/services/note/reaction/create.ts | 4 +- src/services/note/reaction/delete.ts | 2 +- src/services/note/read.ts | 2 +- src/services/note/unread.ts | 2 +- src/services/push-notification.ts | 61 +++++++++++ src/services/stream.ts | 114 +++++++++++++++++++++ src/stream.ts | 114 --------------------- 54 files changed, 295 insertions(+), 295 deletions(-) delete mode 100644 src/notify.ts delete mode 100644 src/push-sw.ts create mode 100644 src/services/create-notification.ts create mode 100644 src/services/push-notification.ts create mode 100644 src/services/stream.ts delete mode 100644 src/stream.ts (limited to 'src') diff --git a/src/notify.ts b/src/notify.ts deleted file mode 100644 index 522f4c52dd..0000000000 --- a/src/notify.ts +++ /dev/null @@ -1,62 +0,0 @@ -import * as mongo from 'mongodb'; -import Notification from './models/notification'; -import Mute from './models/mute'; -import { pack } from './models/notification'; -import { publishMainStream } from './stream'; -import User from './models/user'; -import pushSw from './push-sw'; - -export default ( - notifiee: mongo.ObjectID, - notifier: mongo.ObjectID, - type: string, - content?: any -) => new Promise(async (resolve, reject) => { - if (notifiee.equals(notifier)) { - return resolve(); - } - - // Create notification - const notification = await Notification.insert(Object.assign({ - createdAt: new Date(), - notifieeId: notifiee, - notifierId: notifier, - type: type, - isRead: false - }, content)); - - resolve(notification); - - const packed = await pack(notification); - - // Publish notification event - publishMainStream(notifiee, 'notification', packed); - - // Update flag - User.update({ _id: notifiee }, { - $set: { - hasUnreadNotification: true - } - }); - - // 2秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する - setTimeout(async () => { - const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true }); - if (!fresh.isRead) { - //#region ただしミュートしているユーザーからの通知なら無視 - const mute = await Mute.find({ - muterId: notifiee, - deletedAt: { $exists: false } - }); - const mutedUserIds = mute.map(m => m.muteeId.toString()); - if (mutedUserIds.indexOf(notifier.toString()) != -1) { - return; - } - //#endregion - - publishMainStream(notifiee, 'unreadNotification', packed); - - pushSw(notifiee, 'notification', packed); - } - }, 2000); -}); diff --git a/src/push-sw.ts b/src/push-sw.ts deleted file mode 100644 index 8fd2dc137e..0000000000 --- a/src/push-sw.ts +++ /dev/null @@ -1,61 +0,0 @@ -import * as push from 'web-push'; -import * as mongo from 'mongodb'; -import Subscription from './models/sw-subscription'; -import config from './config'; -import fetchMeta from './misc/fetch-meta'; -import { IMeta } from './models/meta'; - -let meta: IMeta = null; - -setInterval(() => { - fetchMeta().then(m => { - meta = m; - - if (meta.enableServiceWorker) { - // アプリケーションの連絡先と、サーバーサイドの鍵ペアの情報を登録 - push.setVapidDetails(config.url, - meta.swPublicKey, - meta.swPrivateKey); - } - }); -}, 3000); - -export default async function(userId: mongo.ObjectID | string, type: string, body?: any) { - if (!meta.enableServiceWorker) return; - - if (typeof userId === 'string') { - userId = new mongo.ObjectID(userId); - } - - // Fetch - const subscriptions = await Subscription.find({ - userId: userId - }); - - for (const subscription of subscriptions) { - const pushSubscription = { - endpoint: subscription.endpoint, - keys: { - auth: subscription.auth, - p256dh: subscription.publickey - } - }; - - push.sendNotification(pushSubscription, JSON.stringify({ - type, body - })).catch((err: any) => { - //swLogger.info(err.statusCode); - //swLogger.info(err.headers); - //swLogger.info(err.body); - - if (err.statusCode == 410) { - Subscription.remove({ - userId: userId, - endpoint: subscription.endpoint, - auth: subscription.auth, - publickey: subscription.publickey - }); - } - }); - } -} diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts index a2fdaa3ada..3cc13cbdaa 100644 --- a/src/queue/processors/http/process-inbox.ts +++ b/src/queue/processors/http/process-inbox.ts @@ -6,7 +6,7 @@ import perform from '../../../remote/activitypub/perform'; import { resolvePerson, updatePerson } from '../../../remote/activitypub/models/person'; import { toUnicode } from 'punycode'; import { URL } from 'url'; -import { publishApLogStream } from '../../../stream'; +import { publishApLogStream } from '../../../services/stream'; import Logger from '../../../misc/logger'; const logger = new Logger('inbox'); diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts index 519c8026bc..e820d0c94c 100644 --- a/src/remote/activitypub/request.ts +++ b/src/remote/activitypub/request.ts @@ -7,7 +7,7 @@ import * as promiseAny from 'promise-any'; import config from '../../config'; import { ILocalUser } from '../../models/user'; -import { publishApLogStream } from '../../stream'; +import { publishApLogStream } from '../../services/stream'; import { apLogger } from './logger'; export const logger = apLogger.createSubLogger('deliver'); diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts index 63080d22a4..9f1e7e6ab4 100644 --- a/src/server/api/common/read-messaging-message.ts +++ b/src/server/api/common/read-messaging-message.ts @@ -2,9 +2,9 @@ import * as mongo from 'mongodb'; import isObjectId from '../../../misc/is-objectid'; import Message from '../../../models/messaging-message'; import { IMessagingMessage as IMessage } from '../../../models/messaging-message'; -import { publishMainStream } from '../../../stream'; -import { publishMessagingStream } from '../../../stream'; -import { publishMessagingIndexStream } from '../../../stream'; +import { publishMainStream } from '../../../services/stream'; +import { publishMessagingStream } from '../../../services/stream'; +import { publishMessagingIndexStream } from '../../../services/stream'; import User from '../../../models/user'; /** diff --git a/src/server/api/common/read-notification.ts b/src/server/api/common/read-notification.ts index 27d3f1be32..4361305119 100644 --- a/src/server/api/common/read-notification.ts +++ b/src/server/api/common/read-notification.ts @@ -1,7 +1,7 @@ import * as mongo from 'mongodb'; import isObjectId from '../../../misc/is-objectid'; import { default as Notification, INotification } from '../../../models/notification'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../../services/stream'; import Mute from '../../../models/mute'; import User from '../../../models/user'; diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts index 214d211d80..c322587d8f 100644 --- a/src/server/api/endpoints/drive/files/delete.ts +++ b/src/server/api/endpoints/drive/files/delete.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import DriveFile from '../../../../../models/drive-file'; import del from '../../../../../services/drive/delete-file'; -import { publishDriveStream } from '../../../../../stream'; +import { publishDriveStream } from '../../../../../services/stream'; import define from '../../../define'; export const meta = { diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts index 52d20af64e..4db493c1d0 100644 --- a/src/server/api/endpoints/drive/files/update.ts +++ b/src/server/api/endpoints/drive/files/update.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import DriveFolder from '../../../../../models/drive-folder'; import DriveFile, { validateFileName, pack } from '../../../../../models/drive-file'; -import { publishDriveStream } from '../../../../../stream'; +import { publishDriveStream } from '../../../../../services/stream'; import define from '../../../define'; import Note from '../../../../../models/note'; diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts index b7a7e6c88c..1aca521a76 100644 --- a/src/server/api/endpoints/drive/folders/create.ts +++ b/src/server/api/endpoints/drive/folders/create.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder'; -import { publishDriveStream } from '../../../../../stream'; +import { publishDriveStream } from '../../../../../services/stream'; import define from '../../../define'; export const meta = { diff --git a/src/server/api/endpoints/drive/folders/delete.ts b/src/server/api/endpoints/drive/folders/delete.ts index 5259fe7841..228e262ccd 100644 --- a/src/server/api/endpoints/drive/folders/delete.ts +++ b/src/server/api/endpoints/drive/folders/delete.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import DriveFolder from '../../../../../models/drive-folder'; import define from '../../../define'; -import { publishDriveStream } from '../../../../../stream'; +import { publishDriveStream } from '../../../../../services/stream'; import DriveFile from '../../../../../models/drive-file'; export const meta = { diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts index af4f2fcf6b..3207594367 100644 --- a/src/server/api/endpoints/drive/folders/update.ts +++ b/src/server/api/endpoints/drive/folders/update.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder'; -import { publishDriveStream } from '../../../../../stream'; +import { publishDriveStream } from '../../../../../services/stream'; import define from '../../../define'; export const meta = { diff --git a/src/server/api/endpoints/games/reversi/games/surrender.ts b/src/server/api/endpoints/games/reversi/games/surrender.ts index 7a8d45b312..a19743fee9 100644 --- a/src/server/api/endpoints/games/reversi/games/surrender.ts +++ b/src/server/api/endpoints/games/reversi/games/surrender.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../../misc/cafy-id'; import ReversiGame, { pack } from '../../../../../../models/games/reversi/game'; -import { publishReversiGameStream } from '../../../../../../stream'; +import { publishReversiGameStream } from '../../../../../../services/stream'; import define from '../../../../define'; export const meta = { diff --git a/src/server/api/endpoints/games/reversi/match.ts b/src/server/api/endpoints/games/reversi/match.ts index 67e6dde3d6..febf815067 100644 --- a/src/server/api/endpoints/games/reversi/match.ts +++ b/src/server/api/endpoints/games/reversi/match.ts @@ -3,7 +3,7 @@ import ID, { transform } from '../../../../../misc/cafy-id'; import Matching, { pack as packMatching } from '../../../../../models/games/reversi/matching'; import ReversiGame, { pack as packGame } from '../../../../../models/games/reversi/game'; import User from '../../../../../models/user'; -import { publishMainStream, publishReversiStream } from '../../../../../stream'; +import { publishMainStream, publishReversiStream } from '../../../../../services/stream'; import { eighteight } from '../../../../../games/reversi/maps'; import define from '../../../define'; diff --git a/src/server/api/endpoints/i/read_all_messaging_messages.ts b/src/server/api/endpoints/i/read_all_messaging_messages.ts index a1fe82c4cb..739acf93c6 100644 --- a/src/server/api/endpoints/i/read_all_messaging_messages.ts +++ b/src/server/api/endpoints/i/read_all_messaging_messages.ts @@ -1,5 +1,5 @@ import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import Message from '../../../../models/messaging-message'; import define from '../../define'; diff --git a/src/server/api/endpoints/i/read_all_unread_notes.ts b/src/server/api/endpoints/i/read_all_unread_notes.ts index 7d63de4e19..509450e43c 100644 --- a/src/server/api/endpoints/i/read_all_unread_notes.ts +++ b/src/server/api/endpoints/i/read_all_unread_notes.ts @@ -1,5 +1,5 @@ import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import NoteUnread from '../../../../models/note-unread'; import define from '../../define'; diff --git a/src/server/api/endpoints/i/regenerate_token.ts b/src/server/api/endpoints/i/regenerate_token.ts index 5dfc3cd664..16c2983184 100644 --- a/src/server/api/endpoints/i/regenerate_token.ts +++ b/src/server/api/endpoints/i/regenerate_token.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import * as bcrypt from 'bcryptjs'; import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import generateUserToken from '../../common/generate-native-user-token'; import define from '../../define'; diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts index 88e184b181..0ad7e0f33f 100644 --- a/src/server/api/endpoints/i/update.ts +++ b/src/server/api/endpoints/i/update.ts @@ -1,7 +1,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../misc/cafy-id'; import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import DriveFile from '../../../../models/drive-file'; import acceptAllFollowRequests from '../../../../services/following/requests/accept-all'; import { publishToFollowers } from '../../../../services/i/update'; diff --git a/src/server/api/endpoints/i/update_client_setting.ts b/src/server/api/endpoints/i/update_client_setting.ts index 66435ec9b2..2b2f3d3c7b 100644 --- a/src/server/api/endpoints/i/update_client_setting.ts +++ b/src/server/api/endpoints/i/update_client_setting.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import define from '../../define'; export const meta = { diff --git a/src/server/api/endpoints/i/update_email.ts b/src/server/api/endpoints/i/update_email.ts index eeac460796..c3aafc8d8b 100644 --- a/src/server/api/endpoints/i/update_email.ts +++ b/src/server/api/endpoints/i/update_email.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User, { pack } from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import define from '../../define'; import * as nodemailer from 'nodemailer'; import fetchMeta from '../../../../misc/fetch-meta'; diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts index f472600ee0..805c52d728 100644 --- a/src/server/api/endpoints/i/update_home.ts +++ b/src/server/api/endpoints/i/update_home.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import define from '../../define'; export const meta = { diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts index 792c4b7877..0e1c3313e0 100644 --- a/src/server/api/endpoints/i/update_mobile_home.ts +++ b/src/server/api/endpoints/i/update_mobile_home.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import define from '../../define'; export const meta = { diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts index da96ec6fc1..e3e91c1f08 100644 --- a/src/server/api/endpoints/i/update_widget.ts +++ b/src/server/api/endpoints/i/update_widget.ts @@ -1,6 +1,6 @@ import $ from 'cafy'; import User from '../../../../models/user'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import define from '../../define'; export const meta = { diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts index bcb3c7309e..8300f69e53 100644 --- a/src/server/api/endpoints/messaging/messages/create.ts +++ b/src/server/api/endpoints/messaging/messages/create.ts @@ -6,9 +6,9 @@ import User from '../../../../../models/user'; import Mute from '../../../../../models/mute'; import DriveFile from '../../../../../models/drive-file'; import { pack } from '../../../../../models/messaging-message'; -import { publishMainStream } from '../../../../../stream'; -import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../stream'; -import pushSw from '../../../../../push-sw'; +import { publishMainStream } from '../../../../../services/stream'; +import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../services/stream'; +import pushSw from '../../../../../services/push-notification'; import define from '../../../define'; export const meta = { diff --git a/src/server/api/endpoints/messaging/messages/delete.ts b/src/server/api/endpoints/messaging/messages/delete.ts index 103b680da8..4f3fabb4ce 100644 --- a/src/server/api/endpoints/messaging/messages/delete.ts +++ b/src/server/api/endpoints/messaging/messages/delete.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import Message from '../../../../../models/messaging-message'; import define from '../../../define'; -import { publishMessagingStream } from '../../../../../stream'; +import { publishMessagingStream } from '../../../../../services/stream'; import * as ms from 'ms'; export const meta = { diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts index 5741932438..68c3898e05 100644 --- a/src/server/api/endpoints/notes/polls/vote.ts +++ b/src/server/api/endpoints/notes/polls/vote.ts @@ -4,8 +4,8 @@ import Vote from '../../../../../models/poll-vote'; import Note from '../../../../../models/note'; import Watching from '../../../../../models/note-watching'; import watch from '../../../../../services/note/watch'; -import { publishNoteStream } from '../../../../../stream'; -import notify from '../../../../../notify'; +import { publishNoteStream } from '../../../../../services/stream'; +import notify from '../../../../../services/create-notification'; import define from '../../../define'; import createNote from '../../../../../services/note/create'; import User from '../../../../../models/user'; diff --git a/src/server/api/endpoints/notifications/mark_all_as_read.ts b/src/server/api/endpoints/notifications/mark_all_as_read.ts index 1b5208d447..de5a12707b 100644 --- a/src/server/api/endpoints/notifications/mark_all_as_read.ts +++ b/src/server/api/endpoints/notifications/mark_all_as_read.ts @@ -1,5 +1,5 @@ import Notification from '../../../../models/notification'; -import { publishMainStream } from '../../../../stream'; +import { publishMainStream } from '../../../../services/stream'; import User from '../../../../models/user'; import define from '../../define'; diff --git a/src/server/api/endpoints/users/lists/pull.ts b/src/server/api/endpoints/users/lists/pull.ts index ed44977a7e..86eaa1dd8d 100644 --- a/src/server/api/endpoints/users/lists/pull.ts +++ b/src/server/api/endpoints/users/lists/pull.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import UserList from '../../../../../models/user-list'; import User, { pack as packUser } from '../../../../../models/user'; -import { publishUserListStream } from '../../../../../stream'; +import { publishUserListStream } from '../../../../../services/stream'; import define from '../../../define'; export const meta = { diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts index 8be498ec2c..6e2dbed518 100644 --- a/src/server/api/endpoints/users/lists/push.ts +++ b/src/server/api/endpoints/users/lists/push.ts @@ -2,7 +2,7 @@ import $ from 'cafy'; import ID, { transform } from '../../../../../misc/cafy-id'; import UserList from '../../../../../models/user-list'; import User, { pack as packUser, isRemoteUser, fetchProxyAccount } from '../../../../../models/user'; -import { publishUserListStream } from '../../../../../stream'; +import { publishUserListStream } from '../../../../../services/stream'; import { renderActivity } from '../../../../../remote/activitypub/renderer'; import renderFollow from '../../../../../remote/activitypub/renderer/follow'; import { deliver } from '../../../../../queue'; diff --git a/src/server/api/endpoints/users/report-abuse.ts b/src/server/api/endpoints/users/report-abuse.ts index d63f3e55a4..c592e5cfd4 100644 --- a/src/server/api/endpoints/users/report-abuse.ts +++ b/src/server/api/endpoints/users/report-abuse.ts @@ -3,7 +3,7 @@ import ID, { transform } from '../../../../misc/cafy-id'; import define from '../../define'; import User from '../../../../models/user'; import AbuseUserReport from '../../../../models/abuse-user-report'; -import { publishAdminStream } from '../../../../stream'; +import { publishAdminStream } from '../../../../services/stream'; export const meta = { desc: { diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts index 6292527843..40bcd2c5d6 100644 --- a/src/server/api/private/signin.ts +++ b/src/server/api/private/signin.ts @@ -3,7 +3,7 @@ import * as bcrypt from 'bcryptjs'; import * as speakeasy from 'speakeasy'; import User, { ILocalUser } from '../../../models/user'; import Signin, { pack } from '../../../models/signin'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../../services/stream'; import signin from '../common/signin'; import config from '../../../config'; diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts index 30f077d224..af0c43b48b 100644 --- a/src/server/api/service/discord.ts +++ b/src/server/api/service/discord.ts @@ -4,7 +4,7 @@ import * as request from 'request'; import { OAuth2 } from 'oauth'; import User, { pack, ILocalUser } from '../../../models/user'; import config from '../../../config'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../../services/stream'; import redis from '../../../db/redis'; import * as uuid from 'uuid'; import signin from '../common/signin'; diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts index c8ce494a93..d6d5d1eccb 100644 --- a/src/server/api/service/github.ts +++ b/src/server/api/service/github.ts @@ -4,7 +4,7 @@ import * as request from 'request'; import { OAuth2 } from 'oauth'; import User, { pack, ILocalUser } from '../../../models/user'; import config from '../../../config'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../../services/stream'; import redis from '../../../db/redis'; import * as uuid from 'uuid'; import signin from '../common/signin'; diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts index f7f023d828..fc23808e21 100644 --- a/src/server/api/service/twitter.ts +++ b/src/server/api/service/twitter.ts @@ -4,7 +4,7 @@ import * as uuid from 'uuid'; import autwh from 'autwh'; import redis from '../../../db/redis'; import User, { pack, ILocalUser } from '../../../models/user'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../../services/stream'; import config from '../../../config'; import signin from '../common/signin'; import fetchMeta from '../../../misc/fetch-meta'; diff --git a/src/server/api/stream/channels/games/reversi-game.ts b/src/server/api/stream/channels/games/reversi-game.ts index 1cb077c8c4..87df9e194c 100644 --- a/src/server/api/stream/channels/games/reversi-game.ts +++ b/src/server/api/stream/channels/games/reversi-game.ts @@ -2,7 +2,7 @@ import autobind from 'autobind-decorator'; import * as CRC32 from 'crc-32'; import * as mongo from 'mongodb'; import ReversiGame, { pack } from '../../../../../models/games/reversi/game'; -import { publishReversiGameStream } from '../../../../../stream'; +import { publishReversiGameStream } from '../../../../../services/stream'; import Reversi from '../../../../../games/reversi/core'; import * as maps from '../../../../../games/reversi/maps'; import Channel from '../../channel'; diff --git a/src/server/api/stream/channels/games/reversi.ts b/src/server/api/stream/channels/games/reversi.ts index b40709617b..1b1ad187a3 100644 --- a/src/server/api/stream/channels/games/reversi.ts +++ b/src/server/api/stream/channels/games/reversi.ts @@ -1,7 +1,7 @@ import autobind from 'autobind-decorator'; import * as mongo from 'mongodb'; import Matching, { pack } from '../../../../../models/games/reversi/matching'; -import { publishMainStream } from '../../../../../stream'; +import { publishMainStream } from '../../../../../services/stream'; import Channel from '../../channel'; export default class extends Channel { diff --git a/src/services/blocking/create.ts b/src/services/blocking/create.ts index f82eeae2b4..2b46d6b94a 100644 --- a/src/services/blocking/create.ts +++ b/src/services/blocking/create.ts @@ -1,7 +1,7 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user'; import Following from '../../models/following'; import FollowRequest from '../../models/follow-request'; -import { publishMainStream } from '../../stream'; +import { publishMainStream } from '../stream'; import { renderActivity } from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderUndo from '../../remote/activitypub/renderer/undo'; diff --git a/src/services/create-notification.ts b/src/services/create-notification.ts new file mode 100644 index 0000000000..3e000ef2ed --- /dev/null +++ b/src/services/create-notification.ts @@ -0,0 +1,62 @@ +import * as mongo from 'mongodb'; +import Notification from '../models/notification'; +import Mute from '../models/mute'; +import { pack } from '../models/notification'; +import { publishMainStream } from './stream'; +import User from '../models/user'; +import pushSw from './push-notification'; + +export default ( + notifiee: mongo.ObjectID, + notifier: mongo.ObjectID, + type: string, + content?: any +) => new Promise(async (resolve, reject) => { + if (notifiee.equals(notifier)) { + return resolve(); + } + + // Create notification + const notification = await Notification.insert(Object.assign({ + createdAt: new Date(), + notifieeId: notifiee, + notifierId: notifier, + type: type, + isRead: false + }, content)); + + resolve(notification); + + const packed = await pack(notification); + + // Publish notification event + publishMainStream(notifiee, 'notification', packed); + + // Update flag + User.update({ _id: notifiee }, { + $set: { + hasUnreadNotification: true + } + }); + + // 2秒経っても(今回作成した)通知が既読にならなかったら「未読の通知がありますよ」イベントを発行する + setTimeout(async () => { + const fresh = await Notification.findOne({ _id: notification._id }, { isRead: true }); + if (!fresh.isRead) { + //#region ただしミュートしているユーザーからの通知なら無視 + const mute = await Mute.find({ + muterId: notifiee, + deletedAt: { $exists: false } + }); + const mutedUserIds = mute.map(m => m.muteeId.toString()); + if (mutedUserIds.indexOf(notifier.toString()) != -1) { + return; + } + //#endregion + + publishMainStream(notifiee, 'unreadNotification', packed); + + pushSw(notifiee, 'notification', packed); + } + }, 2000); +}); diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts index 2b3b923b93..31902b2425 100644 --- a/src/services/drive/add-file.ts +++ b/src/services/drive/add-file.ts @@ -12,7 +12,7 @@ import * as isSvg from 'is-svg'; import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file'; import DriveFolder from '../../models/drive-folder'; import { pack } from '../../models/drive-file'; -import { publishMainStream, publishDriveStream } from '../../stream'; +import { publishMainStream, publishDriveStream } from '../stream'; import { isLocalUser, IUser, IRemoteUser } from '../../models/user'; import delFile from './delete-file'; import config from '../../config'; diff --git a/src/services/following/create.ts b/src/services/following/create.ts index 9c0984b6d7..936655d7d1 100644 --- a/src/services/following/create.ts +++ b/src/services/following/create.ts @@ -1,8 +1,8 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user'; import Following from '../../models/following'; import Blocking from '../../models/blocking'; -import { publishMainStream } from '../../stream'; -import notify from '../../notify'; +import { publishMainStream } from '../stream'; +import notify from '../../services/create-notification'; import { renderActivity } from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderAccept from '../../remote/activitypub/renderer/accept'; diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts index 1c5e8272f2..d56edd3cc3 100644 --- a/src/services/following/delete.ts +++ b/src/services/following/delete.ts @@ -1,6 +1,6 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user'; import Following from '../../models/following'; -import { publishMainStream } from '../../stream'; +import { publishMainStream } from '../stream'; import { renderActivity } from '../../remote/activitypub/renderer'; import renderFollow from '../../remote/activitypub/renderer/follow'; import renderUndo from '../../remote/activitypub/renderer/undo'; diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts index 76bb67afa1..8c42b5a783 100644 --- a/src/services/following/requests/accept.ts +++ b/src/services/following/requests/accept.ts @@ -5,7 +5,7 @@ import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderAccept from '../../../remote/activitypub/renderer/accept'; import { deliver } from '../../../queue'; import Following from '../../../models/following'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../stream'; import perUserFollowingChart from '../../../chart/per-user-following'; import Logger from '../../../misc/logger'; diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts index 731e25f9ca..375c14d5e1 100644 --- a/src/services/following/requests/cancel.ts +++ b/src/services/following/requests/cancel.ts @@ -4,7 +4,7 @@ import { renderActivity } from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderUndo from '../../../remote/activitypub/renderer/undo'; import { deliver } from '../../../queue'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(followee)) { diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts index 6507cadb77..10c534f529 100644 --- a/src/services/following/requests/create.ts +++ b/src/services/following/requests/create.ts @@ -1,6 +1,6 @@ import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../../models/user'; -import { publishMainStream } from '../../../stream'; -import notify from '../../../notify'; +import { publishMainStream } from '../../stream'; +import notify from '../../../services/create-notification'; import { renderActivity } from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import { deliver } from '../../../queue'; diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts index 0f121a18f7..cb924df811 100644 --- a/src/services/following/requests/reject.ts +++ b/src/services/following/requests/reject.ts @@ -4,7 +4,7 @@ import { renderActivity } from '../../../remote/activitypub/renderer'; import renderFollow from '../../../remote/activitypub/renderer/follow'; import renderReject from '../../../remote/activitypub/renderer/reject'; import { deliver } from '../../../queue'; -import { publishMainStream } from '../../../stream'; +import { publishMainStream } from '../../stream'; export default async function(followee: IUser, follower: IUser) { if (isRemoteUser(follower)) { diff --git a/src/services/note/create.ts b/src/services/note/create.ts index 7b6120b1ed..9ccf3be9e8 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -1,7 +1,7 @@ import es from '../../db/elasticsearch'; import Note, { pack, INote, IChoice } from '../../models/note'; import User, { isLocalUser, IUser, isRemoteUser, IRemoteUser, ILocalUser } from '../../models/user'; -import { publishMainStream, publishHomeTimelineStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../../stream'; +import { publishMainStream, publishHomeTimelineStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../stream'; import Following from '../../models/following'; import { deliver } from '../../queue'; import renderNote from '../../remote/activitypub/renderer/note'; @@ -9,7 +9,7 @@ import renderCreate from '../../remote/activitypub/renderer/create'; import renderAnnounce from '../../remote/activitypub/renderer/announce'; import { renderActivity } from '../../remote/activitypub/renderer'; import DriveFile, { IDriveFile } from '../../models/drive-file'; -import notify from '../../notify'; +import notify from '../../services/create-notification'; import NoteWatching from '../../models/note-watching'; import watch from './watch'; import Mute from '../../models/mute'; diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts index aaaa79afdf..557872d751 100644 --- a/src/services/note/delete.ts +++ b/src/services/note/delete.ts @@ -1,6 +1,6 @@ import Note, { INote } from '../../models/note'; import { IUser, isLocalUser } from '../../models/user'; -import { publishNoteStream } from '../../stream'; +import { publishNoteStream } from '../stream'; import renderDelete from '../../remote/activitypub/renderer/delete'; import { renderActivity } from '../../remote/activitypub/renderer'; import { deliver } from '../../queue'; diff --git a/src/services/note/polls/vote.ts b/src/services/note/polls/vote.ts index dafd59331e..115b071b45 100644 --- a/src/services/note/polls/vote.ts +++ b/src/services/note/polls/vote.ts @@ -2,8 +2,8 @@ import Vote from '../../../models/poll-vote'; import Note, { INote } from '../../../models/note'; import Watching from '../../../models/note-watching'; import watch from '../../../services/note/watch'; -import { publishNoteStream } from '../../../stream'; -import notify from '../../../notify'; +import { publishNoteStream } from '../../stream'; +import notify from '../../../services/create-notification'; import { isLocalUser, IUser } from '../../../models/user'; export default (user: IUser, note: INote, choice: number) => new Promise(async (res, rej) => { diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts index 96d1dd8e53..e6a9fe7d65 100644 --- a/src/services/note/reaction/create.ts +++ b/src/services/note/reaction/create.ts @@ -1,8 +1,8 @@ import { IUser, isLocalUser, isRemoteUser } from '../../../models/user'; import Note, { INote } from '../../../models/note'; import NoteReaction from '../../../models/note-reaction'; -import { publishNoteStream } from '../../../stream'; -import notify from '../../../notify'; +import { publishNoteStream } from '../../stream'; +import notify from '../../create-notification'; import NoteWatching from '../../../models/note-watching'; import watch from '../watch'; import renderLike from '../../../remote/activitypub/renderer/like'; diff --git a/src/services/note/reaction/delete.ts b/src/services/note/reaction/delete.ts index 8689730433..ee3a9e13d8 100644 --- a/src/services/note/reaction/delete.ts +++ b/src/services/note/reaction/delete.ts @@ -1,7 +1,7 @@ import { IUser, isLocalUser, isRemoteUser } from '../../../models/user'; import Note, { INote } from '../../../models/note'; import Reaction from '../../../models/note-reaction'; -import { publishNoteStream } from '../../../stream'; +import { publishNoteStream } from '../../stream'; import renderLike from '../../../remote/activitypub/renderer/like'; import renderUndo from '../../../remote/activitypub/renderer/undo'; import { renderActivity } from '../../../remote/activitypub/renderer'; diff --git a/src/services/note/read.ts b/src/services/note/read.ts index f2c1213363..8b52445cf0 100644 --- a/src/services/note/read.ts +++ b/src/services/note/read.ts @@ -1,6 +1,6 @@ import * as mongo from 'mongodb'; import isObjectId from '../../misc/is-objectid'; -import { publishMainStream } from '../../stream'; +import { publishMainStream } from '../stream'; import User from '../../models/user'; import NoteUnread from '../../models/note-unread'; diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts index e84ac2a4bf..e70c63c765 100644 --- a/src/services/note/unread.ts +++ b/src/services/note/unread.ts @@ -2,7 +2,7 @@ import NoteUnread from '../../models/note-unread'; import User, { IUser } from '../../models/user'; import { INote } from '../../models/note'; import Mute from '../../models/mute'; -import { publishMainStream } from '../../stream'; +import { publishMainStream } from '../stream'; export default async function(user: IUser, note: INote, isSpecified = false) { //#region ミュートしているなら無視 diff --git a/src/services/push-notification.ts b/src/services/push-notification.ts new file mode 100644 index 0000000000..ceb762b2fa --- /dev/null +++ b/src/services/push-notification.ts @@ -0,0 +1,61 @@ +import * as push from 'web-push'; +import * as mongo from 'mongodb'; +import Subscription from '../models/sw-subscription'; +import config from '../config'; +import fetchMeta from '../misc/fetch-meta'; +import { IMeta } from '../models/meta'; + +let meta: IMeta = null; + +setInterval(() => { + fetchMeta().then(m => { + meta = m; + + if (meta.enableServiceWorker) { + // アプリケーションの連絡先と、サーバーサイドの鍵ペアの情報を登録 + push.setVapidDetails(config.url, + meta.swPublicKey, + meta.swPrivateKey); + } + }); +}, 3000); + +export default async function(userId: mongo.ObjectID | string, type: string, body?: any) { + if (!meta.enableServiceWorker) return; + + if (typeof userId === 'string') { + userId = new mongo.ObjectID(userId); + } + + // Fetch + const subscriptions = await Subscription.find({ + userId: userId + }); + + for (const subscription of subscriptions) { + const pushSubscription = { + endpoint: subscription.endpoint, + keys: { + auth: subscription.auth, + p256dh: subscription.publickey + } + }; + + push.sendNotification(pushSubscription, JSON.stringify({ + type, body + })).catch((err: any) => { + //swLogger.info(err.statusCode); + //swLogger.info(err.headers); + //swLogger.info(err.body); + + if (err.statusCode == 410) { + Subscription.remove({ + userId: userId, + endpoint: subscription.endpoint, + auth: subscription.auth, + publickey: subscription.publickey + }); + } + }); + } +} diff --git a/src/services/stream.ts b/src/services/stream.ts new file mode 100644 index 0000000000..813c9eb7c0 --- /dev/null +++ b/src/services/stream.ts @@ -0,0 +1,114 @@ +import * as mongo from 'mongodb'; +import redis from '../db/redis'; +import Xev from 'xev'; + +type ID = string | mongo.ObjectID; + +class Publisher { + private ev: Xev; + + constructor() { + // Redisがインストールされてないときはプロセス間通信を使う + if (redis == null) { + this.ev = new Xev(); + } + } + + private publish = (channel: string, type: string, value?: any): void => { + const message = type == null ? value : value == null ? + { type: type, body: null } : + { type: type, body: value }; + + if (this.ev) { + this.ev.emit(channel, message); + } else { + redis.publish('misskey', JSON.stringify({ + channel: channel, + message: message + })); + } + } + + public publishMainStream = (userId: ID, type: string, value?: any): void => { + this.publish(`mainStream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishDriveStream = (userId: ID, type: string, value?: any): void => { + this.publish(`driveStream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishNoteStream = (noteId: ID, type: string, value: any): void => { + this.publish(`noteStream:${noteId}`, type, { + id: noteId, + body: value + }); + } + + public publishUserListStream = (listId: ID, type: string, value?: any): void => { + this.publish(`userListStream:${listId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishMessagingStream = (userId: ID, otherpartyId: ID, type: string, value?: any): void => { + this.publish(`messagingStream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishMessagingIndexStream = (userId: ID, type: string, value?: any): void => { + this.publish(`messagingIndexStream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishReversiStream = (userId: ID, type: string, value?: any): void => { + this.publish(`reversiStream:${userId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishReversiGameStream = (gameId: ID, type: string, value?: any): void => { + this.publish(`reversiGameStream:${gameId}`, type, typeof value === 'undefined' ? null : value); + } + + public publishHomeTimelineStream = (userId: ID, note: any): void => { + this.publish(`homeTimeline:${userId}`, null, note); + } + + public publishLocalTimelineStream = async (note: any): Promise => { + this.publish('localTimeline', null, note); + } + + public publishHybridTimelineStream = async (userId: ID, note: any): Promise => { + this.publish(userId ? `hybridTimeline:${userId}` : 'hybridTimeline', null, note); + } + + public publishGlobalTimelineStream = (note: any): void => { + this.publish('globalTimeline', null, note); + } + + public publishHashtagStream = (note: any): void => { + this.publish('hashtag', null, note); + } + + public publishApLogStream = (log: any): void => { + this.publish('apLog', null, log); + } + + public publishAdminStream = (userId: ID, type: string, value?: any): void => { + this.publish(`adminStream:${userId}`, type, typeof value === 'undefined' ? null : value); + } +} + +const publisher = new Publisher(); + +export default publisher; + +export const publishMainStream = publisher.publishMainStream; +export const publishDriveStream = publisher.publishDriveStream; +export const publishNoteStream = publisher.publishNoteStream; +export const publishUserListStream = publisher.publishUserListStream; +export const publishMessagingStream = publisher.publishMessagingStream; +export const publishMessagingIndexStream = publisher.publishMessagingIndexStream; +export const publishReversiStream = publisher.publishReversiStream; +export const publishReversiGameStream = publisher.publishReversiGameStream; +export const publishHomeTimelineStream = publisher.publishHomeTimelineStream; +export const publishLocalTimelineStream = publisher.publishLocalTimelineStream; +export const publishHybridTimelineStream = publisher.publishHybridTimelineStream; +export const publishGlobalTimelineStream = publisher.publishGlobalTimelineStream; +export const publishHashtagStream = publisher.publishHashtagStream; +export const publishApLogStream = publisher.publishApLogStream; +export const publishAdminStream = publisher.publishAdminStream; diff --git a/src/stream.ts b/src/stream.ts deleted file mode 100644 index 098d49ecd1..0000000000 --- a/src/stream.ts +++ /dev/null @@ -1,114 +0,0 @@ -import * as mongo from 'mongodb'; -import redis from './db/redis'; -import Xev from 'xev'; - -type ID = string | mongo.ObjectID; - -class Publisher { - private ev: Xev; - - constructor() { - // Redisがインストールされてないときはプロセス間通信を使う - if (redis == null) { - this.ev = new Xev(); - } - } - - private publish = (channel: string, type: string, value?: any): void => { - const message = type == null ? value : value == null ? - { type: type, body: null } : - { type: type, body: value }; - - if (this.ev) { - this.ev.emit(channel, message); - } else { - redis.publish('misskey', JSON.stringify({ - channel: channel, - message: message - })); - } - } - - public publishMainStream = (userId: ID, type: string, value?: any): void => { - this.publish(`mainStream:${userId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishDriveStream = (userId: ID, type: string, value?: any): void => { - this.publish(`driveStream:${userId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishNoteStream = (noteId: ID, type: string, value: any): void => { - this.publish(`noteStream:${noteId}`, type, { - id: noteId, - body: value - }); - } - - public publishUserListStream = (listId: ID, type: string, value?: any): void => { - this.publish(`userListStream:${listId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishMessagingStream = (userId: ID, otherpartyId: ID, type: string, value?: any): void => { - this.publish(`messagingStream:${userId}-${otherpartyId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishMessagingIndexStream = (userId: ID, type: string, value?: any): void => { - this.publish(`messagingIndexStream:${userId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishReversiStream = (userId: ID, type: string, value?: any): void => { - this.publish(`reversiStream:${userId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishReversiGameStream = (gameId: ID, type: string, value?: any): void => { - this.publish(`reversiGameStream:${gameId}`, type, typeof value === 'undefined' ? null : value); - } - - public publishHomeTimelineStream = (userId: ID, note: any): void => { - this.publish(`homeTimeline:${userId}`, null, note); - } - - public publishLocalTimelineStream = async (note: any): Promise => { - this.publish('localTimeline', null, note); - } - - public publishHybridTimelineStream = async (userId: ID, note: any): Promise => { - this.publish(userId ? `hybridTimeline:${userId}` : 'hybridTimeline', null, note); - } - - public publishGlobalTimelineStream = (note: any): void => { - this.publish('globalTimeline', null, note); - } - - public publishHashtagStream = (note: any): void => { - this.publish('hashtag', null, note); - } - - public publishApLogStream = (log: any): void => { - this.publish('apLog', null, log); - } - - public publishAdminStream = (userId: ID, type: string, value?: any): void => { - this.publish(`adminStream:${userId}`, type, typeof value === 'undefined' ? null : value); - } -} - -const publisher = new Publisher(); - -export default publisher; - -export const publishMainStream = publisher.publishMainStream; -export const publishDriveStream = publisher.publishDriveStream; -export const publishNoteStream = publisher.publishNoteStream; -export const publishUserListStream = publisher.publishUserListStream; -export const publishMessagingStream = publisher.publishMessagingStream; -export const publishMessagingIndexStream = publisher.publishMessagingIndexStream; -export const publishReversiStream = publisher.publishReversiStream; -export const publishReversiGameStream = publisher.publishReversiGameStream; -export const publishHomeTimelineStream = publisher.publishHomeTimelineStream; -export const publishLocalTimelineStream = publisher.publishLocalTimelineStream; -export const publishHybridTimelineStream = publisher.publishHybridTimelineStream; -export const publishGlobalTimelineStream = publisher.publishGlobalTimelineStream; -export const publishHashtagStream = publisher.publishHashtagStream; -export const publishApLogStream = publisher.publishApLogStream; -export const publishAdminStream = publisher.publishAdminStream; -- cgit v1.2.3-freya