pomelo-citrus-rpc 0.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.
Files changed (37) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +20 -0
  3. data/Rakefile +0 -0
  4. data/citrus-rpc.gemspec +32 -0
  5. data/example/client.rb +43 -0
  6. data/example/remote/test/service.rb +9 -0
  7. data/example/server.rb +20 -0
  8. data/lib/citrus-rpc.rb +16 -0
  9. data/lib/citrus-rpc/rpc-client/client.rb +328 -0
  10. data/lib/citrus-rpc/rpc-client/mailboxes/ws_mailbox.rb +164 -0
  11. data/lib/citrus-rpc/rpc-client/mailstation.rb +363 -0
  12. data/lib/citrus-rpc/rpc-client/proxy.rb +37 -0
  13. data/lib/citrus-rpc/rpc-client/router.rb +63 -0
  14. data/lib/citrus-rpc/rpc-server/acceptors/ws_acceptor.rb +143 -0
  15. data/lib/citrus-rpc/rpc-server/dispatcher.rb +36 -0
  16. data/lib/citrus-rpc/rpc-server/gateway.rb +58 -0
  17. data/lib/citrus-rpc/rpc-server/server.rb +92 -0
  18. data/lib/citrus-rpc/util/constants.rb +20 -0
  19. data/lib/citrus-rpc/util/utils.rb +42 -0
  20. data/lib/citrus-rpc/version.rb +7 -0
  21. data/spec/mock-remote/area/add_one_remote.rb +13 -0
  22. data/spec/mock-remote/area/add_three_remote.rb +9 -0
  23. data/spec/mock-remote/area/who_am_i_remote.rb +9 -0
  24. data/spec/mock-remote/connector/who_am_i_remote.rb +9 -0
  25. data/spec/rpc-client/client_spec.rb +166 -0
  26. data/spec/rpc-client/mailstaion_spec.rb +235 -0
  27. data/spec/rpc-client/proxy_spec.rb +8 -0
  28. data/spec/rpc-client/router_spec.rb +8 -0
  29. data/spec/rpc-client/ws_mailbox_spec.rb +144 -0
  30. data/spec/rpc-server/client/mock-tcp-client.rb +6 -0
  31. data/spec/rpc-server/client/mock-ws-client.rb +48 -0
  32. data/spec/rpc-server/dispatcher_spec.rb +88 -0
  33. data/spec/rpc-server/gateway_spec.rb +206 -0
  34. data/spec/rpc-server/server_spec.rb +79 -0
  35. data/spec/rpc-server/ws_acceptor_spec.rb +138 -0
  36. data/spec/spec_helper.rb +25 -0
  37. metadata +179 -0
