rsence-pre 2.1.0.14 → 2.1.0.15
Sign up to get free protection for your applications and to get access to all the features.
- 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
|