summaryrefslogtreecommitdiff
path: root/src/server/api
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-03-21 15:14:03 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-03-21 15:14:03 +0900
commit8050352ad88798be222f735a3217367acaee277f (patch)
tree812ca46b632f91a49d0f749e53221d93be0ab5dc /src/server/api
parentadd note (diff)
downloadsharkey-8050352ad88798be222f735a3217367acaee277f.tar.gz
sharkey-8050352ad88798be222f735a3217367acaee277f.tar.bz2
sharkey-8050352ad88798be222f735a3217367acaee277f.zip
perf: 各ストリーミング接続ごとにポーリングしないように
Diffstat (limited to 'src/server/api')
-rw-r--r--src/server/api/endpoints/channels/follow.ts3
-rw-r--r--src/server/api/endpoints/channels/unfollow.ts3
-rw-r--r--src/server/api/endpoints/i/update.ts3
-rw-r--r--src/server/api/endpoints/mute/create.ts3
-rw-r--r--src/server/api/endpoints/mute/delete.ts3
-rw-r--r--src/server/api/stream/index.ts57
6 files changed, 54 insertions, 18 deletions
diff --git a/src/server/api/endpoints/channels/follow.ts b/src/server/api/endpoints/channels/follow.ts
index bf2f2bbb57..11c6e37ff7 100644
--- a/src/server/api/endpoints/channels/follow.ts
+++ b/src/server/api/endpoints/channels/follow.ts
@@ -4,6 +4,7 @@ import define from '../../define';
import { ApiError } from '../../error';
import { Channels, ChannelFollowings } from '../../../../models';
import { genId } from '../../../../misc/gen-id';
+import { publishUserEvent } from '../../../../services/stream';
export const meta = {
tags: ['channels'],
@@ -42,4 +43,6 @@ export default define(meta, async (ps, user) => {
followerId: user.id,
followeeId: channel.id,
});
+
+ publishUserEvent(user.id, 'followChannel', channel);
});
diff --git a/src/server/api/endpoints/channels/unfollow.ts b/src/server/api/endpoints/channels/unfollow.ts
index 8cab5c36a6..3eb0f1519b 100644
--- a/src/server/api/endpoints/channels/unfollow.ts
+++ b/src/server/api/endpoints/channels/unfollow.ts
@@ -3,6 +3,7 @@ import { ID } from '../../../../misc/cafy-id';
import define from '../../define';
import { ApiError } from '../../error';
import { Channels, ChannelFollowings } from '../../../../models';
+import { publishUserEvent } from '../../../../services/stream';
export const meta = {
tags: ['channels'],
@@ -39,4 +40,6 @@ export default define(meta, async (ps, user) => {
followerId: user.id,
followeeId: channel.id,
});
+
+ publishUserEvent(user.id, 'unfollowChannel', channel);
});
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index a1faf8f1c2..92be2e9e6d 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -1,6 +1,6 @@
import $ from 'cafy';
import { ID } from '../../../../misc/cafy-id';
-import { publishMainStream } from '../../../../services/stream';
+import { publishMainStream, publishUserEvent } from '../../../../services/stream';
import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
import { publishToFollowers } from '../../../../services/i/update';
import define from '../../define';
@@ -317,6 +317,7 @@ export default define(meta, async (ps, user, token) => {
// Publish meUpdated event
publishMainStream(user.id, 'meUpdated', iObj);
+ publishUserEvent(user.id, 'updateUserProfile', await UserProfiles.findOne(user.id));
// 鍵垢を解除したとき、溜まっていたフォローリクエストがあるならすべて承認
if (user.isLocked && ps.isLocked === false) {
diff --git a/src/server/api/endpoints/mute/create.ts b/src/server/api/endpoints/mute/create.ts
index 437ad96107..ebfc6028ed 100644
--- a/src/server/api/endpoints/mute/create.ts
+++ b/src/server/api/endpoints/mute/create.ts
@@ -6,6 +6,7 @@ import { getUser } from '../../common/getters';
import { genId } from '../../../../misc/gen-id';
import { Mutings, NoteWatchings } from '../../../../models';
import { Muting } from '../../../../models/entities/muting';
+import { publishUserEvent } from '../../../../services/stream';
export const meta = {
desc: {
@@ -82,6 +83,8 @@ export default define(meta, async (ps, user) => {
muteeId: mutee.id,
} as Muting);
+ publishUserEvent(user.id, 'mute', mutee);
+
NoteWatchings.delete({
userId: muter.id,
noteUserId: mutee.id
diff --git a/src/server/api/endpoints/mute/delete.ts b/src/server/api/endpoints/mute/delete.ts
index 217352acb4..67a59e3ae4 100644
--- a/src/server/api/endpoints/mute/delete.ts
+++ b/src/server/api/endpoints/mute/delete.ts
@@ -4,6 +4,7 @@ import define from '../../define';
import { ApiError } from '../../error';
import { getUser } from '../../common/getters';
import { Mutings } from '../../../../models';
+import { publishUserEvent } from '../../../../services/stream';
export const meta = {
desc: {
@@ -76,4 +77,6 @@ export default define(meta, async (ps, user) => {
await Mutings.delete({
id: exist.id
});
+
+ publishUserEvent(user.id, 'unmute', mutee);
});
diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts
index a94923484d..748e894f83 100644
--- a/src/server/api/stream/index.ts
+++ b/src/server/api/stream/index.ts
@@ -30,10 +30,6 @@ export default class Connection {
public subscriber: EventEmitter;
private channels: Channel[] = [];
private subscribingNotes: any = {};
- private followingClock: ReturnType<typeof setInterval>;
- private mutingClock: ReturnType<typeof setInterval>;
- private followingChannelsClock: ReturnType<typeof setInterval>;
- private userProfileClock: ReturnType<typeof setInterval>;
constructor(
wsConnection: websocket.connection,
@@ -52,19 +48,51 @@ export default class Connection {
this.onBroadcastMessage(type, body);
});
- // TODO: reidsでイベントをもらうようにし、ポーリングはしないようにする
if (this.user) {
this.updateFollowing();
- this.followingClock = setInterval(this.updateFollowing, 5000);
-
this.updateMuting();
- this.mutingClock = setInterval(this.updateMuting, 5000);
-
this.updateFollowingChannels();
- this.followingChannelsClock = setInterval(this.updateFollowingChannels, 5000);
-
this.updateUserProfile();
- this.userProfileClock = setInterval(this.updateUserProfile, 5000);
+
+ this.subscriber.on(`user:${this.user.id}`, ({ type, body }) => {
+ this.onUserEvent(type, body);
+ });
+ }
+ }
+
+ @autobind
+ private onUserEvent(type: string, body: any) {
+ switch (type) {
+ case 'follow':
+ this.following.add(body.id);
+ break;
+
+ case 'unfollow':
+ this.following.delete(body.id);
+ break;
+
+ case 'mute':
+ this.muting.add(body.id);
+ break;
+
+ case 'unmute':
+ this.muting.delete(body.id);
+ break;
+
+ case 'followChannel':
+ this.followingChannels.add(body.id);
+ break;
+
+ case 'unfollowChannel':
+ this.followingChannels.delete(body.id);
+ break;
+
+ case 'updateUserProfile':
+ this.userProfile = body;
+ break;
+
+ default:
+ break;
}
}
@@ -354,10 +382,5 @@ export default class Connection {
for (const c of this.channels.filter(c => c.dispose)) {
if (c.dispose) c.dispose();
}
-
- if (this.followingClock) clearInterval(this.followingClock);
- if (this.mutingClock) clearInterval(this.mutingClock);
- if (this.followingChannelsClock) clearInterval(this.followingChannelsClock);
- if (this.userProfileClock) clearInterval(this.userProfileClock);
}
}