class Citrus::Server::Server

Server

Public Class Methods

new(app) click to toggle source

Create a new server

@param [Object] app

# File lib/citrus/server/server.rb, line 24
def initialize app
  @app = app

  @global_filter_service = nil
  @filter_service = nil
  @handler_service = nil

  @crons = []
  @jobs = {}
  @state = :state_inited

  @app.on(:add_crons) { |crons| add_crons crons }
  @app.on(:remove_crons) { |crons| remove_crons crons }
end

Public Instance Methods

add_crons(crons) click to toggle source

Add crons at runtime

@param [Array] crons

# File lib/citrus/server/server.rb, line 113
def add_crons crons
end
after_start() click to toggle source

After the sever start

# File lib/citrus/server/server.rb, line 51
def after_start
end
global_handle(msg, session) { |exception 'server not started'| ... } click to toggle source

Global handler

@param [Hash] msg @param [Object] session

# File lib/citrus/server/server.rb, line 63
def global_handle msg, session, &block
  unless @state == :state_started
    block_given? and yield Exception.new 'server not started'
    return
  end

  route_record = parse_route msg['route']
  unless route_record
    block_given? and yield Exception.new 'meet unknown route message'
    return
  end

  dispatch = Proc.new { |err, resp, args|
    if err
      handle_error(true, err, msg, session, resp, args) { |err, resp, args|
        response true, err, msg, session, resp, args, &block
      }
      return
    end

    unless @app.server_type == route_record['server_type']
      do_forward(msg, session, route_record) { |err, resp, args|
        response true, err, msg, session, resp, args, &block
      }
    else
      do_handle(msg, session, route_record) { |err, resp, args|
        response true, err, msg, session, resp, args, &block
      }
    end
  }
  before_filter true, msg, session, &dispatch
end
handle(msg, session) { |exception 'server not started'| ... } click to toggle source

Handle request

@param [Hash] msg @param [Object] session

# File lib/citrus/server/server.rb, line 100
def handle msg, session, &block
  unless @state == :state_started
    block_given? and yield Exception.new 'server not started'
    return
  end

  route_record = parse_route msg['route']
  do_handle msg, session, route_record, &block
end
remove_crons(crons) click to toggle source

Remove crons at runtime

@param [Array] crons

# File lib/citrus/server/server.rb, line 119
def remove_crons crons
end
start() click to toggle source

Start the server

# File lib/citrus/server/server.rb, line 40
def start
  return unless @state == :state_inited

  @global_filter_service = init_filter true
  @filter_service = init_filter false
  @handler_service = init_handler

  @state = :state_started
end
stop() click to toggle source

Stop the server

# File lib/citrus/server/server.rb, line 55
def stop
  @state = :state_stoped
end

Private Instance Methods

after_filter(is_global, err, msg, session, resp, args) { |err, resp, args| ... } click to toggle source

Fire after filter chain if any

@param [Boolean] is_global @param [Object] err @param [Hash] msg @param [Object] session @param [Hash] resp @param [Hash] args

@private

# File lib/citrus/server/server.rb, line 200
def after_filter is_global, err, msg, session, resp, args, &block
  if is_global
    fm = @global_filter_service
  else
    fm = @filter_service
  end
  if fm
    if is_global
      fm.after_filter(err, msg, session, resp) {}
    else
      fm.after_filter(err, msg, session, resp) {
        block_given? and yield err, resp, args
      }
    end
  end
end
before_filter(is_global, msg, session) { || ... } click to toggle source

Fire before filter chain if any

@param [Boolean] is_global @param [Hash] msg @param [Object] session

@private

# File lib/citrus/server/server.rb, line 177
def before_filter is_global, msg, session, &block
  if is_global
    fm = @global_filter_service
  else
    fm = @filter_service
  end
  if fm
    fm.before_filter msg, session, &block
  else
    block_given? and yield
  end
