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