kimchi 0.0.5 → 0.0.6

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 (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kimchi/version.rb +1 -1
  3. data/lib/wire.rb +75 -24
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61d5856576f6d41a8007145e8c6080a468efd625
4
- data.tar.gz: c88c31dddc62bbb70fc427990532a2b180261d04
3
+ metadata.gz: 8883424bb826544feaef6c94a6b55f11692b5d08
4
+ data.tar.gz: f28ce0474a811d495876985354ffc03c489c6457
5
5
  SHA512:
6
- metadata.gz: c72e8abfe8f79ecfe5d09b5205d2672be0894da73e13ab6462ff3994a6df4cc3daa9706626830c3a68eb770b8ff8df5ce589332c4e5569e03ed883595f4968da
7
- data.tar.gz: bfff490a7f1dabec46191ac90e8aadd9f21ab7c469f07975ca3bd2d3d00b0dbece19c21502cd6ebcdda65e94fbbcd98ae30803d820b8578a9dcc9e2be6bee36f
6
+ metadata.gz: 13a423da3a62ff956d1ed2e3eaa9d13db48d0af6070b0328abd4d3833e609a4c4b62d32f670e74be49f9226ce68948816c13919d5e5e00b577768533ee9382c2
7
+ data.tar.gz: 382c61c84602b4e7591d44611bc5d4abbcd2aa8789a384b3ba269d8fe6ff0d8f946d8294582a55c3f0978a203cc4889525a19bf9ada6622a2abfc757a1d5cbce
@@ -1,3 +1,3 @@
1
1
  module Kimchi
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/wire.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "rubygems"
2
2
  require "uuid"
3
3
  require "bunny"
4
+ require "net/http"
4
5
 
5
6
  module Wire
6
7
 
@@ -12,8 +13,18 @@ module Wire
12
13
  @native_type = native_type
13
14
  end
14
15
 
16
+ # ignore this for any real service call, the http endpoint is evidently incapable of getting this from a header
17
+ def service= service
18
+ @service=service
19
+ end
20
+
21
+ # ignore this for any real service call, the http endpoint is evidently incapable of getting this from a header
22
+ def version= version
23
+ @version=version
24
+ end
25
+
15
26
  def to_json
16
- "{\"endpoint\": \"#{@name}\"" + ((@signature == nil) ? "" : ", \"signature\": #{@signature}") + ((@result_type == nil) ? "" : ", \"resultType\": \"#{@result_type}\"") + ((@native_type == nil) ? "" : ", \"nativeType\": \"#{@native_type}\"") + "}"
27
+ "{\"endpoint\": \"#{@name}\"" + ((@signature == nil) ? "" : ", \"signature\": #{@signature}") + ((@result_type == nil) ? "" : ", \"resultType\": \"#{@result_type}\"") + ((@native_type == nil) ? "" : ", \"nativeType\": \"#{@native_type}\"") + ((@service == nil) ? "" : ", \"service\": \"#{@service}\"") + ((@version == nil) ? "" : ", \"version\": \"#{@version}\"") + "}"
17
28
  end
18
29
  end
19
30
 
@@ -24,8 +35,20 @@ module Wire
24
35
  @contexts = contexts
25
36
  end
26
37
 
38
+ def function
39
+ @function
40
+ end
41
+
42
+ def contexts=contexts
43
+ @contexts=contexts
44
+ end
45
+
46
+ def contexts
47
+ @contexts
48
+ end
49
+
27
50
  def to_json
28
- "{\"address\": #{@function.to_json}, \"body\": #{@arguments.to_json}, \"contexts\": #{@contexts}}"
51
+ "{\"address\": #{@function.to_json}, \"body\": #{@arguments.to_json}, \"contexts\": #{@contexts.to_json}}"
29
52
  end
30
53
  end
31
54
 
@@ -55,39 +78,52 @@ module Wire
55
78
  end
56
79
 
57
80
  class RabbitMQTransport
58
- def initialize (host, port, service_name)
81
+ def initialize (host, port)
59
82
  @connection = Bunny.new("amqp://#{host}:#{port}")
60
83
  @connection.start
61
84
 
85
+ @semaphore = Mutex.new
86
+
62
87
  @uuid = UUID.new
63
88
  @caller_id = @uuid.generate
64
89
 
90
+ @topic_hash = {}
65
91
  @message_hash = {}
92
+ end
66
93
 
67
- request_channel = @connection.create_channel
68
- @request_exchange = request_channel.topic("#{service_name}.request")
69
-
70
- response_queue_name = @uuid.generate
71
- response_channel = @connection.create_channel
72
- response_exchange = response_channel.topic("#{service_name}.response")
73
- response_queue = response_channel.queue("#{response_queue_name}", {:durable => false, :exclusive => true, :auto_delete => true})
74
-
75
- response_queue.bind(response_exchange, :routing_key => "#{@caller_id}").subscribe do |delivery_info, metadata, payload|
76
- if (message_callback = @message_hash[metadata[:correlation_id]]) != nil
77
- result_body = JSON.parse(payload)
78
- message_callback.set_result(result_body)
94
+ def initialize_service (service_name)
95
+ @semaphore.synchronize do
96
+ topic = @topic_hash[service_name]
97
+
98
+ if topic == nil
99
+ request_channel = @connection.create_channel
100
+ topic = request_channel.topic("#{service_name}.request")
101
+
102
+ response_queue_name = @uuid.generate
103
+ response_channel = @connection.create_channel
104
+ response_exchange = response_channel.topic("#{service_name}.response")
105
+ response_queue = response_channel.queue("#{response_queue_name}", {:durable => false, :exclusive => true, :auto_delete => true})
106
+
107
+ response_queue.bind(response_exchange, :routing_key => "#{@caller_id}").subscribe do |delivery_info, metadata, payload|
108
+ if (message_callback = @message_hash[metadata[:correlation_id]]) != nil
109
+ result_body = JSON.parse(payload)
110
+ message_callback.set_result(result_body)
111
+ end
112
+ end
79
113
  end
114
+
115
+ return topic
80
116
  end
81
117
  end
82
118
 
83
- def transmit_in_only(version, invocation_signal)
84
- @request_exchange.publish(invocation_signal.to_json, :routing_key => "#{version}.2", :headers => {"x-opt-callerId" => "#{@caller_id}"}, :content_type => "application/json", :message_id => "#{@uuid.generate}", :timestamp => Time.new.to_i)
119
+ def transmit_in_only(service_name, version, invocation_signal)
120
+ initialize_service(service_name).publish(invocation_signal.to_json, :routing_key => "#{version}.2", :headers => {"x-opt-callerId" => "#{@caller_id}"}, :content_type => "application/json", :message_id => "#{@uuid.generate}", :timestamp => Time.new.to_i)
85
121
  end
86
122
 
87
- def transmit(version, invocation_signal, callback, timeout_seconds)
123
+ def transmit(service_name, version, invocation_signal, callback, timeout_seconds)
88
124
  message_id = "#{@uuid.generate}".freeze
89
125
  @message_hash[message_id] = MessageCallback.new(@message_hash, message_id, callback, timeout_seconds)
90
- @request_exchange.publish(invocation_signal.to_json, :routing_key => "#{version}.2", :headers => {"x-opt-callerId" => "#{@caller_id}"}, :content_type => "application/json", :message_id => "#{message_id}", :timestamp => Time.new.to_i)
126
+ initialize_service(service_name).publish(invocation_signal.to_json, :routing_key => "#{version}.2", :headers => {"x-opt-callerId" => "#{@caller_id}"}, :content_type => "application/json", :message_id => "#{message_id}", :timestamp => Time.new.to_i)
91
127
  end
92
128
  end
93
129
 
@@ -96,16 +132,31 @@ module Wire
96
132
  @host = host
97
133
  @port = port
98
134
  end
99
- def transmit (version, invocation_signal, callback, timeout_seconds)
135
+
136
+ def transmit (service_name, version, invocation_signal, callback, timeout_seconds)
100
137
  uri = URI("#{@host}:#{@port}/api/message")
101
- headers = {"Content-Type" => "application/json", "X-Icix-Version" => "#{version}"}
138
+ headers = {"Content-Type" => "application/json"}
102
139
  http = Net::HTTP.new(uri.host, uri.port)
140
+ http.read_timeout = timeout_seconds
141
+
142
+ invocation_signal.function.service = service_name
143
+ invocation_signal.function.version = version
144
+
145
+ context_hash = {}
146
+ invocation_signal.contexts.each {|context| context.each{|key,value| context_hash[key] = value}}
147
+ invocation_signal.contexts = context_hash
103
148
 
104
149
  res = http.post(uri.path, invocation_signal.to_json, headers)
105
- res.code.should == '200'
106
150
 
107
- response = JSON.parse res.body
108
- callback.complete(response)
151
+ case res
152
+ when Net::HTTPSuccess
153
+ response = JSON.parse res.body
154
+ callback.complete(response)
155
+ else
156
+ res.error!
157
+ end
158
+ rescue Timeout::Error
159
+ callback.timeout
109
160
  end
110
161
  end
111
162
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kimchi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Taylor Gautier