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