From 3424fdd603021b606d0ac39e24c8279a5a99d2cc Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Mon, 29 Jul 2019 00:56:55 +0900 Subject: [PATCH] Use websocket as default streaming method for all timelines --- .../integration/store/TimelineSpace.spec.ts | 3 - .../renderer/unit/store/TimelineSpace.spec.ts | 1 - src/config/locales/en/translation.json | 1 - src/main/index.ts | 50 +++++------ src/main/streaming.ts | 82 ------------------- src/main/streamingManager.ts | 71 ---------------- .../components/TimelineSpace/HeaderMenu.vue | 53 ------------ src/renderer/store/TimelineSpace.ts | 19 +---- .../TimelineSpace/Contents/Hashtag/Tag.ts | 3 +- .../TimelineSpace/Contents/Lists/Show.ts | 3 +- 10 files changed, 28 insertions(+), 258 deletions(-) delete mode 100644 src/main/streaming.ts delete mode 100644 src/main/streamingManager.ts diff --git a/spec/renderer/integration/store/TimelineSpace.spec.ts b/spec/renderer/integration/store/TimelineSpace.spec.ts index d47bf94a..2081064b 100644 --- a/spec/renderer/integration/store/TimelineSpace.spec.ts +++ b/spec/renderer/integration/store/TimelineSpace.spec.ts @@ -39,7 +39,6 @@ const state = (): TimelineSpaceState => { local: true, public: true }, - useWebsocket: false, pleroma: false } } @@ -175,7 +174,6 @@ describe('TimelineSpace', () => { ;(Mastodon.get as any).mockResolvedValue(mockedResponse) await store.dispatch('TimelineSpace/detectPleroma') expect(store.state.TimelineSpace.pleroma).toEqual(true) - expect(store.state.TimelineSpace.useWebsocket).toEqual(true) }) }) describe('API is not pleroma', () => { @@ -210,7 +208,6 @@ describe('TimelineSpace', () => { ;(Mastodon.get as any).mockResolvedValue(mockedResponse) await store.dispatch('TimelineSpace/detectPleroma') expect(store.state.TimelineSpace.pleroma).toEqual(false) - expect(store.state.TimelineSpace.useWebsocket).toEqual(false) }) }) }) diff --git a/spec/renderer/unit/store/TimelineSpace.spec.ts b/spec/renderer/unit/store/TimelineSpace.spec.ts index 32ae0d58..e5b7bf4a 100644 --- a/spec/renderer/unit/store/TimelineSpace.spec.ts +++ b/spec/renderer/unit/store/TimelineSpace.spec.ts @@ -17,7 +17,6 @@ describe('TimelineSpace', () => { local: unreadSettings.Local.default, public: unreadSettings.Public.default }, - useWebsocket: false, pleroma: false } }) diff --git a/src/config/locales/en/translation.json b/src/config/locales/en/translation.json index 8c549ad6..f5466887 100644 --- a/src/config/locales/en/translation.json +++ b/src/config/locales/en/translation.json @@ -78,7 +78,6 @@ "show_replies": "Show replies", "apply": "Apply" }, - "switch_streaming": "Use websocket for streaming. If the timeline does not update with streaming, please try it.", "new_toot": "Toot", "reload": "Reload", "settings": "Settings" diff --git a/src/main/index.ts b/src/main/index.ts index 2533277d..e562f1a5 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -28,7 +28,7 @@ import sanitizeHtml from 'sanitize-html' import pkg from '~/package.json' import Authentication from './auth' import Account from './account' -import StreamingManager from './streamingManager' +import WebSocket from './websocket' import Preferences from './preferences' import Fonts from './fonts' import Hashtags from './hashtags' @@ -438,7 +438,7 @@ ipcMain.on('reset-badge', () => { }) // user streaming -let userStreamings: { [key: string]: StreamingManager | null } = {} +let userStreamings: { [key: string]: WebSocket | null } = {} ipcMain.on('start-all-user-streamings', (event: Event, accounts: Array) => { accounts.map(account => { @@ -451,8 +451,8 @@ ipcMain.on('start-all-user-streamings', (event: Event, accounts: Array { if (!event.sender.isDestroyed()) { event.sender.send(`update-start-all-user-streamings-${id}`, update) @@ -541,13 +541,12 @@ const stopUserStreaming = (id: string) => { type StreamingSetting = { account: LocalAccount - useWebsocket: boolean } -let directMessagesStreaming: StreamingManager | null = null +let directMessagesStreaming: WebSocket | null = null ipcMain.on('start-directmessages-streaming', (event: Event, obj: StreamingSetting) => { - const { account, useWebsocket } = obj + const { account } = obj accountManager .getAccount(account._id!) .then(acct => { @@ -557,10 +556,9 @@ ipcMain.on('start-directmessages-streaming', (event: Event, obj: StreamingSettin directMessagesStreaming = null } - directMessagesStreaming = new StreamingManager(acct, useWebsocket) + directMessagesStreaming = new WebSocket(acct) directMessagesStreaming.start( 'direct', - '', (update: Status) => { if (!event.sender.isDestroyed()) { event.sender.send('update-start-directmessages-streaming', update) @@ -594,10 +592,10 @@ ipcMain.on('stop-directmessages-streaming', () => { } }) -let localStreaming: StreamingManager | null = null +let localStreaming: WebSocket | null = null ipcMain.on('start-local-streaming', (event: Event, obj: StreamingSetting) => { - const { account, useWebsocket } = obj + const { account } = obj accountManager .getAccount(account._id!) .then(acct => { @@ -607,10 +605,9 @@ ipcMain.on('start-local-streaming', (event: Event, obj: StreamingSetting) => { localStreaming = null } - localStreaming = new StreamingManager(acct, useWebsocket) + localStreaming = new WebSocket(acct) localStreaming.start( - 'public/local', - '', + 'public:local', (update: Status) => { if (!event.sender.isDestroyed()) { event.sender.send('update-start-local-streaming', update) @@ -644,10 +641,10 @@ ipcMain.on('stop-local-streaming', () => { } }) -let publicStreaming: StreamingManager | null = null +let publicStreaming: WebSocket | null = null ipcMain.on('start-public-streaming', (event: Event, obj: StreamingSetting) => { - const { account, useWebsocket } = obj + const { account } = obj accountManager .getAccount(account._id!) .then(acct => { @@ -657,10 +654,9 @@ ipcMain.on('start-public-streaming', (event: Event, obj: StreamingSetting) => { publicStreaming = null } - publicStreaming = new StreamingManager(acct, useWebsocket) + publicStreaming = new WebSocket(acct) publicStreaming.start( 'public', - '', (update: Status) => { if (!event.sender.isDestroyed()) { event.sender.send('update-start-public-streaming', update) @@ -694,14 +690,14 @@ ipcMain.on('stop-public-streaming', () => { } }) -let listStreaming: StreamingManager | null = null +let listStreaming: WebSocket | null = null type ListID = { listID: string } ipcMain.on('start-list-streaming', (event: Event, obj: ListID & StreamingSetting) => { - const { listID, account, useWebsocket } = obj + const { listID, account } = obj accountManager .getAccount(account._id!) .then(acct => { @@ -711,10 +707,9 @@ ipcMain.on('start-list-streaming', (event: Event, obj: ListID & StreamingSetting listStreaming = null } - listStreaming = new StreamingManager(acct, useWebsocket) + listStreaming = new WebSocket(acct) listStreaming.start( - 'list', - `list=${listID}`, + `list&list=${listID}`, (update: Status) => { if (!event.sender.isDestroyed()) { event.sender.send('update-start-list-streaming', update) @@ -748,14 +743,14 @@ ipcMain.on('stop-list-streaming', () => { } }) -let tagStreaming: StreamingManager | null = null +let tagStreaming: WebSocket | null = null type Tag = { tag: string } ipcMain.on('start-tag-streaming', (event: Event, obj: Tag & StreamingSetting) => { - const { tag, account, useWebsocket } = obj + const { tag, account } = obj accountManager .getAccount(account._id!) .then(acct => { @@ -765,10 +760,9 @@ ipcMain.on('start-tag-streaming', (event: Event, obj: Tag & StreamingSetting) => tagStreaming = null } - tagStreaming = new StreamingManager(acct, useWebsocket) + tagStreaming = new WebSocket(acct) tagStreaming.start( - 'hashtag', - `tag=${tag}`, + `hashtag&tag=${tag}`, (update: Status) => { if (!event.sender.isDestroyed()) { event.sender.send('update-start-tag-streaming', update) diff --git a/src/main/streaming.ts b/src/main/streaming.ts deleted file mode 100644 index 2b887543..00000000 --- a/src/main/streaming.ts +++ /dev/null @@ -1,82 +0,0 @@ -import Mastodon, { StreamListener, Status, Notification } from 'megalodon' -import log from 'electron-log' -import { LocalAccount } from '~/src/types/localAccount' - -export default class Streaming { - private client: Mastodon - private listener: StreamListener | null - - constructor(account: LocalAccount) { - this.client = new Mastodon(account.accessToken!, account.baseURL + '/api/v1', 'Whalebird') - this.listener = null - } - - startUserStreaming(updateCallback: Function, notificationCallback: Function, deleteCallback: Function, errCallback: Function) { - this.listener = this.client.stream('/streaming/user') - - this.listener.on('connect', _ => { - log.info('/streaming/user started') - }) - - this.listener.on('update', (status: Status) => { - updateCallback(status) - }) - - this.listener.on('notification', (notification: Notification) => { - notificationCallback(notification) - }) - - this.listener.on('delete', (id: string) => { - deleteCallback(id) - }) - - this.listener.on('error', (err: Error) => { - errCallback(err) - }) - - this.listener.on('connection-limit-exceeded', (err: Error) => { - errCallback(err) - }) - } - - start(path: string, updateCallback: Function, deleteCallback: Function, errCallback: Function) { - this.listener = this.client.stream(path) - this.listener.on('connect', _ => { - log.info(`${path} started`) - }) - - this.listener.on('update', (status: Status) => { - updateCallback(status) - }) - - this.listener.on('delete', (id: string) => { - deleteCallback(id) - }) - - this.listener.on('error', (err: Error) => { - errCallback(err) - }) - - this.listener.on('connection-limit-exceeded', err => { - errCallback(err) - }) - } - - stop() { - if (this.listener) { - this.listener.removeAllListeners('connect') - this.listener.removeAllListeners('update') - this.listener.removeAllListeners('notification') - this.listener.removeAllListeners('error') - this.listener.removeAllListeners('parser-error') - this.listener.on('error', (e: Error) => { - log.error(e) - }) - this.listener.on('parser-error', (e: Error) => { - log.error(e) - }) - this.listener.stop() - log.info('streaming stopped') - } - } -} diff --git a/src/main/streamingManager.ts b/src/main/streamingManager.ts deleted file mode 100644 index 6ea5943c..00000000 --- a/src/main/streamingManager.ts +++ /dev/null @@ -1,71 +0,0 @@ -import Streaming from './streaming' -import WebSocket from './websocket' -import { LocalAccount } from '~/src/types/localAccount' - -export default class StreamingManager { - private streaming: Streaming - private websocket: WebSocket - private useWebsocket: boolean - - constructor(account: LocalAccount, useWebsocket = false) { - this.streaming = new Streaming(account) - this.websocket = new WebSocket(account) - this.useWebsocket = useWebsocket - } - - startUser(updateCallback: Function, notificationCallback: Function, deleteCallback: Function, errCallback: Function) { - if (this.useWebsocket) { - this._startUserSocket(updateCallback, notificationCallback, deleteCallback, errCallback) - } else { - this._startUserStreaming(updateCallback, notificationCallback, deleteCallback, errCallback) - } - } - - start(path: string, params: string, updateCallback: Function, deleteCallback: Function, errCallback: Function) { - if (this.useWebsocket) { - this._startSocket(path, params, updateCallback, deleteCallback, errCallback) - } else { - this._startStreaming(path, params, updateCallback, deleteCallback, errCallback) - } - } - - stop() { - this._stopStreaming() - this._stopSocket() - } - - /** - * Using streaming for Mastodon - */ - _startUserStreaming(updateCallback: Function, notificationCallback: Function, deleteCallback: Function, errCallback: Function) { - this.streaming.startUserStreaming(updateCallback, notificationCallback, deleteCallback, errCallback) - } - - _startStreaming(path: string, params: string, updateCallback: Function, deleteCallback, errCallback: Function) { - const target = `/streaming/${path}?${params}` - this.streaming.start(target, updateCallback, deleteCallback, errCallback) - } - - _stopStreaming() { - this.streaming.stop() - } - - /** - * Using websocket for Pleroma - */ - _startUserSocket(updateCallback: Function, notificationCallback: Function, deleteCallback: Function, errCallback: Function) { - this.websocket.startUserStreaming(updateCallback, notificationCallback, deleteCallback, errCallback) - } - - _startSocket(path: string, params: string, updateCallback: Function, deleteCallback: Function, errCallback: Function) { - let stream = path - if (stream === 'public/local') { - stream = 'public:local' - } - this.websocket.start(`${stream}&${params}`, updateCallback, deleteCallback, errCallback) - } - - _stopSocket() { - this.websocket.stop() - } -} diff --git a/src/renderer/components/TimelineSpace/HeaderMenu.vue b/src/renderer/components/TimelineSpace/HeaderMenu.vue index d0345341..71c4e266 100644 --- a/src/renderer/components/TimelineSpace/HeaderMenu.vue +++ b/src/renderer/components/TimelineSpace/HeaderMenu.vue @@ -5,26 +5,6 @@
- - - - - @@ -86,10 +66,6 @@ export default { ...mapState('TimelineSpace/HeaderMenu', { title: state => state.title, loading: state => state.loading - }), - ...mapState('TimelineSpace', { - useWebsocket: state => state.useWebsocket, - pleroma: state => state.pleroma }) }, created() { @@ -157,23 +133,6 @@ export default { break } }, - streamingSwitchable() { - switch (this.$route.name) { - case 'direct-messages': - case 'local': - case 'public': - case 'tag': - case 'list': - return !this.pleroma - default: - return false - } - }, - switchStreaming() { - this.$store.dispatch('TimelineSpace/stopStreamings') - this.$store.commit('TimelineSpace/changeUseWebsocket', !this.useWebsocket) - this.$store.dispatch('TimelineSpace/startStreamings') - }, openNewTootModal() { this.$store.dispatch('TimelineSpace/Modals/NewToot/openModal') }, @@ -349,18 +308,6 @@ export default { &:hover { color: #409eff; } - - .not-websocket { - fill: var(--theme-secondary-color); - - &:hover { - fill: #409eff; - } - } - - .websocket { - fill: #409eff; - } } } } diff --git a/src/renderer/store/TimelineSpace.ts b/src/renderer/store/TimelineSpace.ts index 6000f920..dee7b26d 100644 --- a/src/renderer/store/TimelineSpace.ts +++ b/src/renderer/store/TimelineSpace.ts @@ -24,7 +24,6 @@ export type TimelineSpaceState = { emojis: Array tootMax: number unreadNotification: UnreadNotification - useWebsocket: boolean pleroma: boolean } @@ -53,7 +52,6 @@ const state = (): TimelineSpaceState => ({ local: unreadSettings.Local.default, public: unreadSettings.Public.default }, - useWebsocket: false, pleroma: false }) @@ -64,8 +62,7 @@ export const MUTATION_TYPES = { UPDATE_EMOJIS: 'updateEmojis', UPDATE_TOOT_MAX: 'updateTootMax', UPDATE_UNREAD_NOTIFICATION: 'updateUnreadNotification', - CHANGE_PLEROMA: 'changePleroma', - CHANGE_USE_WEBSOCKET: 'changeUseWebsocket' + CHANGE_PLEROMA: 'changePleroma' } const mutations: MutationTree = { @@ -98,9 +95,6 @@ const mutations: MutationTree = { }, [MUTATION_TYPES.CHANGE_PLEROMA]: (state, pleroma: boolean) => { state.pleroma = pleroma - }, - [MUTATION_TYPES.CHANGE_USE_WEBSOCKET]: (state, use: boolean) => { - state.useWebsocket = use } } @@ -181,10 +175,8 @@ const actions: ActionTree = { const res = await Mastodon.get('/instance', {}, state.account.baseURL + '/api/v1') if (res.data.version.includes('Pleroma')) { commit(MUTATION_TYPES.CHANGE_PLEROMA, true) - commit(MUTATION_TYPES.CHANGE_USE_WEBSOCKET, true) } else { commit(MUTATION_TYPES.CHANGE_PLEROMA, false) - commit(MUTATION_TYPES.CHANGE_USE_WEBSOCKET, false) } }, // ----------------------------------------------- @@ -360,8 +352,7 @@ const actions: ActionTree = { return new Promise((resolve, reject) => { // eslint-disable-line no-unused-vars ipcRenderer.send('start-local-streaming', { - account: state.account, - useWebsocket: state.useWebsocket + account: state.account }) ipcRenderer.once('error-start-local-streaming', (_, err: Error) => { reject(err) @@ -385,8 +376,7 @@ const actions: ActionTree = { return new Promise((resolve, reject) => { // eslint-disable-line no-unused-vars ipcRenderer.send('start-public-streaming', { - account: state.account, - useWebsocket: state.useWebsocket + account: state.account }) ipcRenderer.once('error-start-public-streaming', (_, err: Error) => { reject(err) @@ -410,8 +400,7 @@ const actions: ActionTree = { return new Promise((resolve, reject) => { // eslint-disable-line no-unused-vars ipcRenderer.send('start-directmessages-streaming', { - account: state.account, - useWebsocket: state.useWebsocket + account: state.account }) ipcRenderer.once('error-start-directmessages-streaming', (_, err: Error) => { reject(err) diff --git a/src/renderer/store/TimelineSpace/Contents/Hashtag/Tag.ts b/src/renderer/store/TimelineSpace/Contents/Hashtag/Tag.ts index a7b5e8fe..f56d1453 100644 --- a/src/renderer/store/TimelineSpace/Contents/Hashtag/Tag.ts +++ b/src/renderer/store/TimelineSpace/Contents/Hashtag/Tag.ts @@ -117,8 +117,7 @@ const actions: ActionTree = { // eslint-disable-line no-unused-vars ipcRenderer.send('start-tag-streaming', { tag: encodeURIComponent(tag), - account: rootState.TimelineSpace.account, - useWebsocket: rootState.TimelineSpace.useWebsocket + account: rootState.TimelineSpace.account }) ipcRenderer.once('error-start-tag-streaming', (_, err: Error) => { reject(err) diff --git a/src/renderer/store/TimelineSpace/Contents/Lists/Show.ts b/src/renderer/store/TimelineSpace/Contents/Lists/Show.ts index 9b5a36c0..516f7dc9 100644 --- a/src/renderer/store/TimelineSpace/Contents/Lists/Show.ts +++ b/src/renderer/store/TimelineSpace/Contents/Lists/Show.ts @@ -117,8 +117,7 @@ const actions: ActionTree = { // eslint-disable-line no-unused-vars ipcRenderer.send('start-list-streaming', { listID: listID, - account: rootState.TimelineSpace.account, - useWebsocket: rootState.TimelineSpace.useWebsocket + account: rootState.TimelineSpace.account }) ipcRenderer.once('error-start-list-streaming', (_, err: Error) => { reject(err)