From 6efe1aa6a92ce7f9f264903e9d27fb5cf6c32bfe Mon Sep 17 00:00:00 2001 From: Aldo Cortesi Date: Tue, 16 Sep 2014 16:26:16 +1200 Subject: We're not ready for ES6 Lets re-evaluate in June next year when it's actually released --- web/src/js/Connection.es6.js | 34 ----------- web/src/js/Dispatcher.es6.js | 35 ------------ web/src/js/actions.es6.js | 17 ------ web/src/js/actions.js | 17 ++++++ web/src/js/components/EventLog.react.js | 38 ------------ web/src/js/components/Footer.react.js | 12 ---- web/src/js/components/Header.react.js | 89 ----------------------------- web/src/js/components/ProxyApp.react.js | 46 --------------- web/src/js/components/TrafficTable.react.js | 34 ----------- web/src/js/components/eventlog.jsx | 39 +++++++++++++ web/src/js/components/footer.jsx | 12 ++++ web/src/js/components/header.jsx | 89 +++++++++++++++++++++++++++++ web/src/js/components/proxyapp.jsx | 46 +++++++++++++++ web/src/js/components/traffictable.jsx | 34 +++++++++++ web/src/js/connection.js | 33 +++++++++++ web/src/js/dispatcher.js | 35 ++++++++++++ web/src/js/stores/EventLogStore.es6.js | 84 --------------------------- web/src/js/stores/SettingsStore.es6.js | 27 --------- web/src/js/stores/base.es6.js | 26 --------- web/src/js/stores/base.js | 24 ++++++++ web/src/js/stores/eventlogstore.js | 84 +++++++++++++++++++++++++++ web/src/js/stores/settingstore.js | 27 +++++++++ 22 files changed, 440 insertions(+), 442 deletions(-) delete mode 100644 web/src/js/Connection.es6.js delete mode 100644 web/src/js/Dispatcher.es6.js delete mode 100644 web/src/js/actions.es6.js create mode 100644 web/src/js/actions.js delete mode 100644 web/src/js/components/EventLog.react.js delete mode 100644 web/src/js/components/Footer.react.js delete mode 100644 web/src/js/components/Header.react.js delete mode 100644 web/src/js/components/ProxyApp.react.js delete mode 100644 web/src/js/components/TrafficTable.react.js create mode 100644 web/src/js/components/eventlog.jsx create mode 100644 web/src/js/components/footer.jsx create mode 100644 web/src/js/components/header.jsx create mode 100644 web/src/js/components/proxyapp.jsx create mode 100644 web/src/js/components/traffictable.jsx create mode 100644 web/src/js/connection.js create mode 100644 web/src/js/dispatcher.js delete mode 100644 web/src/js/stores/EventLogStore.es6.js delete mode 100644 web/src/js/stores/SettingsStore.es6.js delete mode 100644 web/src/js/stores/base.es6.js create mode 100644 web/src/js/stores/base.js create mode 100644 web/src/js/stores/eventlogstore.js create mode 100644 web/src/js/stores/settingstore.js (limited to 'web/src') diff --git a/web/src/js/Connection.es6.js b/web/src/js/Connection.es6.js deleted file mode 100644 index 7250dd39..00000000 --- a/web/src/js/Connection.es6.js +++ /dev/null @@ -1,34 +0,0 @@ -class _Connection { - constructor(root) { - if (!root) { - root = location.origin + "/api/v1"; - } - this.root = root; - } - init() { - this.openWebSocketConnection(); - } - openWebSocketConnection() { - this.ws = new WebSocket(this.root.replace("http", "ws") + "/ws"); - var ws = this.ws; - - ws.onopen = this.onopen.bind(this); - ws.onmessage = this.onmessage.bind(this); - ws.onerror = this.onerror.bind(this); - ws.onclose = this.onclose.bind(this); - } - onopen(open) { - console.log("onopen", this, arguments); - } - onmessage(message) { - //AppDispatcher.dispatchServerAction(...); - console.log("onmessage", this, arguments); - } - onerror(error) { - console.log("onerror", this, arguments); - } - onclose(close) { - console.log("onclose", this, arguments); - } -} -var Connection = new _Connection(); \ No newline at end of file diff --git a/web/src/js/Dispatcher.es6.js b/web/src/js/Dispatcher.es6.js deleted file mode 100644 index f1f36cc8..00000000 --- a/web/src/js/Dispatcher.es6.js +++ /dev/null @@ -1,35 +0,0 @@ -const PayloadSources = { - VIEW_ACTION: "VIEW_ACTION", - SERVER_ACTION: "SERVER_ACTION" -}; - -class Dispatcher { - constructor() { - this.callbacks = []; - } - register(callback) { - this.callbacks.push(callback); - } - unregister(callback) { - var index = this.callbacks.indexOf(f); - if (index >= 0) { - this.callbacks.splice(this.callbacks.indexOf(f), 1); - } - } - dispatch(payload) { - console.debug("dispatch", payload); - this.callbacks.forEach((callback) => { - callback(payload); - }); - } -} - -AppDispatcher = new Dispatcher(); -AppDispatcher.dispatchViewAction = function(action) { - action.actionSource = PayloadSources.VIEW_ACTION; - this.dispatch(action); -}; -AppDispatcher.dispatchServerAction = function(action) { - action.actionSource = PayloadSources.SERVER_ACTION; - this.dispatch(action); -}; \ No newline at end of file diff --git a/web/src/js/actions.es6.js b/web/src/js/actions.es6.js deleted file mode 100644 index 55cb4552..00000000 --- a/web/src/js/actions.es6.js +++ /dev/null @@ -1,17 +0,0 @@ -var ActionTypes = { - SETTINGS_UPDATE: "SETTINGS_UPDATE", - EVENTLOG_ADD: "EVENTLOG_ADD" -}; - -var SettingsActions = { - update(settings) { - settings = _.merge({}, SettingsStore.getAll(), settings); - //TODO: Update server. - - //Facebook Flux: We do an optimistic update on the client already. - AppDispatcher.dispatchViewAction({ - actionType: ActionTypes.SETTINGS_UPDATE, - settings: settings - }); - } -}; \ No newline at end of file diff --git a/web/src/js/actions.js b/web/src/js/actions.js new file mode 100644 index 00000000..6eecd78e --- /dev/null +++ b/web/src/js/actions.js @@ -0,0 +1,17 @@ +var ActionTypes = { + SETTINGS_UPDATE: "SETTINGS_UPDATE", + EVENTLOG_ADD: "EVENTLOG_ADD" +}; + +var SettingsActions = { + update:function(settings) { + settings = _.merge({}, SettingsStore.getAll(), settings); + //TODO: Update server. + + //Facebook Flux: We do an optimistic update on the client already. + AppDispatcher.dispatchViewAction({ + actionType: ActionTypes.SETTINGS_UPDATE, + settings: settings + }); + } +}; diff --git a/web/src/js/components/EventLog.react.js b/web/src/js/components/EventLog.react.js deleted file mode 100644 index 6c7a7c58..00000000 --- a/web/src/js/components/EventLog.react.js +++ /dev/null @@ -1,38 +0,0 @@ -/** @jsx React.DOM */ - -var EventLog = React.createClass({ - getInitialState() { - return { - log: [] - }; - }, - componentDidMount() { - this.log = EventLogStore.getView(); - this.log.addListener("change", this.onEventLogChange); - }, - componentWillUnmount() { - this.log.removeListener("change", this.onEventLogChange); - this.log.close(); - }, - onEventLogChange() { - this.setState({ - log: this.log.getAll() - }); - }, - close() { - SettingsActions.update({ - showEventLog: false - }); - }, - render() { - var messages = this.state.log.map(row => (
{row.message}
)); - return ( -
-
-                    
-                    {messages}
-                
-
- ); - } -}); \ No newline at end of file diff --git a/web/src/js/components/Footer.react.js b/web/src/js/components/Footer.react.js deleted file mode 100644 index 20a4abfb..00000000 --- a/web/src/js/components/Footer.react.js +++ /dev/null @@ -1,12 +0,0 @@ -/** @jsx React.DOM */ - -var Footer = React.createClass({ - render(){ - var mode = this.props.settings.mode; - return ( - - ); - } -}); \ No newline at end of file diff --git a/web/src/js/components/Header.react.js b/web/src/js/components/Header.react.js deleted file mode 100644 index 0131d350..00000000 --- a/web/src/js/components/Header.react.js +++ /dev/null @@ -1,89 +0,0 @@ -/** @jsx React.DOM */ - -var MainMenu = React.createClass({ - toggleEventLog() { - SettingsActions.update({ - showEventLog: !this.props.settings.showEventLog - }); - }, - render(){ - return ( -
- -
- ); - } -}); -var ToolsMenu = React.createClass({ - render(){ - return
Tools Menu
; - } -}); -var ReportsMenu = React.createClass({ - render(){ - return
Reports Menu
; - } -}); - - -var _Header_Entries = { - main: { - title: "Traffic", - route: "main", - menu: MainMenu - }, - tools: { - title: "Tools", - route: "main", - menu: ToolsMenu - }, - reports: { - title: "Visualization", - route: "reports", - menu: ReportsMenu - } -}; - -var Header = React.createClass({ - getInitialState(){ - return { - active: "main" - }; - }, - handleClick(active){ - this.setState({active: active}); - ReactRouter.transitionTo(_Header_Entries[active].route); - return false; - }, - handleFileClick(){ - console.log("File click"); - }, - render(){ - var header = []; - for(var item in _Header_Entries){ - var classes = this.state.active == item ? "active" : ""; - header.push({ _Header_Entries[item].title }); - } - - var menu = _Header_Entries[this.state.active].menu({ - settings: this.props.settings - }); - return ( -
-
- mitmproxy { this.props.settings.version } -
- -
- { menu } -
-
- ); - } -}); \ No newline at end of file diff --git a/web/src/js/components/ProxyApp.react.js b/web/src/js/components/ProxyApp.react.js deleted file mode 100644 index 07d66440..00000000 --- a/web/src/js/components/ProxyApp.react.js +++ /dev/null @@ -1,46 +0,0 @@ -/** @jsx React.DOM */ - -//TODO: Move out of here, just a stub. -var Reports = React.createClass({ - render(){ - return
Report Editor
; - } -}); - - -var ProxyAppMain = React.createClass({ - getInitialState(){ - return { settings: SettingsStore.getAll() }; - }, - componentDidMount(){ - SettingsStore.addListener("change", this.onSettingsChange); - }, - componentWillUnmount(){ - SettingsStore.removeListener("change", this.onSettingsChange); - }, - onSettingsChange(){ - console.log("onSettingsChange"); - this.setState({settings: SettingsStore.getAll()}); - }, - render() { - return ( -
-
-
- {this.state.settings.showEventLog ? : null} -
-
- ); - } -}); - - -var ProxyApp = ( - - - - - - - -); diff --git a/web/src/js/components/TrafficTable.react.js b/web/src/js/components/TrafficTable.react.js deleted file mode 100644 index 7e9e26e3..00000000 --- a/web/src/js/components/TrafficTable.react.js +++ /dev/null @@ -1,34 +0,0 @@ -/** @jsx React.DOM */ - -var TrafficTable = React.createClass({ - getInitialState() { - return { - flows: [] - }; - }, - componentDidMount() { - //this.flowStore = FlowStore.getView(); - //this.flowStore.addListener("change",this.onFlowChange); - }, - componentWillUnmount() { - //this.flowStore.removeListener("change",this.onFlowChange); - //this.flowStore.close(); - }, - onFlowChange() { - this.setState({ - //flows: this.flowStore.getAll() - }); - }, - render() { - /*var flows = this.state.flows.map(function(flow){ - return
{flow.request.method} {flow.request.scheme}://{flow.request.host}{flow.request.path}
; - }); */ - //Dummy Text for layout testing - x = "Flow"; - i = 12; - while (i--) x += x; - return ( -
 { x } 
- ); - } -}); \ No newline at end of file diff --git a/web/src/js/components/eventlog.jsx b/web/src/js/components/eventlog.jsx new file mode 100644 index 00000000..530e9f4f --- /dev/null +++ b/web/src/js/components/eventlog.jsx @@ -0,0 +1,39 @@ +/** @jsx React.DOM */ + +var EventLog = React.createClass({ + getInitialState: function() { + return { + log: [] + }; + }, + componentDidMount: function() { + this.log = EventLogStore.getView(); + this.log.addListener("change", this.onEventLogChange); + }, + componentWillUnmount: function() { + this.log.removeListener("change", this.onEventLogChange); + this.log.close(); + }, + onEventLogChange: function() { + this.setState({ + log: this.log.getAll() + }); + }, + close: function() { + SettingsActions.update({ + showEventLog: false + }); + }, + render: function() { + //var messages = this.state.log.map(row => (
{row.message}
)); + var messages = []; + return ( +
+
+                    
+                    {messages}
+                
+
+ ); + } +}); diff --git a/web/src/js/components/footer.jsx b/web/src/js/components/footer.jsx new file mode 100644 index 00000000..6d5b75a1 --- /dev/null +++ b/web/src/js/components/footer.jsx @@ -0,0 +1,12 @@ +/** @jsx React.DOM */ + +var Footer = React.createClass({ + render: function(){ + var mode = this.props.settings.mode; + return ( + + ); + } +}); diff --git a/web/src/js/components/header.jsx b/web/src/js/components/header.jsx new file mode 100644 index 00000000..e6350171 --- /dev/null +++ b/web/src/js/components/header.jsx @@ -0,0 +1,89 @@ +/** @jsx React.DOM */ + +var MainMenu = React.createClass({ + toggleEventLog: function() { + SettingsActions.update({ + showEventLog: !this.props.settings.showEventLog + }); + }, + render: function(){ + return ( +
+ +
+ ); + } +}); +var ToolsMenu = React.createClass({ + render: function(){ + return
Tools Menu
; + } +}); +var ReportsMenu = React.createClass({ + render: function(){ + return
Reports Menu
; + } +}); + + +var _Header_Entries = { + main: { + title: "Traffic", + route: "main", + menu: MainMenu + }, + tools: { + title: "Tools", + route: "main", + menu: ToolsMenu + }, + reports: { + title: "Visualization", + route: "reports", + menu: ReportsMenu + } +}; + +var Header = React.createClass({ + getInitialState: function(){ + return { + active: "main" + }; + }, + handleClick: function(active){ + this.setState({active: active}); + ReactRouter.transitionTo(_Header_Entries[active].route); + return false; + }, + handleFileClick: function(){ + console.log("File click"); + }, + render: function(){ + var header = []; + for(var item in _Header_Entries){ + var classes = this.state.active == item ? "active" : ""; + header.push({ _Header_Entries[item].title }); + } + + var menu = _Header_Entries[this.state.active].menu({ + settings: this.props.settings + }); + return ( +
+
+ mitmproxy { this.props.settings.version } +
+ +
+ { menu } +
+
+ ); + } +}); diff --git a/web/src/js/components/proxyapp.jsx b/web/src/js/components/proxyapp.jsx new file mode 100644 index 00000000..c0196461 --- /dev/null +++ b/web/src/js/components/proxyapp.jsx @@ -0,0 +1,46 @@ +/** @jsx React.DOM */ + +//TODO: Move out of here, just a stub. +var Reports = React.createClass({ + render: function(){ + return
Report Editor
; + } +}); + + +var ProxyAppMain = React.createClass({ + getInitialState: function(){ + return { settings: SettingsStore.getAll() }; + }, + componentDidMount: function(){ + SettingsStore.addListener("change", this.onSettingsChange); + }, + componentWillUnmount: function(){ + SettingsStore.removeListener("change", this.onSettingsChange); + }, + onSettingsChange: function(){ + console.log("onSettingsChange"); + this.setState({settings: SettingsStore.getAll()}); + }, + render: function() { + return ( +
+
+
+ {this.state.settings.showEventLog ? : null} +
+
+ ); + } +}); + + +var ProxyApp = ( + + + + + + + +); diff --git a/web/src/js/components/traffictable.jsx b/web/src/js/components/traffictable.jsx new file mode 100644 index 00000000..1ed6fbc8 --- /dev/null +++ b/web/src/js/components/traffictable.jsx @@ -0,0 +1,34 @@ +/** @jsx React.DOM */ + +var TrafficTable = React.createClass({ + getInitialState: function() { + return { + flows: [] + }; + }, + componentDidMount: function() { + //this.flowStore = FlowStore.getView(); + //this.flowStore.addListener("change",this.onFlowChange); + }, + componentWillUnmount: function() { + //this.flowStore.removeListener("change",this.onFlowChange); + //this.flowStore.close(); + }, + onFlowChange: function() { + this.setState({ + //flows: this.flowStore.getAll() + }); + }, + render: function() { + /*var flows = this.state.flows.map(function(flow){ + return
{flow.request.method} {flow.request.scheme}://{flow.request.host}{flow.request.path}
; + }); */ + //Dummy Text for layout testing + x = "Flow"; + i = 12; + while (i--) x += x; + return ( +
 { x } 
+ ); + } +}); diff --git a/web/src/js/connection.js b/web/src/js/connection.js new file mode 100644 index 00000000..1f2daeef --- /dev/null +++ b/web/src/js/connection.js @@ -0,0 +1,33 @@ +function _Connection(root) {"use strict"; + if (!root) { + root = location.origin + "/api/v1"; + } + this.root = root; + } + _Connection.prototype.init=function() {"use strict"; + this.openWebSocketConnection(); + }; + _Connection.prototype.openWebSocketConnection=function() {"use strict"; + this.ws = new WebSocket(this.root.replace("http", "ws") + "/ws"); + var ws = this.ws; + + ws.onopen = this.onopen.bind(this); + ws.onmessage = this.onmessage.bind(this); + ws.onerror = this.onerror.bind(this); + ws.onclose = this.onclose.bind(this); + }; + _Connection.prototype.onopen=function(open) {"use strict"; + console.log("onopen", this, arguments); + }; + _Connection.prototype.onmessage=function(message) {"use strict"; + //AppDispatcher.dispatchServerAction(...); + console.log("onmessage", this, arguments); + }; + _Connection.prototype.onerror=function(error) {"use strict"; + console.log("onerror", this, arguments); + }; + _Connection.prototype.onclose=function(close) {"use strict"; + console.log("onclose", this, arguments); + }; + +var Connection = new _Connection(); diff --git a/web/src/js/dispatcher.js b/web/src/js/dispatcher.js new file mode 100644 index 00000000..310f9a7f --- /dev/null +++ b/web/src/js/dispatcher.js @@ -0,0 +1,35 @@ +const PayloadSources = { + VIEW_ACTION: "VIEW_ACTION", + SERVER_ACTION: "SERVER_ACTION" +}; + + + function Dispatcher() {"use strict"; + this.callbacks = []; + } + Dispatcher.prototype.register=function(callback) {"use strict"; + this.callbacks.push(callback); + }; + Dispatcher.prototype.unregister=function(callback) {"use strict"; + var index = this.callbacks.indexOf(f); + if (index >= 0) { + this.callbacks.splice(this.callbacks.indexOf(f), 1); + } + }; + Dispatcher.prototype.dispatch=function(payload) {"use strict"; + console.debug("dispatch", payload); + this.callbacks.forEach(function(callback) { + callback(payload); + }); + }; + + +AppDispatcher = new Dispatcher(); +AppDispatcher.dispatchViewAction = function(action) { + action.actionSource = PayloadSources.VIEW_ACTION; + this.dispatch(action); +}; +AppDispatcher.dispatchServerAction = function(action) { + action.actionSource = PayloadSources.SERVER_ACTION; + this.dispatch(action); +}; diff --git a/web/src/js/stores/EventLogStore.es6.js b/web/src/js/stores/EventLogStore.es6.js deleted file mode 100644 index e470f44f..00000000 --- a/web/src/js/stores/EventLogStore.es6.js +++ /dev/null @@ -1,84 +0,0 @@ -// -// We have an EventLogView and an EventLogStore: -// The basic architecture is that one can request views on the event log -// from the store, which returns a view object and then deals with getting the data required for the view. -// The view object is accessed by React components and distributes updates etc. -// -// See also: components/EventLog.react.js - -class EventLogView extends EventEmitter { - constructor(store, live) { - super(); - this._store = store; - this.live = live; - this.log = []; - - this.add = this.add.bind(this); - - if (live) { - this._store.addListener("new_entry", this.add); - } - } - close() { - this._store.removeListener("new_entry", this.add); - } - getAll() { - return this.log; - } - add(entry) { - this.log.push(entry); - this.emit("change"); - } - add_bulk(messages) { - var log = messages; - var last_id = log[log.length - 1].id; - var to_add = _.filter(this.log, entry => entry.id > last_id); - this.log = log.concat(to_add); - this.emit("change"); - } -} - -class _EventLogStore extends EventEmitter { - getView(since) { - var view = new EventLogView(this, !since); - - //TODO: Really do bulk retrieval of last messages. - window.setTimeout(function() { - view.add_bulk([{ - id: 1, - message: "Hello World" - }, { - id: 2, - message: "I was already transmitted as an event." - }]); - }, 100); - - var id = 2; - view.add({ - id: id++, - message: "I was already transmitted as an event." - }); - view.add({ - id: id++, - message: "I was only transmitted as an event before the bulk was added.." - }); - window.setInterval(function() { - view.add({ - id: id++, - message: "." - }); - }, 1000); - return view; - } - handle(action) { - switch (action.actionType) { - case ActionTypes.EVENTLOG_ADD: - this.emit("new_message", action.message); - break; - default: - return; - } - } -} -var EventLogStore = new _EventLogStore(); -AppDispatcher.register(EventLogStore.handle.bind(EventLogStore)); \ No newline at end of file diff --git a/web/src/js/stores/SettingsStore.es6.js b/web/src/js/stores/SettingsStore.es6.js deleted file mode 100644 index 29971fa7..00000000 --- a/web/src/js/stores/SettingsStore.es6.js +++ /dev/null @@ -1,27 +0,0 @@ -class _SettingsStore extends EventEmitter { - constructor() { - super(); - - //FIXME: What do we do if we haven't requested anything from the server yet? - this.settings = { - version: "0.12", - showEventLog: true, - mode: "transparent", - }; - } - getAll() { - return this.settings; - } - handle(action) { - switch (action.actionType) { - case ActionTypes.SETTINGS_UPDATE: - this.settings = action.settings; - this.emit("change"); - break; - default: - return; - } - } -} -var SettingsStore = new _SettingsStore(); -AppDispatcher.register(SettingsStore.handle.bind(SettingsStore)); \ No newline at end of file diff --git a/web/src/js/stores/base.es6.js b/web/src/js/stores/base.es6.js deleted file mode 100644 index 1dc4ca2f..00000000 --- a/web/src/js/stores/base.es6.js +++ /dev/null @@ -1,26 +0,0 @@ -class EventEmitter { - constructor() { - this.listeners = {}; - } - emit(event) { - if (!(event in this.listeners)) { - return; - } - this.listeners[event].forEach(function(listener) { - listener.apply(this, arguments); - }.bind(this)); - } - addListener(event, f) { - this.listeners[event] = this.listeners[event] || []; - this.listeners[event].push(f); - } - removeListener(event, f) { - if (!(event in this.listeners)) { - return false; - } - var index = this.listeners[event].indexOf(f); - if (index >= 0) { - this.listeners[event].splice(index, 1); - } - } -} \ No newline at end of file diff --git a/web/src/js/stores/base.js b/web/src/js/stores/base.js new file mode 100644 index 00000000..55808deb --- /dev/null +++ b/web/src/js/stores/base.js @@ -0,0 +1,24 @@ +function EventEmitter() {"use strict"; + this.listeners = {}; + } + EventEmitter.prototype.emit=function(event) {"use strict"; + if (!(event in this.listeners)) { + return; + } + this.listeners[event].forEach(function(listener) { + listener.apply(this, arguments); + }.bind(this)); + }; + EventEmitter.prototype.addListener=function(event, f) {"use strict"; + this.listeners[event] = this.listeners[event] || []; + this.listeners[event].push(f); + }; + EventEmitter.prototype.removeListener=function(event, f) {"use strict"; + if (!(event in this.listeners)) { + return false; + } + var index = this.listeners[event].indexOf(f); + if (index >= 0) { + this.listeners[event].splice(index, 1); + } + }; diff --git a/web/src/js/stores/eventlogstore.js b/web/src/js/stores/eventlogstore.js new file mode 100644 index 00000000..f9d8cf27 --- /dev/null +++ b/web/src/js/stores/eventlogstore.js @@ -0,0 +1,84 @@ +// +// We have an EventLogView and an EventLogStore: +// The basic architecture is that one can request views on the event log +// from the store, which returns a view object and then deals with getting the data required for the view. +// The view object is accessed by React components and distributes updates etc. +// +// See also: components/EventLog.react.js + +for(var EventEmitter____Key in EventEmitter){if(EventEmitter.hasOwnProperty(EventEmitter____Key)){EventLogView[EventEmitter____Key]=EventEmitter[EventEmitter____Key];}}var ____SuperProtoOfEventEmitter=EventEmitter===null?null:EventEmitter.prototype;EventLogView.prototype=Object.create(____SuperProtoOfEventEmitter);EventLogView.prototype.constructor=EventLogView;EventLogView.__superConstructor__=EventEmitter; + function EventLogView(store, live) {"use strict"; + EventEmitter.call(this); + this.$EventLogView_store = store; + this.live = live; + this.log = []; + + this.add = this.add.bind(this); + + if (live) { + this.$EventLogView_store.addListener("new_entry", this.add); + } + } + EventLogView.prototype.close=function() {"use strict"; + this.$EventLogView_store.removeListener("new_entry", this.add); + }; + EventLogView.prototype.getAll=function() {"use strict"; + return this.log; + }; + EventLogView.prototype.add=function(entry) {"use strict"; + this.log.push(entry); + this.emit("change"); + }; + EventLogView.prototype.add_bulk=function(messages) {"use strict"; + var log = messages; + var last_id = log[log.length - 1].id; + var to_add = _.filter(this.log, function(entry) {return entry.id > last_id;}); + this.log = log.concat(to_add); + this.emit("change"); + }; + + +for(EventEmitter____Key in EventEmitter){if(EventEmitter.hasOwnProperty(EventEmitter____Key)){_EventLogStore[EventEmitter____Key]=EventEmitter[EventEmitter____Key];}}_EventLogStore.prototype=Object.create(____SuperProtoOfEventEmitter);_EventLogStore.prototype.constructor=_EventLogStore;_EventLogStore.__superConstructor__=EventEmitter;function _EventLogStore(){"use strict";if(EventEmitter!==null){EventEmitter.apply(this,arguments);}} + _EventLogStore.prototype.getView=function(since) {"use strict"; + var view = new EventLogView(this, !since); + + //TODO: Really do bulk retrieval of last messages. + window.setTimeout(function() { + view.add_bulk([{ + id: 1, + message: "Hello World" + }, { + id: 2, + message: "I was already transmitted as an event." + }]); + }, 100); + + var id = 2; + view.add({ + id: id++, + message: "I was already transmitted as an event." + }); + view.add({ + id: id++, + message: "I was only transmitted as an event before the bulk was added.." + }); + window.setInterval(function() { + view.add({ + id: id++, + message: "." + }); + }, 1000); + return view; + }; + _EventLogStore.prototype.handle=function(action) {"use strict"; + switch (action.actionType) { + case ActionTypes.EVENTLOG_ADD: + this.emit("new_message", action.message); + break; + default: + return; + } + }; + +var EventLogStore = new _EventLogStore(); +AppDispatcher.register(EventLogStore.handle.bind(EventLogStore)); diff --git a/web/src/js/stores/settingstore.js b/web/src/js/stores/settingstore.js new file mode 100644 index 00000000..5ceed7db --- /dev/null +++ b/web/src/js/stores/settingstore.js @@ -0,0 +1,27 @@ +for(var EventEmitter____Key in EventEmitter){if(EventEmitter.hasOwnProperty(EventEmitter____Key)){_SettingsStore[EventEmitter____Key]=EventEmitter[EventEmitter____Key];}}var ____SuperProtoOfEventEmitter=EventEmitter===null?null:EventEmitter.prototype;_SettingsStore.prototype=Object.create(____SuperProtoOfEventEmitter);_SettingsStore.prototype.constructor=_SettingsStore;_SettingsStore.__superConstructor__=EventEmitter; + function _SettingsStore() {"use strict"; + EventEmitter.call(this); + + //FIXME: What do we do if we haven't requested anything from the server yet? + this.settings = { + version: "0.12", + showEventLog: true, + mode: "transparent", + }; + } + _SettingsStore.prototype.getAll=function() {"use strict"; + return this.settings; + }; + _SettingsStore.prototype.handle=function(action) {"use strict"; + switch (action.actionType) { + case ActionTypes.SETTINGS_UPDATE: + this.settings = action.settings; + this.emit("change"); + break; + default: + return; + } + }; + +var SettingsStore = new _SettingsStore(); +AppDispatcher.register(SettingsStore.handle.bind(SettingsStore)); -- cgit v1.2.3