Skip to content

Commit a786ac0

Browse files
committed
Add SNS sdk inbound/outbound resource management.
1 parent c12269a commit a786ac0

28 files changed

+397
-16
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ group :development, :test do
1414
gem 'yard'
1515
gem 'rubocop-git'
1616
gem 'aws-sdk-sns'
17+
gem 'concurrent-ruby'
1718
end

Gemfile.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ PLATFORMS
345345

346346
DEPENDENCIES
347347
aws-sdk-sns
348+
concurrent-ruby
348349
database_cleaner
349350
event_source!
350351
faker

lib/event_source.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
require 'event_source/operations/build_message_options'
4646
require 'event_source/operations/build_message'
4747
require 'event_source/boot_registry'
48+
require 'event_source/paginator'
4849

4950
# Event source provides ability to compose, publish and subscribe to events
5051
module EventSource

lib/event_source/async_api/contracts/subscribe_operation_bindings_contract.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require "event_source/protocols/http/contracts/subscribe_operation_bindings_contract"
44
require "event_source/protocols/amqp/contracts/subscribe_operation_binding_contract"
5+
require "event_source/protocols/sns/contracts/subscribe_operation_binding_contract"
56

67
module EventSource
78
module AsyncApi
@@ -11,6 +12,7 @@ class SubscribeOperationBindingsContract < Contract
1112
params do
1213
optional(:http).hash
1314
optional(:amqp).hash
15+
optional(:sns).hash
1416
end
1517

1618
rule(:http) do
@@ -24,6 +26,20 @@ class SubscribeOperationBindingsContract < Contract
2426
end
2527
end
2628
end
29+
30+
rule(:sns) do
31+
if key? && value
32+
validation_result = ::EventSource::Protocols::Sns::Contracts::SubscribeOperationBindingsContract.new.call(value)
33+
if validation_result&.failure?
34+
key.failure(
35+
text: 'invalid operation bindings',
36+
error: validation_result.errors.to_h
37+
)
38+
else
39+
values.data.merge({ sns: validation_result.values })
40+
end
41+
end
42+
end
2743
end
2844
end
2945
end

lib/event_source/async_api/publish_bindings.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
require "event_source/protocols/http/publish_bindings"
55
require "event_source/protocols/amqp/types"
66
require "event_source/protocols/amqp/publish_bindings"
7-
require "event_source/protocols/sns/publish_bindings"
7+
require "event_source/protocols/sns/operation_bindings"
88

99
module EventSource
1010
module AsyncApi

lib/event_source/async_api/subscribe_bindings.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
require "event_source/protocols/http/types"
44
require "event_source/protocols/http/subscribe_bindings"
55
require "event_source/protocols/amqp/subscribe_bindings"
6+
require "event_source/protocols/sns/operation_bindings"
67

78
module EventSource
89
module AsyncApi
910
class SubscribeBindings < Dry::Struct
1011
transform_keys(&:to_sym)
1112
attribute :http, ::EventSource::Protocols::Http::SubscribeBindings.meta(omittable: true)
1213
attribute :amqp, Types::Hash.meta(omittable: true)
14+
attribute :sns, ::EventSource::Protocols::Sns::SubscribeBindings.meta(omittable: true)
1315
end
1416
end
1517
end

lib/event_source/connection_manager.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ def find_connection(params)
8989
connection.publish_operation_exists?(params[:publish_operation_name])
9090
end
9191
else
92+
# raise params[:subscribe_operation_name].inspect if params[:protocol] == :sns
93+
# raise connections.first.subscribe_operations.keys.inspect
9294
connections.detect do |connection|
9395
connection.subscribe_operation_exists?(
9496
params[:subscribe_operation_name]

lib/event_source/paginator.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
module EventSource
4+
# Abstract paginator for protocols which support it.
5+
class Paginator
6+
attr_reader :state, :continuation_data
7+
8+
def initialize(more, state, continue_data)
9+
@more = more
10+
@state = state
11+
@continuation_data = continue_data
12+
end
13+
14+
def more?
15+
@more
16+
end
17+
18+
def self.continue(state, continue_data)
19+
self.new(true, state, continue_data)
20+
end
21+
22+
def self.finished
23+
self.new(false, nil, nil)
24+
end
25+
end
26+
end

lib/event_source/protocols/amqp_protocol.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ def self.scheme_patterns
3232
def self.proxy_klass
3333
EventSource::Protocols::Amqp::BunnyConnectionProxy
3434
end
35+
36+
def self.subscribe_operation_name_for(app_name, subscriber_key)
37+
"on_#{app_name}.#{subscriber_key}"
38+
end
3539
end
3640
end
37-
end
41+
end

lib/event_source/protocols/http_protocol.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ def self.scheme_patterns
3131
def self.proxy_klass
3232
EventSource::Protocols::Http::FaradayConnectionProxy
3333
end
34+
35+
def self.subscribe_operation_name_for(_app_name, subscriber_key)
36+
"/on#{subscriber_key}"
37+
end
3438
end
3539
end
3640
end

0 commit comments

Comments
 (0)