pomelo-citrus 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +20 -0
- data/Rakefile +0 -0
- data/citrus.gemspec +35 -0
- data/lib/citrus.rb +18 -0
- data/lib/citrus/application.rb +237 -0
- data/lib/citrus/citrus.rb +27 -0
- data/lib/citrus/common/remote/backend/msg_remote.rb +57 -0
- data/lib/citrus/common/remote/frontend/channel_remote.rb +73 -0
- data/lib/citrus/common/remote/frontend/session_remote.rb +108 -0
- data/lib/citrus/common/service/backend_session_service.rb +265 -0
- data/lib/citrus/common/service/channel_service.rb +485 -0
- data/lib/citrus/common/service/connection_service.rb +71 -0
- data/lib/citrus/common/service/filter_service.rb +92 -0
- data/lib/citrus/common/service/handler_service.rb +63 -0
- data/lib/citrus/common/service/session_service.rb +446 -0
- data/lib/citrus/components/backend_session.rb +32 -0
- data/lib/citrus/components/channel.rb +33 -0
- data/lib/citrus/components/component.rb +19 -0
- data/lib/citrus/components/connection.rb +48 -0
- data/lib/citrus/components/connector.rb +265 -0
- data/lib/citrus/components/master.rb +40 -0
- data/lib/citrus/components/monitor.rb +48 -0
- data/lib/citrus/components/proxy.rb +195 -0
- data/lib/citrus/components/push_scheduler.rb +74 -0
- data/lib/citrus/components/remote.rb +71 -0
- data/lib/citrus/components/server.rb +61 -0
- data/lib/citrus/components/session.rb +41 -0
- data/lib/citrus/connectors/commands/handshake.rb +22 -0
- data/lib/citrus/connectors/commands/heartbeat.rb +22 -0
- data/lib/citrus/connectors/commands/kick.rb +22 -0
- data/lib/citrus/connectors/common/coder.rb +21 -0
- data/lib/citrus/connectors/common/handler.rb +21 -0
- data/lib/citrus/connectors/ws_connector.rb +110 -0
- data/lib/citrus/connectors/ws_socket.rb +75 -0
- data/lib/citrus/filters/handler/handler_filter.rb +19 -0
- data/lib/citrus/filters/handler/too_busy.rb +16 -0
- data/lib/citrus/filters/rpc/rpc_filter.rb +19 -0
- data/lib/citrus/filters/rpc/too_busy.rb +16 -0
- data/lib/citrus/master/master.rb +60 -0
- data/lib/citrus/master/starter.rb +73 -0
- data/lib/citrus/master/watchdog.rb +83 -0
- data/lib/citrus/modules/console.rb +45 -0
- data/lib/citrus/modules/console_module.rb +35 -0
- data/lib/citrus/modules/master_watcher.rb +88 -0
- data/lib/citrus/modules/monitor_watcher.rb +86 -0
- data/lib/citrus/monitor/monitor.rb +61 -0
- data/lib/citrus/push_schedulers/buffer.rb +16 -0
- data/lib/citrus/push_schedulers/direct.rb +76 -0
- data/lib/citrus/server/server.rb +327 -0
- data/lib/citrus/util/app_util.rb +203 -0
- data/lib/citrus/util/constants.rb +19 -0
- data/lib/citrus/util/countdown_latch.rb +42 -0
- data/lib/citrus/util/events.rb +14 -0
- data/lib/citrus/util/module_util.rb +68 -0
- data/lib/citrus/util/path_util.rb +50 -0
- data/lib/citrus/util/utils.rb +49 -0
- data/lib/citrus/version.rb +7 -0
- 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,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
|