diff options
author | Jason <jason.daurus@gmail.com> | 2016-06-24 21:04:39 +0800 |
---|---|---|
committer | Jason <jason.daurus@gmail.com> | 2016-06-24 21:04:39 +0800 |
commit | 5a1677c3879c53abcaddbbfa4894fa8a117a3143 (patch) | |
tree | adf5c9cdd79ea5d519420e0e3328ac92e1ad9dc3 /web/src/js/ducks | |
parent | f392b8e34cae2d985c500ddc26a93c8f620a6f57 (diff) | |
parent | 21c3480429108cbbd45f5ae3de7a36d15460cdc3 (diff) | |
download | mitmproxy-5a1677c3879c53abcaddbbfa4894fa8a117a3143.tar.gz mitmproxy-5a1677c3879c53abcaddbbfa4894fa8a117a3143.tar.bz2 mitmproxy-5a1677c3879c53abcaddbbfa4894fa8a117a3143.zip |
Merge branch 'master' of github.com:mitmproxy/mitmproxy into list
Conflicts:
mitmproxy/web/static/app.js
web/src/js/app.jsx
web/src/js/connection.js
web/src/js/ducks/websocket.js
Diffstat (limited to 'web/src/js/ducks')
-rw-r--r-- | web/src/js/ducks/app.js | 27 | ||||
-rw-r--r-- | web/src/js/ducks/websocket.js | 118 |
2 files changed, 128 insertions, 17 deletions
diff --git a/web/src/js/ducks/app.js b/web/src/js/ducks/app.js new file mode 100644 index 00000000..f1dcb490 --- /dev/null +++ b/web/src/js/ducks/app.js @@ -0,0 +1,27 @@ +import { connect as wsConnect, disconnect as wsDisconnect } from './websocket' + +export const INIT = 'APP_INIT' + +const defaultState = {} + +export function reduce(state = defaultState, action) { + switch (action.type) { + + default: + return state + } +} + +export function init() { + return dispatch => { + dispatch(wsConnect()) + dispatch({ type: INIT }) + } +} + +export function destruct() { + return dispatch => { + dispatch(wsDisconnect()) + dispatch({ type: DESTRUCT }) + } +} diff --git a/web/src/js/ducks/websocket.js b/web/src/js/ducks/websocket.js index c10f9f5e..c79d887a 100644 --- a/web/src/js/ducks/websocket.js +++ b/web/src/js/ducks/websocket.js @@ -1,34 +1,118 @@ -const CONNECTED = 'WEBSOCKET_CONNECTED' -const DISCONNECTED = 'WEBSOCKET_DISCONNECTED' +import { ConnectionActions } from '../actions.js' +import { AppDispatcher } from '../dispatcher.js' +import * as eventLogActions from './eventLog' +import * as flowsActions from './flows' +import * as settingsActions from './settings' export const CMD_ADD = 'add' export const CMD_UPDATE = 'update' export const CMD_REMOVE = 'remove' export const CMD_RESET = 'reset' -const defaultState = { - connected: false, - /* we may want to have an error message attribute here at some point */ -} -export default function reducer(state = defaultState, action) { +export const SYM_SOCKET = Symbol('WEBSOCKET_SYM_SOCKET') + +export const CONNECT = 'WEBSOCKET_CONNECT' +export const CONNECTED = 'WEBSOCKET_CONNECTED' +export const DISCONNECT = 'WEBSOCKET_DISCONNECT' +export const DISCONNECTED = 'WEBSOCKET_DISCONNECTED' +export const ERROR = 'WEBSOCKET_ERROR' +export const MESSAGE = 'WEBSOCKET_MESSAGE' + +/* we may want to have an error message attribute here at some point */ +const defaultState = { connected: false, socket: null } + +export default function reduce(state = defaultState, action) { switch (action.type) { + + case CONNECT: + return { ...state, [SYM_SOCKET]: action.socket } + case CONNECTED: - return { - connected: true - } + return { ...state, connected: true } + + case DISCONNECT: + return { ...state, connected: false } + case DISCONNECTED: - return { - connected: false - } + return { ...state, [SYM_SOCKET]: null, connected: false } + default: return state } } +export function connect() { + return dispatch => { + const socket = new WebSocket(location.origin.replace('http', 'ws') + '/updates') + + // @todo remove this + window.ws = socket + + socket.addEventListener('open', () => dispatch(onConnect())) + socket.addEventListener('close', () => dispatch(onDisconnect())) + socket.addEventListener('message', msg => dispatch(onMessage(msg))) + socket.addEventListener('error', error => dispatch(onError(error))) + + dispatch({ type: CONNECT, socket }) + + return socket + } +} + +export function disconnect() { + return (dispatch, getState) => { + getState().settings[SYM_SOCKET].close() + dispatch({ type: DISCONNECT }) + } +} + +export function onConnect() { + // workaround to make sure that our state is already available. + return dispatch => { + dispatch({ type: CONNECTED }) + dispatch(settingsActions.fetchSettings()) + dispatch(flowsActions.fetchFlows()).then(() => ConnectionActions.open()) + } +} + +export function onMessage(msg) { + return dispatch => { + const data = JSON.parse(msg.data) + + AppDispatcher.dispatchServerAction(data) + + switch (data.type) { + + case eventLogActions.WS_MSG_TYPE: + return dispatch(eventLogActions.handleWsMsg(data)) + + case flowsActions.WS_MSG_TYPE: + return dispatch(flowsActions.handleWsMsg(data)) -export function connected() { - return {type: CONNECTED} + case settingsActions.UPDATE_SETTINGS: + return dispatch(settingsActions.handleWsMsg(data)) + + default: + console.warn('unknown message', data) + } + + dispatch({ type: MESSAGE, msg }) + } +} + +export function onDisconnect() { + return dispatch => { + ConnectionActions.close() + dispatch(eventLogActions.addLogEntry('WebSocket connection closed.')) + dispatch({ type: DISCONNECTED }) + } } -export function disconnected() { - return {type: DISCONNECTED} + +export function onError(error) { + // @todo let event log subscribe WebSocketActions.ERROR + return dispatch => { + ConnectionActions.error() + dispatch(eventLogActions.addLogEntry('WebSocket connection error.')) + dispatch({ type: ERROR, error }) + } } |