end
do_forward(msg, session, route_record) { |err, resp, args| ... } click to toggle source

Forward message

@param [Hash] msg @param [Object] session @param [Hash] route_record

@private

# File lib/citrus/server/server.rb, line 283
def do_forward msg, session, route_record, &block
  finished = false
  begin
    @app.sysrpc[route_record['server_type']].msgRemote.forwardMessage(
      session, msg, session.export
    ) { |err, resp, args|
        finished = true
        block_given? and yield err, resp, args
      }
  rescue => err
    block_given? and yield err unless finished
  end
end
do_handle(msg, session, route_record, &block) click to toggle source

Handle message

@param [Hash] msg @param [Object] session @param [Hash] route_record

@private

# File lib/citrus/server/server.rb, line 304
def do_handle msg, session, route_record, &block
  handle = Proc.new { |err, resp, args|
    if err
      handle_error(false, err, msg, session, resp, args) { |err, resp, args|
        response false, err, msg, session, resp, args, &block
      }
      return
    end

    @handler_service.handle(route_record, msg, session) { |err, resp, args|
      if err
        handle_error(false, err, msg, session, resp, args) { |err, resp, args|
          response false, err, msg, session, resp, args, &block
        }
        return
      end
      response false, err, msg, session, resp, args, &block
    }
  }
  before_filter false, msg, session, &handle
end
handle_error(is_global, err, msg, session, resp, args) { |err, resp, args| ... } click to toggle source

Pass err to the global error handler if specified

@param [Boolean] is_global @param [Object] err @param [Hash] msg @param [Object] session @param [Hash] resp @param [Hash] args

@private

# File lib/citrus/server/server.rb, line 227
def handle_error is_global, err, msg, session, resp, args, &block
  if is_global
    handler = :global_error_handler
  else
    handler = :err_handler
  end
  unless @app.respond_to? handler
    block_given? and yield err, resp, args
  else
    @app.send handler err, msg, resp, session, args, &block
  end
end
init_filter(is_global) click to toggle source

Init filter service

@param [Boolean] is_global

@private

# File lib/citrus/server/server.rb, line 129
def init_filter is_global
  service = Common::Service::FilterService.new

  if is_global
    befores = @app.global_befores
    afters = @app.global_afters
  else
    befores = @app.befores
    afters = @app.afters
  end

  befores.each { |before| service.before before }
  afters.each { |after| service.after after }

  service
end
init_handler() click to toggle source

Init handler service

@private

# File lib/citrus/server/server.rb, line 149
def init_handler
  Common::Service::HandlerService.new @app, load_handlers
end
load_handlers() click to toggle source

Load handlers from current application

@private

# File lib/citrus/server/server.rb, line 156
def load_handlers
  handlers = {}
  path = get_handler_path @app.base, @app.server_type
  if path
    klasses = load_app_handler path
    klasses.each { |klass|
      handler = klass.name
      handler[0] = handler[0].downcase
      handlers[handler] = klass.new @app
    }
  end
  handlers
end
parse_route(route) click to toggle source

Parse route string

@param [String] route

@private

# File lib/citrus/server/server.rb, line 265
def parse_route route
  return nil unless route
  return nil unless (ts = route.split '.').length == 3
  {
    'route' => route,
    'server_type' => ts[0],
    'handler' => ts[1],
    'method' => ts[2]
  }
end
response(is_global, err, msg, session, resp, args) { |err, resp, args| ... } click to toggle source

Send response to the client and fire after filter chain if any

@param [Boolean] is_global @param [Object] err @param [Hash] msg @param [Object] session @param [Hash] resp @param [Hash] args

@private

# File lib/citrus/server/server.rb, line 250
def response is_global, err, msg, session, resp, args, &block
  if is_global
    block_given? and yield err, resp, args
    # after filter should not interfere response
    after_filter is_global, err, msg, session, resp, args, &block
  else
    after_filter is_global, err, msg, session, resp, args, &block
  end
end