@@ -0,0 +1,79 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 5 July 2014
4
+
5
+ require File.expand_path('../../spec_helper', __FILE__)
6
+
7
+ describe Server do
8
+
9
+ dirname = File.expand_path File.dirname(__FILE__)
10
+ records = [
11
+ { :namespace => 'user', :path => dirname + '/../mock-remote/area' },
12
+ { :namespace => 'sys', :path => dirname + '/../mock-remote/connector' }
13
+ ]
14
+
15
+ port = 3333
16
+
17
+ describe '#create' do
18
+ it 'should be ok by passing port and paths argument' do
19
+ error_count = 0
20
+ close_count = 0
21
+
22
+ server = Server.new :records => records, :port => port
23
+ expect(server).to be
24
+
25
+ server.on(:error) { |err| error_count = error_count + 1 }
26
+ server.on(:closed) { close_count = close_count + 1 }
27
+
28
+ EM.run {
29
+ server.start
30
+ server.stop
31
+
32
+ EM.add_timer(0.1) {
33
+ expect(error_count).to eq 0
34
+ expect(close_count).to eq 1
35
+ EM.stop_event_loop
36
+ }
37
+ }
38
+ end
39
+
40
+ it 'should change the default acceptor class by passing acceptor class argument' do
41
+ construct_count = 0
42
+ listen_count = 0
43
+ close_count = 0
44
+
45
+ MockAcceptor = Class.new do
46
+ define_method(:initialize) { |*args|
47
+ construct_count = construct_count + 1
48
+ }
49
+
50
+ define_method(:listen) { |*args|
51
+ listen_count = listen_count + 1
52
+ }
53
+
54
+ define_method(:close) { |*args|
55
+ close_count = close_count + 1
56
+ }
57
+
58
+ define_method(:on) { |*args| }
59
+
60
+ define_method(:emit) { |*args| }
61
+ end
62
+
63
+ server = Server.new :records => records, :port => port, :acceptor_class => MockAcceptor
64
+ expect(server).to be
65
+
66
+ EM.run {
67
+ server.start
68
+ server.stop
69
+
70
+ EM.add_timer(0.1) {
71
+ expect(construct_count).to eq 1
72
+ expect(listen_count).to eq 1
73
+ expect(close_count).to eq 1
74
+ EM.stop_event_loop
75
+ }
76
+ }
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,138 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 5 July 2014
4
+
5
+ require File.expand_path('../../spec_helper', __FILE__)
6
+ require File.expand_path('../client/mock-ws-client', __FILE__)
7
+
8
+ describe WsAcceptor do
9
+
10
+ port = 3333
11
+
12
+ describe '#listen' do
13
+ it 'should be ok started listening on a valid port and closed event should be emitted when closed' do
14
+ error_count = 0
15
+ close_count = 0
16
+
17
+ acceptor = WsAcceptor.new
18
+ expect(acceptor).to be
19
+
20
+ acceptor.on(:error) { |err| error_count = error_count + 1 }
21
+ acceptor.on(:closed) { |closed| close_count = close_count + 1 }
22
+
23
+ EM.run {
24
+ acceptor.listen port
25
+ acceptor.close
26
+
27
+ EM.add_timer(0.1) {
28
+ expect(error_count).to eql 0
29
+ expect(close_count).to eql 1
30
+ EM.stop_event_loop
31
+ }
32
+ }
33
+ end
34
+
35
+ it 'should emit an error when listening on a port in use' do
36
+ error_count = 0
37
+
38
+ acceptor = WsAcceptor.new
39
+ expect(acceptor).to be
40
+
41
+ acceptor.on(:error) { |err|
42
+ expect(err).to be
43
+ error_count = error_count + 1
44
+ }
45
+
46
+ EM.run {
47
+ acceptor.listen 80
48
+
49
+ EM.add_timer(0.1) {
50
+ expect(error_count).to eql 1
51
+ EM.stop_event_loop
52
+ }
53
+ }
54
+ end
55
+ end
56
+
57
+ describe '#new message callback' do
58
+ it('should invoke the callback function with the same msg and return response to remote client by cb') {
59
+ server_callback_count = 0
60
+ client_callback_count = 0
61
+
62
+ origin_msg = {
63
+ 'service' => 'xxx.yyy.zzz',
64
+ 'method' => 'someMethod',
65
+ 'args' => [ 1, 'a', { 'param' => 100 } ]
66
+ }
67
+
68
+ acceptor = WsAcceptor.new do |msg, &block|
69
+ expect(msg).to eql origin_msg
70
+ server_callback_count = server_callback_count + 1
71
+ block.call msg
72
+ end
73
+ expect(acceptor).to be
74
+
75
+ EM.run {
76
+ acceptor.listen port
77
+
78
+ client = MockWsClient.new
79
+ client.connect('127.0.0.1', port) {
80
+ client.send(origin_msg) { |msg|
81
+ expect(msg).to eql origin_msg
82
+ client_callback_count = client_callback_count + 1
83
+ }
84
+ }
85
+
86
+ EM.add_timer(0.1) {
87
+ expect(server_callback_count).to eql 1
88
+ expect(client_callback_count).to eql 1
89
+ EM.stop_event_loop
90
+ }
91
+ }
92
+ }
93
+
94
+ it 'should keep relationship with request and response' do
95
+ server_callback_count = 0
96
+ client_callback_count = 0
97
+
98
+ origin_msg1 = {
99
+ 'service' => 'xxx.yyy.zzz1',
100
+ 'method' => 'someMethod1',
101
+ 'args' => [ 1, 'a', { 'param' => 100 } ]
102
+ }
103
+ origin_msg2 = {
104
+ 'service' => 'xxx.yyy.zzz2',
105
+ 'method' => 'someMethod2',
106
+ 'args' => [ 1, 'a', { 'param' => 100} ]
107
+ }
108
+
109
+ acceptor = WsAcceptor.new do |msg, &block|
110
+ server_callback_count = server_callback_count + 1
111
+ block.call msg
112
+ end
113
+ expect(acceptor).to be
114
+
115
+ EM.run {
116
+ acceptor.listen port
117
+
118
+ client = MockWsClient.new
119
+ client.connect('127.0.0.1', port) {
120
+ client.send(origin_msg1) { |msg|
121
+ expect(msg).to eql origin_msg1
122
+ client_callback_count = client_callback_count + 1
123
+ }
124
+ client.send(origin_msg2) { |msg|
125
+ expect(msg).to eql origin_msg2
126
+ client_callback_count = client_callback_count + 1
127
+ }
128
+ }
129
+
130
+ EM.add_timer(0.1) {
131
+ expect(server_callback_count).to eql 2
132
+ expect(client_callback_count).to eql 2
133
+ EM.stop_event_loop
134
+ }
135
+ }
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,25 @@
1
+ # Author:: MinixLi (gmail: MinixLi1986)
2
+ # Homepage:: http://citrus.inspawn.com
3
+ # Date:: 5 July 2014
4
+
5
+ require File.expand_path('../../lib/citrus-rpc', __FILE__)
6
+
7
+ Client = CitrusRpc::RpcClient::Client
8
+ MailStation = CitrusRpc::RpcClient::MailStation
9
+ WsMailBox = CitrusRpc::RpcClient::WsMailBox
10
+ Proxy = CitrusRpc::RpcClient::Proxy
11
+ Router = CitrusRpc::RpcClient::Router
12
+
13
+ Server = CitrusRpc::RpcServer::Server
14
+ Gateway = CitrusRpc::RpcServer::Gateway
15
+ Dispatcher = CitrusRpc::RpcServer::Dispatcher
16
+ WsAcceptor = CitrusRpc::RpcServer::WsAcceptor
17
+
18
+ RSpec.configure { |config|
19
+ config.mock_with(:rspec) { |c|
20
+ c.syntax = [:should, :expect]
21
+ }
22
+ config.expect_with(:rspec) { |c|
23
+ c.syntax = [:should, :expect]
24
+ }
25
+ }
metadata ADDED
@@ -0,0 +1,179 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pomelo-citrus-rpc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - MinixLi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eventmachine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: websocket-eventmachine-client
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: websocket-eventmachine-server
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pomelo-citrus-loader
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pomelo-citrus-logger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: pomelo-citrus-rpc is a simple clone of pomelo-rpc, it provides the infrastructure
98
+ of RPC between multi-server processes
99
+ email: MinixLi1986@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - README.md
105
+ - Rakefile
106
+ - citrus-rpc.gemspec
107
+ - example/client.rb
108
+ - example/remote/test/service.rb
109
+ - example/server.rb
110
+ - lib/citrus-rpc.rb
111
+ - lib/citrus-rpc/rpc-client/client.rb
112
+ - lib/citrus-rpc/rpc-client/mailboxes/ws_mailbox.rb
113
+ - lib/citrus-rpc/rpc-client/mailstation.rb
114
+ - lib/citrus-rpc/rpc-client/proxy.rb
115
+ - lib/citrus-rpc/rpc-client/router.rb
116
+ - lib/citrus-rpc/rpc-server/acceptors/ws_acceptor.rb
117
+ - lib/citrus-rpc/rpc-server/dispatcher.rb
118
+ - lib/citrus-rpc/rpc-server/gateway.rb
119
+ - lib/citrus-rpc/rpc-server/server.rb
120
+ - lib/citrus-rpc/util/constants.rb
121
+ - lib/citrus-rpc/util/utils.rb
122
+ - lib/citrus-rpc/version.rb
123
+ - spec/mock-remote/area/add_one_remote.rb
124
+ - spec/mock-remote/area/add_three_remote.rb
125
+ - spec/mock-remote/area/who_am_i_remote.rb
126
+ - spec/mock-remote/connector/who_am_i_remote.rb
127
+ - spec/rpc-client/client_spec.rb
128
+ - spec/rpc-client/mailstaion_spec.rb
129
+ - spec/rpc-client/proxy_spec.rb
130
+ - spec/rpc-client/router_spec.rb
131
+ - spec/rpc-client/ws_mailbox_spec.rb
132
+ - spec/rpc-server/client/mock-tcp-client.rb
133
+ - spec/rpc-server/client/mock-ws-client.rb
134
+ - spec/rpc-server/dispatcher_spec.rb
135
+ - spec/rpc-server/gateway_spec.rb
136
+ - spec/rpc-server/server_spec.rb
137
+ - spec/rpc-server/ws_acceptor_spec.rb
138
+ - spec/spec_helper.rb
139
+ homepage: https://github.com/minixli/pomelo-citrus-rpc
140
+ licenses:
141
+ - MIT
142
+ metadata: {}
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 2.4.1
160
+ signing_key:
161
+ specification_version: 4
162
+ summary: pomelo-rpc clone written in Ruby using EventMachine
163
+ test_files:
164
+ - spec/mock-remote/area/add_one_remote.rb
165
+ - spec/mock-remote/area/add_three_remote.rb
166
+ - spec/mock-remote/area/who_am_i_remote.rb
167
+ - spec/mock-remote/connector/who_am_i_remote.rb
168
+ - spec/rpc-client/client_spec.rb
169
+ - spec/rpc-client/mailstaion_spec.rb
170
+ - spec/rpc-client/proxy_spec.rb
171
+ - spec/rpc-client/router_spec.rb
172
+ - spec/rpc-client/ws_mailbox_spec.rb
173
+ - spec/rpc-server/client/mock-tcp-client.rb
174
+ - spec/rpc-server/client/mock-ws-client.rb
175
+ - spec/rpc-server/dispatcher_spec.rb
176
+ - spec/rpc-server/gateway_spec.rb
177
+ - spec/rpc-server/server_spec.rb
178
+ - spec/rpc-server/ws_acceptor_spec.rb
179
+ - spec/spec_helper.rb