pomelo-citrus 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +20 -0
  3. data/Rakefile +0 -0
  4. data/citrus.gemspec +35 -0
  5. data/lib/citrus.rb +18 -0
  6. data/lib/citrus/application.rb +237 -0
  7. data/lib/citrus/citrus.rb +27 -0
  8. data/lib/citrus/common/remote/backend/msg_remote.rb +57 -0
  9. data/lib/citrus/common/remote/frontend/channel_remote.rb +73 -0
  10. data/lib/citrus/common/remote/frontend/session_remote.rb +108 -0
  11. data/lib/citrus/common/service/backend_session_service.rb +265 -0
  12. data/lib/citrus/common/service/channel_service.rb +485 -0
  13. data/lib/citrus/common/service/connection_service.rb +71 -0
  14. data/lib/citrus/common/service/filter_service.rb +92 -0
  15. data/lib/citrus/common/service/handler_service.rb +63 -0
  16. data/lib/citrus/common/service/session_service.rb +446 -0
  17. data/lib/citrus/components/backend_session.rb +32 -0
  18. data/lib/citrus/components/channel.rb +33 -0
  19. data/lib/citrus/components/component.rb +19 -0
  20. data/lib/citrus/components/connection.rb +48 -0
  21. data/lib/citrus/components/connector.rb +265 -0
  22. data/lib/citrus/components/master.rb +40 -0
  23. data/lib/citrus/components/monitor.rb +48 -0
  24. data/lib/citrus/components/proxy.rb +195 -0
  25. data/lib/citrus/components/push_scheduler.rb +74 -0
  26. data/lib/citrus/components/remote.rb +71 -0
  27. data/lib/citrus/components/server.rb +61 -0
  28. data/lib/citrus/components/session.rb +41 -0
  29. data/lib/citrus/connectors/commands/handshake.rb +22 -0
  30. data/lib/citrus/connectors/commands/heartbeat.rb +22 -0
  31. data/lib/citrus/connectors/commands/kick.rb +22 -0
  32. data/lib/citrus/connectors/common/coder.rb +21 -0
  33. data/lib/citrus/connectors/common/handler.rb +21 -0
  34. data/lib/citrus/connectors/ws_connector.rb +110 -0
  35. data/lib/citrus/connectors/ws_socket.rb +75 -0
  36. data/lib/citrus/filters/handler/handler_filter.rb +19 -0
  37. data/lib/citrus/filters/handler/too_busy.rb +16 -0
  38. data/lib/citrus/filters/rpc/rpc_filter.rb +19 -0
  39. data/lib/citrus/filters/rpc/too_busy.rb +16 -0
  40. data/lib/citrus/master/master.rb +60 -0
  41. data/lib/citrus/master/starter.rb +73 -0
  42. data/lib/citrus/master/watchdog.rb +83 -0
  43. data/lib/citrus/modules/console.rb +45 -0
  44. data/lib/citrus/modules/console_module.rb +35 -0
  45. data/lib/citrus/modules/master_watcher.rb +88 -0
  46. data/lib/citrus/modules/monitor_watcher.rb +86 -0
  47. data/lib/citrus/monitor/monitor.rb +61 -0
  48. data/lib/citrus/push_schedulers/buffer.rb +16 -0
  49. data/lib/citrus/push_schedulers/direct.rb +76 -0
  50. data/lib/citrus/server/server.rb +327 -0
  51. data/lib/citrus/util/app_util.rb +203 -0
  52. data/lib/citrus/util/constants.rb +19 -0
  53. data/lib/citrus/util/countdown_latch.rb +42 -0
  54. data/lib/citrus/util/events.rb +14 -0
  55. data/lib/citrus/util/module_util.rb +68 -0
  56. data/lib/citrus/util/path_util.rb +50 -0
  57. data/lib/citrus/util/utils.rb +49 -0
  58. data/lib/citrus/version.rb +7 -0
  59. metadata +241 -0
