pomelo-citrus 0.0.1

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.
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