2016-07-13 12:44:24 -08:00
|
|
|
import Immutable from 'seamless-immutable';
|
2016-09-21 06:27:11 -08:00
|
|
|
import {decorateSessionsReducer} from '../utils/plugins';
|
2016-07-13 12:44:24 -08:00
|
|
|
import {
|
|
|
|
|
SESSION_ADD,
|
|
|
|
|
SESSION_PTY_EXIT,
|
|
|
|
|
SESSION_USER_EXIT,
|
|
|
|
|
SESSION_PTY_DATA,
|
|
|
|
|
SESSION_SET_ACTIVE,
|
|
|
|
|
SESSION_CLEAR_ACTIVE,
|
|
|
|
|
SESSION_URL_SET,
|
|
|
|
|
SESSION_URL_UNSET,
|
2016-10-03 18:00:50 -08:00
|
|
|
SESSION_RESIZE,
|
2016-10-22 12:05:32 -08:00
|
|
|
SESSION_SET_XTERM_TITLE
|
2016-07-13 12:44:24 -08:00
|
|
|
} from '../constants/sessions';
|
|
|
|
|
|
|
|
|
|
const initialState = Immutable({
|
|
|
|
|
sessions: {},
|
|
|
|
|
write: null,
|
|
|
|
|
activeUid: null
|
|
|
|
|
});
|
|
|
|
|
|
2016-09-21 06:27:11 -08:00
|
|
|
function Session(obj) {
|
2016-07-13 12:44:24 -08:00
|
|
|
return Immutable({
|
|
|
|
|
uid: '',
|
|
|
|
|
title: '',
|
2016-10-03 18:00:50 -08:00
|
|
|
cols: null,
|
|
|
|
|
rows: null,
|
2016-07-13 12:44:24 -08:00
|
|
|
write: null,
|
|
|
|
|
url: null,
|
2016-07-14 15:40:15 -08:00
|
|
|
cleared: false,
|
2016-07-16 14:41:13 -08:00
|
|
|
shell: '',
|
|
|
|
|
pid: null
|
2016-07-13 12:44:24 -08:00
|
|
|
}).merge(obj);
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-21 06:27:11 -08:00
|
|
|
function Write(obj) {
|
2016-07-13 12:44:24 -08:00
|
|
|
return Immutable({
|
|
|
|
|
uid: '',
|
|
|
|
|
data: ''
|
|
|
|
|
}).merge(obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const reducer = (state = initialState, action) => {
|
|
|
|
|
switch (action.type) {
|
|
|
|
|
case SESSION_ADD:
|
2016-10-03 18:00:50 -08:00
|
|
|
return state
|
|
|
|
|
.set('activeUid', action.uid)
|
|
|
|
|
.setIn(['sessions', action.uid], Session({
|
|
|
|
|
cols: action.cols,
|
|
|
|
|
rows: action.rows,
|
|
|
|
|
uid: action.uid,
|
|
|
|
|
shell: action.shell.split('/').pop(),
|
|
|
|
|
pid: action.pid
|
|
|
|
|
}));
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_URL_SET:
|
|
|
|
|
return state.setIn(['sessions', action.uid, 'url'], action.url);
|
|
|
|
|
|
|
|
|
|
case SESSION_URL_UNSET:
|
|
|
|
|
return state.setIn(['sessions', action.uid, 'url'], null);
|
|
|
|
|
|
|
|
|
|
case SESSION_SET_ACTIVE:
|
|
|
|
|
return state.set('activeUid', action.uid);
|
|
|
|
|
|
|
|
|
|
case SESSION_CLEAR_ACTIVE:
|
|
|
|
|
return state.merge({
|
|
|
|
|
sessions: {
|
|
|
|
|
[state.activeUid]: {
|
|
|
|
|
cleared: true
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-09-21 06:27:11 -08:00
|
|
|
}, {deep: true});
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_PTY_DATA:
|
2016-07-14 15:40:15 -08:00
|
|
|
return state
|
2016-07-29 12:40:46 -08:00
|
|
|
.set('write', Write(action))
|
|
|
|
|
.merge({
|
|
|
|
|
sessions: {
|
|
|
|
|
[action.uid]: {
|
|
|
|
|
cleared: false
|
|
|
|
|
}
|
2016-07-13 12:44:24 -08:00
|
|
|
}
|
2016-09-21 06:27:11 -08:00
|
|
|
}, {deep: true});
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_PTY_EXIT:
|
|
|
|
|
if (state.sessions[action.uid]) {
|
|
|
|
|
return deleteSession(state, action.uid);
|
|
|
|
|
}
|
2016-09-21 06:27:11 -08:00
|
|
|
console.log('ignore pty exit: session removed by user');
|
|
|
|
|
return state;
|
2016-07-13 12:44:24 -08:00
|
|
|
|
|
|
|
|
case SESSION_USER_EXIT:
|
|
|
|
|
return deleteSession(state, action.uid);
|
|
|
|
|
|
|
|
|
|
case SESSION_SET_XTERM_TITLE:
|
|
|
|
|
return state.setIn(['sessions', action.uid, 'title'], action.title);
|
|
|
|
|
|
2016-10-03 18:00:50 -08:00
|
|
|
case SESSION_RESIZE:
|
|
|
|
|
return state.setIn(['sessions', action.uid], state.sessions[action.uid].merge({
|
|
|
|
|
rows: action.rows,
|
|
|
|
|
cols: action.cols,
|
|
|
|
|
resizeAt: Date.now()
|
|
|
|
|
}));
|
|
|
|
|
|
2016-07-13 12:44:24 -08:00
|
|
|
default:
|
|
|
|
|
return state;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default decorateSessionsReducer(reducer);
|
|
|
|
|
|
2016-09-21 06:27:11 -08:00
|
|
|
function deleteSession(state, uid) {
|
|
|
|
|
return state.updateIn(['sessions'], sessions => {
|
2016-07-13 12:44:24 -08:00
|
|
|
const sessions_ = sessions.asMutable();
|
|
|
|
|
delete sessions_[uid];
|
|
|
|
|
return sessions_;
|
|
|
|
|
});
|
|
|
|
|
}
|