hanami-events-cloud_pubsub 3.1.2 → 3.3.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/hanami/events/adapter/cloud_pubsub.rb +15 -14
- data/lib/hanami/events/cloud_pubsub.rb +1 -1
- data/lib/hanami/events/cloud_pubsub/cli.rb +4 -3
- data/lib/hanami/events/cloud_pubsub/integration.rb +4 -5
- data/lib/hanami/events/cloud_pubsub/listener.rb +26 -7
- data/lib/hanami/events/cloud_pubsub/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: de5b89251e969ff280f708bfe2453b6f182b3bca5e50bfd98b9e8be372123562
|
|
4
|
+
data.tar.gz: d71ccf32872fae21acb045a8786b7935f051f92a25ff47ad6ff1340a0c88d44a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7740508a3898f859a59fbb39377bb2d6977ec06f48cf2671d177aa647c355945b50209a3b0b3c6815d1222424df7d998a83bb9402b0918118636c8fe053776fb
|
|
7
|
+
data.tar.gz: dd52a0e85056371712d695c6a2fd9650c49d5dfdaaff2c2afdf41cced04e61b2a12633eb2ee185eaa23dd15c40dcbfebef021ec92e14cdcdfa985de5951e7edd
|
|
@@ -11,13 +11,12 @@ module Hanami
|
|
|
11
11
|
#
|
|
12
12
|
# @api private
|
|
13
13
|
class CloudPubsub
|
|
14
|
-
attr_reader :
|
|
14
|
+
attr_reader :listeners, :topic_registry, :middleware
|
|
15
15
|
|
|
16
16
|
def initialize(params)
|
|
17
17
|
@pubsub = params[:pubsub]
|
|
18
18
|
@logger = params[:logger] || Logger.new($stdout)
|
|
19
19
|
@listen = params[:listen] || false
|
|
20
|
-
@subscribers = Concurrent::Array.new
|
|
21
20
|
@listeners = Concurrent::Array.new
|
|
22
21
|
@serializer_type = params.fetch(:serializer, :json).to_sym
|
|
23
22
|
@topic_registry = {}
|
|
@@ -54,17 +53,16 @@ module Hanami
|
|
|
54
53
|
# @param id [String] A unique identifier for the subscriber
|
|
55
54
|
# @param subscriber_opts [String] Additional options for the subscriber
|
|
56
55
|
# @param block [Block] to execute when event is broadcasted
|
|
57
|
-
def subscribe(name, id:, **subscriber_opts, &block)
|
|
56
|
+
def subscribe(name, id:, auto_ack: true, **subscriber_opts, &block)
|
|
58
57
|
event_name = namespaced(name)
|
|
59
58
|
namespaced_id = namespaced(id)
|
|
60
59
|
|
|
61
60
|
logger.debug("Subscribed listener \"#{id}\" for event \"#{event_name}\"")
|
|
62
61
|
|
|
63
62
|
sub = Hanami::Events::CloudPubsub::Subscriber.new(event_name, block, logger)
|
|
64
|
-
@subscribers << sub
|
|
65
63
|
topic = topic_for event_name
|
|
66
64
|
|
|
67
|
-
register_listener(event_name, topic, namespaced_id, subscriber_opts)
|
|
65
|
+
register_listener(event_name, topic, namespaced_id, auto_ack, subscriber_opts, sub)
|
|
68
66
|
end
|
|
69
67
|
|
|
70
68
|
def flush_messages
|
|
@@ -76,28 +74,31 @@ module Hanami
|
|
|
76
74
|
|
|
77
75
|
attr_reader :logger
|
|
78
76
|
|
|
79
|
-
|
|
77
|
+
# rubocop:disable Metrics/ParameterLists
|
|
78
|
+
def register_listener(event_name, topic, subscriber_id, auto_ack, subscriber_opts, sub)
|
|
80
79
|
listener = ::Hanami::Events::CloudPubsub::Listener.new(
|
|
81
80
|
subscriber_id: subscriber_id,
|
|
82
81
|
event_name: event_name,
|
|
83
|
-
handler:
|
|
82
|
+
handler: call_subscriber(sub),
|
|
84
83
|
logger: logger,
|
|
85
84
|
topic: topic,
|
|
86
85
|
subscriber_opts: subscriber_opts,
|
|
87
|
-
dead_letter_topic: dead_letter_topic
|
|
86
|
+
dead_letter_topic: dead_letter_topic,
|
|
87
|
+
auto_ack: auto_ack
|
|
88
88
|
)
|
|
89
89
|
|
|
90
90
|
@listeners << listener
|
|
91
91
|
listener.register
|
|
92
92
|
end
|
|
93
|
+
# rubocop:enable Metrics/ParameterLists
|
|
93
94
|
|
|
94
|
-
def
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
def call_subscriber(sub)
|
|
96
|
+
proc do |message|
|
|
97
|
+
data = message.data
|
|
98
|
+
payload = serializer.deserialize(data)
|
|
99
|
+
event_name = message.attributes['event_name']
|
|
98
100
|
|
|
99
|
-
|
|
100
|
-
subscriber.call(event_name, payload, message)
|
|
101
|
+
sub.call(event_name, payload, message)
|
|
101
102
|
end
|
|
102
103
|
end
|
|
103
104
|
|
|
@@ -7,7 +7,6 @@ require 'hanami/events/cloud_pubsub/middleware/stack'
|
|
|
7
7
|
require 'hanami/events/cloud_pubsub/middleware/logging'
|
|
8
8
|
require 'hanami/events/cloud_pubsub/runner'
|
|
9
9
|
require 'hanami/events/cloud_pubsub/errors'
|
|
10
|
-
require 'google/cloud/pubsub'
|
|
11
10
|
require 'dry-configurable'
|
|
12
11
|
|
|
13
12
|
module Hanami
|
|
@@ -97,6 +96,7 @@ module Hanami
|
|
|
97
96
|
end
|
|
98
97
|
|
|
99
98
|
def self.finalize_settings!
|
|
99
|
+
require 'google/cloud/pubsub'
|
|
100
100
|
conf_hash = config.pubsub
|
|
101
101
|
conf_hash.each { |key, val| Google::Cloud::Pubsub.configure[key] = val }
|
|
102
102
|
end
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'hanami/cli'
|
|
4
|
-
require 'hanami/events/cloud_pubsub'
|
|
5
|
-
require 'hanami/events/cloud_pubsub/health_check_server'
|
|
6
4
|
|
|
7
5
|
module Hanami
|
|
8
6
|
module Events
|
|
@@ -55,6 +53,7 @@ module Hanami
|
|
|
55
53
|
end
|
|
56
54
|
|
|
57
55
|
def start_server
|
|
56
|
+
require 'hanami/events/cloud_pubsub/health_check_server'
|
|
58
57
|
server = HealthCheckServer.new(runner, logger)
|
|
59
58
|
on_shutdown = proc { @event_queue << proc { shutdown } }
|
|
60
59
|
server.run_in_background(on_shutdown: on_shutdown)
|
|
@@ -77,6 +76,7 @@ module Hanami
|
|
|
77
76
|
def start_runner
|
|
78
77
|
logger.debug 'Running in emulator mode' if @emulator
|
|
79
78
|
logger.info "Starting worker (pid: #{Process.pid})"
|
|
79
|
+
GC.compact if GC.respond_to?(:compact)
|
|
80
80
|
runner.start
|
|
81
81
|
end
|
|
82
82
|
|
|
@@ -86,13 +86,14 @@ module Hanami
|
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
def build_runner
|
|
89
|
+
require 'hanami/events/cloud_pubsub'
|
|
89
90
|
Hanami::Components.resolve 'events'
|
|
90
91
|
events = Hanami::Components['events']
|
|
91
92
|
@runner = Runner.new(logger: logger, adapter: events.adapter)
|
|
92
93
|
end
|
|
93
94
|
|
|
94
95
|
def logger
|
|
95
|
-
CloudPubsub.logger
|
|
96
|
+
Hanami::Events::CloudPubsub.logger
|
|
96
97
|
end
|
|
97
98
|
|
|
98
99
|
def setup_signal_handlers
|
|
@@ -33,11 +33,10 @@ module Hanami
|
|
|
33
33
|
conf.cloud_pubsub.each { |blk| blk.call(config) }
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
)
|
|
36
|
+
require 'google/cloud/pubsub'
|
|
37
|
+
|
|
38
|
+
opts = { pubsub: Google::Cloud::Pubsub.new, logger: Hanami::Components['logger'] }
|
|
39
|
+
::Hanami::Events.initialize(:cloud_pubsub, **opts)
|
|
41
40
|
end
|
|
42
41
|
end
|
|
43
42
|
end
|
|
@@ -26,6 +26,7 @@ module Hanami
|
|
|
26
26
|
subscriber_id:,
|
|
27
27
|
subscriber_opts: {},
|
|
28
28
|
middleware: CloudPubsub.config.middleware,
|
|
29
|
+
auto_ack: true,
|
|
29
30
|
dead_letter_topic: nil)
|
|
30
31
|
@topic = topic
|
|
31
32
|
@logger = logger
|
|
@@ -35,12 +36,13 @@ module Hanami
|
|
|
35
36
|
@input_subscriber_opts = subscriber_opts
|
|
36
37
|
@middleware = middleware
|
|
37
38
|
@dead_letter_topic = dead_letter_topic
|
|
39
|
+
@auto_ack = auto_ack
|
|
38
40
|
end
|
|
39
41
|
# rubocop:enable Metrics/ParameterLists
|
|
40
42
|
|
|
41
43
|
def register
|
|
42
44
|
subscription = subscription_for(subscriber_id)
|
|
43
|
-
|
|
45
|
+
apply_subscription_options(subscription)
|
|
44
46
|
listener = subscription.listen(**subscriber_options) { |m| handle_message(m) }
|
|
45
47
|
logger.debug("Registered listener for #{subscriber_id} with: #{subscriber_options}")
|
|
46
48
|
|
|
@@ -86,7 +88,7 @@ module Hanami
|
|
|
86
88
|
|
|
87
89
|
def run_handler(message)
|
|
88
90
|
middleware.invoke(message) { handler.call(message) }
|
|
89
|
-
message.ack!
|
|
91
|
+
message.ack! if @auto_ack
|
|
90
92
|
rescue StandardError => e
|
|
91
93
|
run_error_handlers(e, message.message_id.to_s)
|
|
92
94
|
message.nack! if CloudPubsub.config.auto_retry.enabled
|
|
@@ -133,21 +135,38 @@ module Hanami
|
|
|
133
135
|
}
|
|
134
136
|
end
|
|
135
137
|
|
|
136
|
-
def
|
|
137
|
-
|
|
138
|
+
def apply_subscription_options(sub)
|
|
139
|
+
apply_deadline_options(sub)
|
|
140
|
+
apply_retry_options(sub)
|
|
141
|
+
apply_dead_letter_options(sub)
|
|
142
|
+
rescue StandardError => e
|
|
143
|
+
run_error_handlers(e, nil)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def apply_deadline_options(sub)
|
|
147
|
+
sub.deadline = subscriber_options[:deadline] if sub.deadline != subscriber_options[:deadline]
|
|
148
|
+
rescue StandardError => e
|
|
149
|
+
run_error_handlers(e, nil)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def apply_dead_letter_options(sub)
|
|
138
153
|
attempts = CloudPubsub.config.auto_retry.max_attempts
|
|
139
154
|
|
|
140
|
-
sub.retry_policy = retry_policy if sub.retry_policy&.to_grpc != retry_policy&.to_grpc
|
|
141
155
|
sub.dead_letter_topic = dead_letter_topic if sub.dead_letter_topic&.name != dead_letter_topic&.name
|
|
142
156
|
sub.dead_letter_max_delivery_attempts = attempts if sub.dead_letter_topic&.name != dead_letter_topic&.name
|
|
157
|
+
rescue StandardError => e
|
|
158
|
+
run_error_handlers(e, nil)
|
|
159
|
+
end
|
|
143
160
|
|
|
144
|
-
|
|
161
|
+
def apply_retry_options(sub)
|
|
162
|
+
retry_policy = build_retry_policy
|
|
163
|
+
sub.retry_policy = retry_policy if sub.retry_policy&.to_grpc != retry_policy&.to_grpc
|
|
145
164
|
rescue StandardError => e
|
|
146
165
|
run_error_handlers(e, nil)
|
|
147
166
|
end
|
|
148
167
|
|
|
149
168
|
def build_retry_policy
|
|
150
|
-
return unless CloudPubsub.config.auto_retry.enabled
|
|
169
|
+
return unless Hanami::Events::CloudPubsub.config.auto_retry.enabled
|
|
151
170
|
|
|
152
171
|
Google::Cloud::PubSub::RetryPolicy.new(
|
|
153
172
|
minimum_backoff: CloudPubsub.config.auto_retry.minimum_backoff,
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hanami-events-cloud_pubsub
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 3.
|
|
4
|
+
version: 3.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ian Ker-Seymer
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-05-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dry-configurable
|