eventq 2.4.0 → 3.0.0
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 +4 -4
- data/lib/eventq/eventq_aws/aws_eventq_client.rb +23 -11
- data/lib/eventq/eventq_aws/aws_subscription_manager.rb +29 -16
- data/lib/eventq/eventq_aws/sns.rb +28 -2
- metadata +52 -23
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ea953c5716907922d39bdf208905ef63c23d210dd58efb9a9f5744f328608ae3
|
|
4
|
+
data.tar.gz: ab03fa33de860acc77710fd49b2ee1f42ce782bc9299e8d1e01602e554a1c7b0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5e8136b710134b4f924d1414b0620cd77425e980ca5ec07bf3485b02bcc766b82dfe04c2c2604b883ac9cfe77f58822ac14e6d7fdb1b5cc37553cd2f8d940a59
|
|
7
|
+
data.tar.gz: 796dd866e6190d45c091fe540fa39760569f92aa968b4a72716a64c130b2836b00cb684c8959fa07e55c5d04c28da21f1d6a395acccb5c77becdf9c86abfeee5
|
|
@@ -15,25 +15,37 @@ module EventQ
|
|
|
15
15
|
@serialization_manager = EventQ::SerializationProviders::Manager.new
|
|
16
16
|
@signature_manager = EventQ::SignatureProviders::Manager.new
|
|
17
17
|
|
|
18
|
-
# this
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
# this hash is used to record known event types:
|
|
19
|
+
# key = event_type / name
|
|
20
|
+
# value = topic arn
|
|
21
|
+
@known_event_types = {}
|
|
21
22
|
end
|
|
22
23
|
|
|
24
|
+
# Returns true if the event has already been registerd, or false
|
|
25
|
+
# otherwise.
|
|
26
|
+
#
|
|
27
|
+
# @param [String] event_type
|
|
28
|
+
# @param [String] region
|
|
29
|
+
#
|
|
30
|
+
# @return [Boolean]
|
|
23
31
|
def registered?(event_type, region = nil)
|
|
24
32
|
topic_key = "#{region}:#{event_type}"
|
|
25
|
-
@known_event_types.
|
|
33
|
+
@known_event_types.key?(topic_key)
|
|
26
34
|
end
|
|
27
35
|
|
|
36
|
+
# Registers the event event_type and returns its topic arn.
|
|
37
|
+
#
|
|
38
|
+
# @param [String] event_type
|
|
39
|
+
# @param [String] region
|
|
40
|
+
#
|
|
41
|
+
# @return [String]
|
|
28
42
|
def register_event(event_type, region = nil)
|
|
29
|
-
if registered?(event_type, region)
|
|
30
|
-
return true
|
|
31
|
-
end
|
|
32
|
-
|
|
33
43
|
topic_key = "#{region}:#{event_type}"
|
|
34
|
-
@
|
|
35
|
-
|
|
36
|
-
|
|
44
|
+
return @known_event_types[topic_key] if registered?(event_type, region)
|
|
45
|
+
|
|
46
|
+
topic_arn = @client.sns_helper(region).create_topic_arn(event_type, region)
|
|
47
|
+
@known_event_types[topic_key] = topic_arn
|
|
48
|
+
topic_arn
|
|
37
49
|
end
|
|
38
50
|
|
|
39
51
|
def publish(topic:, event:, context: {}, region: nil)
|
|
@@ -12,7 +12,7 @@ module EventQ
|
|
|
12
12
|
@manager = options[:queue_manager]
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def subscribe(event_type, queue, topic_region = nil, queue_region = nil)
|
|
15
|
+
def subscribe(event_type, queue, topic_region = nil, queue_region = nil, topic_namespaces = [EventQ.namespace])
|
|
16
16
|
if queue.isolated
|
|
17
17
|
method = :get_topic_arn
|
|
18
18
|
else
|
|
@@ -20,26 +20,30 @@ module EventQ
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
topic_arn = @client.sns_helper(topic_region).public_send(method, event_type, topic_region)
|
|
23
|
-
raise Exceptions::EventTypeNotFound,
|
|
23
|
+
raise Exceptions::EventTypeNotFound, "SNS topic not found, unable to subscribe to #{event_type}" unless topic_arn
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
queue_arn = @client.sqs_helper(queue_region).get_queue_arn(queue)
|
|
25
|
+
queue_arn = configure_queue(queue, queue_region)
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
# subscribe the queue to the topic with the namespaces provided
|
|
28
|
+
topic_namespaces.each do |namespace|
|
|
29
|
+
namespaced_topic_arn = topic_arn.gsub(":#{EventQ.namespace}-", ":#{namespace}-")
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
return true if existing_subscription?(queue_arn, topic_arn)
|
|
31
|
+
# create the sns topic - this method is idempotent & returns the topic arn if it already exists
|
|
32
|
+
@client.sns_helper.create_topic_arn("#{namespace}-#{event_type}".delete('.')) unless queue.isolated
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
endpoint: queue_arn
|
|
39
|
-
)
|
|
34
|
+
# skip subscribe if subscription for given queue/topic already exists
|
|
35
|
+
# this is a workaround for a localstack issue: https://github.com/localstack/localstack/issues/933
|
|
36
|
+
return true if existing_subscription?(queue_arn, namespaced_topic_arn)
|
|
40
37
|
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
EventQ.logger.debug do
|
|
39
|
+
"[#{self.class} #subscribe] - Subscribing Queue: #{queue.name} to topic_arn: #{namespaced_topic_arn}, endpoint: #{queue_arn}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
@client.sns(topic_region).subscribe(
|
|
43
|
+
topic_arn: namespaced_topic_arn,
|
|
44
|
+
protocol: 'sqs',
|
|
45
|
+
endpoint: queue_arn
|
|
46
|
+
)
|
|
43
47
|
end
|
|
44
48
|
|
|
45
49
|
true
|
|
@@ -51,6 +55,15 @@ module EventQ
|
|
|
51
55
|
|
|
52
56
|
private
|
|
53
57
|
|
|
58
|
+
def configure_queue(queue, region)
|
|
59
|
+
q = @manager.get_queue(queue)
|
|
60
|
+
queue_arn = @client.sqs_helper(region).get_queue_arn(queue)
|
|
61
|
+
|
|
62
|
+
attributes = default_queue_attributes(q, queue_arn)
|
|
63
|
+
@client.sqs(region).set_queue_attributes(attributes)
|
|
64
|
+
queue_arn
|
|
65
|
+
end
|
|
66
|
+
|
|
54
67
|
def default_queue_attributes(queue, queue_arn)
|
|
55
68
|
{
|
|
56
69
|
queue_url: queue,
|
|
@@ -32,6 +32,7 @@ module EventQ
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
# Check if a TopicArn exists. This will check with AWS if necessary and cache the results if one is found
|
|
35
|
+
#
|
|
35
36
|
# @return TopicArn [String]
|
|
36
37
|
def get_topic_arn(event_type, region = nil)
|
|
37
38
|
_event_type = EventQ.create_event_type(event_type)
|
|
@@ -39,8 +40,7 @@ module EventQ
|
|
|
39
40
|
|
|
40
41
|
arn = @@topic_arns[topic_key]
|
|
41
42
|
unless arn
|
|
42
|
-
|
|
43
|
-
arn = response.topics.detect { |topic| topic.topic_arn.end_with?(":#{_event_type}") }&.topic_arn
|
|
43
|
+
arn = find_topic(_event_type)
|
|
44
44
|
|
|
45
45
|
@@topic_arns[topic_key] = arn if arn
|
|
46
46
|
end
|
|
@@ -62,6 +62,32 @@ module EventQ
|
|
|
62
62
|
def aws_safe_name(name)
|
|
63
63
|
return name[0..79].gsub(/[^a-zA-Z\d_\-]/,'')
|
|
64
64
|
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
# Finds the given topic, or returns nil if the topic could not be found
|
|
69
|
+
#
|
|
70
|
+
# @note Responses to list_topics can be paged, so to check *all* topics
|
|
71
|
+
# we'll need to request each page of topics using response.next_token for
|
|
72
|
+
# until the response no longer contains a next_token. Requests to
|
|
73
|
+
# list_topics are throttled to 30 TPS, so in the future we may need to
|
|
74
|
+
# handle this if it becomes a problem.
|
|
75
|
+
#
|
|
76
|
+
# @param topic_name [String] the name of the topic to find
|
|
77
|
+
# @return [String]
|
|
78
|
+
def find_topic(topic_name)
|
|
79
|
+
response = sns.list_topics
|
|
80
|
+
topics = response.topics
|
|
81
|
+
arn = topics.detect { |topic| topic.topic_arn.end_with?(":#{topic_name}") }&.topic_arn
|
|
82
|
+
|
|
83
|
+
while arn.nil? && response.next_token
|
|
84
|
+
response = sns.list_topics(next_token: response.next_token)
|
|
85
|
+
topics = response.topics
|
|
86
|
+
arn = topics.detect { |topic| topic.topic_arn.end_with?(":#{topic_name}") }&.topic_arn
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
arn
|
|
90
|
+
end
|
|
65
91
|
end
|
|
66
92
|
end
|
|
67
93
|
end
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: eventq
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- SageOne
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-06-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: activesupport
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '4'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '4'
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: bundler
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -25,35 +39,49 @@ dependencies:
|
|
|
25
39
|
- !ruby/object:Gem::Version
|
|
26
40
|
version: '1.11'
|
|
27
41
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
42
|
+
name: byebug
|
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
|
30
44
|
requirements:
|
|
31
45
|
- - "~>"
|
|
32
46
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
47
|
+
version: '11.0'
|
|
34
48
|
type: :development
|
|
35
49
|
prerelease: false
|
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
51
|
requirements:
|
|
38
52
|
- - "~>"
|
|
39
53
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
54
|
+
version: '11.0'
|
|
41
55
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
56
|
+
name: pry-byebug
|
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
|
44
58
|
requirements:
|
|
45
|
-
- - "
|
|
59
|
+
- - "~>"
|
|
46
60
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
61
|
+
version: '3.9'
|
|
48
62
|
type: :development
|
|
49
63
|
prerelease: false
|
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
65
|
requirements:
|
|
52
|
-
- - "
|
|
66
|
+
- - "~>"
|
|
53
67
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
68
|
+
version: '3.9'
|
|
55
69
|
- !ruby/object:Gem::Dependency
|
|
56
|
-
name:
|
|
70
|
+
name: rake
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '10.0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '10.0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rspec
|
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
|
58
86
|
requirements:
|
|
59
87
|
- - ">="
|
|
@@ -81,19 +109,19 @@ dependencies:
|
|
|
81
109
|
- !ruby/object:Gem::Version
|
|
82
110
|
version: '0'
|
|
83
111
|
- !ruby/object:Gem::Dependency
|
|
84
|
-
name:
|
|
112
|
+
name: simplecov
|
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
|
86
114
|
requirements:
|
|
87
|
-
- - "
|
|
115
|
+
- - ">="
|
|
88
116
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
117
|
+
version: '0'
|
|
90
118
|
type: :development
|
|
91
119
|
prerelease: false
|
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
121
|
requirements:
|
|
94
|
-
- - "
|
|
122
|
+
- - ">="
|
|
95
123
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
124
|
+
version: '0'
|
|
97
125
|
- !ruby/object:Gem::Dependency
|
|
98
126
|
name: aws-sdk
|
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -109,7 +137,7 @@ dependencies:
|
|
|
109
137
|
- !ruby/object:Gem::Version
|
|
110
138
|
version: '2.0'
|
|
111
139
|
- !ruby/object:Gem::Dependency
|
|
112
|
-
name:
|
|
140
|
+
name: bunny
|
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
|
114
142
|
requirements:
|
|
115
143
|
- - ">="
|
|
@@ -123,7 +151,7 @@ dependencies:
|
|
|
123
151
|
- !ruby/object:Gem::Version
|
|
124
152
|
version: '0'
|
|
125
153
|
- !ruby/object:Gem::Dependency
|
|
126
|
-
name:
|
|
154
|
+
name: class_kit
|
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
|
128
156
|
requirements:
|
|
129
157
|
- - ">="
|
|
@@ -137,7 +165,7 @@ dependencies:
|
|
|
137
165
|
- !ruby/object:Gem::Version
|
|
138
166
|
version: '0'
|
|
139
167
|
- !ruby/object:Gem::Dependency
|
|
140
|
-
name:
|
|
168
|
+
name: concurrent-ruby
|
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
|
142
170
|
requirements:
|
|
143
171
|
- - ">="
|
|
@@ -151,7 +179,7 @@ dependencies:
|
|
|
151
179
|
- !ruby/object:Gem::Version
|
|
152
180
|
version: '0'
|
|
153
181
|
- !ruby/object:Gem::Dependency
|
|
154
|
-
name:
|
|
182
|
+
name: oj
|
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
|
156
184
|
requirements:
|
|
157
185
|
- - ">="
|
|
@@ -165,7 +193,7 @@ dependencies:
|
|
|
165
193
|
- !ruby/object:Gem::Version
|
|
166
194
|
version: '0'
|
|
167
195
|
- !ruby/object:Gem::Dependency
|
|
168
|
-
name:
|
|
196
|
+
name: openssl
|
|
169
197
|
requirement: !ruby/object:Gem::Requirement
|
|
170
198
|
requirements:
|
|
171
199
|
- - ">="
|
|
@@ -179,7 +207,7 @@ dependencies:
|
|
|
179
207
|
- !ruby/object:Gem::Version
|
|
180
208
|
version: '0'
|
|
181
209
|
- !ruby/object:Gem::Dependency
|
|
182
|
-
name:
|
|
210
|
+
name: redlock
|
|
183
211
|
requirement: !ruby/object:Gem::Requirement
|
|
184
212
|
requirements:
|
|
185
213
|
- - ">="
|
|
@@ -268,7 +296,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
268
296
|
- !ruby/object:Gem::Version
|
|
269
297
|
version: '0'
|
|
270
298
|
requirements: []
|
|
271
|
-
|
|
299
|
+
rubyforge_project:
|
|
300
|
+
rubygems_version: 2.7.7
|
|
272
301
|
signing_key:
|
|
273
302
|
specification_version: 4
|
|
274
303
|
summary: EventQ is a pub/sub system that uses async notifications and message queues
|