summaryrefslogtreecommitdiff
path: root/src/server/api/stream
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/stream')
-rw-r--r--src/server/api/stream/channel.ts2
-rw-r--r--src/server/api/stream/channels/drive.ts3
-rw-r--r--src/server/api/stream/channels/games/reversi-game.ts16
-rw-r--r--src/server/api/stream/channels/games/reversi.ts3
-rw-r--r--src/server/api/stream/channels/global-timeline.ts3
-rw-r--r--src/server/api/stream/channels/hashtag.ts3
-rw-r--r--src/server/api/stream/channels/home-timeline.ts3
-rw-r--r--src/server/api/stream/channels/hybrid-timeline.ts3
-rw-r--r--src/server/api/stream/channels/local-timeline.ts3
-rw-r--r--src/server/api/stream/channels/main.ts3
-rw-r--r--src/server/api/stream/channels/messaging-index.ts3
-rw-r--r--src/server/api/stream/channels/messaging.ts3
-rw-r--r--src/server/api/stream/channels/notes-stats.ts3
-rw-r--r--src/server/api/stream/channels/server-stats.ts3
-rw-r--r--src/server/api/stream/channels/user-list.ts3
-rw-r--r--src/server/api/stream/index.ts30
16 files changed, 72 insertions, 15 deletions
diff --git a/src/server/api/stream/channel.ts b/src/server/api/stream/channel.ts
index e2726060dc..75914964cb 100644
--- a/src/server/api/stream/channel.ts
+++ b/src/server/api/stream/channel.ts
@@ -7,6 +7,8 @@ import Connection from '.';
export default abstract class Channel {
protected connection: Connection;
public id: string;
+ public abstract readonly chName: string;
+ public static readonly shouldShare: boolean;
protected get user() {
return this.connection.user;
diff --git a/src/server/api/stream/channels/drive.ts b/src/server/api/stream/channels/drive.ts
index 807fc93cd0..7425a620ff 100644
--- a/src/server/api/stream/channels/drive.ts
+++ b/src/server/api/stream/channels/drive.ts
@@ -2,6 +2,9 @@ import autobind from 'autobind-decorator';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'drive';
+ public static shouldShare = true;
+
@autobind
public async init(params: any) {
// Subscribe drive stream
diff --git a/src/server/api/stream/channels/games/reversi-game.ts b/src/server/api/stream/channels/games/reversi-game.ts
index 11f1fb1feb..5dc9ca0608 100644
--- a/src/server/api/stream/channels/games/reversi-game.ts
+++ b/src/server/api/stream/channels/games/reversi-game.ts
@@ -1,5 +1,6 @@
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 Reversi from '../../../../../games/reversi/core';
@@ -7,11 +8,14 @@ import * as maps from '../../../../../games/reversi/maps';
import Channel from '../../channel';
export default class extends Channel {
- private gameId: string;
+ public readonly chName = 'gamesReversiGame';
+ public static shouldShare = false;
+
+ private gameId: mongo.ObjectID;
@autobind
public async init(params: any) {
- this.gameId = params.gameId as string;
+ this.gameId = new mongo.ObjectID(params.gameId as string);
// Subscribe game stream
this.subscriber.on(`reversiGameStream:${this.gameId}`, data => {
@@ -23,10 +27,10 @@ export default class extends Channel {
public onMessage(type: string, body: any) {
switch (type) {
case 'accept': this.accept(true); break;
- case 'cancel-accept': this.accept(false); break;
- case 'update-settings': this.updateSettings(body.settings); break;
- case 'init-form': this.initForm(body); break;
- case 'update-form': this.updateForm(body.id, body.value); break;
+ case 'cancelAccept': this.accept(false); break;
+ case 'updateSettings': this.updateSettings(body.settings); break;
+ case 'initForm': this.initForm(body); break;
+ case 'updateForm': this.updateForm(body.id, body.value); break;
case 'message': this.message(body); break;
case 'set': this.set(body.pos); break;
case 'check': this.check(body.crc32); break;
diff --git a/src/server/api/stream/channels/games/reversi.ts b/src/server/api/stream/channels/games/reversi.ts
index d75025c944..51cb264d98 100644
--- a/src/server/api/stream/channels/games/reversi.ts
+++ b/src/server/api/stream/channels/games/reversi.ts
@@ -5,6 +5,9 @@ import { publishMainStream } from '../../../../../stream';
import Channel from '../../channel';
export default class extends Channel {
+ public readonly chName = 'gamesReversi';
+ public static shouldShare = true;
+
@autobind
public async init(params: any) {
// Subscribe reversi stream
diff --git a/src/server/api/stream/channels/global-timeline.ts b/src/server/api/stream/channels/global-timeline.ts
index ab0fe5d094..e39ea269a6 100644
--- a/src/server/api/stream/channels/global-timeline.ts
+++ b/src/server/api/stream/channels/global-timeline.ts
@@ -5,6 +5,9 @@ import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'globalTimeline';
+ public static shouldShare = true;
+
private mutedUserIds: string[] = [];
@autobind
diff --git a/src/server/api/stream/channels/hashtag.ts b/src/server/api/stream/channels/hashtag.ts
index 652b0caa5b..cf652c166c 100644
--- a/src/server/api/stream/channels/hashtag.ts
+++ b/src/server/api/stream/channels/hashtag.ts
@@ -5,6 +5,9 @@ import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'hashtag';
+ public static shouldShare = false;
+
@autobind
public async init(params: any) {
const mute = this.user ? await Mute.find({ muterId: this.user._id }) : null;
diff --git a/src/server/api/stream/channels/home-timeline.ts b/src/server/api/stream/channels/home-timeline.ts
index 4c674e75ef..3fa887f1e5 100644
--- a/src/server/api/stream/channels/home-timeline.ts
+++ b/src/server/api/stream/channels/home-timeline.ts
@@ -5,6 +5,9 @@ import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'homeTimeline';
+ public static shouldShare = true;
+
private mutedUserIds: string[] = [];
@autobind
diff --git a/src/server/api/stream/channels/hybrid-timeline.ts b/src/server/api/stream/channels/hybrid-timeline.ts
index 0b12ab3a8f..d72545e4c8 100644
--- a/src/server/api/stream/channels/hybrid-timeline.ts
+++ b/src/server/api/stream/channels/hybrid-timeline.ts
@@ -5,6 +5,9 @@ import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'hybridTimeline';
+ public static shouldShare = true;
+
private mutedUserIds: string[] = [];
@autobind
diff --git a/src/server/api/stream/channels/local-timeline.ts b/src/server/api/stream/channels/local-timeline.ts
index 769ec6392f..0ba0b1b195 100644
--- a/src/server/api/stream/channels/local-timeline.ts
+++ b/src/server/api/stream/channels/local-timeline.ts
@@ -5,6 +5,9 @@ import shouldMuteThisNote from '../../../../misc/should-mute-this-note';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'localTimeline';
+ public static shouldShare = true;
+
private mutedUserIds: string[] = [];
@autobind
diff --git a/src/server/api/stream/channels/main.ts b/src/server/api/stream/channels/main.ts
index fd0984c833..7d5462c092 100644
--- a/src/server/api/stream/channels/main.ts
+++ b/src/server/api/stream/channels/main.ts
@@ -3,6 +3,9 @@ import Mute from '../../../../models/mute';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'main';
+ public static shouldShare = true;
+
@autobind
public async init(params: any) {
const mute = await Mute.find({ muterId: this.user._id });
diff --git a/src/server/api/stream/channels/messaging-index.ts b/src/server/api/stream/channels/messaging-index.ts
index 6e87cca7f4..0211d702cf 100644
--- a/src/server/api/stream/channels/messaging-index.ts
+++ b/src/server/api/stream/channels/messaging-index.ts
@@ -2,6 +2,9 @@ import autobind from 'autobind-decorator';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'messagingIndex';
+ public static shouldShare = true;
+
@autobind
public async init(params: any) {
// Subscribe messaging index stream
diff --git a/src/server/api/stream/channels/messaging.ts b/src/server/api/stream/channels/messaging.ts
index e1a78c8678..ab04a332cf 100644
--- a/src/server/api/stream/channels/messaging.ts
+++ b/src/server/api/stream/channels/messaging.ts
@@ -3,6 +3,9 @@ import read from '../../common/read-messaging-message';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'messaging';
+ public static shouldShare = false;
+
private otherpartyId: string;
@autobind
diff --git a/src/server/api/stream/channels/notes-stats.ts b/src/server/api/stream/channels/notes-stats.ts
index cc68d9886d..2282f8bc70 100644
--- a/src/server/api/stream/channels/notes-stats.ts
+++ b/src/server/api/stream/channels/notes-stats.ts
@@ -5,6 +5,9 @@ import Channel from '../channel';
const ev = new Xev();
export default class extends Channel {
+ public readonly chName = 'notesStats';
+ public static shouldShare = true;
+
@autobind
public async init(params: any) {
ev.addListener('notesStats', this.onStats);
diff --git a/src/server/api/stream/channels/server-stats.ts b/src/server/api/stream/channels/server-stats.ts
index 28a566e8ae..912dcf5305 100644
--- a/src/server/api/stream/channels/server-stats.ts
+++ b/src/server/api/stream/channels/server-stats.ts
@@ -5,6 +5,9 @@ import Channel from '../channel';
const ev = new Xev();
export default class extends Channel {
+ public readonly chName = 'serverStats';
+ public static shouldShare = true;
+
@autobind
public async init(params: any) {
ev.addListener('serverStats', this.onStats);
diff --git a/src/server/api/stream/channels/user-list.ts b/src/server/api/stream/channels/user-list.ts
index 4ace308923..b526a5f986 100644
--- a/src/server/api/stream/channels/user-list.ts
+++ b/src/server/api/stream/channels/user-list.ts
@@ -2,6 +2,9 @@ import autobind from 'autobind-decorator';
import Channel from '../channel';
export default class extends Channel {
+ public readonly chName = 'userList';
+ public static shouldShare = false;
+
@autobind
public async init(params: any) {
const listId = params.listId as string;
diff --git a/src/server/api/stream/index.ts b/src/server/api/stream/index.ts
index ef6397fcd9..e376b7a29e 100644
--- a/src/server/api/stream/index.ts
+++ b/src/server/api/stream/index.ts
@@ -1,6 +1,5 @@
import autobind from 'autobind-decorator';
import * as websocket from 'websocket';
-import Xev from 'xev';
import * as debug from 'debug';
import User, { IUser } from '../../../models/user';
@@ -11,6 +10,7 @@ import readNote from '../../../services/note/read';
import Channel from './channel';
import channels from './channels';
+import { EventEmitter } from 'events';
const log = debug('misskey');
@@ -21,14 +21,14 @@ export default class Connection {
public user?: IUser;
public app: IApp;
private wsConnection: websocket.connection;
- public subscriber: Xev;
+ public subscriber: EventEmitter;
private channels: Channel[] = [];
private subscribingNotes: any = {};
public sendMessageToWsOverride: any = null; // 後方互換性のため
constructor(
wsConnection: websocket.connection,
- subscriber: Xev,
+ subscriber: EventEmitter,
user: IUser,
app: IApp
) {
@@ -58,6 +58,7 @@ export default class Connection {
case 'connect': this.onChannelConnectRequested(body); break;
case 'disconnect': this.onChannelDisconnectRequested(body); break;
case 'channel': this.onChannelMessageRequested(body); break;
+ case 'ch': this.onChannelMessageRequested(body); break; // alias
}
}
@@ -145,9 +146,9 @@ export default class Connection {
*/
@autobind
private onChannelConnectRequested(payload: any) {
- const { channel, id, params } = payload;
+ const { channel, id, params, pong } = payload;
log(`CH CONNECT: ${id} ${channel} by @${this.user.username}`);
- this.connectChannel(id, params, (channels as any)[channel]);
+ this.connectChannel(id, params, channel, pong);
}
/**
@@ -176,10 +177,21 @@ export default class Connection {
* チャンネルに接続
*/
@autobind
- public connectChannel(id: string, params: any, channelClass: { new(id: string, connection: Connection): Channel }) {
- const channel = new channelClass(id, this);
- this.channels.push(channel);
- channel.init(params);
+ public connectChannel(id: string, params: any, channel: string, pong = false) {
+ // 共有可能チャンネルに接続しようとしていて、かつそのチャンネルに既に接続していたら無意味なので無視
+ if ((channels as any)[channel].shouldShare && this.channels.some(c => c.chName === channel)) {
+ return;
+ }
+
+ const ch: Channel = new (channels as any)[channel](id, this);
+ this.channels.push(ch);
+ ch.init(params);
+
+ if (pong) {
+ this.sendMessageToWs('connected', {
+ id: id
+ });
+ }
}
/**