omf_web 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/omf_web_server +18 -0
- data/example/bridge/README.md +7 -0
- data/example/bridge/data_sources/sensor-sqlite.rb +15 -15
- data/example/bridge/htdocs/graph/js/bridge.js +35 -45
- data/example/bridge/htdocs/graph/js/event_line_chart.js +20 -18
- data/example/bridge/htdocs/graph/js/event_table.js +26 -28
- data/example/bridge/viz_server.rb +5 -9
- data/example/demo/demo_viz_server.rb +2 -2
- data/example/demo/widgets/linked_graphs_tab.yaml +9 -32
- data/example/openflow-gec15/code_tab.yaml +7 -12
- data/example/openflow-gec15/dashboard_tab.yaml +11 -12
- data/example/openflow-gec15/exp_source.rb +26 -26
- data/example/openflow-gec15/of_viz_server.rb +7 -7
- data/example/simple/simple.yaml +2 -1
- data/example/simple/simple_dynamic.yaml +1 -1
- data/example/web_rtc/web_rtc.yaml +54 -0
- data/example/web_rtc/webrtc-exp_1381786573.sq3 +0 -0
- data/lib/omf-web/config.ru +1 -1
- data/lib/omf-web/content/content_proxy.rb +2 -2
- data/lib/omf-web/content/file_repository.rb +11 -53
- data/lib/omf-web/content/git_repository.rb +1 -1
- data/lib/omf-web/content/irods_repository.rb +1 -1
- data/lib/omf-web/content/repository.rb +5 -3
- data/lib/omf-web/content/static_repository.rb +25 -11
- data/lib/omf-web/data_source_proxy.rb +3 -3
- data/lib/omf-web/rack/content_handler.rb +2 -2
- data/lib/omf-web/rack/session_authenticator.rb +3 -3
- data/lib/omf-web/rack/tab_mapper.rb +2 -2
- data/lib/omf-web/rack/update_handler.rb +2 -2
- data/lib/omf-web/rack/websocket_handler.rb +3 -3
- data/lib/omf-web/rack/widget_mapper.rb +2 -2
- data/lib/omf-web/session_store.rb +2 -2
- data/lib/omf-web/theme/abstract_page.rb +15 -24
- data/lib/omf-web/theme/bright/code_renderer.rb +24 -30
- data/lib/omf-web/theme/bright/data_renderer.rb +7 -5
- data/lib/omf-web/theme/bright/page.rb +2 -1
- data/lib/omf-web/theme/bright/widget_chrome.rb +16 -14
- data/lib/omf-web/theme.rb +1 -1
- data/lib/omf-web/thin/logging.rb +18 -13
- data/lib/omf-web/thin/runner.rb +2 -2
- data/lib/omf-web/thin/server.rb +105 -27
- data/lib/omf-web/version.rb +1 -1
- data/lib/omf-web/widget/abstract_widget.rb +3 -3
- data/lib/omf-web/widget/data_widget.rb +1 -0
- data/lib/omf-web/widget/text/maruku.rb +1 -1
- data/lib/omf-web/widget.rb +22 -22
- data/lib/omf_web.rb +1 -1
- data/omf_web.gemspec +18 -15
- data/share/htdocs/graph/js/abstract_chart.js +69 -68
- data/share/htdocs/graph/js/abstract_nv_chart.js +35 -33
- data/share/htdocs/graph/js/abstract_widget.js +61 -62
- data/share/htdocs/graph/js/axis.js +30 -25
- data/share/htdocs/graph/js/barchart_brush.js +23 -21
- data/share/htdocs/graph/js/code_mirror.js +35 -33
- data/share/htdocs/graph/js/discrete_bar_chart.js +27 -30
- data/share/htdocs/graph/js/histogram2.js +37 -47
- data/share/htdocs/graph/js/line_chart3.js +36 -30
- data/share/htdocs/graph/js/line_chart_with_focus.js +10 -9
- data/share/htdocs/graph/js/multi_barchart.js +33 -30
- data/share/htdocs/graph/js/network2.js +98 -97
- data/share/htdocs/graph/js/pie_chart2.js +25 -23
- data/share/htdocs/graph/js/scatter_plot.js +38 -36
- data/share/htdocs/graph/js/table2.js +60 -54
- data/share/htdocs/js/app.js +43 -0
- data/share/htdocs/js/{data_source2.js → data_source3.js} +44 -73
- data/share/htdocs/js/data_source_repo.js +42 -0
- data/share/htdocs/require/nv_d3.js +2 -0
- data/share/htdocs/theme/abstract/abstract.js +4 -4
- data/share/htdocs/vendor/VERSION_MAP.yaml +2 -0
- data/share/htdocs/vendor/require-2.1.8/require.js +2053 -0
- data/share/htdocs/vendor/require-2.1.8/require.min.js +36 -0
- data/share/htdocs/vendor/require-css-0.0.7/.gitignore +1 -0
- data/share/htdocs/vendor/require-css-0.0.7/LICENSE +10 -0
- data/share/htdocs/vendor/require-css-0.0.7/README.md +231 -0
- data/share/htdocs/vendor/require-css-0.0.7/bower.json +5 -0
- data/share/htdocs/vendor/require-css-0.0.7/css-builder.js +251 -0
- data/share/htdocs/vendor/require-css-0.0.7/css.js +436 -0
- data/share/htdocs/vendor/require-css-0.0.7/normalize.js +138 -0
- data/share/htdocs/vendor/require-css-0.0.7/package.json +5 -0
- data/share/htdocs/vendor/spin/jquery.spin.js +6 -4
- metadata +100 -74
- checksums.yaml +0 -7
- data/bin/omf_web_demo +0 -3
- data/bin/omf_web_demo.sh +0 -7
- data/bin/omf_web_server.rb +0 -157
- data/lib/omf_common/lobject.rb +0 -187
- data/lib/omf_common/log4r_outputter.rb +0 -69
- data/sample.sq3 +0 -0
- data/share/htdocs/js/data_source.js +0 -173
- data/share/htdocs/js/require3.js +0 -292
data/lib/omf_common/lobject.rb
DELETED
@@ -1,187 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Copyright (c) 2006-2009 National ICT Australia (NICTA), Australia
|
3
|
-
#
|
4
|
-
# Copyright (c) 2004-2009 WINLAB, Rutgers University, USA
|
5
|
-
#
|
6
|
-
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
-
# of this software and associated documentation files (the "Software"), to deal
|
8
|
-
# in the Software without restriction, including without limitation the rights
|
9
|
-
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
-
# copies of the Software, and to permit persons to whom the Software is
|
11
|
-
# furnished to do so, subject to the following conditions:
|
12
|
-
#
|
13
|
-
# The above copyright notice and this permission notice shall be included in
|
14
|
-
# all copies or substantial portions of the Software.
|
15
|
-
#
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
-
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
-
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
-
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
-
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
-
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
22
|
-
# THE SOFTWARE.
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
require 'rubygems'
|
27
|
-
require 'date'
|
28
|
-
require 'log4r'
|
29
|
-
require 'log4r/configurator'
|
30
|
-
require 'log4r/yamlconfigurator'
|
31
|
-
require 'log4r/outputter/datefileoutputter'
|
32
|
-
require 'omf_common/log4r_outputter'
|
33
|
-
|
34
|
-
#include Log4r
|
35
|
-
|
36
|
-
module OMF; module Common; end end
|
37
|
-
|
38
|
-
#
|
39
|
-
# An extended object class with support for logging
|
40
|
-
#
|
41
|
-
module OMF::Common
|
42
|
-
module Loggable
|
43
|
-
@@logger = nil
|
44
|
-
@@rootLoggerName = nil
|
45
|
-
|
46
|
-
|
47
|
-
#
|
48
|
-
# Initialize the logger. The 'appName' is used to build some of the defaults.
|
49
|
-
# The 'environment' is the name of the root
|
50
|
-
# logger. 'AppInstance' and 'appName' are available as parameters
|
51
|
-
# in the log configuration file. The 'opts' hash can optionally
|
52
|
-
# contain information on how to find a configuration file. The
|
53
|
-
# following keys are used:
|
54
|
-
#
|
55
|
-
# * :environment - Name used for root logger name ['development']
|
56
|
-
# * :env - Name of environment variable holding dominant config file
|
57
|
-
# * :fileName - Name of config file [#{appName}_log.xml]
|
58
|
-
# * :searchPath - Array of directories to look for 'fileName'
|
59
|
-
#
|
60
|
-
def self.init_log(appName, opts = {})
|
61
|
-
|
62
|
-
#@@logger = ::Log4r::Logger.new(appName)
|
63
|
-
set_environment(opts[:environment] || 'development')
|
64
|
-
@@logger = ::Log4r::Logger.new(@@rootLoggerName)
|
65
|
-
|
66
|
-
configFile = opts[:configFile]
|
67
|
-
if (configFile == nil && logEnv = opts[:env])
|
68
|
-
configFile = ENV[logEnv]
|
69
|
-
end
|
70
|
-
if (configFile != nil)
|
71
|
-
# Make sure log exists ...
|
72
|
-
configFile = File.exists?(configFile) ? configFile : nil
|
73
|
-
else
|
74
|
-
name = opts[:fileName] || "#{appName}_log4r.yaml"
|
75
|
-
if ((searchPath = opts[:searchPath]) != nil)
|
76
|
-
searchPath = searchPath.is_a?(Enumerable) ? searchPath : [searchPath]
|
77
|
-
logDir = searchPath.find {|dir|
|
78
|
-
File.exists?("#{dir}/#{name}")
|
79
|
-
}
|
80
|
-
#puts "logDir '#{logDir}:#{logDir.class}'"
|
81
|
-
configFile = "#{logDir}/#{name}" if logDir != nil
|
82
|
-
end
|
83
|
-
end
|
84
|
-
#puts "config file '#{configFile}'"
|
85
|
-
if !(configFile || '').empty?
|
86
|
-
::Log4r::Configurator['appName'] = appName
|
87
|
-
begin
|
88
|
-
ycfg = YAML.load_file(configFile)
|
89
|
-
::Log4r::YamlConfigurator.decode_yaml(ycfg['log4r'])
|
90
|
-
#::Log4r::Configurator.load_xml_file(configFile)
|
91
|
-
# rescue ::Log4r::ConfigError => ex
|
92
|
-
# @@logger.outputters = ::Log4r::Outputter.stdout
|
93
|
-
# # TODO: FIX ME
|
94
|
-
# puts("ERROR: Log::Config: #{ex}")
|
95
|
-
end
|
96
|
-
else
|
97
|
-
# set default behavior
|
98
|
-
::Log4r::Logger.global.level = ::Log4r::ALL
|
99
|
-
formatter = ::Log4r::PatternFormatter.new(:pattern => "%l %c: %m")
|
100
|
-
::Log4r::StdoutOutputter.new('console', :formatter => formatter)
|
101
|
-
@@logger.add 'console'
|
102
|
-
#@@logger.outputters = ::Log4r::StdoutOutputter.new('console') #Outputter.stdout
|
103
|
-
##@@logger.outputters = ::Log4r::Outputter.stdout
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def self.set_environment(root_logger_name)
|
108
|
-
if root_logger_name.nil? || root_logger_name.empty?
|
109
|
-
# TODO: FIX ME
|
110
|
-
puts("ERROR: LObject: Ignoring empty root logger")
|
111
|
-
return
|
112
|
-
end
|
113
|
-
@@rootLoggerName = root_logger_name
|
114
|
-
end
|
115
|
-
|
116
|
-
def self.logger(category)
|
117
|
-
raise "Logger not initialized" unless @@logger
|
118
|
-
|
119
|
-
name = "#{@@rootLoggerName}::#{category}"
|
120
|
-
logger = Log4r::Logger[name]
|
121
|
-
if logger == nil
|
122
|
-
logger = Log4r::Logger.new(name)
|
123
|
-
end
|
124
|
-
return logger
|
125
|
-
end
|
126
|
-
|
127
|
-
def debug(*message)
|
128
|
-
logger = _logger()
|
129
|
-
logger.debug(message.join('')) if logger.debug?
|
130
|
-
end
|
131
|
-
|
132
|
-
def info(*message)
|
133
|
-
logger = _logger()
|
134
|
-
logger.info(message.join('')) if logger.info?
|
135
|
-
end
|
136
|
-
|
137
|
-
def warn(*message)
|
138
|
-
logger = _logger()
|
139
|
-
logger.warn(message.join('')) if logger.warn?
|
140
|
-
end
|
141
|
-
|
142
|
-
def error(*message)
|
143
|
-
logger = _logger()
|
144
|
-
logger.error(message.join('')) if logger.error?
|
145
|
-
end
|
146
|
-
|
147
|
-
def fatal(*message)
|
148
|
-
logger = _logger()
|
149
|
-
logger.fatal(message.join('')) if logger.fatal?
|
150
|
-
end
|
151
|
-
|
152
|
-
def _logger(category = nil)
|
153
|
-
unless @logger #&& category.nil?
|
154
|
-
cat = self.class.to_s
|
155
|
-
if category
|
156
|
-
cat = "#{cat}-#{category}"
|
157
|
-
end
|
158
|
-
@logger = OMF::Common::Loggable.logger(cat)
|
159
|
-
end
|
160
|
-
return @logger
|
161
|
-
end
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
class LObject
|
166
|
-
include Loggable
|
167
|
-
extend Loggable
|
168
|
-
|
169
|
-
def initialize(logCategory = nil)
|
170
|
-
_logger(logCategory)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
end
|
175
|
-
|
176
|
-
if $0 == __FILE__
|
177
|
-
OMF::Common::Loggable.init_log 'foo'
|
178
|
-
#puts OMF::Common::Loggable.logger('test').inspect
|
179
|
-
o = OMF::Common::LObject.new
|
180
|
-
#puts (o.methods - Object.new.methods).sort
|
181
|
-
o.debug 'Something happened'
|
182
|
-
|
183
|
-
o2 = OMF::Common::LObject.new('fancy')
|
184
|
-
o2.debug 'Something happened'
|
185
|
-
|
186
|
-
end
|
187
|
-
|
@@ -1,69 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'log4r/outputter/fileoutputter'
|
4
|
-
|
5
|
-
module Log4r
|
6
|
-
# When daemonizing, the file handler gets closed and we fall over here.
|
7
|
-
# The following monkey patch retries once to open the file and write again
|
8
|
-
#
|
9
|
-
class FileOutputter
|
10
|
-
|
11
|
-
# def initialize(_name, hash={})
|
12
|
-
# raise "#{_name}::#{hash.inspect}"
|
13
|
-
# end
|
14
|
-
|
15
|
-
def write(data)
|
16
|
-
#puts ">>> #{data}"
|
17
|
-
begin
|
18
|
-
@out.print data
|
19
|
-
@out.flush
|
20
|
-
rescue IOError => ioe # recover from this instead of crash
|
21
|
-
# retry once
|
22
|
-
unless @retrying
|
23
|
-
@retrying = true
|
24
|
-
@out = File.new(@filename, (@trunc ? "w" : "a"))
|
25
|
-
return write(data)
|
26
|
-
end
|
27
|
-
Logger.log_internal {"IOError in Outputter '#{@name}'!"}
|
28
|
-
Logger.log_internal {ioe}
|
29
|
-
close
|
30
|
-
rescue NameError => ne
|
31
|
-
Logger.log_internal {"Outputter '#{@name}' IO is #{@out.class}!"}
|
32
|
-
Logger.log_internal {ne}
|
33
|
-
close
|
34
|
-
end
|
35
|
-
@retrying = false
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# module OMF; module Common; end end
|
41
|
-
#
|
42
|
-
# #
|
43
|
-
# # An extended object class with support for logging
|
44
|
-
# #
|
45
|
-
# module OMF::Common
|
46
|
-
# module Log4r
|
47
|
-
#
|
48
|
-
# class DateFileOutputter < ::Log4r::DateFileOutputter
|
49
|
-
#
|
50
|
-
# def write(data)
|
51
|
-
# puts ">>> #{data}"
|
52
|
-
# begin
|
53
|
-
# @out.print data
|
54
|
-
# @out.flush
|
55
|
-
# rescue IOError => ioe # recover from this instead of crash
|
56
|
-
# Logger.log_internal {"IOError in Outputter '#{@name}'!"}
|
57
|
-
# Logger.log_internal {ioe}
|
58
|
-
# close
|
59
|
-
# rescue NameError => ne
|
60
|
-
# Logger.log_internal {"Outputter '#{@name}' IO is #{@out.class}!"}
|
61
|
-
# Logger.log_internal {ne}
|
62
|
-
# close
|
63
|
-
# end
|
64
|
-
# end
|
65
|
-
# end
|
66
|
-
# end
|
67
|
-
# end
|
68
|
-
#
|
69
|
-
# puts "REQUIRE #{OMF::Common::Log4r::DateFileOutputter}"
|
data/sample.sq3
DELETED
File without changes
|
@@ -1,173 +0,0 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
OML.data_sources = function() {
|
4
|
-
var sources = {};
|
5
|
-
|
6
|
-
function context() {};
|
7
|
-
|
8
|
-
context.register = function(name, updateURL, schema, events) {
|
9
|
-
return sources[name] = new OML.data_source(name, updateURL, schema, events);
|
10
|
-
//return context;
|
11
|
-
};
|
12
|
-
|
13
|
-
context.lookup = function(ds_descr) {
|
14
|
-
var name;
|
15
|
-
var dynamic = false;
|
16
|
-
|
17
|
-
if (typeof(ds_descr) == 'object') {
|
18
|
-
name = ds_descr.name;
|
19
|
-
dynamic = ds_descr.dynamic;
|
20
|
-
} else {
|
21
|
-
name = ds_descr;
|
22
|
-
}
|
23
|
-
var source = sources[name];
|
24
|
-
if (! source) {
|
25
|
-
throw("Unknown data source '" + name + "'.");
|
26
|
-
}
|
27
|
-
if (dynamic) {
|
28
|
-
source.is_dynamic(dynamic);
|
29
|
-
}
|
30
|
-
return source;
|
31
|
-
};
|
32
|
-
|
33
|
-
return context;
|
34
|
-
}();
|
35
|
-
|
36
|
-
OML['data_source'] = function(name, updateURL, schema, events) {
|
37
|
-
this.version = "0.1";
|
38
|
-
|
39
|
-
this.init = function() {
|
40
|
-
this.event_name = "data_source." + this.name + ".changed";
|
41
|
-
this.indexes = [];
|
42
|
-
//this.is_dynamic = false;
|
43
|
-
};
|
44
|
-
|
45
|
-
this.name = name;
|
46
|
-
if (! updateURL) {
|
47
|
-
updateURL = '/_update/' + name + '?sid=' + OML.session_id;
|
48
|
-
}
|
49
|
-
this.update_url = updateURL;
|
50
|
-
this.update_interval = -1;
|
51
|
-
this.schema = schema;
|
52
|
-
this.events = events; // array of events
|
53
|
-
this.init();
|
54
|
-
|
55
|
-
this.create_index = function(index) {
|
56
|
-
var idx = this.indexes[index];
|
57
|
-
if (idx) return;
|
58
|
-
|
59
|
-
this._create_index(index);
|
60
|
-
};
|
61
|
-
|
62
|
-
this._create_index = function(index) {
|
63
|
-
idx = this.indexes[index] = {};
|
64
|
-
// index ignores rows with identical index
|
65
|
-
_.map(this.events, function(r) {
|
66
|
-
idx[r[index]] = r;
|
67
|
-
});
|
68
|
-
};
|
69
|
-
|
70
|
-
this.get_indexed_row = function(index, key) {
|
71
|
-
var idx = this.indexes[index];
|
72
|
-
if (idx == undefined) {
|
73
|
-
throw "Need to create index first";
|
74
|
-
}
|
75
|
-
return idx[key];
|
76
|
-
}
|
77
|
-
|
78
|
-
this.update_indexes = function() {
|
79
|
-
var self = this;
|
80
|
-
_.each(this.indexes, function(value, key) {
|
81
|
-
var i = 0;
|
82
|
-
self._create_index(key);
|
83
|
-
});
|
84
|
-
|
85
|
-
}
|
86
|
-
|
87
|
-
this.is_dynamic = function(_) {
|
88
|
-
if (!arguments.length) {
|
89
|
-
return this.update_interval > 0 || this.ws;
|
90
|
-
}
|
91
|
-
|
92
|
-
var opts = _;
|
93
|
-
var interval = -1;
|
94
|
-
if (typeof(opts) == 'number') {
|
95
|
-
interval = opts
|
96
|
-
} else if (opts == true) {
|
97
|
-
interval = 3;
|
98
|
-
}
|
99
|
-
if (interval < 0) return false;
|
100
|
-
|
101
|
-
|
102
|
-
//if (window.WebSocket) {
|
103
|
-
if (false) { // web sockets don't work right now
|
104
|
-
if (this.ws) return; // already running
|
105
|
-
|
106
|
-
var url = 'ws://' + window.location.host + '/_ws';
|
107
|
-
var ws = this.ws = new WebSocket(url);
|
108
|
-
var self = this;
|
109
|
-
ws.onopen = function() {
|
110
|
-
ws.send('id:' + this.name);
|
111
|
-
};
|
112
|
-
ws.onmessage = function(evt) {
|
113
|
-
// evt.data contains received string.
|
114
|
-
var msg = jQuery.parseJSON(evt.data);
|
115
|
-
var data = msg;
|
116
|
-
this.events.append(data);
|
117
|
-
};
|
118
|
-
ws.onclose = function() {
|
119
|
-
var status = "onclose";
|
120
|
-
};
|
121
|
-
ws.onerror = function(evt) {
|
122
|
-
var status = "onerror";
|
123
|
-
};
|
124
|
-
} else {
|
125
|
-
var first_time = this.update_interval < 0;
|
126
|
-
|
127
|
-
if (this.update_interval < 0 || this.update_interval > interval) {
|
128
|
-
this.update_interval = interval;
|
129
|
-
}
|
130
|
-
|
131
|
-
if (first_time) {
|
132
|
-
var self = this;
|
133
|
-
var check1 = $('.widget-title-icon');
|
134
|
-
// L.require([], function() {
|
135
|
-
// var check2 = $('.widget-title-icon');
|
136
|
-
// var i = 0;
|
137
|
-
// });
|
138
|
-
L.require(['/resource/vendor/jquery/jquery.js', '/resource/vendor/jquery/jquery.periodicalupdater.js'], function() {
|
139
|
-
var check3 = $('.widget-title-icon');
|
140
|
-
|
141
|
-
var update_interval = self.update_interval * 1000;
|
142
|
-
if (update_interval < 1000) update_interval = 3000;
|
143
|
-
var opts = {
|
144
|
-
method: 'get', // method; get or post
|
145
|
-
data: '', // array of values to be passed to the page - e.g. {name: "John", greeting: "hello"}
|
146
|
-
minTimeout: update_interval, // starting value for the timeout in milliseconds
|
147
|
-
maxTimeout: 4 * update_interval, // maximum length of time between requests
|
148
|
-
multiplier: 2, // if set to 2, timerInterval will double each time the response hasn't changed (up to maxTimeout)
|
149
|
-
type: 'json', // response type - text, xml, json, etc. See $.ajax config options
|
150
|
-
maxCalls: 0, // maximum number of calls. 0 = no limit.
|
151
|
-
autoStop: 0 // automatically stop requests after this many returns of the same data. 0 = disabled.
|
152
|
-
};
|
153
|
-
$.PeriodicalUpdater(self.update_url, opts, function(reply) {
|
154
|
-
self.events = reply.events;
|
155
|
-
self.update_indexes();
|
156
|
-
reply.data_source = self;
|
157
|
-
OHUB.trigger(self.event_name, reply);
|
158
|
-
});
|
159
|
-
});
|
160
|
-
} else {
|
161
|
-
// TODO: Don't know how to change updater to decrease interval - hope web sockets start working again soon
|
162
|
-
}
|
163
|
-
}
|
164
|
-
return true;
|
165
|
-
}
|
166
|
-
|
167
|
-
this.on_changed = function(update_f) {
|
168
|
-
OHUB.bind(this.event_name, update_f);
|
169
|
-
}
|
170
|
-
|
171
|
-
return this;
|
172
|
-
}
|
173
|
-
|