@@ -0,0 +1,83 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 22 July 2014
4
+
5
+ module Citrus
6
+ # Master
7
+ #
8
+ #
9
+ module Master
10
+ # WatchDog
11
+ #
12
+ #
13
+ class WatchDog
14
+ # Create a new watchdog
15
+ #
16
+ # @param [Object] app
17
+ # @param [Object] console_service
18
+ def initialize app, console_service
19
+ @app = app
20
+ @service = console_service
21
+ @servers = {}
22
+ @listeners = []
23
+ end
24
+
25
+ # Add server
26
+ #
27
+ # @param [Hash] server
28
+ def add_server server
29
+ return unless server
30
+ @servers[server[:server_id]] = server
31
+ notify({ :action => 'add_server', :server => server })
32
+ end
33
+
34
+ # Remove server
35
+ def remove_server
36
+ end
37
+
38
+ # Reconnect server
39
+ def reconnect_server
40
+ end
41
+
42
+ # Subscribe
43
+ #
44
+ # @param [String] server_id
45
+ def subscribe server_id
46
+ @listeners << server_id
47
+ end
48
+
49
+ # Unsubscribe
50
+ #
51
+ # @param [String] server_id
52
+ def unsubscribe server_id
53
+ @listeners.delete server_id
54
+ end
55
+
56
+ # Query
57
+ def query
58
+ @servers.values
59
+ end
60
+
61
+ private
62
+
63
+ # Notify
64
+ #
65
+ # @param [Hash] msg
66
+ #
67
+ # @private
68
+ def notify msg
69
+ @listeners.each { |server_id|
70
+ @service.agent.notify server_id, ConsoleModules::MonitorWatcher.module_id, msg
71
+ }
72
+ end
73
+
74
+ # Notify
75
+ #
76
+ # @param [String] server_id
77
+ # @param [Hash] msg
78
+ def notify_by_id server_id, msg
79
+ @service.agent.notify server_id, ConsoleModules::MonitorWatcher.module_id, msg
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,45 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 19 July 2014
4
+
5
+ require 'citrus/modules/console_module'
6
+
7
+ module Citrus
8
+ # ConsoleModules
9
+ #
10
+ #
11
+ module ConsoleModules
12
+ # Console
13
+ #
14
+ #
15
+ class Console < ConsoleModule
16
+
17
+ @module_id = '__console__'
18
+
19
+ # Initialize the module
20
+ #
21
+ # @param [Hash] args
22
+ # @param [Object] console_service
23
+ def initialize args={}, console_service
24
+ end
25
+
26
+ # Monitor handler
27
+ #
28
+ #
29
+ def monitor_handler
30
+ end
31
+
32
+ # Master handler
33
+ #
34
+ #
35
+ def master_handler
36
+ end
37
+
38
+ # Client handler
39
+ #
40
+ #
41
+ def client_handler
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,35 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 21 July 2014
4
+
5
+ module Citrus
6
+ # ConsoleModules
7
+ #
8
+ #
9
+ module ConsoleModules
10
+ # ConsoleModule
11
+ #
12
+ #
13
+ class ConsoleModule
14
+ #
15
+ #
16
+ #
17
+ def self.inherited subclass
18
+ class << subclass
19
+ attr_reader :module_id
20
+ end
21
+ end
22
+
23
+ attr_reader :type, :delay, :interval
24
+
25
+ #
26
+ #
27
+ #
28
+ def initialize
29
+ @type = ''
30
+ @delay = 0
31
+ @interval = 0
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,88 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 19 July 2014
4
+
5
+ require 'citrus/master/watchdog'
6
+ require 'citrus/modules/console_module'
7
+
8
+ module Citrus
9
+ # ConsoleModules
10
+ #
11
+ #
12
+ module ConsoleModules
13
+ # MaterWatcher
14
+ #
15
+ #
16
+ class MasterWatcher < ConsoleModule
17
+
18
+ @module_id = '__master_watcher__'
19
+
20
+ # Initialize the module
21
+ #
22
+ # @param [Hash] args
23
+ # @param [Object] console_service
24
+ def initialize args={}, console_service
25
+ @app = args[:app]
26
+ @service = console_service
27
+ @server_id = @app.server_id
28
+ @watchdog = Master::WatchDog.new @app, @service
29
+ @service.on('register') { |*args| on_server_add *args }
30
+ @service.on('disconnect') { |*args| on_server_leave *args }
31
+ @service.on('reconnect') { |*args| on_server_reconnect *args }
32
+ end
33
+
34
+ # Start the module
35
+ def start &block
36
+ block_given? and yield
37
+ end
38
+
39
+ # Master handler
40
+ #
41
+ # @param [Object] agent
42
+ # @param [Hash] msg
43
+ def master_handler agent, msg, &block
44
+ return if !msg
45
+ case msg[:action]
46
+ when 'subscribe'
47
+ handle_subscribe agent, msg, &block
48
+ else
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ # Server add listener
55
+ #
56
+ # @param [Hash] record
57
+ # @private
58
+ def on_server_add record
59
+ return if !record || record[:type] == 'client' || !record[:server_type]
60
+ @watchdog.add_server record
61
+ end
62
+
63
+ # Server leave listener
64
+ #
65
+ # @private
66
+ def on_server_leave
67
+ end
68
+
69
+ # Server reconnect listener
70
+ #
71
+ # @private
72
+ def on_server_reconnect
73
+ end
74
+
75
+ # Handle subscribe
76
+ #
77
+ # @param [Object] agent
78
+ # @param [Hash] msg
79
+ #
80
+ # @private
81
+ def handle_subscribe agent, msg, &block
82
+ return if !msg
83
+ @watchdog.subscribe msg[:server_id]
84
+ block_given? and yield nil, @watchdog.query
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,86 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 19 July 2014
4
+
5
+ require 'citrus/modules/console_module'
6
+
7
+ module Citrus
8
+ # ConsoleModules
9
+ #
10
+ #
11
+ module ConsoleModules
12
+ # MaterWatcher
13
+ #
14
+ #
15
+ class MonitorWatcher < ConsoleModule
16
+
17
+ @module_id = '__monitor_watcher__'
18
+
19
+ # Initialize the module
20
+ #
21
+ # @param [Hash] args
22
+ # @param [Object] console_service
23
+ def initialize args={}, console_service
24
+ @app = args[:app]
25
+ @service = console_service
26
+ @server_id = @app.server_id
27
+ end
28
+
29
+ # Start the module
30
+ def start &block
31
+ subscribe_request &block
32
+ end
33
+
34
+ # Monitor handler
35
+ #
36
+ # @param [Object] agent
37
+ # @param [Hash] msg
38
+ def monitor_handler agent, msg, &block
39
+ return if !msg || !msg[:action]
40
+ case msg[:action]
41
+ when 'add_server'
42
+ handle_add_server agent, msg
43
+ else
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ # Subscribe request
50
+ #
51
+ # @private
52
+ def subscribe_request &block
53
+ msg = { :action => 'subscribe', :server_id => @server_id }
54
+ @service.agent.request ConsoleModules::MasterWatcher.module_id, msg, proc{ |err, servers|
55
+ if err
56
+ block_given? and yield err
57
+ return
58
+ end
59
+ add_servers servers
60
+ block_given? and yield
61
+ }
62
+ end
63
+
64
+ # Handle add server
65
+ #
66
+ # @param [Object] agent
67
+ # @param [Hash] msg
68
+ #
69
+ # @private
70
+ def handle_add_server agent, msg
71
+ return if !msg || !msg[:server]
72
+ add_servers [msg[:server]]
73
+ end
74
+
75
+ # Add servers
76
+ #
77
+ # @param [Array] sinfos
78
+ #
79
+ # @private
80
+ def add_servers sinfos
81
+ return unless sinfos && !sinfos.empty?
82
+ @app.add_servers sinfos
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,61 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 20 July 2014
4
+
5
+ require 'citrus/util/module_util'
6
+
7
+ module Citrus
8
+ # Monitor
9
+ #
10
+ #
11
+ module Monitor
12
+ # Monitor
13
+ #
14
+ #
15
+ class Monitor
16
+ include Utils::ModuleUtil
17
+
18
+ # Create a new monitor
19
+ #
20
+ # @param [Object] app
21
+ # @param [Hash] args
22
+ def initialize app, args={}
23
+ @app = app
24
+ @master = false
25
+ @master_info = @app.master
26
+ @server_info = @app.cur_server
27
+ @modules = []
28
+ @close_watcher = args[:close_watcher]
29
+ @console_service = CitrusAdmin::ConsoleService.create_monitor_console({
30
+ :env => @app.env,
31
+ :host => @master_info[:host],
32
+ :port => @master_info[:port],
33
+ :server_id => @server_info[:server_id],
34
+ :server_type => @app.server_type,
35
+ :server_info => @server_info,
36
+ :auth_server => nil
37
+ })
38
+ end
39
+
40
+ # Start master
41
+ def start &block
42
+ register_default_modules
43
+ load_modules
44
+ @console_service.start { |err|
45
+ if err
46
+ block_given? and yield err
47
+ return
48
+ end
49
+ start_modules { |err|
50
+ block_given? and yield err
51
+ return
52
+ }
53
+ }
54
+ end
55
+
56
+ # Stop master
57
+ def stop &block
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,16 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 16 July 2014
4
+
5
+ module Citrus
6
+ # PushSchedulers
7
+ #
8
+ #
9
+ module PushSchedulers
10
+ # Buffer
11
+ #
12
+ #
13
+ class Buffer
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,76 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 16 July 2014
4
+
5
+ module Citrus
6
+ # PushSchedulers
7
+ #
8
+ #
9
+ module PushSchedulers
10
+ # Direct
11
+ #
12
+ #
13
+ class Direct
14
+ # Initialize the component
15
+ #
16
+ # @param [Object] app
17
+ # @param [Hash] args
18
+ def initialize app, args
19
+ @app = app
20
+ end
21
+
22
+ # Schedule
23
+ #
24
+ # @param [Integer] req_id
25
+ # @param [String] route
26
+ # @param [Hash] msg
27
+ # @param [Array] recvs
28
+ # @param [Hash] args
29
+ def schedule req_id, route, msg, recvs, args, &block
30
+ if args[:type] == 'broadcast'
31
+ do_broadcast msg, args[:user_args]
32
+ else
33
+ do_batch_push msg, recvs
34
+ end
35
+
36
+ EM.next_tick { block.call } if block_given?
37
+ end
38
+
39
+ private
40
+
41
+ # Do broadcast
42
+ #
43
+ # @param [Hash] msg
44
+ # @param [Hash] args
45
+ #
46
+ # @private
47
+ def do_broadcast msg, args={}
48
+ channel_service = @app.channel_service
49
+ session_service = @app.session_service
50
+
51
+ if args[:binded]
52
+ session_service.sessions.each { |session|
53
+ session_service.send_message_by_uid session.uid, msg
54
+ }
55
+ else
56
+ session_service.sessions.each { |session|
57
+ session_service.send_message session.id, msg
58
+ }
59
+ end
60
+ end
61
+
62
+ # Do batch push
63
+ #
64
+ # @param [Hash] msg
65
+ # @param [Array] recvs
66
+ #
67
+ # @private
68
+ def do_batch_push msg, recvs
69
+ session_service = @app.session_service
70
+ recvs.each { |recv|
71
+ session_service.send_message recv, msg
72
+ }
73
+ end
74
+ end
75
+ end
76
+ end