2020-07-23 16:22:57 +02:00
|
|
|
import * as ACTIONS from 'constants/action_types';
|
|
|
|
import { getAuthToken } from 'util/saved-passwords';
|
|
|
|
import { doNotificationList } from 'redux/actions/notifications';
|
|
|
|
|
2021-04-02 22:11:23 +02:00
|
|
|
const NOTIFICATION_WS_URL = 'wss://api.lbry.com/subscribe?auth_token=';
|
2021-03-16 21:59:31 +01:00
|
|
|
const COMMENT_WS_URL = `wss://comments.lbry.com/api/v2/live-chat/subscribe?subscription_id=`;
|
|
|
|
|
2021-03-10 19:34:21 +01:00
|
|
|
let sockets = {};
|
2020-09-17 18:39:11 +02:00
|
|
|
let retryCount = 0;
|
|
|
|
|
2021-04-02 22:11:23 +02:00
|
|
|
export const doSocketConnect = (url, retryOnDisconnect, cb) => {
|
2020-09-17 18:39:11 +02:00
|
|
|
function connectToSocket() {
|
2021-03-10 19:34:21 +01:00
|
|
|
if (sockets[url] !== undefined && sockets[url] !== null) {
|
|
|
|
sockets[url].close();
|
|
|
|
sockets[url] = null;
|
2020-07-23 16:22:57 +02:00
|
|
|
}
|
|
|
|
|
2020-09-17 18:39:11 +02:00
|
|
|
const timeToWait = retryCount ** 2 * 1000;
|
|
|
|
setTimeout(() => {
|
2021-03-10 19:34:21 +01:00
|
|
|
sockets[url] = new WebSocket(url);
|
|
|
|
sockets[url].onopen = (e) => {
|
2020-09-17 18:39:11 +02:00
|
|
|
retryCount = 0;
|
|
|
|
console.log('\nConnected to WS \n\n'); // eslint-disable-line
|
|
|
|
};
|
2021-04-02 22:11:23 +02:00
|
|
|
|
2021-03-10 19:34:21 +01:00
|
|
|
sockets[url].onmessage = (e) => {
|
2020-09-17 18:39:11 +02:00
|
|
|
const data = JSON.parse(e.data);
|
2021-03-10 19:34:21 +01:00
|
|
|
cb(data);
|
2020-09-17 18:39:11 +02:00
|
|
|
};
|
|
|
|
|
2021-03-10 19:34:21 +01:00
|
|
|
sockets[url].onerror = (e) => {
|
2020-12-08 22:50:10 +01:00
|
|
|
console.error('websocket onerror', e); // eslint-disable-line
|
2021-04-02 22:11:23 +02:00
|
|
|
// onerror and onclose will both fire, so nothing is needed here
|
2020-09-17 18:39:11 +02:00
|
|
|
};
|
2021-03-16 21:59:31 +01:00
|
|
|
|
|
|
|
sockets[url].onclose = () => {
|
|
|
|
console.log('\n Disconnected from WS\n\n'); // eslint-disable-line
|
2021-04-02 22:11:23 +02:00
|
|
|
if (retryOnDisconnect) {
|
|
|
|
retryCount += 1;
|
|
|
|
connectToSocket();
|
|
|
|
} else {
|
|
|
|
sockets[url] = null;
|
|
|
|
}
|
2021-03-16 21:59:31 +01:00
|
|
|
};
|
2020-09-17 18:39:11 +02:00
|
|
|
}, timeToWait);
|
|
|
|
}
|
2020-07-23 16:22:57 +02:00
|
|
|
|
2020-09-17 18:39:11 +02:00
|
|
|
connectToSocket();
|
2020-07-23 16:22:57 +02:00
|
|
|
};
|
|
|
|
|
2021-03-16 21:59:31 +01:00
|
|
|
export const doSocketDisconnect = (url) => (dispatch) => {
|
|
|
|
if (sockets[url] !== undefined && sockets[url] !== null) {
|
|
|
|
sockets[url].close();
|
|
|
|
sockets[url] = null;
|
|
|
|
|
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.WS_DISCONNECT,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-03-10 19:34:21 +01:00
|
|
|
export const doNotificationSocketConnect = () => (dispatch) => {
|
|
|
|
const authToken = getAuthToken();
|
|
|
|
if (!authToken) {
|
|
|
|
console.error('Unable to connect to web socket because auth token is missing'); // eslint-disable-line
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-04-02 22:11:23 +02:00
|
|
|
const url = `${NOTIFICATION_WS_URL}${authToken}`;
|
|
|
|
|
|
|
|
doSocketConnect(url, true, (data) => {
|
2021-03-10 19:34:21 +01:00
|
|
|
if (data.type === 'pending_notification') {
|
|
|
|
dispatch(doNotificationList());
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-03-16 19:37:19 +01:00
|
|
|
export const doCommentSocketConnect = (uri, claimId) => (dispatch) => {
|
2021-03-16 21:59:31 +01:00
|
|
|
const url = `${COMMENT_WS_URL}${claimId}`;
|
2021-03-10 19:34:21 +01:00
|
|
|
|
2021-04-02 22:11:23 +02:00
|
|
|
doSocketConnect(url, false, (response) => {
|
2021-03-10 19:34:21 +01:00
|
|
|
if (response.type === 'delta') {
|
|
|
|
const newComment = response.data.comment;
|
|
|
|
dispatch({
|
|
|
|
type: ACTIONS.COMMENT_RECEIVED,
|
2021-03-16 19:37:19 +01:00
|
|
|
data: { comment: newComment, claimId, uri },
|
2021-03-10 19:34:21 +01:00
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2021-03-16 21:59:31 +01:00
|
|
|
export const doCommentSocketDisconnect = (claimId) => (dispatch) => {
|
|
|
|
const url = `${COMMENT_WS_URL}${claimId}`;
|
|
|
|
dispatch(doSocketDisconnect(url));
|
|
|
|
};
|