rsence-pre 2.1.0.14 → 2.1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/conf/rsence_command_strings.yaml +15 -4
- data/lib/conf/argv.rb +10 -7
- data/lib/plugins/plugin.rb +128 -1
- data/lib/session/msg.rb +14 -0
- data/lib/session/sessionmanager.rb +3 -0
- data/plugins/main/info.yaml +5 -4
- data/plugins/main/main.rb +170 -24
- metadata +7 -9
- data/plugins/index_html/index_html.rb +0 -120
- data/plugins/index_html/info.yaml +0 -18
- /data/plugins/{index_html → main}/img/loading.gif +0 -0
- /data/plugins/{index_html → main}/img/riassence.gif +0 -0
- /data/plugins/{index_html → main}/tmpl/index.html +0 -0
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.0.
|
1
|
+
2.1.0.15.pre
|
@@ -46,7 +46,7 @@
|
|
46
46
|
Invalid environment: <%%= env_path.inspect %>
|
47
47
|
|
48
48
|
Type 'rsence help <%%= @cmd.to_s %>' for usage."
|
49
|
-
Type 'rsence help
|
49
|
+
Type 'rsence help init' for environment initialization usage."
|
50
50
|
:invalid_option_chr: |
|
51
51
|
Invalid option character for option character block <%%= arg.inspect %>:
|
52
52
|
<%%= chr.inspect %>
|
@@ -79,7 +79,7 @@
|
|
79
79
|
No process running.
|
80
80
|
:session_data_saved: |
|
81
81
|
Session data saved.
|
82
|
-
# Strings for the
|
82
|
+
# Strings for the init command
|
83
83
|
:initenv:
|
84
84
|
:env_already_initialized: |
|
85
85
|
Environment already initialized.
|
@@ -171,6 +171,7 @@
|
|
171
171
|
|
172
172
|
:confirm_config: "Is the configuration correct, "
|
173
173
|
:creating_dirs: "Creating directories..."
|
174
|
+
:install_welcome: "Do you want to install the 'welcome' plugin as a starting point, "
|
174
175
|
:installing_welcome_plugin: |+
|
175
176
|
Installing the welcome plugin. To remove it, just delete this folder:
|
176
177
|
<%%= welcome_plugin_dst %>
|
@@ -278,9 +279,19 @@
|
|
278
279
|
'say' command installed.
|
279
280
|
|
280
281
|
:initenv: |+
|
281
|
-
|
282
|
+
Alias name of the 'init' command.
|
283
|
+
|
284
|
+
See: rsence help init
|
285
|
+
|
286
|
+
:initialize: |+
|
287
|
+
Alias name of the 'init' command.
|
288
|
+
|
289
|
+
See: rsence help init
|
290
|
+
|
291
|
+
:init: |+
|
292
|
+
usage: 'rsence init [options] [PATH]'
|
282
293
|
|
283
|
-
The '
|
294
|
+
The 'init' command creates a new RSence environment.
|
284
295
|
|
285
296
|
The expected structure of a project environment (where 'project_directory'
|
286
297
|
is the directory of your project) is:
|
data/lib/conf/argv.rb
CHANGED
@@ -51,10 +51,10 @@ module RSence
|
|
51
51
|
# system that fully implements POSIX standard signals.
|
52
52
|
# These are necessary to send signals to the background process.
|
53
53
|
if not RSence.pid_support?
|
54
|
-
@@cmds = [ :run, :initenv, :version, :help ]
|
54
|
+
@@cmds = [ :run, :init, :initenv, :version, :help ]
|
55
55
|
else
|
56
56
|
@@cmds = [ :run, :status, :start, :stop, :restart, :save,
|
57
|
-
:initenv, :version, :help ]
|
57
|
+
:init, :initenv, :version, :help ]
|
58
58
|
end
|
59
59
|
|
60
60
|
help_avail_cmds = @@cmds.map{|cmd|cmd.to_s}.join("\n ")
|
@@ -724,10 +724,13 @@ module RSence
|
|
724
724
|
run_dir = File.expand_path( 'run', env_dir )
|
725
725
|
Dir.mkdir( run_dir )
|
726
726
|
unless create_blank
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
727
|
+
print @@strs[:initenv][:install_welcome]
|
728
|
+
if yesno(true)
|
729
|
+
welcome_plugin_dir = File.join( SERVER_PATH, 'setup', 'welcome' )
|
730
|
+
welcome_plugin_dst = File.join( plugins_dir, 'welcome' )
|
731
|
+
puts ERB.new( @@strs[:initenv][:installing_welcome_plugin] ).result( binding )
|
732
|
+
FileUtils.cp_r( welcome_plugin_dir, welcome_plugin_dst )
|
733
|
+
end
|
731
734
|
end
|
732
735
|
puts @@strs[:initenv][:creating_files]
|
733
736
|
conf_file = File.join( conf_dir, 'config.yaml' )
|
@@ -789,7 +792,7 @@ module RSence
|
|
789
792
|
parse_status_argv
|
790
793
|
elsif cmd == :save
|
791
794
|
parse_save_argv
|
792
|
-
elsif cmd == :initenv
|
795
|
+
elsif cmd == :initenv or cmd == :init
|
793
796
|
parse_initenv_argv
|
794
797
|
end
|
795
798
|
else
|
data/lib/plugins/plugin.rb
CHANGED
@@ -289,13 +289,140 @@ module RSence
|
|
289
289
|
end
|
290
290
|
end
|
291
291
|
|
292
|
+
# @private Returns a hash with valid symbol keys for +#value_call+.
|
293
|
+
def sanitize_value_call_hash( hash_dirty )
|
294
|
+
hash_clean = {}
|
295
|
+
hash_dirty.each do | key, value |
|
296
|
+
if key.to_sym == :method
|
297
|
+
hash_clean[:method] = value.to_sym
|
298
|
+
elsif key.to_sym == :plugin
|
299
|
+
hash_clean[:plugin] = value.to_sym
|
300
|
+
elsif key.to_sym == :args
|
301
|
+
if value.class == Array
|
302
|
+
hash_clean[:args] = value
|
303
|
+
else
|
304
|
+
warn "Invalid arguments (#{value.inspect}). Expected Array."
|
305
|
+
end
|
306
|
+
elsif key.to_sym == :uses_msg
|
307
|
+
value == false if value == nil
|
308
|
+
if value.class == TrueClass or value.class == FalseClass
|
309
|
+
hash_clean[:uses_msg] = value
|
310
|
+
else
|
311
|
+
warn "Invalid argument for :uses_msg (#{value.inspect}), expected boolean."
|
312
|
+
end
|
313
|
+
else
|
314
|
+
warn "Undefined value_call key: #{key.inspect}"
|
315
|
+
end
|
316
|
+
end
|
317
|
+
return hash_clean
|
318
|
+
end
|
319
|
+
|
320
|
+
# @private Returns a sanitized copy of a single responder specification.
|
321
|
+
def sanitize_value_responders( responders_dirty )
|
322
|
+
if responders_dirty.class != Array
|
323
|
+
warn "Unsupported responders type: #{responders_dirty.inspect} (expected Array or Hash). Trying work-around.." unless responders_dirty.class == Hash
|
324
|
+
responders_dirty = [ responders_dirty ]
|
325
|
+
end
|
326
|
+
responders_clean = []
|
327
|
+
responders_dirty.each do |responder_dirty|
|
328
|
+
if responder_dirty.class != Hash
|
329
|
+
if responder_dirty.class == Symbol
|
330
|
+
responder_dirty = { :method => responder_dirty }
|
331
|
+
elsif responder_dirty.class == String
|
332
|
+
if responder_dirty.include?('.')
|
333
|
+
last_dot_index = responder_dirty.rindex('.')
|
334
|
+
responder_plugin = responder_dirty[0..(last_dot_index-1)].to_sym
|
335
|
+
responder_method = responder_dirty[(last_dot_index+1)..-1].to_sym
|
336
|
+
responder_dirty = { :method => responder_method, :plugin => responder_plugin }
|
337
|
+
else
|
338
|
+
responder_dirty = { :method => responders_dirty.to_sym }
|
339
|
+
end
|
340
|
+
else
|
341
|
+
warn "Unsupported responder type: #{responder_dirty.inspect}. Skipping.."
|
342
|
+
next
|
343
|
+
end
|
344
|
+
end
|
345
|
+
responder_clean = {}
|
346
|
+
responder_dirty.each do |key, value|
|
347
|
+
if key.to_sym == :method
|
348
|
+
responder_clean[ :method ] = value.to_sym
|
349
|
+
elsif key.to_sym == :plugin
|
350
|
+
responder_clean[ :plugin ] = value.to_sym
|
351
|
+
else
|
352
|
+
warn "Unsupported responder key: #{key.inspect} => #{value.inspect}. Ignoring.."
|
353
|
+
end
|
354
|
+
end
|
355
|
+
if responder_clean.has_key?( :method )
|
356
|
+
responders_clean.push( responder_clean )
|
357
|
+
else
|
358
|
+
warn "Responder (#{responder_clean.inspect}) is missing a :method specification. Skipping.."
|
359
|
+
end
|
360
|
+
end
|
361
|
+
return responders_clean
|
362
|
+
end
|
363
|
+
|
364
|
+
# @private Returns a sanitized copy of a single value item.
|
365
|
+
def sanitize_value_item( value_item_dirty )
|
366
|
+
value_item_clean = {}
|
367
|
+
value_item_dirty.each do | key, value |
|
368
|
+
if key.to_sym == :value or key.to_sym == :data
|
369
|
+
if [Array, Hash, String, TrueClass, FalseClass, Fixnum, Bignum, Float, NilClass].include? value.class
|
370
|
+
value_item_clean[:value] = value
|
371
|
+
else
|
372
|
+
warn "Unsupported value class (#{value.class.inspect}) for value: #{value.inspect}. Using 0 instead."
|
373
|
+
value_item_clean[:value] = 0
|
374
|
+
end
|
375
|
+
elsif key.to_sym == :value_call or key.to_sym == :call
|
376
|
+
value_item_clean[:value_call] = sanitize_value_call_hash( value )
|
377
|
+
elsif key.to_sym == :restore_default or key.to_sym == :restore
|
378
|
+
if [TrueClass, FalseClass].include? value.class
|
379
|
+
value_item_clean[:restore_default] = value
|
380
|
+
else
|
381
|
+
warn "Unsupported type of restore (expected true or false): #{value.inspect}. Using true instead."
|
382
|
+
value_item_clean[:restore_default] = true
|
383
|
+
end
|
384
|
+
elsif key.to_sym == :responders or key.to_sym == :responder
|
385
|
+
sanitized_responders = sanitize_value_responders( value )
|
386
|
+
value_item_clean[:responders] = sanitized_responders unless sanitized_responders.empty?
|
387
|
+
else
|
388
|
+
warn "Unsupported value specification key: #{key.inspect}."
|
389
|
+
end
|
390
|
+
end
|
391
|
+
return value_item_clean
|
392
|
+
end
|
393
|
+
|
394
|
+
# @private Returns sanitized hash of the structure specified in values.yaml
|
395
|
+
def sanitize_values_yaml( values_path )
|
396
|
+
values_dirty = yaml_read( values_path )
|
397
|
+
return false if values_dirty == false
|
398
|
+
if values_dirty.class == Hash
|
399
|
+
values_clean = {}
|
400
|
+
values_dirty.each do |key, value|
|
401
|
+
values_clean[ key.to_sym ] = sanitize_value_item( value )
|
402
|
+
end
|
403
|
+
return values_clean unless values_clean.empty?
|
404
|
+
elsif values_dirty.class == Array
|
405
|
+
values_clean = []
|
406
|
+
values_dirty.each do |values_dirty_segment|
|
407
|
+
values_clean_segment = {}
|
408
|
+
values_dirty_segment.each do |key, value|
|
409
|
+
values_clean_segment[ key.to_sym ] = sanitize_value_item( value )
|
410
|
+
end
|
411
|
+
values_clean.push( values_clean_segment )
|
412
|
+
end
|
413
|
+
return values_clean unless values_clean.empty?
|
414
|
+
else
|
415
|
+
warn "Unsupported format of values.yaml, got: #{values_dirty.inspect}, expected Hash or Array."
|
416
|
+
end
|
417
|
+
return false
|
418
|
+
end
|
292
419
|
|
293
420
|
# @private This method looks looks for a file called "values.yaml" in the plugin's bundle directory.
|
294
421
|
# If this file is found, it loads it for initial value definitions.
|
295
422
|
# These definitions are accessible as the +@values+ attribute.
|
296
423
|
def init_values
|
297
424
|
values_path = bundle_path( 'values.yaml' )
|
298
|
-
return
|
425
|
+
return sanitize_values_yaml( values_path )
|
299
426
|
end
|
300
427
|
|
301
428
|
# @private Creates a new instance of HValue, assigns it as +value_name+ into the
|
data/lib/session/msg.rb
CHANGED
@@ -175,6 +175,13 @@ module RSence
|
|
175
175
|
@session[:user_id]
|
176
176
|
end
|
177
177
|
|
178
|
+
# Getter for the user info hash
|
179
|
+
# @return [Hash] The current user info hash. Returns {} by default.
|
180
|
+
def user_info
|
181
|
+
@session[:user_info] = {} unless @session.has_key?(:user_info)
|
182
|
+
@session[:user_info]
|
183
|
+
end
|
184
|
+
|
178
185
|
# @private used for automatic reload of page, when the plugins have been changed.
|
179
186
|
def refresh_page?( plugin_incr )
|
180
187
|
if plugin_incr != @session[:plugin_incr]
|
@@ -191,6 +198,13 @@ module RSence
|
|
191
198
|
def user_id=(user_id)
|
192
199
|
@session[:user_id] = user_id
|
193
200
|
end
|
201
|
+
|
202
|
+
# Setter for the user info
|
203
|
+
# @param [Hash] user_info The user info hash to set. Use in login situations to store the user information.
|
204
|
+
# @return [nil]
|
205
|
+
def user_info=(user_info)
|
206
|
+
@session[:user_info] = user_info
|
207
|
+
end
|
194
208
|
|
195
209
|
# Returns the session id
|
196
210
|
# @return [Number]
|
data/plugins/main/info.yaml
CHANGED
@@ -3,16 +3,17 @@
|
|
3
3
|
title: Main Plugin
|
4
4
|
|
5
5
|
# The human-readable version of the package
|
6
|
-
version: 2.
|
6
|
+
version: 2.1.0
|
7
7
|
|
8
8
|
# A brief description of the package (rdoc formatting supported)
|
9
9
|
description: |
|
10
|
-
The main plugin manages the flow of communication between client and server
|
10
|
+
The main plugin manages the flow of communication between client and server
|
11
|
+
as well as initializes a startup web page, if no other plugin does so.
|
11
12
|
|
12
13
|
# System version requirement.
|
13
|
-
sys_version: '>= 2.
|
14
|
+
sys_version: '>= 2.1.0'
|
14
15
|
|
15
16
|
category: :system
|
16
17
|
|
17
|
-
depends_on: :
|
18
|
+
depends_on: :client_pkg
|
18
19
|
|
data/plugins/main/main.rb
CHANGED
@@ -7,9 +7,10 @@
|
|
7
7
|
##
|
8
8
|
|
9
9
|
|
10
|
-
# The MainPlugin is accessible as +@plugins.main+ from other plugins.
|
10
|
+
# The MainPlugin is accessible as +@plugins.main+ and just +main+ from other plugins.
|
11
11
|
#
|
12
12
|
# = MainPlugin provides mainly client setup and the following services:
|
13
|
+
# * The root html page, which includes the scripts and sets up client startup variables.
|
13
14
|
# * The url of the client as a HValue, including the anchor.
|
14
15
|
# * Accessible via +msg.session[:main][:location_href]+
|
15
16
|
# * The local time of the client's web browser as a HValue, as seconds since epoch.
|
@@ -18,38 +19,165 @@
|
|
18
19
|
# * Provides the +#init_ui+ event for plugins that respond to it.
|
19
20
|
class MainPlugin < Plugin
|
20
21
|
|
21
|
-
#
|
22
|
+
# # Session-specific index page renderer (unused)
|
23
|
+
# def session_index_html( request, response )
|
24
|
+
#
|
25
|
+
# ses_key = @randgen.gen
|
26
|
+
# sha_key = ''
|
27
|
+
#
|
28
|
+
# buffer = [
|
29
|
+
# "var qP=function(cmd){COMM.Queue.push(cmd);};"
|
30
|
+
# ]
|
31
|
+
#
|
32
|
+
# req_num = 0
|
33
|
+
#
|
34
|
+
# 3.times do |req_num|
|
35
|
+
# sha_key = Digest::SHA1.hexdigest( ses_key + sha_key )
|
36
|
+
# msg = @plugins.transporter.xhr(
|
37
|
+
# request, response, {
|
38
|
+
# :servlet => true,
|
39
|
+
# :cookie => (req_num==0),
|
40
|
+
# :query => {
|
41
|
+
# 'ses_key' => "#{req_num}:.o.:#{sha_key}"
|
42
|
+
# }
|
43
|
+
# }
|
44
|
+
# )
|
45
|
+
# buffer += msg.value_buffer
|
46
|
+
# msg.buffer.each do |buffer_item|
|
47
|
+
# buffer.push( "qP(function(){#{buffer_item};});")
|
48
|
+
# end
|
49
|
+
# ses_key = msg.ses_key
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# buffer.unshift( "COMM.Session.newKey(#{ses_key.to_json});" )
|
53
|
+
# buffer.unshift( "COMM.Session.sha_key=#{sha_key.to_json};" )
|
54
|
+
# buffer.unshift( "COMM.Session.req_num=#{req_num};" )
|
55
|
+
#
|
56
|
+
# index_html = render_index_html
|
57
|
+
#
|
58
|
+
# return index_html.gsub('__STARTUP_SEQUENCE__', buffer.join("\n") )
|
59
|
+
# end
|
60
|
+
|
61
|
+
|
62
|
+
# Index page renderer
|
63
|
+
def render_index_html
|
64
|
+
|
65
|
+
index_html = @index_html_src.clone
|
66
|
+
|
67
|
+
client_rev = client_pkg.client_cache.client_rev
|
68
|
+
deps_src = ''
|
69
|
+
@conf[:deps].each do |dep|
|
70
|
+
deps_src += %{<script src="#{dep}" type="text/javascript"></script>}
|
71
|
+
end
|
72
|
+
client_base = File.join(@bconf[:h],client_rev)
|
73
|
+
|
74
|
+
index_html.gsub!( '__CLIENT_BASE__', client_base )
|
75
|
+
index_html.gsub!( '__DEFAULT_TITLE__', @conf[:title] )
|
76
|
+
index_html.gsub!( '__CLIENT_REV__', client_rev )
|
77
|
+
index_html.gsub!( '__CLIENT_HELLO__', @bconf[:hello] )
|
78
|
+
index_html.gsub!( '__NOSCRIPT__', @conf[:noscript] )
|
79
|
+
index_html.gsub!( '__SCRIPT_DEPS__', deps_src )
|
80
|
+
|
81
|
+
return index_html
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
|
86
|
+
### Top-level plugin events:
|
87
|
+
|
88
|
+
|
89
|
+
# Binds configuration data as instance variables
|
22
90
|
def init
|
23
91
|
super
|
92
|
+
@plugins.register_alias( :main, :index_html )
|
93
|
+
@randgen = RandGen.new( 40 )
|
94
|
+
::RSence.config[:index_html][:instance] = self
|
24
95
|
@conf = ::RSence.config[:index_html]
|
25
96
|
@bconf = ::RSence.config[:broker_urls]
|
26
97
|
@goodbye_uri = File.join(@bconf[:hello],'goodbye')
|
27
98
|
end
|
28
99
|
|
29
|
-
#
|
30
|
-
def
|
31
|
-
|
100
|
+
# Opens and renders the index page template
|
101
|
+
def open
|
102
|
+
super
|
103
|
+
@index_html_src = file_read( ::RSence.config[:index_html][:index_tmpl] )
|
104
|
+
render_index_html
|
105
|
+
end
|
106
|
+
|
107
|
+
# Frees the ticket resource id of the "loading" gif image.
|
108
|
+
def close
|
109
|
+
super
|
110
|
+
@plugins[:ticket].del_rsrc( @loading_gif_id )
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
### Servlet features; responds to GET / as well as POST /hello/goodbye
|
116
|
+
|
117
|
+
|
118
|
+
# @private Internal structures, matches the "hello/goodbye" session termination POST request and the "/" index html page GET request
|
119
|
+
def match( uri, method )
|
120
|
+
if uri == ::RSence.config[:index_html][:respond_address] and method == :get
|
32
121
|
return true
|
122
|
+
elsif req_type == :post and uri == @goodbye_uri
|
123
|
+
return true
|
124
|
+
else
|
125
|
+
return false
|
33
126
|
end
|
34
|
-
return false
|
35
127
|
end
|
36
128
|
|
37
|
-
# @private Internal structures, score for the "hello/goodbye" session termination request
|
38
|
-
def score
|
129
|
+
# @private Internal structures, score for the "hello/goodbye" session termination request and the default index html page
|
130
|
+
def score
|
131
|
+
return 1000 # allows overriding with anything with a score below 1000
|
132
|
+
end
|
133
|
+
|
134
|
+
# Inspects the http request header to decide if the browser supports gzip compressed responses.
|
135
|
+
def support_gzip( header )
|
136
|
+
return false if not ::RSence.config[:no_gzip]
|
137
|
+
return false if not header.has_key?('accept-encoding')
|
138
|
+
return header['accept-encoding'].include?('gzip')
|
139
|
+
end
|
39
140
|
|
40
|
-
#
|
141
|
+
# Outputs the startup web page.
|
142
|
+
def get( req, response, ses )
|
143
|
+
index_html = render_index_html
|
144
|
+
|
145
|
+
response.status = 200
|
146
|
+
|
147
|
+
response['Content-Type'] = 'text/html; charset=UTF-8'
|
148
|
+
response['Date'] = httime( Time.now )
|
149
|
+
response['Server'] = 'RSence'
|
150
|
+
response['Cache-Control'] = 'no-cache'
|
151
|
+
|
152
|
+
if support_gzip( req.header )
|
153
|
+
index_gzip = GZString.new('')
|
154
|
+
gzwriter = Zlib::GzipWriter.new( index_gzip, 9 )
|
155
|
+
gzwriter.write( index_html )
|
156
|
+
gzwriter.close
|
157
|
+
response['Content-Length'] = index_gzip.length
|
158
|
+
response['Content-Encoding'] = 'gzip'
|
159
|
+
response.body = index_gzip
|
160
|
+
else
|
161
|
+
response['Content-Length'] = index_html.length
|
162
|
+
response.body = index_html
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Returns the "hello/goodbye" session termination request
|
41
167
|
def post( req, res, ses )
|
42
168
|
@plugins.sessions.expire_ses_by_req( req, res )
|
43
169
|
end
|
44
170
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
171
|
+
|
172
|
+
|
173
|
+
### Features accessible from other plugins:
|
174
|
+
|
175
|
+
# The +#url_responder+ gets called whenever the anchor (pound) of location.href changes.
|
176
|
+
# It enables virtual url events for back/forward buttons and bookmarking in browsers whenever utilized.
|
49
177
|
#
|
50
178
|
# Client-side support is included in js/url_responder.js
|
51
179
|
#
|
52
|
-
# Also allows virtual-host -like behavior
|
180
|
+
# Also allows virtual-host -like behavior if utilized.
|
53
181
|
def url_responder(msg,location_href)
|
54
182
|
|
55
183
|
ses = get_ses( msg )
|
@@ -83,24 +211,31 @@ class MainPlugin < Plugin
|
|
83
211
|
|
84
212
|
end
|
85
213
|
|
214
|
+
|
86
215
|
# Returns base url of browser (before the '#' sign)
|
87
216
|
def url( msg )
|
88
217
|
get_ses( msg )[:url][0]
|
89
218
|
end
|
90
219
|
|
220
|
+
|
91
221
|
# Returns pound url of browser (after the '#' sign)
|
92
222
|
def pound( msg )
|
93
223
|
get_ses( msg )[:url][1]
|
94
224
|
end
|
95
225
|
|
96
226
|
|
97
|
-
|
227
|
+
|
228
|
+
### Session events:
|
229
|
+
|
230
|
+
|
231
|
+
# New session initialization, called just once per session.
|
98
232
|
def init_ses(msg)
|
99
233
|
super
|
100
234
|
restore_ses( msg )
|
101
235
|
end
|
102
236
|
|
103
|
-
|
237
|
+
|
238
|
+
# Called once when a session is restored or cloned using the cookie's ses_key
|
104
239
|
def restore_ses(msg)
|
105
240
|
super
|
106
241
|
## Resets session data to defaults
|
@@ -111,6 +246,7 @@ class MainPlugin < Plugin
|
|
111
246
|
ses[:poll_mode] = true
|
112
247
|
end
|
113
248
|
|
249
|
+
|
114
250
|
# Interface for adding delayed calls
|
115
251
|
#
|
116
252
|
# When adding a delayed call, use an Array to define a plugin/method with optional arguments that will be called on the next request. The client will call back immediately when a delayed call is pending. The first param of the method is a +msg+. Don't include the +msg+ of the current request in params, it will be inserted automatically for the delayed call.
|
@@ -135,6 +271,7 @@ class MainPlugin < Plugin
|
|
135
271
|
get_ses( msg )[:delayed_calls].push( params )
|
136
272
|
end
|
137
273
|
|
274
|
+
|
138
275
|
# @private Initializes the client-side COMM.urlResponder and sesWatcher
|
139
276
|
def boot0( msg, ses )
|
140
277
|
|
@@ -158,18 +295,27 @@ class MainPlugin < Plugin
|
|
158
295
|
|
159
296
|
end
|
160
297
|
|
298
|
+
|
161
299
|
# @private Calls the init_ui method of each loaded plugin and removes the loading -message
|
162
300
|
def boot1( msg, ses )
|
163
301
|
# Delegates the init_ui method to each plugin to signal bootstrap completion.
|
164
302
|
msg.plugins.delegate( 'init_ui', msg ) unless ses[:dont_init_ui]
|
165
303
|
end
|
166
304
|
|
167
|
-
|
305
|
+
|
306
|
+
# Disables the init_ui event.
|
168
307
|
def dont_init_ui( msg )
|
169
308
|
get_ses( msg )[:dont_init_ui] = true
|
170
309
|
end
|
171
310
|
|
172
|
-
|
311
|
+
|
312
|
+
# Enables the init_ui event.
|
313
|
+
def do_init_ui( msg )
|
314
|
+
get_ses( msg )[:dont_init_ui] = false
|
315
|
+
end
|
316
|
+
|
317
|
+
|
318
|
+
# Flushes commands in the :delayed_calls array
|
173
319
|
def flush_delayed( msg, ses )
|
174
320
|
## Limits the amount of delayed calls to process to 4.
|
175
321
|
## Prevents the client from choking even when the server
|
@@ -223,10 +369,10 @@ class MainPlugin < Plugin
|
|
223
369
|
end
|
224
370
|
end
|
225
371
|
|
226
|
-
#
|
227
|
-
#
|
228
|
-
#
|
229
|
-
#
|
372
|
+
# When nothing is delayed and the second poll has been made (init_ui called),
|
373
|
+
# sets the client to non-polling-mode, having only value synchronization trigger
|
374
|
+
# new requests. On the client, SesWatcher forces the change by sending the
|
375
|
+
# client time periodically.
|
230
376
|
def end_polling( msg, ses )
|
231
377
|
if ses[:poll_mode] == true
|
232
378
|
msg.reply "COMM.Transporter.poll(0);"
|
@@ -234,7 +380,7 @@ class MainPlugin < Plugin
|
|
234
380
|
end
|
235
381
|
end
|
236
382
|
|
237
|
-
#
|
383
|
+
# Starts polling mode.
|
238
384
|
def start_polling( msg, ses )
|
239
385
|
if ses[:poll_mode] == false
|
240
386
|
msg.reply( "COMM.Transporter.poll(#{::RSence.config[:transporter_conf][:client_poll_priority]});" )
|
@@ -242,7 +388,7 @@ class MainPlugin < Plugin
|
|
242
388
|
end
|
243
389
|
end
|
244
390
|
|
245
|
-
#
|
391
|
+
# Called on every request of an active, valid session
|
246
392
|
def idle(msg)
|
247
393
|
|
248
394
|
ses = get_ses( msg )
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsence-pre
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 121
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 1
|
9
9
|
- 0
|
10
|
-
-
|
11
|
-
version: 2.1.0.
|
10
|
+
- 15
|
11
|
+
version: 2.1.0.15
|
12
12
|
platform: ruby
|
13
13
|
authors:
|
14
14
|
- Riassence Inc.
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-11-
|
19
|
+
date: 2010-11-22 00:00:00 +02:00
|
20
20
|
default_executable: rsence-pre
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
@@ -93,14 +93,12 @@ files:
|
|
93
93
|
- plugins/client_pkg/lib/client_pkg_build.rb
|
94
94
|
- plugins/client_pkg/lib/client_pkg_cache.rb
|
95
95
|
- plugins/client_pkg/lib/client_pkg_serve.rb
|
96
|
-
- plugins/
|
97
|
-
- plugins/
|
98
|
-
- plugins/index_html/index_html.rb
|
99
|
-
- plugins/index_html/info.yaml
|
100
|
-
- plugins/index_html/tmpl/index.html
|
96
|
+
- plugins/main/img/loading.gif
|
97
|
+
- plugins/main/img/riassence.gif
|
101
98
|
- plugins/main/info.yaml
|
102
99
|
- plugins/main/js/main.js
|
103
100
|
- plugins/main/main.rb
|
101
|
+
- plugins/main/tmpl/index.html
|
104
102
|
- plugins/main/values.yaml
|
105
103
|
- plugins/ticket/info.yaml
|
106
104
|
- plugins/ticket/lib/common.rb
|
@@ -1,120 +0,0 @@
|
|
1
|
-
## RSence
|
2
|
-
# Copyright 2009 Riassence Inc.
|
3
|
-
# http://riassence.com/
|
4
|
-
#
|
5
|
-
# You should have received a copy of the GNU General Public License along
|
6
|
-
# with this software package. If not, contact licensing@riassence.com
|
7
|
-
##
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
# @private IndexHtmlPlugin is the servlet plugin that is responsible for initializing the "boot-strap page". It's not intended as a part of the public API at this time.
|
12
|
-
class IndexHtmlPlugin < Servlet
|
13
|
-
|
14
|
-
def match( uri, method )
|
15
|
-
if uri == ::RSence.config[:index_html][:respond_address] and method == :get
|
16
|
-
return true
|
17
|
-
else
|
18
|
-
return false
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def score
|
23
|
-
return 1000 # allows overriding with anything with a score below 1000
|
24
|
-
end
|
25
|
-
|
26
|
-
def init
|
27
|
-
@randgen = RandGen.new( 40 )
|
28
|
-
::RSence.config[:index_html][:instance] = self
|
29
|
-
end
|
30
|
-
|
31
|
-
def open
|
32
|
-
@index_html_src = file_read( ::RSence.config[:index_html][:index_tmpl] )
|
33
|
-
render_index_html
|
34
|
-
end
|
35
|
-
|
36
|
-
def close
|
37
|
-
@plugins[:ticket].del_rsrc( @loading_gif_id )
|
38
|
-
end
|
39
|
-
|
40
|
-
def render_index_html
|
41
|
-
|
42
|
-
index_html = @index_html_src.clone
|
43
|
-
|
44
|
-
index_html.gsub!('__DEFAULT_TITLE__',::RSence.config[:index_html][:title])
|
45
|
-
client_rev = @plugins[:client_pkg].client_cache.client_rev
|
46
|
-
index_html.gsub!('__CLIENT_REV__',client_rev)
|
47
|
-
index_html.gsub!('__CLIENT_BASE__',File.join(::RSence.config[:broker_urls][:h],client_rev))
|
48
|
-
index_html.gsub!('__CLIENT_HELLO__',::RSence.config[:broker_urls][:hello])
|
49
|
-
index_html.gsub!('__NOSCRIPT__',::RSence.config[:index_html][:noscript])
|
50
|
-
|
51
|
-
deps_src = ''
|
52
|
-
::RSence.config[:index_html][:deps].each do |dep|
|
53
|
-
deps_src += %{<script src="#{dep}" type="text/javascript"></script>}
|
54
|
-
end
|
55
|
-
index_html.gsub!('__SCRIPT_DEPS__',deps_src)
|
56
|
-
|
57
|
-
return index_html
|
58
|
-
end
|
59
|
-
|
60
|
-
def session_index_html( request, response )
|
61
|
-
ses_key = @randgen.gen
|
62
|
-
sha_key = ''
|
63
|
-
buffer = [
|
64
|
-
"var qP=function(cmd){COMM.Queue.push(cmd);};"
|
65
|
-
]
|
66
|
-
req_num = 0
|
67
|
-
3.times do |req_num|
|
68
|
-
sha_key = Digest::SHA1.hexdigest( ses_key + sha_key )
|
69
|
-
msg = @plugins.transporter.xhr(
|
70
|
-
request, response, {
|
71
|
-
:servlet => true,
|
72
|
-
:cookie => (req_num==0),
|
73
|
-
:query => {
|
74
|
-
'ses_key' => "#{req_num}:.o.:#{sha_key}"
|
75
|
-
}
|
76
|
-
}
|
77
|
-
)
|
78
|
-
buffer += msg.value_buffer
|
79
|
-
msg.buffer.each do |buffer_item|
|
80
|
-
buffer.push( "qP(function(){#{buffer_item};});")
|
81
|
-
end
|
82
|
-
ses_key = msg.ses_key
|
83
|
-
end
|
84
|
-
buffer.unshift( "COMM.Session.newKey(#{ses_key.to_json});" )
|
85
|
-
buffer.unshift( "COMM.Session.sha_key=#{sha_key.to_json};" )
|
86
|
-
buffer.unshift( "COMM.Session.req_num=#{req_num};" )
|
87
|
-
index_html = render_index_html
|
88
|
-
return index_html.gsub('__STARTUP_SEQUENCE__', buffer.join("\n") )
|
89
|
-
end
|
90
|
-
|
91
|
-
## Outputs a static web page.
|
92
|
-
def get( request, response, ses )
|
93
|
-
index_html = render_index_html
|
94
|
-
support_gzip = (request.header.has_key?('accept-encoding') and \
|
95
|
-
request.header['accept-encoding'].include?('gzip')) \
|
96
|
-
and not ::RSence.config[:no_gzip]
|
97
|
-
|
98
|
-
response.status = 200
|
99
|
-
|
100
|
-
response['Content-Type'] = 'text/html; charset=UTF-8'
|
101
|
-
response['Date'] = httime( Time.now )
|
102
|
-
response['Server'] = 'RSence'
|
103
|
-
response['Cache-Control'] = 'no-cache'
|
104
|
-
|
105
|
-
if support_gzip
|
106
|
-
index_gzip = GZString.new('')
|
107
|
-
gzwriter = Zlib::GzipWriter.new( index_gzip, 9 )
|
108
|
-
gzwriter.write( index_html )
|
109
|
-
gzwriter.close
|
110
|
-
response['Content-Length'] = index_gzip.length
|
111
|
-
response['Content-Encoding'] = 'gzip'
|
112
|
-
response.body = index_gzip
|
113
|
-
else
|
114
|
-
response['Content-Length'] = index_html.length
|
115
|
-
response.body = index_html
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
end
|
120
|
-
|
@@ -1,18 +0,0 @@
|
|
1
|
-
|
2
|
-
# The human-readable product name of the package
|
3
|
-
title: Index HTML Page
|
4
|
-
|
5
|
-
# The human-readable version of the package
|
6
|
-
version: 2.0.0
|
7
|
-
|
8
|
-
# A brief description of the package (rdoc formatting supported)
|
9
|
-
description: |
|
10
|
-
This plugin serves the initial html page.
|
11
|
-
|
12
|
-
# System version requirement.
|
13
|
-
sys_version: '>= 2.0.0'
|
14
|
-
|
15
|
-
category: :system
|
16
|
-
|
17
|
-
depends_on: :client_pkg
|
18
|
-
|
File without changes
|
File without changes
|
File without changes
|