mrpin-sdk 0.3.141 → 1.0.2
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 +4 -4
- data/.gitignore +47 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +65 -0
- data/Rakefile +1 -0
- data/app/assets/stylesheets/mrpin/sign_in.css +32 -0
- data/app/assets/stylesheets/mrpin.css.scss +3 -0
- data/app/views/devise/sessions/new.html.erb +16 -0
- data/app/views/layouts/devise.html.erb +12 -0
- data/lib/mrpin/all_files.rb +48 -0
- data/lib/mrpin/api/base/api_object.rb +48 -0
- data/lib/mrpin/api/base/handler_base.rb +86 -0
- data/lib/mrpin/api/base/request_base.rb +15 -0
- data/lib/mrpin/api/base/response_base.rb +29 -0
- data/lib/mrpin/api/bundles/init/handler_bundles_init.rb +36 -0
- data/lib/mrpin/api/bundles/init/request_bundles_init.rb +7 -0
- data/lib/mrpin/api/bundles/init/response_bundles_init.rb +5 -0
- data/lib/mrpin/api/packs/requests_pack.rb +38 -0
- data/lib/mrpin/api/packs/responses_pack.rb +38 -0
- data/lib/mrpin/api/platform/base/handler_platform_base.rb +26 -0
- data/lib/mrpin/api/platform/base/request_platform_base.rb +54 -0
- data/lib/mrpin/api/platform/report/handler_report_error.rb +74 -0
- data/lib/mrpin/api/platform/report/request_report_error.rb +20 -0
- data/lib/mrpin/api/standard/response_error.rb +19 -0
- data/lib/mrpin/api/standard/response_ok.rb +18 -0
- data/lib/mrpin/api/standard/response_session_end.rb +21 -0
- data/lib/mrpin/api/standard/response_with_url_data.rb +7 -0
- data/lib/mrpin/api/system/echo/handler_system_echo.rb +25 -0
- data/lib/mrpin/api/system/echo/request_system_echo.rb +19 -0
- data/lib/mrpin/config/initializers/00_carrier_wave.rb +4 -0
- data/lib/mrpin/config/initializers/01_devise.rb +264 -0
- data/lib/mrpin/config/initializers/02_mongo.rb +2 -0
- data/lib/mrpin/config/initializers/03_i18n.rb +3 -0
- data/lib/mrpin/config/initializers.rb +7 -0
- data/lib/mrpin/config/locales/rails_admin.en.yml +10 -0
- data/lib/mrpin/controllers/application_controller_base.rb +14 -0
- data/lib/mrpin/controllers/system_controller_base.rb +222 -0
- data/lib/mrpin/core/admin/admin_user.rb +39 -0
- data/lib/mrpin/core/admin/e_admin_user_role.rb +4 -0
- data/lib/mrpin/core/app_config_base.rb +48 -0
- data/lib/mrpin/core/app_info/app_info_base.rb +413 -0
- data/lib/mrpin/core/app_info/e_app_state.rb +13 -0
- data/lib/mrpin/core/base/amf_serializable.rb +16 -0
- data/lib/mrpin/core/base/enum_base.rb +12 -0
- data/lib/mrpin/core/base/info_base.rb +18 -0
- data/lib/mrpin/core/base/manager_base.rb +74 -0
- data/lib/mrpin/core/base/manager_with_json_data.rb +98 -0
- data/lib/mrpin/core/base/model_base.rb +219 -0
- data/lib/mrpin/core/bundles/bundle_base.rb +197 -0
- data/lib/mrpin/core/bundles/bundle_info_base.rb +29 -0
- data/lib/mrpin/core/bundles/e_build_type.rb +7 -0
- data/lib/mrpin/core/bundles/manager_bundles_base.rb +56 -0
- data/lib/mrpin/core/constants/constants_remote.rb +14 -0
- data/lib/mrpin/core/currency_exchanger/base/exchanger_base.rb +21 -0
- data/lib/mrpin/core/currency_exchanger/currency_exchanger.rb +40 -0
- data/lib/mrpin/core/currency_exchanger/e_currency_type.rb +8 -0
- data/lib/mrpin/core/currency_exchanger/fixer/exchanger_fixer.rb +40 -0
- data/lib/mrpin/core/currency_exchanger/local/exchanger_local.rb +23 -0
- data/lib/mrpin/core/currency_exchanger/yahoo/exchanger_yahoo.rb +34 -0
- data/lib/mrpin/core/exceptions/assertion_error.rb +3 -0
- data/lib/mrpin/core/extensions/hash.rb +25 -0
- data/lib/mrpin/core/extensions/mongoid_id_alias.rb +7 -0
- data/lib/mrpin/core/extensions/object.rb +57 -0
- data/lib/mrpin/core/extensions/thread.rb +23 -0
- data/lib/mrpin/core/extensions/time.rb +5 -0
- data/lib/mrpin/core/logger/logger_sdk.rb +14 -0
- data/lib/mrpin/core/platform/e_platform_type.rb +14 -0
- data/lib/mrpin/core/player/e_player_role.rb +7 -0
- data/lib/mrpin/core/player/e_sex_type.rb +7 -0
- data/lib/mrpin/core/player/player_statistic_base.rb +50 -0
- data/lib/mrpin/core/purchase/e_sale_type.rb +7 -0
- data/lib/mrpin/core/remote/e_response_type.rb +4 -0
- data/lib/mrpin/core/remote/http/manager_remote_http.rb +107 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_api.rb +43 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_disconnect.rb +69 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_handle.rb +155 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_sessions.rb +41 -0
- data/lib/mrpin/core/remote/socket/base/extensions/manager_remote_socket_statistic.rb +41 -0
- data/lib/mrpin/core/remote/socket/base/extensions/network_interface_helper.rb +53 -0
- data/lib/mrpin/core/remote/socket/base/manager_remote_socket_base.rb +131 -0
- data/lib/mrpin/core/remote/socket/base/socket_client_base.rb +181 -0
- data/lib/mrpin/core/remote/socket/base/socket_client_crossdomain.rb +33 -0
- data/lib/mrpin/core/remote/socket/flash/manager_remote_socket_flash.rb +51 -0
- data/lib/mrpin/core/remote/socket/flash/socket_client_flash.rb +21 -0
- data/lib/mrpin/core/remote/socket/unity/manager_remote_socket_unity.rb +58 -0
- data/lib/mrpin/core/remote/socket/unity/socket_client_unity.rb +19 -0
- data/lib/mrpin/core/remote/socket/websocket/manager_remote_web_sockets.rb +101 -0
- data/lib/mrpin/core/remote/socket/websocket/socket_client_web_sockets.rb +129 -0
- data/lib/mrpin/core/remote/socket/with_policy/socket_client_with_policy.rb +66 -0
- data/lib/mrpin/core/review.rb +231 -0
- data/lib/mrpin/core/scheduler/manager_scheduler.rb +66 -0
- data/lib/mrpin/core/statistic/error_client_base.rb +136 -0
- data/lib/mrpin/core/statistic/error_server_base.rb +93 -0
- data/lib/mrpin/core/statistic/manager_statistics_base.rb +221 -0
- data/lib/mrpin/core/statistic/statistic_application_base.rb +88 -0
- data/lib/mrpin/core/statistic/statistic_config_base.rb +38 -0
- data/lib/mrpin/core/statistic/system_handler_profiler.rb +85 -0
- data/lib/mrpin/core/string/e_language_type.rb +29 -0
- data/lib/mrpin/core/string/e_string_type_base.rb +14 -0
- data/lib/mrpin/core/string/localization_base.rb +77 -0
- data/lib/mrpin/core/string/localization_base_map.rb +303 -0
- data/lib/mrpin/core/string/manager_string_base.rb +159 -0
- data/lib/mrpin/core/threads/thread_with_task.rb +62 -0
- data/lib/mrpin/core/uploaders/aws/aws_file_info.rb +16 -0
- data/lib/mrpin/core/uploaders/aws/aws_uploader.rb +229 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader.rb +7 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_base.rb +66 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_local.rb +111 -0
- data/lib/mrpin/core/uploaders/carrierwave/file_uploader_helpers_s3.rb +87 -0
- data/lib/mrpin/core/uploaders/carrierwave/zip_uploader.rb +10 -0
- data/lib/mrpin/core/utils/mongo.rb +41 -0
- data/lib/mrpin/core/utils/sorter_base.rb +344 -0
- data/lib/mrpin/core/utils/utils_io.rb +27 -0
- data/lib/mrpin/core/utils/utils_string.rb +17 -0
- data/lib/mrpin/core/utils/utils_zip.rb +58 -0
- data/lib/mrpin/libs/rails_admin/localization.rb +70 -0
- data/lib/mrpin/libs.rb +11 -0
- data/lib/mrpin/rails/engine.rb +11 -0
- data/lib/mrpin/vendors.rb +19 -0
- data/lib/mrpin/version.rb +3 -0
- data/lib/mrpin-sdk.rb +6 -0
- data/mrpin-sdk.gemspec +54 -0
- metadata +163 -96
@@ -0,0 +1,69 @@
|
|
1
|
+
module ManagerRemoteSocketDisconnect
|
2
|
+
|
3
|
+
#
|
4
|
+
# properties
|
5
|
+
#
|
6
|
+
|
7
|
+
#
|
8
|
+
# methods
|
9
|
+
#
|
10
|
+
|
11
|
+
protected
|
12
|
+
def send_response_and_close(session, response)
|
13
|
+
session.should_disconnect_session = false
|
14
|
+
session.send_response(response)
|
15
|
+
session.close_connection_after_writing
|
16
|
+
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
public
|
21
|
+
def disconnect_inactive
|
22
|
+
response = Api::ResponseSessionEnd.new
|
23
|
+
response.description = EStringTypeBase::EST_ERROR_PLAYER_INACTIVE
|
24
|
+
|
25
|
+
inactive_players_count = 0
|
26
|
+
|
27
|
+
@sessions_locker.synchronize do
|
28
|
+
|
29
|
+
time_last_request = Time.now.to_i - 20.minutes
|
30
|
+
|
31
|
+
@sessions.reject! do |session|
|
32
|
+
|
33
|
+
result = session.time_last_request < time_last_request
|
34
|
+
|
35
|
+
if result
|
36
|
+
send_response_and_close(session, response)
|
37
|
+
|
38
|
+
inactive_players_count += 1
|
39
|
+
end #if
|
40
|
+
|
41
|
+
result
|
42
|
+
end #reject!
|
43
|
+
|
44
|
+
end #mutex
|
45
|
+
|
46
|
+
@logger.info "disconnect inactive #{inactive_players_count} players"
|
47
|
+
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
public
|
52
|
+
def disconnect_all_with_message(message)
|
53
|
+
response = Api::ResponseSessionEnd.new
|
54
|
+
response.description = message
|
55
|
+
|
56
|
+
@logger.info "disconnect all with #{message}"
|
57
|
+
|
58
|
+
@sessions_locker.synchronize do
|
59
|
+
@sessions.each do |session|
|
60
|
+
send_response_and_close(session, response)
|
61
|
+
end
|
62
|
+
|
63
|
+
@sessions.clear
|
64
|
+
end
|
65
|
+
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
module ManagerRemoteSocketHandle
|
2
|
+
|
3
|
+
#
|
4
|
+
# properties
|
5
|
+
#
|
6
|
+
|
7
|
+
public
|
8
|
+
def requests_pending
|
9
|
+
result = 0
|
10
|
+
|
11
|
+
@sessions_with_requests_locker.synchronize do
|
12
|
+
result = @sessions_with_requests.size
|
13
|
+
end
|
14
|
+
|
15
|
+
result
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# events
|
20
|
+
#
|
21
|
+
|
22
|
+
protected
|
23
|
+
def on_request_handler_is_nil(session, request, request_id)
|
24
|
+
error = "can't find handler for request: #{request.class}"
|
25
|
+
|
26
|
+
AppInfo.instance.on_server_error(error)
|
27
|
+
|
28
|
+
session.send_response_error(request_id, error)
|
29
|
+
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# methods
|
35
|
+
#
|
36
|
+
|
37
|
+
private
|
38
|
+
def init_handle
|
39
|
+
@sessions_with_requests = []
|
40
|
+
@sessions_with_requests_locker = Mutex.new
|
41
|
+
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
def create_handler(index)
|
47
|
+
result = ThreadWithTask.new(0.01, "thread_remote_handler_#{index}", 0.01)
|
48
|
+
|
49
|
+
result.run do
|
50
|
+
session = nil
|
51
|
+
|
52
|
+
@sessions_with_requests_locker.synchronize do
|
53
|
+
session = @sessions_with_requests.shift
|
54
|
+
end
|
55
|
+
|
56
|
+
next if session.nil?
|
57
|
+
|
58
|
+
requests = session.get_requests
|
59
|
+
|
60
|
+
requests.each do |request|
|
61
|
+
|
62
|
+
if Rails.env.development?
|
63
|
+
request.report_log("received\t") if request.respond_to?(:report_log)
|
64
|
+
end
|
65
|
+
|
66
|
+
try_handle_request(session, request)
|
67
|
+
|
68
|
+
end #synchronize
|
69
|
+
|
70
|
+
nil #for prevent return other value
|
71
|
+
|
72
|
+
end #thread
|
73
|
+
|
74
|
+
result
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
protected
|
79
|
+
def try_handle_request(session, request)
|
80
|
+
if request.nil?
|
81
|
+
AppInfo.instance.on_server_error('request should be non nil')
|
82
|
+
return
|
83
|
+
end
|
84
|
+
|
85
|
+
begin
|
86
|
+
|
87
|
+
handler = @handlers_map[request.class]
|
88
|
+
|
89
|
+
if handler.nil? #something wrong
|
90
|
+
|
91
|
+
request_id = -1
|
92
|
+
|
93
|
+
if request.is_a? AMF::HashWithType
|
94
|
+
request_id = request[:request_id]
|
95
|
+
|
96
|
+
@logger.warn "you forgot register class #{request.class_type}"
|
97
|
+
elsif request.respond_to?(:request_id)
|
98
|
+
request_id = request.request_id
|
99
|
+
end
|
100
|
+
|
101
|
+
on_request_handler_is_nil(session, request, request_id)
|
102
|
+
|
103
|
+
else #just handle request
|
104
|
+
handler.handle_request(session, request)
|
105
|
+
handler.post_handle(Time.now)
|
106
|
+
end
|
107
|
+
|
108
|
+
rescue Exception => e
|
109
|
+
|
110
|
+
player_id = nil
|
111
|
+
|
112
|
+
if session.respond_to?(:player) && !session.player.nil?
|
113
|
+
player_id = session.player.id
|
114
|
+
end
|
115
|
+
|
116
|
+
if player_id.nil?
|
117
|
+
player_id = request.player_id if request.respond_to?(:player_id)
|
118
|
+
end
|
119
|
+
|
120
|
+
AppInfo.instance.on_server_error(e.to_s, e, request, player_id)
|
121
|
+
|
122
|
+
request_id = request.respond_to?(:request_id) ? request.request_id : -1
|
123
|
+
|
124
|
+
#send error if can't handle
|
125
|
+
session.send_response_error(request_id, EStringTypeBase::EST_ERROR_UNKNOWN)
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
nil
|
130
|
+
end
|
131
|
+
|
132
|
+
protected
|
133
|
+
def check_request_class(request)
|
134
|
+
return if request.is_a?(Api::RequestBase)
|
135
|
+
|
136
|
+
if request.is_a?(AMF::HashWithType)
|
137
|
+
assert(false, "You forgot register request class #{request.class_type}")
|
138
|
+
else
|
139
|
+
assert(false, "Unsupported request class #{request.class}")
|
140
|
+
end
|
141
|
+
|
142
|
+
nil
|
143
|
+
end
|
144
|
+
|
145
|
+
public
|
146
|
+
def handle_data_from(session)
|
147
|
+
@sessions_with_requests_locker.synchronize do
|
148
|
+
@sessions_with_requests << session
|
149
|
+
end
|
150
|
+
|
151
|
+
nil
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ManagerRemoteSocketSessions
|
2
|
+
|
3
|
+
#
|
4
|
+
# properties
|
5
|
+
#
|
6
|
+
|
7
|
+
#
|
8
|
+
# events
|
9
|
+
#
|
10
|
+
|
11
|
+
public
|
12
|
+
def on_client_connected(session)
|
13
|
+
@sessions_locker.synchronize do
|
14
|
+
@sessions << session
|
15
|
+
end
|
16
|
+
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
public
|
21
|
+
def on_client_disconnected(session)
|
22
|
+
@sessions_locker.synchronize do
|
23
|
+
@sessions.delete(session)
|
24
|
+
end
|
25
|
+
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
#
|
30
|
+
# methods
|
31
|
+
#
|
32
|
+
|
33
|
+
public
|
34
|
+
def init_sessions
|
35
|
+
@sessions = []
|
36
|
+
@sessions_locker = Mutex.new
|
37
|
+
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module ManagerRemoteSocketStatistic
|
2
|
+
|
3
|
+
#
|
4
|
+
# properties
|
5
|
+
#
|
6
|
+
|
7
|
+
#
|
8
|
+
# methods
|
9
|
+
#
|
10
|
+
|
11
|
+
public
|
12
|
+
def store_handler_profiler_data
|
13
|
+
return unless Rails.env.production?
|
14
|
+
|
15
|
+
timestamp = Time.now.to_i
|
16
|
+
|
17
|
+
handlers = @handlers_map.values
|
18
|
+
|
19
|
+
handlers.each do |handler|
|
20
|
+
|
21
|
+
next if handler.requests_count == 0
|
22
|
+
|
23
|
+
handle_stats = SystemHandlerProfiler.new
|
24
|
+
|
25
|
+
handle_stats.handler = handler.class.to_s
|
26
|
+
handle_stats.requests_count = handler.requests_count
|
27
|
+
handle_stats.requests_handle_duration_ms = handler.handle_duration_total
|
28
|
+
handle_stats.requests_handle_duration_max = handler.handle_duration_max
|
29
|
+
handle_stats.requests_handle_duration_min = handler.handle_duration_min
|
30
|
+
handle_stats.requests_handle_duration_avg = handler.handle_duration_total / handle_stats.requests_count
|
31
|
+
|
32
|
+
handle_stats.timestamp = timestamp
|
33
|
+
|
34
|
+
handle_stats.save!
|
35
|
+
|
36
|
+
handler.reset_handler_stats
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module NetworkInterfaceHelper
|
2
|
+
|
3
|
+
protected
|
4
|
+
def get_ip
|
5
|
+
result = self.my_first_public_ipv4
|
6
|
+
|
7
|
+
result = self.my_first_private_ipv4 if result.nil?
|
8
|
+
|
9
|
+
result = '127.0.0.1' if result.nil?
|
10
|
+
|
11
|
+
result
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
def my_first_private_ipv4
|
16
|
+
result = nil
|
17
|
+
|
18
|
+
addr_info = Socket.ip_address_list.detect do |intf|
|
19
|
+
intf.ipv4_private?
|
20
|
+
end
|
21
|
+
|
22
|
+
result = addr_info.ip_address unless addr_info.nil?
|
23
|
+
|
24
|
+
result
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def my_first_public_ipv4
|
29
|
+
result = nil
|
30
|
+
|
31
|
+
addr_info = Socket.ip_address_list.detect do |intf|
|
32
|
+
intf.ipv4? and !intf.ipv4_loopback? and !intf.ipv4_multicast? and !intf.ipv4_private?
|
33
|
+
end
|
34
|
+
|
35
|
+
result = addr_info.ip_address unless addr_info.nil?
|
36
|
+
|
37
|
+
result
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
def my_public_ipv4_aws
|
42
|
+
result = nil
|
43
|
+
|
44
|
+
begin
|
45
|
+
result = `wget -qO- http://instance-data/latest/meta-data/public-ipv4`
|
46
|
+
rescue Exception => e
|
47
|
+
AppInfo.instance.on_server_error(e, e)
|
48
|
+
end
|
49
|
+
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
class ManagerRemoteSocketBase < ManagerBase
|
2
|
+
|
3
|
+
include ManagerRemoteSocketApi
|
4
|
+
include ManagerRemoteSocketDisconnect
|
5
|
+
include ManagerRemoteSocketHandle
|
6
|
+
include ManagerRemoteSocketSessions
|
7
|
+
include ManagerRemoteSocketStatistic
|
8
|
+
include NetworkInterfaceHelper
|
9
|
+
|
10
|
+
#
|
11
|
+
# Properties
|
12
|
+
#
|
13
|
+
|
14
|
+
attr_reader :ip
|
15
|
+
attr_reader :port
|
16
|
+
attr_reader :port_secure
|
17
|
+
|
18
|
+
attr_reader :sessions
|
19
|
+
|
20
|
+
protected
|
21
|
+
def default_port
|
22
|
+
assert(false, 'please override')
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
def server_type
|
27
|
+
'unknown'
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Events
|
32
|
+
#
|
33
|
+
|
34
|
+
public
|
35
|
+
def on_client_request_policy(session)
|
36
|
+
#do nothing
|
37
|
+
end
|
38
|
+
|
39
|
+
public
|
40
|
+
def on_server_shutdown
|
41
|
+
super
|
42
|
+
|
43
|
+
disconnect_all_with_message(EStringTypeBase::EST_ERROR_SERVER_SHUTDOWN)
|
44
|
+
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
public
|
49
|
+
def on_server_maintenance_on
|
50
|
+
self.disconnect_all_with_message(EStringTypeBase::EST_ERROR_SERVER_ON_MAINTENANCE)
|
51
|
+
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# Methods
|
57
|
+
#
|
58
|
+
|
59
|
+
# default constructor
|
60
|
+
public
|
61
|
+
def initialize
|
62
|
+
super
|
63
|
+
|
64
|
+
init_api
|
65
|
+
init_handle
|
66
|
+
init_sessions
|
67
|
+
end
|
68
|
+
|
69
|
+
public
|
70
|
+
def post_init
|
71
|
+
super
|
72
|
+
|
73
|
+
register_classes
|
74
|
+
register_handlers
|
75
|
+
|
76
|
+
Constants::THREADS_HANDLERS_COUNT.times do |n|
|
77
|
+
create_handler(n)
|
78
|
+
end
|
79
|
+
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
|
83
|
+
def start!(callback = nil)
|
84
|
+
begin
|
85
|
+
descriptor_size = EventMachine.set_descriptor_table_size(60000)
|
86
|
+
|
87
|
+
@logger.info "descriptors size is #{descriptor_size}"
|
88
|
+
|
89
|
+
rescue Exception => e
|
90
|
+
AppInfo.instance.on_server_error(e.to_s, e)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
protected
|
95
|
+
def start_server_on_port(port, client_class, continue_after_error = true, callback = nil)
|
96
|
+
thread = Thread.new do
|
97
|
+
|
98
|
+
client_class.manager_remote = self if client_class.respond_to?('manager_remote=')
|
99
|
+
|
100
|
+
begin
|
101
|
+
|
102
|
+
EventMachine.epoll
|
103
|
+
|
104
|
+
EventMachine.run do
|
105
|
+
|
106
|
+
ip = '0.0.0.0'
|
107
|
+
|
108
|
+
EventMachine.start_server(ip, port, client_class)
|
109
|
+
|
110
|
+
@logger.info "server #{self.server_type}\t\tstarted on #{ip}:#{port}"
|
111
|
+
|
112
|
+
callback.call unless callback.nil?
|
113
|
+
end
|
114
|
+
rescue Exception => e
|
115
|
+
message = "error on server #{ip}:#{port} thread: #{e}"
|
116
|
+
|
117
|
+
AppInfo.instance.on_server_error(message, e)
|
118
|
+
|
119
|
+
sleep 10
|
120
|
+
|
121
|
+
retry if continue_after_error
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
thread.name = "thread_remote_server_#{ip}:#{port}"
|
127
|
+
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,181 @@
|
|
1
|
+
class SocketClientBase < EM::Connection
|
2
|
+
|
3
|
+
#
|
4
|
+
# static fields
|
5
|
+
#
|
6
|
+
|
7
|
+
public
|
8
|
+
def self.manager_remote=(value)
|
9
|
+
@manager_remote = value
|
10
|
+
end
|
11
|
+
|
12
|
+
public
|
13
|
+
def self.manager_remote
|
14
|
+
@manager_remote
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Properties
|
19
|
+
#
|
20
|
+
attr_reader :time_last_request
|
21
|
+
attr_reader :ip
|
22
|
+
|
23
|
+
#use for disconnect_inactive_players and on_application_exit
|
24
|
+
attr_accessor :should_disconnect_session
|
25
|
+
|
26
|
+
attr_accessor :player
|
27
|
+
|
28
|
+
public
|
29
|
+
def is_online?
|
30
|
+
@is_online
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Events
|
35
|
+
#
|
36
|
+
|
37
|
+
protected
|
38
|
+
def on_get_requests_error(e)
|
39
|
+
AppInfo.instance.on_server_error("Error on get_requests #{e}", e)
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# Methods
|
44
|
+
#
|
45
|
+
|
46
|
+
# default constructor
|
47
|
+
public
|
48
|
+
def post_init
|
49
|
+
@logger = AppInfo.instance.logger
|
50
|
+
|
51
|
+
@requests_locker = Mutex.new
|
52
|
+
|
53
|
+
@is_online = true
|
54
|
+
|
55
|
+
@time_last_request = Time.now.to_i
|
56
|
+
|
57
|
+
@should_disconnect_session = true
|
58
|
+
|
59
|
+
@manager_remote = self.class.manager_remote
|
60
|
+
@manager_remote.on_client_connected(self)
|
61
|
+
|
62
|
+
@data_buffer = ''
|
63
|
+
|
64
|
+
@player = nil
|
65
|
+
|
66
|
+
init_ip
|
67
|
+
|
68
|
+
nil
|
69
|
+
end
|
70
|
+
|
71
|
+
protected
|
72
|
+
def init_ip
|
73
|
+
init_ip_internal(get_peername)
|
74
|
+
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
def init_ip_internal(peername)
|
80
|
+
@ip = Socket.unpack_sockaddr_in(get_peername).last rescue '0.0.0.0'
|
81
|
+
|
82
|
+
@logger.info "connection from #{@ip} complete"
|
83
|
+
|
84
|
+
nil
|
85
|
+
end
|
86
|
+
|
87
|
+
public
|
88
|
+
def receive_data(data)
|
89
|
+
@time_last_request = Time.now.to_i
|
90
|
+
|
91
|
+
@requests_locker.synchronize do
|
92
|
+
@data_buffer += data
|
93
|
+
end
|
94
|
+
|
95
|
+
@manager_remote.handle_data_from(self)
|
96
|
+
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
|
100
|
+
public
|
101
|
+
def get_requests
|
102
|
+
result = []
|
103
|
+
|
104
|
+
return result unless @is_online
|
105
|
+
|
106
|
+
@requests_locker.synchronize do
|
107
|
+
begin
|
108
|
+
|
109
|
+
unless @data_buffer.empty?
|
110
|
+
deserialize_data = AMF::Root.deserialize(@data_buffer)
|
111
|
+
result = deserialize_data[:objects]
|
112
|
+
@data_buffer = deserialize_data[:incomplete_objects] || ''
|
113
|
+
end
|
114
|
+
|
115
|
+
rescue Exception => e
|
116
|
+
on_get_requests_error(e)
|
117
|
+
end #begin/rescue
|
118
|
+
end #synchronize
|
119
|
+
|
120
|
+
result
|
121
|
+
end
|
122
|
+
|
123
|
+
|
124
|
+
public
|
125
|
+
def send_response(response_obj)
|
126
|
+
return unless @is_online
|
127
|
+
|
128
|
+
report_about_sent_request(response_obj)
|
129
|
+
|
130
|
+
response = AMF::Root.serialize(response_obj)
|
131
|
+
|
132
|
+
send_data(response)
|
133
|
+
|
134
|
+
nil #for prevent return other value
|
135
|
+
end
|
136
|
+
|
137
|
+
if Rails.env.development?
|
138
|
+
protected
|
139
|
+
def report_about_sent_request(value)
|
140
|
+
value.report_log("sent\t\t") if value.respond_to?(:report_log)
|
141
|
+
|
142
|
+
nil
|
143
|
+
end
|
144
|
+
else
|
145
|
+
protected
|
146
|
+
def report_about_sent_request(value)
|
147
|
+
#do nothing
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
public
|
153
|
+
def send_raw_data(raw_data)
|
154
|
+
send_data(raw_data)
|
155
|
+
end
|
156
|
+
|
157
|
+
public
|
158
|
+
def send_response_ok(request_id)
|
159
|
+
response = Api::ResponseOk.new(request_id)
|
160
|
+
|
161
|
+
send_response(response)
|
162
|
+
end
|
163
|
+
|
164
|
+
public
|
165
|
+
def send_response_error(request_id, description = nil)
|
166
|
+
response = Api::ResponseError.new(request_id)
|
167
|
+
response.description = description
|
168
|
+
|
169
|
+
send_response(response)
|
170
|
+
end
|
171
|
+
|
172
|
+
public
|
173
|
+
def unbind
|
174
|
+
@is_online = false
|
175
|
+
|
176
|
+
@manager_remote.on_client_disconnected(self) if @should_disconnect_session
|
177
|
+
|
178
|
+
nil
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class SocketClientCrossdomain < EM::Connection
|
2
|
+
|
3
|
+
#
|
4
|
+
# Properties
|
5
|
+
#
|
6
|
+
|
7
|
+
public
|
8
|
+
def self.manager_remote=(value)
|
9
|
+
@manager_remote = value
|
10
|
+
end
|
11
|
+
|
12
|
+
public
|
13
|
+
def self.manager_remote
|
14
|
+
@manager_remote
|
15
|
+
end
|
16
|
+
|
17
|
+
#
|
18
|
+
# Methods
|
19
|
+
#
|
20
|
+
|
21
|
+
public
|
22
|
+
def post_init
|
23
|
+
@manager_remote = self.class.manager_remote
|
24
|
+
end
|
25
|
+
|
26
|
+
public
|
27
|
+
def receive_data(data)
|
28
|
+
@manager_remote.on_client_request_policy(self)
|
29
|
+
|
30
|
+
AppInfo.instance.logger.info 'use 843 port for crossdomain.xml'
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|