summaryrefslogtreecommitdiff
path: root/src/client/app/common/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/app/common/scripts')
-rw-r--r--src/client/app/common/scripts/compose-notification.ts6
-rw-r--r--src/client/app/common/scripts/note-subscriber.ts105
-rw-r--r--src/client/app/common/scripts/stream.ts318
-rw-r--r--src/client/app/common/scripts/streaming/drive.ts34
-rw-r--r--src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts13
-rw-r--r--src/client/app/common/scripts/streaming/games/reversi/reversi.ts31
-rw-r--r--src/client/app/common/scripts/streaming/global-timeline.ts34
-rw-r--r--src/client/app/common/scripts/streaming/hashtag.ts13
-rw-r--r--src/client/app/common/scripts/streaming/home.ts126
-rw-r--r--src/client/app/common/scripts/streaming/hybrid-timeline.ts34
-rw-r--r--src/client/app/common/scripts/streaming/local-timeline.ts34
-rw-r--r--src/client/app/common/scripts/streaming/messaging-index.ts34
-rw-r--r--src/client/app/common/scripts/streaming/messaging.ts20
-rw-r--r--src/client/app/common/scripts/streaming/notes-stats.ts30
-rw-r--r--src/client/app/common/scripts/streaming/server-stats.ts30
-rw-r--r--src/client/app/common/scripts/streaming/stream-manager.ts109
-rw-r--r--src/client/app/common/scripts/streaming/stream.ts137
-rw-r--r--src/client/app/common/scripts/streaming/user-list.ts17
18 files changed, 426 insertions, 699 deletions
diff --git a/src/client/app/common/scripts/compose-notification.ts b/src/client/app/common/scripts/compose-notification.ts
index f42af94370..65087cc98e 100644
--- a/src/client/app/common/scripts/compose-notification.ts
+++ b/src/client/app/common/scripts/compose-notification.ts
@@ -13,21 +13,21 @@ type Notification = {
export default function(type, data): Notification {
switch (type) {
- case 'drive_file_created':
+ case 'driveFileCreated':
return {
title: '%i18n:common.notification.file-uploaded%',
body: data.name,
icon: data.url
};
- case 'unread_messaging_message':
+ case 'unreadMessagingMessage':
return {
title: '%i18n:common.notification.message-from%'.split("{}")[0] + `${getUserName(data.user)}` + '%i18n:common.notification.message-from%'.split("{}")[1] ,
body: data.text, // TODO: getMessagingMessageSummary(data),
icon: data.user.avatarUrl
};
- case 'reversi_invited':
+ case 'reversiInvited':
return {
title: '%i18n:common.notification.reversi-invited%',
body: '%i18n:common.notification.reversi-invited-by%'.split("{}")[0] + `${getUserName(data.parent)}` + '%i18n:common.notification.reversi-invited-by%'.split("{}")[1],
diff --git a/src/client/app/common/scripts/note-subscriber.ts b/src/client/app/common/scripts/note-subscriber.ts
new file mode 100644
index 0000000000..5fc82942d5
--- /dev/null
+++ b/src/client/app/common/scripts/note-subscriber.ts
@@ -0,0 +1,105 @@
+import Vue from 'vue';
+
+export default prop => ({
+ data() {
+ return {
+ connection: null
+ };
+ },
+
+ computed: {
+ $_ns_note_(): any {
+ return this[prop];
+ },
+
+ $_ns_isRenote(): boolean {
+ return (this.$_ns_note_.renote &&
+ this.$_ns_note_.text == null &&
+ this.$_ns_note_.fileIds.length == 0 &&
+ this.$_ns_note_.poll == null);
+ },
+
+ $_ns_target(): any {
+ return this._ns_isRenote ? this.$_ns_note_.renote : this.$_ns_note_;
+ },
+ },
+
+ created() {
+ if (this.$store.getters.isSignedIn) {
+ this.connection = (this as any).os.stream;
+ }
+ },
+
+ mounted() {
+ this.capture(true);
+
+ if (this.$store.getters.isSignedIn) {
+ this.connection.on('_connected_', this.onStreamConnected);
+ }
+ },
+
+ beforeDestroy() {
+ this.decapture(true);
+
+ if (this.$store.getters.isSignedIn) {
+ this.connection.off('_connected_', this.onStreamConnected);
+ }
+ },
+
+ methods: {
+ capture(withHandler = false) {
+ if (this.$store.getters.isSignedIn) {
+ const data = {
+ id: this.$_ns_target.id
+ } as any;
+
+ if (
+ (this.$_ns_target.visibleUserIds || []).includes(this.$store.state.i.id) ||
+ (this.$_ns_target.mentions || []).includes(this.$store.state.i.id)
+ ) {
+ data.read = true;
+ }
+
+ this.connection.send('sn', data);
+ if (withHandler) this.connection.on('noteUpdated', this.onStreamNoteUpdated);
+ }
+ },
+
+ decapture(withHandler = false) {
+ if (this.$store.getters.isSignedIn) {
+ this.connection.send('un', {
+ id: this.$_ns_target.id
+ });
+ if (withHandler) this.connection.off('noteUpdated', this.onStreamNoteUpdated);
+ }
+ },
+
+ onStreamConnected() {
+ this.capture();
+ },
+
+ onStreamNoteUpdated(data) {
+ const { type, id, body } = data;
+
+ if (id !== this.$_ns_target.id) return;
+
+ switch (type) {
+ case 'reacted': {
+ const reaction = body.reaction;
+ if (this.$_ns_target.reactionCounts == null) Vue.set(this.$_ns_target, 'reactionCounts', {});
+ this.$_ns_target.reactionCounts[reaction] = (this.$_ns_target.reactionCounts[reaction] || 0) + 1;
+ break;
+ }
+
+ case 'pollVoted': {
+ if (body.userId == this.$store.state.i.id) return;
+ const choice = body.choice;
+ this.$_ns_target.poll.choices.find(c => c.id === choice).votes++;
+ break;
+ }
+ }
+
+ this.$emit(`update:${prop}`, this.$_ns_note_);
+ },
+ }
+});
diff --git a/src/client/app/common/scripts/stream.ts b/src/client/app/common/scripts/stream.ts
new file mode 100644
index 0000000000..7dc130937b
--- /dev/null
+++ b/src/client/app/common/scripts/stream.ts
@@ -0,0 +1,318 @@
+import autobind from 'autobind-decorator';
+import { EventEmitter } from 'eventemitter3';
+import * as ReconnectingWebsocket from 'reconnecting-websocket';
+import { wsUrl } from '../../config';
+import MiOS from '../../mios';
+
+/**
+ * Misskey stream connection
+ */
+export default class Stream extends EventEmitter {
+ private stream: ReconnectingWebsocket;
+ private state: string;
+ private buffer: any[];
+ private sharedConnections: SharedConnection[] = [];
+ private nonSharedConnections: NonSharedConnection[] = [];
+
+ constructor(os: MiOS) {
+ super();
+
+ this.state = 'initializing';
+ this.buffer = [];
+
+ const user = os.store.state.i;
+
+ this.stream = new ReconnectingWebsocket(wsUrl + (user ? `?i=${user.token}` : ''));
+ this.stream.addEventListener('open', this.onOpen);
+ this.stream.addEventListener('close', this.onClose);
+ this.stream.addEventListener('message', this.onMessage);
+
+ if (user) {
+ const main = this.useSharedConnection('main');
+
+ // 自分の情報が更新されたとき
+ main.on('meUpdated', i => {
+ os.store.dispatch('mergeMe', i);
+ });
+
+ main.on('readAllNotifications', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadNotification: false
+ });
+ });
+
+ main.on('unreadNotification', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadNotification: true
+ });
+ });
+
+ main.on('readAllMessagingMessages', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadMessagingMessage: false
+ });
+ });
+
+ main.on('unreadMessagingMessage', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadMessagingMessage: true
+ });
+ });
+
+ main.on('unreadMention', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadMentions: true
+ });
+ });
+
+ main.on('readAllUnreadMentions', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadMentions: false
+ });
+ });
+
+ main.on('unreadSpecifiedNote', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadSpecifiedNotes: true
+ });
+ });
+
+ main.on('readAllUnreadSpecifiedNotes', () => {
+ os.store.dispatch('mergeMe', {
+ hasUnreadSpecifiedNotes: false
+ });
+ });
+
+ main.on('clientSettingUpdated', x => {
+ os.store.commit('settings/set', {
+ key: x.key,
+ value: x.value
+ });
+ });
+
+ main.on('homeUpdated', x => {
+ os.store.commit('settings/setHome', x);
+ });
+
+ main.on('mobileHomeUpdated', x => {
+ os.store.commit('settings/setMobileHome', x);
+ });
+
+ main.on('widgetUpdated', x => {
+ os.store.commit('settings/setWidget', {
+ id: x.id,
+ data: x.data
+ });
+ });
+
+ // トークンが再生成されたとき
+ // このままではMisskeyが利用できないので強制的にサインアウトさせる
+ main.on('myTokenRegenerated', () => {
+ alert('%i18n:common.my-token-regenerated%');
+ os.signout();
+ });
+ }
+ }
+
+ public useSharedConnection = (channel: string): SharedConnection => {
+ const existConnection = this.sharedConnections.find(c => c.channel === channel);
+
+ if (existConnection) {
+ existConnection.use();
+ return existConnection;
+ } else {
+ const connection = new SharedConnection(this, channel);
+ connection.use();
+ this.sharedConnections.push(connection);
+ return connection;
+ }
+ }
+
+ @autobind
+ public removeSharedConnection(connection: SharedConnection) {
+ this.sharedConnections = this.sharedConnections.filter(c => c.id !== connection.id);
+ }
+
+ public connectToChannel = (channel: string, params?: any): NonSharedConnection => {
+ const connection = new NonSharedConnection(this, channel, params);
+ this.nonSharedConnections.push(connection);
+ return connection;
+ }
+
+ @autobind
+ public disconnectToChannel(connection: NonSharedConnection) {
+ this.nonSharedConnections = this.nonSharedConnections.filter(c => c.id !== connection.id);
+ }
+
+ /**
+ * Callback of when open connection
+ */
+ @autobind
+ private onOpen() {
+ const isReconnect = this.state == 'reconnecting';
+
+ this.state = 'connected';
+ this.emit('_connected_');
+
+ // バッファーを処理
+ const _buffer = [].concat(this.buffer); // Shallow copy
+ this.buffer = []; // Clear buffer
+ _buffer.forEach(data => {
+ this.send(data); // Resend each buffered messages
+ });
+
+ // チャンネル再接続
+ if (isReconnect) {
+ this.sharedConnections.forEach(c => {
+ c.connect();
+ });
+ this.nonSharedConnections.forEach(c => {
+ c.connect();
+ });
+ }
+ }
+
+ /**
+ * Callback of when close connection
+ */
+ @autobind
+ private onClose() {
+ this.state = 'reconnecting';
+ this.emit('_disconnected_');
+ }
+
+ /**
+ * Callback of when received a message from connection
+ */
+ @autobind
+ private onMessage(message) {
+ const { type, body } = JSON.parse(message.data);
+
+ if (type == 'channel') {
+ const id = body.id;
+ const connection = this.sharedConnections.find(c => c.id === id) || this.nonSharedConnections.find(c => c.id === id);
+ connection.emit(body.type, body.body);
+ } else {
+ this.emit(type, body);
+ }
+ }
+
+ /**
+ * Send a message to connection
+ */
+ @autobind
+ public send(typeOrPayload, payload?) {
+ const data = payload === undefined ? typeOrPayload : {
+ type: typeOrPayload,
+ body: payload
+ };
+
+ // まだ接続が確立されていなかったらバッファリングして次に接続した時に送信する
+ if (this.state != 'connected') {
+ this.buffer.push(data);
+ return;
+ }
+
+ this.stream.send(JSON.stringify(data));
+ }
+
+ /**
+ * Close this connection
+ */
+ @autobind
+ public close() {
+ this.stream.removeEventListener('open', this.onOpen);
+ this.stream.removeEventListener('message', this.onMessage);
+ }
+}
+
+abstract class Connection extends EventEmitter {
+ public channel: string;
+ public id: string;
+ protected params: any;
+ protected stream: Stream;
+
+ constructor(stream: Stream, channel: string, params?: any) {
+ super();
+
+ this.stream = stream;
+ this.channel = channel;
+ this.params = params;
+ this.id = Math.random().toString();
+ this.connect();
+ }
+
+ @autobind
+ public connect() {
+ this.stream.send('connect', {
+ channel: this.channel,
+ id: this.id,
+ params: this.params
+ });
+ }
+
+ @autobind
+ public send(typeOrPayload, payload?) {
+ const data = payload === undefined ? typeOrPayload : {
+ type: typeOrPayload,
+ body: payload
+ };
+
+ this.stream.send('channel', {
+ id: this.id,
+ body: data
+ });
+ }
+
+ public abstract dispose: () => void;
+}
+
+class SharedConnection extends Connection {
+ private users = 0;
+ private disposeTimerId: any;
+
+ constructor(stream: Stream, channel: string) {
+ super(stream, channel);
+ }
+
+ @autobind
+ public use() {
+ this.users++;
+
+ // タイマー解除
+ if (this.disposeTimerId) {
+ clearTimeout(this.disposeTimerId);
+ this.disposeTimerId = null;
+ }
+ }
+
+ @autobind
+ public dispose() {
+ this.users--;
+
+ // そのコネクションの利用者が誰もいなくなったら
+ if (this.users === 0) {
+ // また直ぐに再利用される可能性があるので、一定時間待ち、
+ // 新たな利用者が現れなければコネクションを切断する
+ this.disposeTimerId = setTimeout(() => {
+ this.disposeTimerId = null;
+ this.removeAllListeners();
+ this.stream.send('disconnect', { id: this.id });
+ this.stream.removeSharedConnection(this);
+ }, 3000);
+ }
+ }
+}
+
+class NonSharedConnection extends Connection {
+ constructor(stream: Stream, channel: string, params?: any) {
+ super(stream, channel, params);
+ }
+
+ @autobind
+ public dispose() {
+ this.removeAllListeners();
+ this.stream.send('disconnect', { id: this.id });
+ this.stream.disconnectToChannel(this);
+ }
+}
diff --git a/src/client/app/common/scripts/streaming/drive.ts b/src/client/app/common/scripts/streaming/drive.ts
deleted file mode 100644
index 50fff05737..0000000000
--- a/src/client/app/common/scripts/streaming/drive.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Drive stream connection
- */
-export class DriveStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, 'drive', {
- i: me.token
- });
- }
-}
-
-export class DriveStreamManager extends StreamManager<DriveStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new DriveStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts b/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts
deleted file mode 100644
index adfa75ff3b..0000000000
--- a/src/client/app/common/scripts/streaming/games/reversi/reversi-game.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import Stream from '../../stream';
-import MiOS from '../../../../../mios';
-
-export class ReversiGameStream extends Stream {
- constructor(os: MiOS, me, game) {
- super(os, 'games/reversi-game', me ? {
- i: me.token,
- game: game.id
- } : {
- game: game.id
- });
- }
-}
diff --git a/src/client/app/common/scripts/streaming/games/reversi/reversi.ts b/src/client/app/common/scripts/streaming/games/reversi/reversi.ts
deleted file mode 100644
index 1f4fd8c63e..0000000000
--- a/src/client/app/common/scripts/streaming/games/reversi/reversi.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import StreamManager from '../../stream-manager';
-import Stream from '../../stream';
-import MiOS from '../../../../../mios';
-
-export class ReversiStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, 'games/reversi', {
- i: me.token
- });
- }
-}
-
-export class ReversiStreamManager extends StreamManager<ReversiStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new ReversiStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/global-timeline.ts b/src/client/app/common/scripts/streaming/global-timeline.ts
deleted file mode 100644
index a639f1595c..0000000000
--- a/src/client/app/common/scripts/streaming/global-timeline.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Global timeline stream connection
- */
-export class GlobalTimelineStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, 'global-timeline', {
- i: me.token
- });
- }
-}
-
-export class GlobalTimelineStreamManager extends StreamManager<GlobalTimelineStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new GlobalTimelineStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/hashtag.ts b/src/client/app/common/scripts/streaming/hashtag.ts
deleted file mode 100644
index 276b8f8d3d..0000000000
--- a/src/client/app/common/scripts/streaming/hashtag.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import Stream from './stream';
-import MiOS from '../../../mios';
-
-export class HashtagStream extends Stream {
- constructor(os: MiOS, me, q) {
- super(os, 'hashtag', me ? {
- i: me.token,
- q: JSON.stringify(q)
- } : {
- q: JSON.stringify(q)
- });
- }
-}
diff --git a/src/client/app/common/scripts/streaming/home.ts b/src/client/app/common/scripts/streaming/home.ts
deleted file mode 100644
index 26729507fb..0000000000
--- a/src/client/app/common/scripts/streaming/home.ts
+++ /dev/null
@@ -1,126 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Home stream connection
- */
-export class HomeStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, '', {
- i: me.token
- });
-
- // 最終利用日時を更新するため定期的にaliveメッセージを送信
- setInterval(() => {
- this.send({ type: 'alive' });
- me.lastUsedAt = new Date();
- }, 1000 * 60);
-
- // 自分の情報が更新されたとき
- this.on('meUpdated', i => {
- if (os.debug) {
- console.log('I updated:', i);
- }
-
- os.store.dispatch('mergeMe', i);
- });
-
- this.on('read_all_notifications', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadNotification: false
- });
- });
-
- this.on('unread_notification', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadNotification: true
- });
- });
-
- this.on('read_all_messaging_messages', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadMessagingMessage: false
- });
- });
-
- this.on('unread_messaging_message', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadMessagingMessage: true
- });
- });
-
- this.on('unreadMention', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadMentions: true
- });
- });
-
- this.on('readAllUnreadMentions', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadMentions: false
- });
- });
-
- this.on('unreadSpecifiedNote', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadSpecifiedNotes: true
- });
- });
-
- this.on('readAllUnreadSpecifiedNotes', () => {
- os.store.dispatch('mergeMe', {
- hasUnreadSpecifiedNotes: false
- });
- });
-
- this.on('clientSettingUpdated', x => {
- os.store.commit('settings/set', {
- key: x.key,
- value: x.value
- });
- });
-
- this.on('home_updated', x => {
- os.store.commit('settings/setHome', x);
- });
-
- this.on('mobile_home_updated', x => {
- os.store.commit('settings/setMobileHome', x);
- });
-
- this.on('widgetUpdated', x => {
- os.store.commit('settings/setWidget', {
- id: x.id,
- data: x.data
- });
- });
-
- // トークンが再生成されたとき
- // このままではMisskeyが利用できないので強制的にサインアウトさせる
- this.on('my_token_regenerated', () => {
- alert('%i18n:common.my-token-regenerated%');
- os.signout();
- });
- }
-}
-
-export class HomeStreamManager extends StreamManager<HomeStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new HomeStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/hybrid-timeline.ts b/src/client/app/common/scripts/streaming/hybrid-timeline.ts
deleted file mode 100644
index cd290797c4..0000000000
--- a/src/client/app/common/scripts/streaming/hybrid-timeline.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Hybrid timeline stream connection
- */
-export class HybridTimelineStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, 'hybrid-timeline', {
- i: me.token
- });
- }
-}
-
-export class HybridTimelineStreamManager extends StreamManager<HybridTimelineStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new HybridTimelineStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/local-timeline.ts b/src/client/app/common/scripts/streaming/local-timeline.ts
deleted file mode 100644
index 41c36aa14c..0000000000
--- a/src/client/app/common/scripts/streaming/local-timeline.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Local timeline stream connection
- */
-export class LocalTimelineStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, 'local-timeline', me ? {
- i: me.token
- } : {});
- }
-}
-
-export class LocalTimelineStreamManager extends StreamManager<LocalTimelineStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new LocalTimelineStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/messaging-index.ts b/src/client/app/common/scripts/streaming/messaging-index.ts
deleted file mode 100644
index addcccb952..0000000000
--- a/src/client/app/common/scripts/streaming/messaging-index.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Messaging index stream connection
- */
-export class MessagingIndexStream extends Stream {
- constructor(os: MiOS, me) {
- super(os, 'messaging-index', {
- i: me.token
- });
- }
-}
-
-export class MessagingIndexStreamManager extends StreamManager<MessagingIndexStream> {
- private me;
- private os: MiOS;
-
- constructor(os: MiOS, me) {
- super();
-
- this.me = me;
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new MessagingIndexStream(this.os, this.me);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/messaging.ts b/src/client/app/common/scripts/streaming/messaging.ts
deleted file mode 100644
index a59377d867..0000000000
--- a/src/client/app/common/scripts/streaming/messaging.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import Stream from './stream';
-import MiOS from '../../../mios';
-
-/**
- * Messaging stream connection
- */
-export class MessagingStream extends Stream {
- constructor(os: MiOS, me, otherparty) {
- super(os, 'messaging', {
- i: me.token,
- otherparty
- });
-
- (this as any).on('_connected_', () => {
- this.send({
- i: me.token
- });
- });
- }
-}
diff --git a/src/client/app/common/scripts/streaming/notes-stats.ts b/src/client/app/common/scripts/streaming/notes-stats.ts
deleted file mode 100644
index 9e3e78a709..0000000000
--- a/src/client/app/common/scripts/streaming/notes-stats.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Notes stats stream connection
- */
-export class NotesStatsStream extends Stream {
- constructor(os: MiOS) {
- super(os, 'notes-stats');
- }
-}
-
-export class NotesStatsStreamManager extends StreamManager<NotesStatsStream> {
- private os: MiOS;
-
- constructor(os: MiOS) {
- super();
-
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new NotesStatsStream(this.os);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/server-stats.ts b/src/client/app/common/scripts/streaming/server-stats.ts
deleted file mode 100644
index 9983dfcaf0..0000000000
--- a/src/client/app/common/scripts/streaming/server-stats.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import Stream from './stream';
-import StreamManager from './stream-manager';
-import MiOS from '../../../mios';
-
-/**
- * Server stats stream connection
- */
-export class ServerStatsStream extends Stream {
- constructor(os: MiOS) {
- super(os, 'server-stats');
- }
-}
-
-export class ServerStatsStreamManager extends StreamManager<ServerStatsStream> {
- private os: MiOS;
-
- constructor(os: MiOS) {
- super();
-
- this.os = os;
- }
-
- public getConnection() {
- if (this.connection == null) {
- this.connection = new ServerStatsStream(this.os);
- }
-
- return this.connection;
- }
-}
diff --git a/src/client/app/common/scripts/streaming/stream-manager.ts b/src/client/app/common/scripts/streaming/stream-manager.ts
deleted file mode 100644
index 8dd06f67d3..0000000000
--- a/src/client/app/common/scripts/streaming/stream-manager.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { EventEmitter } from 'eventemitter3';
-import * as uuid from 'uuid';
-import Connection from './stream';
-import { erase } from '../../../../../prelude/array';
-
-/**
- * ストリーム接続を管理するクラス
- * 複数の場所から同じストリームを利用する際、接続をまとめたりする
- */
-export default abstract class StreamManager<T extends Connection> extends EventEmitter {
- private _connection: T = null;
-
- private disposeTimerId: any;
-
- /**
- * コネクションを必要としているユーザー
- */
- private users = [];
-
- protected set connection(connection: T) {
- this._connection = connection;
-
- if (this._connection == null) {
- this.emit('disconnected');
- } else {
- this.emit('connected', this._connection);
-
- this._connection.on('_connected_', () => {
- this.emit('_connected_');
- });
-
- this._connection.on('_disconnected_', () => {
- this.emit('_disconnected_');
- });
-
- this._connection.user = 'Managed';
- }
- }
-
- protected get connection() {
- return this._connection;
- }
-
- /**
- * コネクションを持っているか否か
- */
- public get hasConnection() {
- return this._connection != null;
- }
-
- public get state(): string {
- if (!this.hasConnection) return 'no-connection';
- return this._connection.state;
- }
-
- /**
- * コネクションを要求します
- */
- public abstract getConnection(): T;
-
- /**
- * 現在接続しているコネクションを取得します
- */
- public borrow() {
- return this._connection;
- }
-
- /**
- * コネクションを要求するためのユーザーIDを発行します
- */
- public use() {
- // タイマー解除
- if (this.disposeTimerId) {
- clearTimeout(this.disposeTimerId);
- this.disposeTimerId = null;
- }
-
- // ユーザーID生成
- const userId = uuid();
-
- this.users.push(userId);
-
- this._connection.user = `Managed (${ this.users.length })`;
-
- return userId;
- }
-
- /**
- * コネクションを利用し終わってもう必要ないことを通知します
- * @param userId use で発行したユーザーID
- */
- public dispose(userId) {
- this.users = erase(userId, this.users);
-
- this._connection.user = `Managed (${ this.users.length })`;
-
- // 誰もコネクションの利用者がいなくなったら
- if (this.users.length == 0) {
- // また直ぐに再利用される可能性があるので、一定時間待ち、
- // 新たな利用者が現れなければコネクションを切断する
- this.disposeTimerId = setTimeout(() => {
- this.disposeTimerId = null;
-
- this.connection.close();
- this.connection = null;
- }, 3000);
- }
- }
-}
diff --git a/src/client/app/common/scripts/streaming/stream.ts b/src/client/app/common/scripts/streaming/stream.ts
deleted file mode 100644
index 4ab78f1190..0000000000
--- a/src/client/app/common/scripts/streaming/stream.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-import { EventEmitter } from 'eventemitter3';
-import * as uuid from 'uuid';
-import * as ReconnectingWebsocket from 'reconnecting-websocket';
-import { wsUrl } from '../../../config';
-import MiOS from '../../../mios';
-
-/**
- * Misskey stream connection
- */
-export default class Connection extends EventEmitter {
- public state: string;
- private buffer: any[];
- public socket: ReconnectingWebsocket;
- public name: string;
- public connectedAt: Date;
- public user: string = null;
- public in: number = 0;
- public out: number = 0;
- public inout: Array<{
- type: 'in' | 'out',
- at: Date,
- data: string
- }> = [];
- public id: string;
- public isSuspended = false;
- private os: MiOS;
-
- constructor(os: MiOS, endpoint, params?) {
- super();
-
- //#region BIND
- this.onOpen = this.onOpen.bind(this);
- this.onClose = this.onClose.bind(this);
- this.onMessage = this.onMessage.bind(this);
- this.send = this.send.bind(this);
- this.close = this.close.bind(this);
- //#endregion
-
- this.id = uuid();
- this.os = os;
- this.name = endpoint;
- this.state = 'initializing';
- this.buffer = [];
-
- const query = params
- ? Object.keys(params)
- .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(params[k])}`)
- .join('&')
- : null;
-
- this.socket = new ReconnectingWebsocket(`${wsUrl}/${endpoint}${query ? `?${query}` : ''}`);
- this.socket.addEventListener('open', this.onOpen);
- this.socket.addEventListener('close', this.onClose);
- this.socket.addEventListener('message', this.onMessage);
-
- // Register this connection for debugging
- this.os.registerStreamConnection(this);
- }
-
- /**
- * Callback of when open connection
- */
- private onOpen() {
- this.state = 'connected';
- this.emit('_connected_');
-
- this.connectedAt = new Date();
-
- // バッファーを処理
- const _buffer = [].concat(this.buffer); // Shallow copy
- this.buffer = []; // Clear buffer
- _buffer.forEach(data => {
- this.send(data); // Resend each buffered messages
-
- if (this.os.debug) {
- this.out++;
- this.inout.push({ type: 'out', at: new Date(), data });
- }
- });
- }
-
- /**
- * Callback of when close connection
- */
- private onClose() {
- this.state = 'reconnecting';
- this.emit('_disconnected_');
- }
-
- /**
- * Callback of when received a message from connection
- */
- private onMessage(message) {
- if (this.isSuspended) return;
-
- if (this.os.debug) {
- this.in++;
- this.inout.push({ type: 'in', at: new Date(), data: message.data });
- }
-
- try {
- const msg = JSON.parse(message.data);
- if (msg.type) this.emit(msg.type, msg.body);
- } catch (e) {
- // noop
- }
- }
-
- /**
- * Send a message to connection
- */
- public send(data) {
- if (this.isSuspended) return;
-
- // まだ接続が確立されていなかったらバッファリングして次に接続した時に送信する
- if (this.state != 'connected') {
- this.buffer.push(data);
- return;
- }
-
- if (this.os.debug) {
- this.out++;
- this.inout.push({ type: 'out', at: new Date(), data });
- }
-
- this.socket.send(JSON.stringify(data));
- }
-
- /**
- * Close this connection
- */
- public close() {
- this.os.unregisterStreamConnection(this);
- this.socket.removeEventListener('open', this.onOpen);
- this.socket.removeEventListener('message', this.onMessage);
- }
-}
diff --git a/src/client/app/common/scripts/streaming/user-list.ts b/src/client/app/common/scripts/streaming/user-list.ts
deleted file mode 100644
index 30a52b98dd..0000000000
--- a/src/client/app/common/scripts/streaming/user-list.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import Stream from './stream';
-import MiOS from '../../mios';
-
-export class UserListStream extends Stream {
- constructor(os: MiOS, me, listId) {
- super(os, 'user-list', {
- i: me.token,
- listId
- });
-
- (this as any).on('_connected_', () => {
- this.send({
- i: me.token
- });
- });
- }
-}