From b775e23c3c0f3ba384eba8f6c8091c0f062702ab Mon Sep 17 00:00:00 2001 From: Guillermo Rauch Date: Mon, 25 Sep 2017 13:55:04 +0200 Subject: [PATCH] Revert "improve writing performance by avoiding redux for pty events" This reverts commit 44dfb0faf888daf6d13ea9de719c39135b3a9343. --- lib/actions/sessions.js | 31 +++++++++++++++++++++++++++---- lib/index.js | 20 ++++++++++++++++++-- lib/store/configure-store.dev.js | 3 ++- lib/store/configure-store.prod.js | 4 +++- lib/store/write-middleware.js | 14 ++++++++++++++ 5 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 lib/store/write-middleware.js diff --git a/lib/actions/sessions.js b/lib/actions/sessions.js index e6f2c785..b296a145 100644 --- a/lib/actions/sessions.js +++ b/lib/actions/sessions.js @@ -1,16 +1,19 @@ import rpc from '../rpc'; +import isUrl from '../utils/url-command'; import {keys} from '../utils/object'; import findBySession from '../utils/term-groups'; import { SESSION_ADD, SESSION_RESIZE, SESSION_REQUEST, + SESSION_ADD_DATA, SESSION_PTY_DATA, SESSION_PTY_EXIT, SESSION_USER_EXIT, SESSION_SET_ACTIVE, SESSION_CLEAR_ACTIVE, SESSION_USER_DATA, + SESSION_URL_SET, SESSION_URL_UNSET, SESSION_SET_XTERM_TITLE } from '../constants/sessions'; @@ -45,10 +48,30 @@ export function requestSession() { } export function addSessionData(uid, data) { - return { - type: SESSION_PTY_DATA, - uid, - data + return (dispatch, getState) => { + dispatch({ + type: SESSION_ADD_DATA, + data, + effect() { + const session = getState().sessions.sessions[uid]; + if (session) { + const enterKey = data.indexOf('\n') > 0; + const url = enterKey ? isUrl(session.shell, data) : null; + if (url) { + return dispatch({ + type: SESSION_URL_SET, + uid, + url + }); + } + } + dispatch({ + type: SESSION_PTY_DATA, + uid, + data + }); + } + }); }; } diff --git a/lib/index.js b/lib/index.js index d3e07ffd..18aedf08 100644 --- a/lib/index.js +++ b/lib/index.js @@ -6,7 +6,6 @@ import {render} from 'react-dom'; import rpc from './rpc'; import init from './actions/index'; -import terms from './terms'; import * as config from './utils/config'; import * as plugins from './utils/plugins'; import * as uiActions from './actions/ui'; @@ -47,11 +46,28 @@ rpc.on('session add', data => { // we aggregate all the incoming pty events by raf // debouncing, to reduce allocation and iterations +let req; +let objects = {}; rpc.on('session data', d => { // the uid is a uuid v4 so it's 36 chars long const uid = d.slice(0, 36); const data = d.slice(36); - terms[uid].term.write(data); + if (objects[uid] === undefined) { + objects[uid] = data; + } else { + objects[uid] += data; + } + if (!req) { + req = requestAnimationFrame(() => { + for (const i in objects) { + if ({}.hasOwnProperty.call(objects, i)) { + store_.dispatch(sessionActions.addSessionData(i, objects[i])); + } + } + objects = {}; + req = null; + }); + } }); rpc.on('session data send', ({uid, data, escaped}) => { diff --git a/lib/store/configure-store.dev.js b/lib/store/configure-store.dev.js index d9a88bd0..f87e071f 100644 --- a/lib/store/configure-store.dev.js +++ b/lib/store/configure-store.dev.js @@ -4,6 +4,7 @@ import {createLogger} from 'redux-logger'; import rootReducer from '../reducers/index'; import effects from '../utils/effects'; import * as plugins from '../utils/plugins'; +import writeMiddleware from './write-middleware'; export default () => { const logger = createLogger({ @@ -12,7 +13,7 @@ export default () => { }); const enhancer = compose( - applyMiddleware(thunk, plugins.middleware, thunk, effects, logger), + applyMiddleware(thunk, plugins.middleware, thunk, effects, writeMiddleware, logger), window.devToolsExtension() ); diff --git a/lib/store/configure-store.prod.js b/lib/store/configure-store.prod.js index a94276d7..52ca0b04 100644 --- a/lib/store/configure-store.prod.js +++ b/lib/store/configure-store.prod.js @@ -3,5 +3,7 @@ import thunk from 'redux-thunk'; import rootReducer from '../reducers/index'; import effects from '../utils/effects'; import * as plugins from '../utils/plugins'; +import writeMiddleware from './write-middleware'; -export default () => createStore(rootReducer, applyMiddleware(thunk, plugins.middleware, thunk, effects)); +export default () => + createStore(rootReducer, applyMiddleware(thunk, plugins.middleware, thunk, effects, writeMiddleware)); diff --git a/lib/store/write-middleware.js b/lib/store/write-middleware.js new file mode 100644 index 00000000..72372ecb --- /dev/null +++ b/lib/store/write-middleware.js @@ -0,0 +1,14 @@ +import terms from '../terms'; + +// the only side effect we perform from middleware +// is to write to the react term instance directly +// to avoid a performance hit +export default () => next => action => { + if (action.type === 'SESSION_PTY_DATA') { + const term = terms[action.uid]; + if (term) { + term.write(action.data); + } + } + next(action); +};