83 lines
1.5 KiB
JavaScript
83 lines
1.5 KiB
JavaScript
const take = require('lodash.take');
|
|
|
|
const actions = {
|
|
'UPDATE_STATS': (state, action) => {
|
|
const data = (state[action.subscription] || {
|
|
cpu: [],
|
|
mem: [],
|
|
disk: []
|
|
});
|
|
|
|
const newData = ['cpu', 'mem', 'disk'].reduce((sum, key) => {
|
|
const item = {
|
|
...action.payload.stats[key],
|
|
when: action.payload.when
|
|
};
|
|
|
|
const prepended = [item].concat(data[key]);
|
|
|
|
return {
|
|
...sum,
|
|
[key]: take(prepended, state.windowSize)
|
|
};
|
|
}, {});
|
|
|
|
return {
|
|
...state,
|
|
[action.subscription]: newData
|
|
};
|
|
}
|
|
};
|
|
|
|
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({
|
|
type: '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({
|
|
type: 'UNSUBSCRIBE',
|
|
payload: p
|
|
});
|
|
};
|