lib/transporter/transporter.rb in rsence-2.0.0.6.pre vs lib/transporter/transporter.rb in rsence-2.0.0.7.pre
- old
+ new
@@ -9,237 +9,232 @@
#++
module RSence
-=begin
- Transporter is the counterpart to the client's HTransporter xhr engine.
-=end
-
-class Transporter
+ # Transporter handles incoming requests targeted at RSence
+ # and distributes calls and data accordingly.
+ class Transporter
- # ValueManager syncronizes value objects
- require 'values/valuemanager'
+ # ValueManager syncronizes value objects
+ require 'values/valuemanager'
- # SessionManager creates, validates, stores and expires sessions
- require 'session/sessionmanager'
+ # SessionManager creates, validates, stores and expires sessions
+ require 'session/sessionmanager'
- # PluginManager handles all the plugins
- require 'plugins/pluginmanager'
+ # PluginManager handles all the plugins
+ require 'plugins/pluginmanager'
- attr_accessor :valuemanager, :sessions, :plugins
+ attr_accessor :valuemanager, :sessions, :plugins
- def initialize
- @config = ::RSence.config[:transporter_conf]
- @accept_req = false
- @valuemanager = ValueManager.new
- @sessions = SessionManager.new( self )
- @plugins = PluginManager.new( ::RSence.config[:plugin_paths], self, RSence.args[:autoupdate] )
- if RSence.launch_pid != Process.pid
- Process.kill( 'TERM', RSence.launch_pid )
+ def initialize
+ @config = ::RSence.config[:transporter_conf]
+ @accept_req = false
+ @valuemanager = ValueManager.new
+ @sessions = SessionManager.new( self )
+ @plugins = PluginManager.new( ::RSence.config[:plugin_paths], self, RSence.args[:autoupdate] )
+ if RSence.launch_pid != Process.pid
+ Process.kill( 'TERM', RSence.launch_pid )
+ end
end
- end
- def online?
- @accept_req
- end
+ def online?
+ @accept_req
+ end
- def online=(state)
- if RSence.args[:verbose]
- if state
- puts "RSence is online now."
- else
- puts "RSence is offline now."
+ def online=(state)
+ if RSence.args[:verbose]
+ if state
+ puts "RSence is online now."
+ else
+ puts "RSence is offline now."
+ end
end
+ @accept_req = state
end
- @accept_req = state
- end
- def shutdown
- online=false
- @plugins.shutdown
- @sessions.shutdown
- end
+ def shutdown
+ online=false
+ @plugins.shutdown
+ @sessions.shutdown
+ end
- def servlet( request_type, request, response )
- broker_urls = ::RSence.config[:broker_urls]
- uri = request.fullpath
+ def servlet( request_type, request, response )
+ broker_urls = ::RSence.config[:broker_urls]
+ uri = request.fullpath
- if request_type == :post
- ## /x handles xhr without cookies
- if uri == broker_urls[:x] and @sessions.accept_requests
- xhr( request, response, { :cookies => true, :servlet => false } )
- return true
- ## /hello handles the first xhr (with cookies, for session key)
- elsif uri == broker_urls[:hello] and @sessions.accept_requests
- xhr( request, response, { :cookies => true, :servlet => false } )
- return true
+ if request_type == :post
+ ## /x handles xhr without cookies
+ if uri == broker_urls[:x] and @sessions.accept_requests
+ xhr( request, response, { :cookies => true, :servlet => false } )
+ return true
+ ## /hello handles the first xhr (with cookies, for session key)
+ elsif uri == broker_urls[:hello] and @sessions.accept_requests
+ xhr( request, response, { :cookies => true, :servlet => false } )
+ return true
+ else
+ session = {}
+ return @plugins.match_servlet( request_type, request, response, session )
+ end
else
session = {}
return @plugins.match_servlet( request_type, request, response, session )
end
- else
- session = {}
- return @plugins.match_servlet( request_type, request, response, session )
end
- end
- # wrapper for the session manager stop client functionality
- def xhr_error_handler(msg,err_name,err_extra_descr='')
- @sessions.stop_client_with_message( msg,
- @config[:messages][err_name][:title],
- @config[:messages][err_name][:descr]+err_extra_descr,
- @config[:messages][err_name][:uri]
- )
- end
+ # wrapper for the session manager stop client functionality
+ def xhr_error_handler(msg,err_name,err_extra_descr='')
+ @sessions.stop_client_with_message( msg,
+ @config[:messages][err_name][:title],
+ @config[:messages][err_name][:descr]+err_extra_descr,
+ @config[:messages][err_name][:uri]
+ )
+ end
- # wrapper for tracebacks in xhr
- def xhr_traceback_handler(e,err_descr='Transporter::UnspecifiedError')
- puts "=="*40 if RSence.args[:debug]
- puts err_descr
- if RSence.args[:debug]
- puts "--"*40
- puts e.message
- puts " #{e.backtrace.join("\n ")}"
- puts "=="*40
+ # wrapper for tracebacks in xhr
+ def xhr_traceback_handler(e,err_descr='Transporter::UnspecifiedError')
+ puts "=="*40 if RSence.args[:debug]
+ puts err_descr
+ if RSence.args[:debug]
+ puts "--"*40
+ puts e.message
+ puts " #{e.backtrace.join("\n ")}"
+ puts "=="*40
+ end
end
- end
- ## handles incoming XMLHttpRequests from the browser
- def xhr(request, response, options = { :cookies => false, :servlet => false } )
+ ## handles incoming XMLHttpRequests from the browser
+ def xhr(request, response, options = { :cookies => false, :servlet => false } )
- session_conf = ::RSence.config[:session_conf]
+ session_conf = ::RSence.config[:session_conf]
- options[:cookies] = false unless options.has_key?(:cookies)
+ options[:cookies] = false unless options.has_key?(:cookies)
- if session_conf[:session_cookies] and session_conf[:trust_cookies]
- options[:cookies] = true
- end
+ if session_conf[:session_cookies] and session_conf[:trust_cookies]
+ options[:cookies] = true
+ end
- # Creates the msg object, also checks or creates a new session; verifies session keys and such
- msg = @sessions.init_msg( request, response, options )
+ # Creates the msg object, also checks or creates a new session; verifies session keys and such
+ msg = @sessions.init_msg( request, response, options )
- response_success = true
+ response_success = true
- # If the client encounters an error, display error message
- if request.query.has_key?('err_msg')
- response_success = false
- client_error_msg = request.query['err_msg'].inspect
- puts "\nCLIENT ERROR:\n#{client_error_msg}\n" if RSence.args[:debug]
- xhr_error_handler(msg,:client_error,client_error_msg)
- end
+ # If the client encounters an error, display error message
+ if request.query.has_key?('err_msg')
+ response_success = false
+ client_error_msg = request.query['err_msg'].inspect
+ puts "\nCLIENT ERROR:\n#{client_error_msg}\n" if RSence.args[:debug]
+ xhr_error_handler(msg,:client_error,client_error_msg)
+ end
- # If the session is valid, continue:
- if msg.ses_valid and response_success
+ # If the session is valid, continue:
+ if msg.ses_valid and response_success
- # If cookies are true, it means the url base needs to
- # be changed from /hello to /x to prevent further cookie juggling.
- if options[:cookies] and not options[:servlet]
- msg.reply("COMM.Transporter.url=#{::RSence.config[:broker_urls][:x].to_json};")
- end
+ # If cookies are true, it means the url base needs to
+ # be changed from /hello to /x to prevent further cookie juggling.
+ if options[:cookies] and not options[:servlet]
+ msg.reply("COMM.Transporter.url=#{::RSence.config[:broker_urls][:x].to_json};")
+ end
- # Appends a 'new session.' message for new sessions in RSence.args[:verbose]:
- puts "new session." if msg.new_session and RSence.args[:verbose]
- puts "restored session." if msg.restored_session and RSence.args[:verbose]
- puts "clone source." if msg.cloned_targets and RSence.args[:verbose]
- puts "clone target." if msg.cloned_source and RSence.args[:verbose]
+ # Appends a 'new session.' message for new sessions in RSence.args[:verbose]:
+ puts "new session." if msg.new_session and RSence.args[:verbose]
+ puts "restored session." if msg.restored_session and RSence.args[:verbose]
+ puts "clone source." if msg.cloned_targets and RSence.args[:verbose]
+ puts "clone target." if msg.cloned_source and RSence.args[:verbose]
- ## Pass the client XML to the value manager
- if request.query.has_key?( 'values' )
- syncdata_str = request.query[ 'values' ]
- begin
- @valuemanager.xhr( msg, syncdata_str )
- rescue => e
- response_success = false
- xhr_error_handler( msg, :valuemanager_xhr_error, e.message )
- xhr_traceback_handler( e, "Transporter::ValueManagerXHRError: @valuemanager.xhr failed." )
+ ## Pass the client XML to the value manager
+ if request.query.has_key?( 'values' )
+ syncdata_str = request.query[ 'values' ]
+ begin
+ @valuemanager.xhr( msg, syncdata_str )
+ rescue => e
+ response_success = false
+ xhr_error_handler( msg, :valuemanager_xhr_error, e.message )
+ xhr_traceback_handler( e, "Transporter::ValueManagerXHRError: @valuemanager.xhr failed." )
+ end
end
- end
- ## Calls the restore_ses of plugins, when a session is restored (page reload with previously active session)
- if msg.restored_session
+ ## Calls the restore_ses of plugins, when a session is restored (page reload with previously active session)
+ if msg.restored_session
- msg.session[:deps] = []
+ msg.session[:deps] = []
- if msg.cloned_source
+ if msg.cloned_source
+ begin
+ @plugins.delegate( :cloned_target, msg, msg.cloned_source )
+ rescue => e
+ response_success = false
+ xhr_error_handler( msg, :plugin_delegate_cloned_target_error, e.message )
+ xhr_traceback_handler( e, "Transporter::PluginDelegateClonedTargetError: @plugins.delegate 'cloned_target' failed." )
+ end
+ end
+
begin
- @plugins.delegate( :cloned_target, msg, msg.cloned_source )
+ @plugins.delegate( :restore_ses, msg )
rescue => e
response_success = false
- xhr_error_handler( msg, :plugin_delegate_cloned_target_error, e.message )
- xhr_traceback_handler( e, "Transporter::PluginDelegateClonedTargetError: @plugins.delegate 'cloned_target' failed." )
+ xhr_error_handler( msg, :plugin_delegate_restore_ses_error, e.message )
+ xhr_traceback_handler( e, "Transporter::PluginDelegateRestoreSesError: @plugins.delegate 'restore_ses' failed." )
end
- end
+ elsif msg.new_session
+ begin
+ @plugins.delegate( :init_ses, msg )
+ rescue => e
+ response_success = false
+ xhr_error_handler( msg, :plugin_delegate_init_ses_error, e.message )
+ xhr_traceback_handler( e, "Transporter::PluginDelegateInitSesError: @plugins.delegate 'init_ses' failed." )
+ end
+ elsif msg.cloned_targets
+ begin
+ @plugins.delegate( :cloned_source, msg, msg.cloned_targets )
+ rescue => e
+ response_success = false
+ xhr_error_handler( msg, :plugin_delegate_cloned_source_error, e.message )
+ xhr_traceback_handler( e, "Transporter::PluginDelegateClonedSourceError: @plugins.delegate 'cloned_source' failed." )
+ end
+ end
+
+ ## Calls validators for changed values
begin
- @plugins.delegate( :restore_ses, msg )
+ @valuemanager.validate( msg )
rescue => e
response_success = false
- xhr_error_handler( msg, :plugin_delegate_restore_ses_error, e.message )
- xhr_traceback_handler( e, "Transporter::PluginDelegateRestoreSesError: @plugins.delegate 'restore_ses' failed." )
+ xhr_error_handler( msg, :valuemanager_validate_error, e.message )
+ xhr_traceback_handler( e, "Transporter::ValueManagerValidateError: @valuemanager.validate failed." )
end
-
- elsif msg.new_session
+
+ ### Allows every plugin to respond to the idle call
begin
- @plugins.delegate( :init_ses, msg )
+ @plugins.delegate( :idle, msg )
rescue => e
response_success = false
- xhr_error_handler( msg, :plugin_delegate_init_ses_error, e.message )
- xhr_traceback_handler( e, "Transporter::PluginDelegateInitSesError: @plugins.delegate 'init_ses' failed." )
+ xhr_error_handler( msg, :plugin_idle_error, e.message )
+ xhr_traceback_handler( e, "Transporter::PluginIdleError: @plugins.idle failed." )
end
- elsif msg.cloned_targets
+
+ ### Processes outgoing values to client
begin
- @plugins.delegate( :cloned_source, msg, msg.cloned_targets )
+ @valuemanager.sync_client( msg )
rescue => e
response_success = false
- xhr_error_handler( msg, :plugin_delegate_cloned_source_error, e.message )
- xhr_traceback_handler( e, "Transporter::PluginDelegateClonedSourceError: @plugins.delegate 'cloned_source' failed." )
+ xhr_error_handler( msg, :valuemanager_sync_client_error, e.message )
+ xhr_traceback_handler( e, "Transporter::ValueManagerSyncClientError: @valuemanager.sync_client failed." )
end
- end
- ## Calls validators for changed values
- begin
- @valuemanager.validate( msg )
- rescue => e
- response_success = false
- xhr_error_handler( msg, :valuemanager_validate_error, e.message )
- xhr_traceback_handler( e, "Transporter::ValueManagerValidateError: @valuemanager.validate failed." )
- end
+ else
- ### Allows every plugin to respond to the idle call
- begin
- @plugins.delegate( :idle, msg )
- rescue => e
+ # session is not valid, the error was set in SessionManager
response_success = false
- xhr_error_handler( msg, :plugin_idle_error, e.message )
- xhr_traceback_handler( e, "Transporter::PluginIdleError: @plugins.idle failed." )
- end
- ### Processes outgoing values to client
- begin
- @valuemanager.sync_client( msg )
- rescue => e
- response_success = false
- xhr_error_handler( msg, :valuemanager_sync_client_error, e.message )
- xhr_traceback_handler( e, "Transporter::ValueManagerSyncClientError: @valuemanager.sync_client failed." )
end
-
- else
-
- # session is not valid, the error was set in SessionManager
- response_success = false
-
- end
- msg.response_success = response_success
+ msg.response_success = response_success
- unless options[:servlet]
- msg.response_done()
- end
+ unless options[:servlet]
+ msg.response_done()
+ end
- return msg
-
+ return msg
+ end
end
-
-end
-
end