mirror of
https://github.com/gravitational/teleport
synced 2024-10-22 10:13:21 +00:00
(web) adding error handling and notifications to ttyPlayer
This commit is contained in:
parent
e4d486f3ad
commit
a11c504664
6
web/dist/app/app.js
vendored
6
web/dist/app/app.js
vendored
File diff suppressed because one or more lines are too long
4
web/dist/app/styles.js
vendored
4
web/dist/app/styles.js
vendored
File diff suppressed because one or more lines are too long
26
web/dist/app/vendor.js
vendored
26
web/dist/app/vendor.js
vendored
File diff suppressed because one or more lines are too long
6
web/dist/index.html
vendored
6
web/dist/index.html
vendored
|
@ -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>
|
||||
|
|
|
@ -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 {
|
||||
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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}/>;
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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();
|
||||
},
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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
|
||||
})
|
|
@ -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,
|
|
@ -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,
|
|
@ -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
|
||||
}
|
|
@ -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');
|
|
@ -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'),
|
||||
|
|
|
@ -16,4 +16,3 @@ limitations under the License.
|
|||
|
||||
module.exports.getters = require('./getters');
|
||||
module.exports.actions = require('./actions');
|
||||
module.exports.activeTermStore = require('./sessionStore');
|
||||
|
|
Loading…
Reference in a new issue