aboutsummaryrefslogtreecommitdiffstats
path: root/src/features/settingsWS
diff options
context:
space:
mode:
Diffstat (limited to 'src/features/settingsWS')
-rwxr-xr-xsrc/features/settingsWS/actions.ts13
-rwxr-xr-xsrc/features/settingsWS/index.ts28
-rwxr-xr-xsrc/features/settingsWS/state.ts13
-rwxr-xr-xsrc/features/settingsWS/store.js132
4 files changed, 0 insertions, 186 deletions
diff --git a/src/features/settingsWS/actions.ts b/src/features/settingsWS/actions.ts
deleted file mode 100755
index 03a398eb5..000000000
--- a/src/features/settingsWS/actions.ts
+++ /dev/null
@@ -1,13 +0,0 @@
1import PropTypes from 'prop-types';
2import { createActionsFromDefinitions } from '../../actions/lib/actions';
3
4export const settingsWSActions = createActionsFromDefinitions(
5 {
6 greet: {
7 name: PropTypes.string.isRequired,
8 },
9 },
10 PropTypes.checkPropTypes,
11);
12
13export default settingsWSActions;
diff --git a/src/features/settingsWS/index.ts b/src/features/settingsWS/index.ts
deleted file mode 100755
index 9bb206d82..000000000
--- a/src/features/settingsWS/index.ts
+++ /dev/null
@@ -1,28 +0,0 @@
1import { reaction } from 'mobx';
2import { SettingsWSStore } from './store';
3
4const debug = require('debug')('Ferdi:feature:settingsWS');
5
6export const settingsStore = new SettingsWSStore();
7
8export default function initSettingsWebSocket(
9 stores: { features: any },
10 actions: any,
11) {
12 const { features } = stores;
13
14 // Toggle SettingsWebSocket feature
15 reaction(
16 () => features.features.isSettingsWSEnabled,
17 isEnabled => {
18 if (isEnabled) {
19 debug('Initializing `settingsWS` feature');
20 settingsStore.start(stores, actions);
21 } else if (settingsStore) {
22 debug('Disabling `settingsWS` feature');
23 settingsStore.stop();
24 }
25 },
26 { fireImmediately: true },
27 );
28}
diff --git a/src/features/settingsWS/state.ts b/src/features/settingsWS/state.ts
deleted file mode 100755
index 7b16b2b6e..000000000
--- a/src/features/settingsWS/state.ts
+++ /dev/null
@@ -1,13 +0,0 @@
1import { observable } from 'mobx';
2
3const defaultState = {
4 isFeatureActive: false,
5};
6
7export const settingsWSState = observable(defaultState);
8
9export function resetState() {
10 Object.assign(settingsWSState, defaultState);
11}
12
13export default settingsWSState;
diff --git a/src/features/settingsWS/store.js b/src/features/settingsWS/store.js
deleted file mode 100755
index 3b9e10825..000000000
--- a/src/features/settingsWS/store.js
+++ /dev/null
@@ -1,132 +0,0 @@
1import { observable } from 'mobx';
2import WebSocket from 'ws';
3import ms from 'ms';
4
5import { FeatureStore } from '../utils/FeatureStore';
6import { createReactions } from '../../stores/lib/Reaction';
7import { WS_API } from '../../environment-remote';
8
9const debug = require('debug')('Ferdi:feature:settingsWS:store');
10
11export class SettingsWSStore extends FeatureStore {
12 stores = null;
13
14 actions = null;
15
16 ws = null;
17
18 pingTimeout = null;
19
20 reconnectTimeout = null;
21
22 @observable connected = false;
23
24 start(stores, actions) {
25 this.stores = stores;
26 this.actions = actions;
27
28 this._registerReactions(
29 createReactions([
30 this._initialize.bind(this),
31 this._reconnect.bind(this),
32 this._close.bind(this),
33 ]),
34 );
35 }
36
37 connect() {
38 try {
39 const wsURL = `${WS_API}/ws/${this.stores.user.data.id}`;
40 debug('Setting up WebSocket to', wsURL);
41
42 this.ws = new WebSocket(wsURL);
43
44 this.ws.on('open', () => {
45 debug('Opened WebSocket');
46 this.send({
47 action: 'authorize',
48 token: this.stores.user.authToken,
49 });
50
51 this.connected = true;
52
53 this.heartbeat();
54 });
55
56 this.ws.on('message', data => {
57 const resp = JSON.parse(data);
58 debug('Received message', resp);
59
60 if (resp.id) {
61 this.stores.user.getUserInfoRequest.patch(result => {
62 if (!result) return;
63
64 debug('Patching user object with new values');
65 Object.assign(result, resp);
66 });
67 }
68 });
69
70 this.ws.on('ping', this.heartbeat.bind(this));
71 } catch (error) {
72 console.error(error);
73 }
74 }
75
76 heartbeat() {
77 debug('Heartbeat');
78 clearTimeout(this.pingTimeout);
79
80 this.pingTimeout = setTimeout(() => {
81 debug('Terminating connection, reconnecting in 35');
82 this.ws.terminate();
83
84 this.connected = false;
85 }, ms('35s'));
86 }
87
88 send(data) {
89 if (this.ws && this.ws.readyState === 1) {
90 this.ws.send(JSON.stringify(data));
91 debug('Sending data', data);
92 } else {
93 debug('WebSocket is not initialized');
94 }
95 }
96
97 // Reactions
98
99 _initialize() {
100 if (this.stores.user.data.id && !this.ws) {
101 this.connect();
102 }
103 }
104
105 _reconnect() {
106 if (!this.connected) {
107 debug('Trying to reconnect in 30s');
108 this.reconnectTimeout = setInterval(() => {
109 debug('Trying to reconnect');
110 this.connect();
111 }, ms('30s'));
112 } else {
113 debug('Clearing reconnect interval');
114 clearInterval(this.reconnectTimeout);
115 }
116 }
117
118 _close() {
119 if (!this.stores.user.isLoggedIn) {
120 debug('Stopping reactions');
121 this._stopReactions();
122
123 if (this.ws) {
124 debug('Terminating connection');
125 this.ws.terminate();
126 this.ws = null;
127 }
128 }
129 }
130}
131
132export default SettingsWSStore;