(web) adding error handling and notifications to ttyPlayer

This commit is contained in:
Alexey Kontsevoy 2016-03-17 19:24:21 -04:00
parent e4d486f3ad
commit a11c504664
19 changed files with 84 additions and 88 deletions

6
web/dist/app/app.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

6
web/dist/index.html vendored
View file

@ -14,11 +14,11 @@
<script src="/web/app/assets/js/bootstrap-3.3.6.js"></script>
<script src="/web/app/assets/js/term-0.0.7.js"></script>
<script src="/web/app/assets/js/bootstrap-datepicker-1.6.0.js"></script>
<script src="/web/app/vendor.js?ver=0.11458252117936"></script>
<script src="/web/app/styles.js?ver=0.11458252117936"></script>
<script src="/web/app/vendor.js?ver=0.11458256729474"></script>
<script src="/web/app/styles.js?ver=0.11458256729474"></script>
</head>
<body class="grv">
<div id="app"></div>
</body>
<script src="/web/app/app.js?ver=0.11458252117936"></script>
<script src="/web/app/app.js?ver=0.11458256729474"></script>
</html>

View file

@ -17,7 +17,7 @@ limitations under the License.
var EventEmitter = require('events').EventEmitter;
var session = require('app/services/session');
var cfg = require('app/config');
var {actions} = require('app/modules/activeTerminal/');
var {actions} = require('app/modules/currentSession/');
class Tty extends EventEmitter {

View file

@ -17,6 +17,13 @@ limitations under the License.
var Tty = require('app/common/tty');
var api = require('app/services/api');
var cfg = require('app/config');
var {showError} = require('app/modules/notifications/actions');
const logger = require('app/common/logger').create('TtyPlayer');
function handleAjaxError(err){
showError('Unable to retrieve session info');
logger.error('fetching session length', err);
}
class TtyPlayer extends Tty {
constructor({sid}){
@ -44,7 +51,8 @@ class TtyPlayer extends Tty {
this.length = data.count;
this.isReady = true;
})
.fail(()=>{
.fail((err)=>{
handleAjaxError(err);
this.isError = true;
})
.always(()=>{
@ -127,7 +135,11 @@ class TtyPlayer extends Tty {
var delay = response.chunks[i].delay;
this.ttySteam[start+i] = { data, delay};
}
});
})
.fail((err)=>{
handleAjaxError(err);
this.isError = true;
})
}
_showChunk(start, end){

View file

@ -31,7 +31,7 @@ var ActiveSession = React.createClass({
},
render: function() {
let {login, parties, serverId} = this.props.activeSession;
let {login, parties, serverId} = this.props.session;
let serverLabelText = '';
if(serverId){
let hostname = reactor.evaluate(nodeHostNameByServerId(serverId));
@ -44,7 +44,7 @@ var ActiveSession = React.createClass({
<div className="grv-current-session-server-info">
<h3>{serverLabelText}</h3>
</div>
<TtyConnection {...this.props.activeSession} />
<TtyConnection {...this.props.session} />
</div>
);
}

View file

@ -16,7 +16,7 @@ limitations under the License.
var React = require('react');
var reactor = require('app/reactor');
var {getters, actions} = require('app/modules/activeTerminal/');
var {getters, actions} = require('app/modules/currentSession/');
var SessionPlayer = require('./sessionPlayer.jsx');
var ActiveSession = require('./activeSession.jsx');
@ -26,7 +26,7 @@ var CurrentSessionHost = React.createClass({
getDataBindings() {
return {
currentSession: getters.activeSession
currentSession: getters.currentSession
}
},
@ -44,10 +44,10 @@ var CurrentSessionHost = React.createClass({
}
if(currentSession.isNewSession || currentSession.active){
return <ActiveSession activeSession={currentSession}/>;
return <ActiveSession session={currentSession}/>;
}
return <SessionPlayer activeSession={currentSession}/>;
return <SessionPlayer session={currentSession}/>;
}
});

View file

@ -15,7 +15,7 @@ limitations under the License.
*/
var React = require('react');
var {actions} = require('app/modules/activeTerminal/');
var {actions} = require('app/modules/currentSession/');
var colors = ['#104137', '#1c84c6', '#23c6c8', '#f8ac59', '#ED5565', '#c2c2c2'];
var ReactCSSTransitionGroup = require('react-addons-css-transition-group');

View file

@ -32,7 +32,7 @@ var SessionPlayer = React.createClass({
},
getInitialState() {
var sid = this.props.activeSession.sid;
var sid = this.props.session.sid;
this.tty = new TtyPlayer({sid});
return this.calculateState();
},

View file

@ -17,7 +17,7 @@ limitations under the License.
var React = require('react');
var InputSearch = require('./../inputSearch.jsx');
var {Table, Column, Cell, SortHeaderCell, SortTypes} = require('app/components/table.jsx');
var {createNewSession} = require('app/modules/activeTerminal/actions');
var {createNewSession} = require('app/modules/currentSession/actions');
var _ = require('_');
var {isMatch} = require('app/common/objectUtils');

View file

@ -19,7 +19,7 @@ var reactor = require('app/reactor');
var {getters} = require('app/modules/dialogs');
var {closeSelectNodeDialog} = require('app/modules/dialogs/actions');
var NodeList = require('./nodes/nodeList.jsx');
var activeSessionGetters = require('app/modules/activeTerminal/getters');
var currentSessionGetters = require('app/modules/currentSession/getters');
var nodeGetters = require('app/modules/nodes/getters');
var $ = require('jQuery');
@ -57,7 +57,7 @@ var Dialog = React.createClass({
},
render() {
var activeSession = reactor.evaluate(activeSessionGetters.activeSession) || {};
var activeSession = reactor.evaluate(currentSessionGetters.currentSession) || {};
var nodeRecords = reactor.evaluate(nodeGetters.nodeListView);
var logins = [activeSession.login];

View file

@ -16,7 +16,6 @@ limitations under the License.
import keyMirror from 'keymirror'
export default keyMirror({
TLPT_TERM_OPEN: null,
TLPT_TERM_CLOSE: null,
TLPT_TERM_CHANGE_SERVER: null
TLPT_CURRENT_SESSION_OPEN: null,
TLPT_CURRENT_SESSION_CLOSE: null
})

View file

@ -22,21 +22,14 @@ var getters = require('./getters');
var sessionModule = require('./../sessions');
const logger = require('app/common/logger').create('Current Session');
const { TLPT_TERM_OPEN, TLPT_TERM_CLOSE, TLPT_TERM_CHANGE_SERVER } = require('./actionTypes');
const { TLPT_CURRENT_SESSION_OPEN, TLPT_CURRENT_SESSION_CLOSE } = require('./actionTypes');
const actions = {
changeServer(serverId, login){
reactor.dispatch(TLPT_TERM_CHANGE_SERVER, {
serverId,
login
});
},
close(){
let {isNewSession} = reactor.evaluate(getters.activeSession);
let {isNewSession} = reactor.evaluate(getters.currentSession);
reactor.dispatch(TLPT_TERM_CLOSE);
reactor.dispatch(TLPT_CURRENT_SESSION_CLOSE);
if(isNewSession){
session.getHistory().push(cfg.routes.nodes);
@ -51,7 +44,7 @@ const actions = {
h = h < 5 ? 5 : h;
let reqData = { terminal_params: { w, h } };
let {sid} = reactor.evaluate(getters.activeSession);
let {sid} = reactor.evaluate(getters.currentSession);
logger.info('resize', `w:${w} and h:${h}`);
api.put(cfg.api.getTerminalSessionUrl(sid), reqData)
@ -66,7 +59,7 @@ const actions = {
let sView = reactor.evaluate(sessionModule.getters.sessionViewById(sid));
let { serverId, login } = sView;
logger.info('open session', 'OK');
reactor.dispatch(TLPT_TERM_OPEN, {
reactor.dispatch(TLPT_CURRENT_SESSION_OPEN, {
serverId,
login,
sid,
@ -85,7 +78,7 @@ const actions = {
var history = session.getHistory();
logger.info('createNewSession', {serverId, login});
reactor.dispatch(TLPT_TERM_OPEN, {
reactor.dispatch(TLPT_CURRENT_SESSION_OPEN, {
serverId,
login,
sid,

View file

@ -15,7 +15,7 @@ limitations under the License.
*/
var { Store, toImmutable } = require('nuclear-js');
var { TLPT_TERM_OPEN, TLPT_TERM_CLOSE, TLPT_TERM_CHANGE_SERVER } = require('./actionTypes');
var { TLPT_CURRENT_SESSION_OPEN, TLPT_CURRENT_SESSION_CLOSE } = require('./actionTypes');
export default Store({
getInitialState() {
@ -23,22 +23,16 @@ export default Store({
},
initialize() {
this.on(TLPT_TERM_OPEN, setActiveTerminal);
this.on(TLPT_TERM_CLOSE, close);
this.on(TLPT_TERM_CHANGE_SERVER, changeServer);
this.on(TLPT_CURRENT_SESSION_OPEN, setCurrentSession);
this.on(TLPT_CURRENT_SESSION_CLOSE, close);
}
})
function changeServer(state, {serverId, login}){
return state.set('serverId', serverId)
.set('login', login);
}
function close(){
return toImmutable(null);
}
function setActiveTerminal(state, {serverId, login, sid, isNewSession} ){
function setCurrentSession(state, {serverId, login, sid, isNewSession} ){
return toImmutable({
serverId,
login,

View file

@ -16,10 +16,9 @@ limitations under the License.
var {createView} = require('app/modules/sessions/getters');
const activeSession = [
['tlpt_current_session'], ['tlpt_sessions'],
(activeTerm, sessions) => {
if(!activeTerm){
const currentSession = [ ['tlpt_current_session'], ['tlpt_sessions'],
(current, sessions) => {
if(!current){
return null;
}
@ -28,36 +27,36 @@ const activeSession = [
* exist at this point. For example, upon creating a new session we need to know
* login and serverId. It will be simplified once server API gets extended.
*/
let asView = {
isNewSession: activeTerm.get('isNewSession'),
notFound: activeTerm.get('notFound'),
addr: activeTerm.get('addr'),
serverId: activeTerm.get('serverId'),
let curSessionView = {
isNewSession: current.get('isNewSession'),
notFound: current.get('notFound'),
addr: current.get('addr'),
serverId: current.get('serverId'),
serverIp: undefined,
login: activeTerm.get('login'),
sid: activeTerm.get('sid'),
login: current.get('login'),
sid: current.get('sid'),
cols: undefined,
rows: undefined
};
// in case if session already exists, get the data from there
// (for example, when joining an existing session)
if(sessions.has(asView.sid)){
let sView = createView(sessions.get(asView.sid));
/*
* in case if session already exists, get its view data (for example, when joining an existing session)
*/
if(sessions.has(curSessionView.sid)){
let existing = createView(sessions.get(curSessionView.sid));
asView.parties = sView.parties;
asView.serverIp = sView.serverIp;
asView.serverId = sView.serverId;
asView.active = sView.active;
asView.cols = sView.cols;
asView.rows = sView.rows;
curSessionView.parties = existing.parties;
curSessionView.serverIp = existing.serverIp;
curSessionView.serverId = existing.serverId;
curSessionView.active = existing.active;
curSessionView.cols = existing.cols;
curSessionView.rows = existing.rows;
}
return asView;
return curSessionView;
}
];
export default {
activeSession
currentSession
}

View file

@ -15,4 +15,4 @@ limitations under the License.
*/
module.exports.getters = require('./getters');
module.exports.actions = require('./actions');
module.exports.activeTermStore = require('./activeTermStore');
module.exports.activeTermStore = require('./currentSessionStore');

View file

@ -18,7 +18,7 @@ var reactor = require('app/reactor');
reactor.registerStores({
'tlpt': require('./app/appStore'),
'tlpt_dialogs': require('./dialogs/dialogStore'),
'tlpt_current_session': require('./activeTerminal/activeTermStore'),
'tlpt_current_session': require('./currentSession/currentSessionStore'),
'tlpt_user': require('./user/userStore'),
'tlpt_nodes': require('./nodes/nodeStore'),
'tlpt_invite': require('./invite/inviteStore'),

View file

@ -16,4 +16,3 @@ limitations under the License.
module.exports.getters = require('./getters');
module.exports.actions = require('./actions');
module.exports.activeTermStore = require('./sessionStore');