combi 0.0.3
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/.gitignore +12 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +100 -0
- data/combi.gemspec +24 -0
- data/lib/combi.rb +2 -0
- data/lib/combi/buses/bus.rb +82 -0
- data/lib/combi/buses/http.rb +88 -0
- data/lib/combi/buses/in_process.rb +45 -0
- data/lib/combi/buses/queue.rb +86 -0
- data/lib/combi/buses/web_socket.rb +227 -0
- data/lib/combi/helpers.rb +18 -0
- data/lib/combi/queue_service.rb +102 -0
- data/lib/combi/reactor.rb +46 -0
- data/lib/combi/response_store.rb +36 -0
- data/lib/combi/service.rb +59 -0
- data/lib/combi/service_bus.rb +31 -0
- data/lib/combi/version.rb +3 -0
- data/spec/integration/multi_bus_spec.rb +140 -0
- data/spec/lib/combi/buses/bus_spec.rb +22 -0
- data/spec/lib/combi/buses/http_spec.rb +25 -0
- data/spec/lib/combi/buses/in_process_spec.rb +24 -0
- data/spec/lib/combi/buses/queue_spec.rb +41 -0
- data/spec/lib/combi/buses/web_socket_spec.rb +34 -0
- data/spec/lib/combi/service_spec.rb +40 -0
- data/spec/shared_examples/standard_bus.rb +62 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/support/rabbitmq_server.rb +81 -0
- data/spec/support/web_server.rb +50 -0
- data/spec/support/websocket_server.rb +13 -0
- metadata +203 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'socket'
|
3
|
+
require 'timeout'
|
4
|
+
# Uses docker to start a server
|
5
|
+
class RabbitmqServer
|
6
|
+
include Singleton
|
7
|
+
|
8
|
+
NAME='combi_rabbit'
|
9
|
+
PASSWORD='testpass'
|
10
|
+
|
11
|
+
def start!
|
12
|
+
needs_to_start = !container_running?
|
13
|
+
if needs_to_start
|
14
|
+
puts "Starting new Rabbitmq container"
|
15
|
+
system "docker run -d -P -e RABBITMQ_PASS=#{PASSWORD} --name #{NAME} tutum/rabbitmq"
|
16
|
+
puts "RABBITMQ STARTING"
|
17
|
+
end
|
18
|
+
start_forwarder!
|
19
|
+
is_port_open?('localhost', port)
|
20
|
+
return needs_to_start
|
21
|
+
end
|
22
|
+
|
23
|
+
def stop!
|
24
|
+
system "docker stop --time 0 #{NAME}" if container_running?
|
25
|
+
system "docker rm #{NAME}" if container_exists?
|
26
|
+
stop_forwarder!
|
27
|
+
end
|
28
|
+
|
29
|
+
def start_forwarder!
|
30
|
+
@forwarder_pid = Process.spawn '/usr/local/bin/boot2docker', 'ssh', '-L', "#{port}:localhost:#{port}", '-N'
|
31
|
+
#Process.detach @forwarder_pid
|
32
|
+
puts "starting forwarder pid: #{@forwarder_pid}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def stop_forwarder!
|
36
|
+
puts "stopping forwarder pid #{@forwarder_pid}"
|
37
|
+
Process.kill 'TERM', @forwarder_pid if @forwarder_pid
|
38
|
+
rescue Error::ESRCH => e
|
39
|
+
# the forwarder process has already died
|
40
|
+
end
|
41
|
+
|
42
|
+
def port
|
43
|
+
container_line = `docker ps | grep #{NAME}`
|
44
|
+
port_match = container_line.match(/:([0-9]+)->5672/)
|
45
|
+
if port_match
|
46
|
+
return port_match[1]
|
47
|
+
else
|
48
|
+
puts "Container not running yet, sleeping"
|
49
|
+
sleep 0.2
|
50
|
+
port
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def is_port_open?(ip, port, timeout = 15)
|
55
|
+
begin
|
56
|
+
Timeout::timeout(timeout) do
|
57
|
+
begin
|
58
|
+
s = TCPSocket.new(ip, port)
|
59
|
+
s.close
|
60
|
+
return true
|
61
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
62
|
+
puts "conn error to rabbit @ #{ip}##{port}"
|
63
|
+
sleep 1
|
64
|
+
retry
|
65
|
+
end
|
66
|
+
end
|
67
|
+
rescue Timeout::Error
|
68
|
+
puts "Cannot connect to RABBIT server after #{timeout} seconds"
|
69
|
+
end
|
70
|
+
|
71
|
+
return false
|
72
|
+
end
|
73
|
+
|
74
|
+
def container_running?
|
75
|
+
`docker ps | grep #{NAME}`.length > 0
|
76
|
+
end
|
77
|
+
|
78
|
+
def container_exists?
|
79
|
+
`docker ps -a | grep #{NAME}`.length > 0
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
|
3
|
+
AsyncResponse = [-1, {}, []].freeze
|
4
|
+
|
5
|
+
class DeferrableBody
|
6
|
+
include EventMachine::Deferrable
|
7
|
+
|
8
|
+
def initialize(defer)
|
9
|
+
@defer = defer
|
10
|
+
@defer.callback do |service_response|
|
11
|
+
EM::next_tick do
|
12
|
+
self.call [{result: 'ok', response: service_response}.to_json]
|
13
|
+
self.succeed
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def each(&block)
|
19
|
+
@body_callback = block
|
20
|
+
end
|
21
|
+
|
22
|
+
def call(chunks)
|
23
|
+
chunks.each do |chunk|
|
24
|
+
@body_callback.call chunk
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def start_web_server(http_bus, port, webserver = 'thin')
|
31
|
+
require webserver
|
32
|
+
puts "starting web server '#{webserver}' at port #{port}"
|
33
|
+
app = lambda do |env|
|
34
|
+
response_message = http_bus.manage_request(env)
|
35
|
+
if response_message[:response].respond_to? :succeed
|
36
|
+
env['async.callback'].call [200, {}, DeferrableBody.new(response_message[:response])]
|
37
|
+
AsyncResponse
|
38
|
+
else
|
39
|
+
response_rack = Rack::Response.new
|
40
|
+
response_rack.status = response_message.nil? ? 201 : 200
|
41
|
+
response_rack.body = [response_message.to_json]
|
42
|
+
response_rack.finish
|
43
|
+
response_rack
|
44
|
+
end
|
45
|
+
end
|
46
|
+
rack_handler = Rack::Handler.get(webserver)
|
47
|
+
rack_handler.run app, Port: port
|
48
|
+
puts "EM WEB STARTED"
|
49
|
+
sleep 0.1
|
50
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'em-websocket'
|
2
|
+
|
3
|
+
def start_em_websocket_server(websocket_bus, port)
|
4
|
+
puts "starting websocket server at port #{port}"
|
5
|
+
ws_handler = Class.new do
|
6
|
+
def new_session(arg); end
|
7
|
+
end.new
|
8
|
+
EM::WebSocket.start(host: '0.0.0.0', port: port) do |ws|
|
9
|
+
websocket_bus.manage_ws_event(ws, ws_handler)
|
10
|
+
end
|
11
|
+
puts "EM WEBSOCKET STARTED"
|
12
|
+
sleep 0.1
|
13
|
+
end
|
metadata
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: combi
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- German Del Zotto
|
8
|
+
- Abel Muiño
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-05-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: yajl-ruby
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 1.2.0
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - "~>"
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 1.2.0
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: rspec-given
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - "~>"
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 3.5.4
|
35
|
+
type: :development
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - "~>"
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 3.5.4
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: amqp
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - "~>"
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.3.0
|
49
|
+
type: :development
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - "~>"
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.3.0
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: faye-websocket
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.7.2
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.7.2
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: em-websocket
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - "~>"
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: 0.5.1
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 0.5.1
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: thin
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 1.6.2
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 1.6.2
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: em-synchrony
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 1.0.3
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - "~>"
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 1.0.3
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: em-http-request
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - "~>"
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 1.1.2
|
119
|
+
type: :development
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - "~>"
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.1.2
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: evented-spec
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - "~>"
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 0.9.0
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.9.0
|
140
|
+
description: Provides implementation for in process, amqp or web socket service bus
|
141
|
+
email:
|
142
|
+
- germ@ndz.com.ar
|
143
|
+
- amuino@1uptalent.com
|
144
|
+
executables: []
|
145
|
+
extensions: []
|
146
|
+
extra_rdoc_files: []
|
147
|
+
files:
|
148
|
+
- ".gitignore"
|
149
|
+
- Gemfile
|
150
|
+
- LICENSE
|
151
|
+
- README.md
|
152
|
+
- combi.gemspec
|
153
|
+
- lib/combi.rb
|
154
|
+
- lib/combi/buses/bus.rb
|
155
|
+
- lib/combi/buses/http.rb
|
156
|
+
- lib/combi/buses/in_process.rb
|
157
|
+
- lib/combi/buses/queue.rb
|
158
|
+
- lib/combi/buses/web_socket.rb
|
159
|
+
- lib/combi/helpers.rb
|
160
|
+
- lib/combi/queue_service.rb
|
161
|
+
- lib/combi/reactor.rb
|
162
|
+
- lib/combi/response_store.rb
|
163
|
+
- lib/combi/service.rb
|
164
|
+
- lib/combi/service_bus.rb
|
165
|
+
- lib/combi/version.rb
|
166
|
+
- spec/integration/multi_bus_spec.rb
|
167
|
+
- spec/lib/combi/buses/bus_spec.rb
|
168
|
+
- spec/lib/combi/buses/http_spec.rb
|
169
|
+
- spec/lib/combi/buses/in_process_spec.rb
|
170
|
+
- spec/lib/combi/buses/queue_spec.rb
|
171
|
+
- spec/lib/combi/buses/web_socket_spec.rb
|
172
|
+
- spec/lib/combi/service_spec.rb
|
173
|
+
- spec/shared_examples/standard_bus.rb
|
174
|
+
- spec/spec_helper.rb
|
175
|
+
- spec/support/rabbitmq_server.rb
|
176
|
+
- spec/support/web_server.rb
|
177
|
+
- spec/support/websocket_server.rb
|
178
|
+
homepage: https://github.com/1uptalent/combi
|
179
|
+
licenses:
|
180
|
+
- MIT
|
181
|
+
metadata: {}
|
182
|
+
post_install_message:
|
183
|
+
rdoc_options: []
|
184
|
+
require_paths:
|
185
|
+
- lib
|
186
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
187
|
+
requirements:
|
188
|
+
- - ">="
|
189
|
+
- !ruby/object:Gem::Version
|
190
|
+
version: '0'
|
191
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - ">="
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
196
|
+
requirements: []
|
197
|
+
rubyforge_project:
|
198
|
+
rubygems_version: 2.2.0
|
199
|
+
signing_key:
|
200
|
+
specification_version: 4
|
201
|
+
summary: Mini Bus for microservices
|
202
|
+
test_files: []
|
203
|
+
has_rdoc:
|