65 lines
1.2 KiB
JavaScript
65 lines
1.2 KiB
JavaScript
const take = require('lodash.take');
|
|
|
|
const actions = {
|
|
'UPDATE_STATS': (state, action) => {
|
|
const data = [action.payload].concat(state[action.subscription] || []);
|
|
|
|
return {
|
|
...state,
|
|
[action.subscription]: take(data, state.windowSize)
|
|
};
|
|
}
|
|
};
|
|
|
|
module.exports = (state, action) => {
|
|
return !actions[action.type] ? state : actions[action.type](state, action);
|
|
};
|
|
|
|
module.exports.subscribe = (id) => (dispatch, getState) => {
|
|
const {
|
|
ws
|
|
} = getState();
|
|
|
|
const p = new Promise((resolve, reject) => {
|
|
ws.subscribe(`/stats/${id}`, (update, flag) => {
|
|
dispatch({
|
|
type: 'UPDATE_STATS',
|
|
payload: update,
|
|
subscription: id
|
|
});
|
|
}, (err) => {
|
|
if (err) {
|
|
return reject(err);
|
|
}
|
|
|
|
resolve();
|
|
});
|
|
});
|
|
|
|
return dispatch({
|
|
action: 'SUBSCRIBE',
|
|
payload: p
|
|
});
|
|
};
|
|
|
|
module.exports.unsubscribe = (id) => (dispatch, getState) => {
|
|
const {
|
|
ws
|
|
} = getState();
|
|
|
|
const p = new Promise((resolve, reject) => {
|
|
ws.unsubscribe(`/stats/${id}`, null, (err) => {
|
|
if (err) {
|
|
return reject(err);
|
|
}
|
|
|
|
resolve();
|
|
});
|
|
});
|
|
|
|
return dispatch({
|
|
action: 'UNSUBSCRIBE',
|
|
payload: p
|
|
});
|
|
};
|