aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/stores
diff options
context:
space:
mode:
Diffstat (limited to 'web/src/js/stores')
-rw-r--r--web/src/js/stores/base.js141
-rw-r--r--web/src/js/stores/eventlogstore.js99
-rw-r--r--web/src/js/stores/flowstore.js105
-rw-r--r--web/src/js/stores/settingstore.js28
4 files changed, 0 insertions, 373 deletions
diff --git a/web/src/js/stores/base.js b/web/src/js/stores/base.js
deleted file mode 100644
index f9534bd2..00000000
--- a/web/src/js/stores/base.js
+++ /dev/null
@@ -1,141 +0,0 @@
-function EventEmitter() {
- this.listeners = {};
-}
-EventEmitter.prototype.emit = function (event) {
- if (!(event in this.listeners)) {
- return;
- }
- var args = Array.prototype.slice.call(arguments, 1);
- this.listeners[event].forEach(function (listener) {
- listener.apply(this, args);
- }.bind(this));
-};
-EventEmitter.prototype.addListener = function (events, f) {
- events.split(" ").forEach(function (event) {
- this.listeners[event] = this.listeners[event] || [];
- this.listeners[event].push(f);
- }.bind(this));
-};
-EventEmitter.prototype.removeListener = function (events, f) {
- if (!(events in this.listeners)) {
- return false;
- }
- events.split(" ").forEach(function (event) {
- var index = this.listeners[event].indexOf(f);
- if (index >= 0) {
- this.listeners[event].splice(index, 1);
- }
- }.bind(this));
-};
-
-
-function Store() {
- this._views = [];
- this.reset();
-}
-_.extend(Store.prototype, {
- add: function (elem) {
- if (elem.id in this._pos_map) {
- return;
- }
-
- this._pos_map[elem.id] = this._list.length;
- this._list.push(elem);
- for (var i = 0; i < this._views.length; i++) {
- this._views[i].add(elem);
- }
- },
- update: function (elem) {
- if (!(elem.id in this._pos_map)) {
- return;
- }
-
- this._list[this._pos_map[elem.id]] = elem;
- for (var i = 0; i < this._views.length; i++) {
- this._views[i].update(elem);
- }
- },
- remove: function (elem_id) {
- if (!(elem.id in this._pos_map)) {
- return;
- }
-
- this._list.splice(this._pos_map[elem_id], 1);
- this._build_map();
- for (var i = 0; i < this._views.length; i++) {
- this._views[i].remove(elem_id);
- }
- },
- reset: function (elems) {
- this._list = elems || [];
- this._build_map();
- for (var i = 0; i < this._views.length; i++) {
- this._views[i].recalculate(this._list);
- }
- },
- _build_map: function () {
- this._pos_map = {};
- for (var i = 0; i < this._list.length; i++) {
- var elem = this._list[i];
- this._pos_map[elem.id] = i;
- }
- },
- get: function (elem_id) {
- return this._list[this._pos_map[elem_id]];
- }
-});
-
-
-function LiveStore(type) {
- Store.call(this);
- this.type = type;
-
- this._updates_before_fetch = undefined;
- this._fetchxhr = false;
-
- this.handle = this.handle.bind(this);
- AppDispatcher.register(this.handle);
-
- // Avoid double-fetch on startup.
- if (!(window.ws && window.ws.readyState === WebSocket.CONNECTING)) {
- this.fetch();
- }
-}
-_.extend(LiveStore.prototype, Store.prototype, {
- handle: function (event) {
- if (event.type === ActionTypes.CONNECTION_OPEN) {
- return this.fetch();
- }
- if (event.type === this.type) {
- if (event.cmd === "reset") {
- this.fetch();
- } else if (this._updates_before_fetch) {
- console.log("defer update", event);
- this._updates_before_fetch.push(event);
- } else {
- this[event.cmd](event.data);
- }
- }
- },
- close: function () {
- AppDispatcher.unregister(this.handle);
- },
- fetch: function () {
- console.log("fetch " + this.type);
- if (this._fetchxhr) {
- this._fetchxhr.abort();
- }
- this._fetchxhr = $.getJSON("/" + this.type, this.handle_fetch.bind(this));
- this._updates_before_fetch = []; // (JS: empty array is true)
- },
- handle_fetch: function (data) {
- this._fetchxhr = false;
- console.log(this.type + " fetched.", this._updates_before_fetch);
- this.reset(data.flows);
- var updates = this._updates_before_fetch;
- this._updates_before_fetch = false;
- for (var i = 0; i < updates.length; i++) {
- this.handle(updates[i]);
- }
- },
-}); \ No newline at end of file
diff --git a/web/src/js/stores/eventlogstore.js b/web/src/js/stores/eventlogstore.js
deleted file mode 100644
index 439c2360..00000000
--- a/web/src/js/stores/eventlogstore.js
+++ /dev/null
@@ -1,99 +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
-function EventLogView(store, live) {
- EventEmitter.call(this);
- this._store = store;
- this.live = live;
- this.log = [];
-
- this.add = this.add.bind(this);
-
- if (live) {
- this._store.addListener(ActionTypes.ADD_EVENT, this.add);
- }
-}
-_.extend(EventLogView.prototype, EventEmitter.prototype, {
- close: function () {
- this._store.removeListener(ActionTypes.ADD_EVENT, this.add);
- },
- getAll: function () {
- return this.log;
- },
- add: function (entry) {
- this.log.push(entry);
- if (this.log.length > 200) {
- this.log.shift();
- }
- this.emit("change");
- },
- add_bulk: function (messages) {
- 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");
- }
-});
-
-
-function _EventLogStore() {
- EventEmitter.call(this);
-}
-_.extend(_EventLogStore.prototype, EventEmitter.prototype, {
- getView: function (since) {
- var view = new EventLogView(this, !since);
- return view;
- /*
- //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: function (action) {
- switch (action.type) {
- case ActionTypes.ADD_EVENT:
- this.emit(ActionTypes.ADD_EVENT, action.data);
- 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/flowstore.js b/web/src/js/stores/flowstore.js
deleted file mode 100644
index 8bffe5b2..00000000
--- a/web/src/js/stores/flowstore.js
+++ /dev/null
@@ -1,105 +0,0 @@
-function LiveFlowStore() {
- return new LiveStore("flows");
-}
-
-function SortByInsertionOrder() {
- this.i = 0;
- this.map = {};
- this.key = this.key.bind(this);
-}
-SortByInsertionOrder.prototype.key = function (flow) {
- if (!(flow.id in this.map)) {
- this.i++;
- this.map[flow.id] = this.i;
- }
- return this.map[flow.id];
-};
-
-var default_sort = (new SortByInsertionOrder()).key;
-
-function FlowView(store, filt, sortfun) {
- EventEmitter.call(this);
- filt = filt || function (flow) {
- return true;
- };
- sortfun = sortfun || default_sort;
-
- this.store = store;
- this.store._views.push(this);
- this.recalculate(this.store._list, filt, sortfun);
-}
-
-_.extend(FlowView.prototype, EventEmitter.prototype, {
- close: function () {
- this.store._views = _.without(this.store._views, this);
- },
- recalculate: function (flows, filt, sortfun) {
- if (filt) {
- this.filt = filt;
- }
- if (sortfun) {
- this.sortfun = sortfun;
- }
-
- //Ugly workaround: Call .sortfun() for each flow once in order,
- //so that SortByInsertionOrder make sense.
- for (var i = 0; i < flows.length; i++) {
- this.sortfun(flows[i]);
- }
-
- this.flows = flows.filter(this.filt);
- this.flows.sort(function (a, b) {
- return this.sortfun(a) - this.sortfun(b);
- }.bind(this));
- this.emit("recalculate");
- },
- index: function (flow) {
- return _.sortedIndex(this.flows, flow, this.sortfun);
- },
- add: function (flow) {
- if (this.filt(flow)) {
- var idx = this.index(flow);
- if (idx === this.flows.length) { //happens often, .push is way faster.
- this.flows.push(flow);
- } else {
- this.flows.splice(idx, 0, flow);
- }
- this.emit("add", flow, idx);
- }
- },
- update: function (flow) {
- var idx;
- var i = this.flows.length;
- // Search from the back, we usually update the latest flows.
- while (i--) {
- if (this.flows[i].id === flow.id) {
- idx = i;
- break;
- }
- }
-
- if (idx === -1) { //not contained in list
- this.add(flow);
- } else if (!this.filt(flow)) {
- this.remove(flow.id);
- } else {
- if (this.sortfun(this.flows[idx]) !== this.sortfun(flow)) { //sortpos has changed
- this.remove(this.flows[idx]);
- this.add(flow);
- } else {
- this.flows[idx] = flow;
- this.emit("update", flow, idx);
- }
- }
- },
- remove: function (flow_id) {
- var i = this.flows.length;
- while (i--) {
- if (this.flows[i].id === flow_id) {
- this.flows.splice(i, 1);
- this.emit("remove", flow_id, i);
- break;
- }
- }
- }
-}); \ No newline at end of file
diff --git a/web/src/js/stores/settingstore.js b/web/src/js/stores/settingstore.js
deleted file mode 100644
index 7eef9b8f..00000000
--- a/web/src/js/stores/settingstore.js
+++ /dev/null
@@ -1,28 +0,0 @@
-function _SettingsStore() {
- 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",
- };
-}
-_.extend(_SettingsStore.prototype, EventEmitter.prototype, {
- getAll: function () {
- return this.settings;
- },
- handle: function (action) {
- switch (action.type) {
- case ActionTypes.UPDATE_SETTINGS:
- this.settings = action.settings;
- this.emit("change");
- break;
- default:
- return;
- }
- }
-});
-
-var SettingsStore = new _SettingsStore();
-AppDispatcher.register(SettingsStore.handle.bind(SettingsStore));