combi 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: