hanami-events-cloud_pubsub 0.2.1 → 0.2.2
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/Gemfile.lock +9 -7
- data/examples/server.rb +4 -0
- data/hanami-events-cloud_pubsub.gemspec +4 -3
- data/lib/hanami/events/cloud_pubsub.rb +7 -0
- data/lib/hanami/events/cloud_pubsub/cli.rb +30 -25
- data/lib/hanami/events/cloud_pubsub/health_check_server.rb +58 -0
- data/lib/hanami/events/cloud_pubsub/listener.rb +5 -3
- data/lib/hanami/events/cloud_pubsub/version.rb +1 -1
- metadata +26 -11
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5c1e904f1c495c8ec63738657cffec7235f9ac37
|
|
4
|
+
data.tar.gz: cc8260aba559598abff5cedeec6cc59e4514cf07
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 90585ecfef0ea10e61674e7e3671633a5feaa1b5f1437b7952bf01b1a001314b30652d3df20cfb4eccafef5b8e6de26832b0114bfd47a7aafaad6b58bea777a7
|
|
7
|
+
data.tar.gz: 69a520f5ed0fd98029bd6de9496f326d384ca2fb2717ee82635aacaca2113b70a5a9a83244077afbbd7f4d563e7f0a6f93a0dcec6fe937d86099f828161078e9
|
data/Gemfile.lock
CHANGED
|
@@ -9,11 +9,12 @@ GIT
|
|
|
9
9
|
PATH
|
|
10
10
|
remote: .
|
|
11
11
|
specs:
|
|
12
|
-
hanami-events-cloud_pubsub (0.2.
|
|
13
|
-
dry-configurable
|
|
12
|
+
hanami-events-cloud_pubsub (0.2.2)
|
|
13
|
+
dry-configurable (~> 0.7.0)
|
|
14
14
|
google-cloud-pubsub (~> 0.30.2)
|
|
15
|
-
hanami-cli
|
|
16
|
-
hanami-events
|
|
15
|
+
hanami-cli (~> 0.2.0)
|
|
16
|
+
hanami-events (~> 0)
|
|
17
|
+
rack (~> 2.0.5)
|
|
17
18
|
|
|
18
19
|
GEM
|
|
19
20
|
remote: https://rubygems.org/
|
|
@@ -75,7 +76,7 @@ GEM
|
|
|
75
76
|
hanami-utils (1.2.0)
|
|
76
77
|
concurrent-ruby (~> 1.0)
|
|
77
78
|
transproc (~> 1.0)
|
|
78
|
-
jaro_winkler (1.
|
|
79
|
+
jaro_winkler (1.5.1)
|
|
79
80
|
json (2.1.0)
|
|
80
81
|
jwt (2.1.0)
|
|
81
82
|
little-plugger (1.1.4)
|
|
@@ -95,6 +96,7 @@ GEM
|
|
|
95
96
|
coderay (~> 1.1.0)
|
|
96
97
|
method_source (~> 0.9.0)
|
|
97
98
|
public_suffix (3.0.2)
|
|
99
|
+
rack (2.0.5)
|
|
98
100
|
rainbow (3.0.0)
|
|
99
101
|
rake (12.3.1)
|
|
100
102
|
rly (0.2.3)
|
|
@@ -111,8 +113,8 @@ GEM
|
|
|
111
113
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
112
114
|
rspec-support (~> 3.7.0)
|
|
113
115
|
rspec-support (3.7.1)
|
|
114
|
-
rubocop (0.57.
|
|
115
|
-
jaro_winkler (~> 1.
|
|
116
|
+
rubocop (0.57.1)
|
|
117
|
+
jaro_winkler (~> 1.5.1)
|
|
116
118
|
parallel (~> 1.10)
|
|
117
119
|
parser (>= 2.5)
|
|
118
120
|
powerpack (~> 0.1)
|
data/examples/server.rb
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
Hanami::Events::CloudPubsub.configure do |config|
|
|
4
|
+
config.subscriber.streams = 2
|
|
5
|
+
config.subscriber.threads.push = 2
|
|
6
|
+
config.subscriber.threads.callback = 2
|
|
7
|
+
|
|
4
8
|
config.subscriptions_loader = -> do
|
|
5
9
|
$events.subscribe('user.deleted', id: 'testing-2') do |payload|
|
|
6
10
|
puts "Deleted2 user: #{payload}"
|
|
@@ -22,10 +22,11 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
23
23
|
spec.require_paths = ['lib']
|
|
24
24
|
|
|
25
|
-
spec.add_dependency 'dry-configurable'
|
|
25
|
+
spec.add_dependency 'dry-configurable', '~> 0.7.0'
|
|
26
26
|
spec.add_dependency 'google-cloud-pubsub', '~> 0.30.2'
|
|
27
|
-
spec.add_dependency 'hanami-cli'
|
|
28
|
-
spec.add_dependency 'hanami-events'
|
|
27
|
+
spec.add_dependency 'hanami-cli', '~> 0.2.0'
|
|
28
|
+
spec.add_dependency 'hanami-events', '~> 0'
|
|
29
|
+
spec.add_dependency 'rack', '~> 2.0.5'
|
|
29
30
|
|
|
30
31
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
|
31
32
|
spec.add_development_dependency 'rake', '~> 12.3'
|
|
@@ -13,6 +13,13 @@ module Hanami
|
|
|
13
13
|
module CloudPubsub
|
|
14
14
|
extend Dry::Configurable
|
|
15
15
|
|
|
16
|
+
setting :subscriber, reader: true do
|
|
17
|
+
setting :streams, 4
|
|
18
|
+
setting :threads do
|
|
19
|
+
setting :callback, 8
|
|
20
|
+
setting :push, 4
|
|
21
|
+
end
|
|
22
|
+
end
|
|
16
23
|
setting :project_id, reader: true
|
|
17
24
|
setting :logger, Logger.new(STDOUT), reader: true
|
|
18
25
|
setting :subscriptions_loader, proc {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'hanami/cli'
|
|
4
4
|
require 'hanami/events/cloud_pubsub'
|
|
5
|
+
require 'hanami/events/cloud_pubsub/health_check_server'
|
|
5
6
|
|
|
6
7
|
module Hanami
|
|
7
8
|
module Events
|
|
@@ -13,6 +14,13 @@ module Hanami
|
|
|
13
14
|
|
|
14
15
|
# Command to run the worker
|
|
15
16
|
class Run < Hanami::CLI::Command
|
|
17
|
+
attr_reader :runner
|
|
18
|
+
|
|
19
|
+
def initialize(*args)
|
|
20
|
+
super
|
|
21
|
+
@event_queue = Queue.new
|
|
22
|
+
end
|
|
23
|
+
|
|
16
24
|
option :emulator,
|
|
17
25
|
type: :boolean,
|
|
18
26
|
default: false,
|
|
@@ -35,6 +43,7 @@ module Hanami
|
|
|
35
43
|
load_subscriptions
|
|
36
44
|
setup_signal_handlers
|
|
37
45
|
start_runner
|
|
46
|
+
start_server
|
|
38
47
|
sleep_forever
|
|
39
48
|
end
|
|
40
49
|
|
|
@@ -49,18 +58,18 @@ module Hanami
|
|
|
49
58
|
CloudPubsub.setup
|
|
50
59
|
end
|
|
51
60
|
|
|
61
|
+
def start_server
|
|
62
|
+
server = HealthCheckServer.new(runner, logger)
|
|
63
|
+
on_shutdown = proc { @event_queue << proc { shutdown } }
|
|
64
|
+
server.run_in_background(on_shutdown: on_shutdown)
|
|
65
|
+
server
|
|
66
|
+
end
|
|
67
|
+
|
|
52
68
|
def sleep_forever
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
event.call
|
|
57
|
-
end
|
|
69
|
+
until finished_shutting_down?
|
|
70
|
+
event = @event_queue.pop
|
|
71
|
+
event.call
|
|
58
72
|
end
|
|
59
|
-
|
|
60
|
-
sleep
|
|
61
|
-
rescue Interrupt
|
|
62
|
-
thread.kill
|
|
63
|
-
shutdown
|
|
64
73
|
end
|
|
65
74
|
|
|
66
75
|
def load_config
|
|
@@ -72,7 +81,7 @@ module Hanami
|
|
|
72
81
|
def start_runner
|
|
73
82
|
logger.debug 'Running in emulator mode' if @emulator
|
|
74
83
|
logger.info "Starting worker (pid: #{Process.pid})"
|
|
75
|
-
|
|
84
|
+
runner.start
|
|
76
85
|
end
|
|
77
86
|
|
|
78
87
|
def parse_opts(opts)
|
|
@@ -100,24 +109,20 @@ module Hanami
|
|
|
100
109
|
end
|
|
101
110
|
|
|
102
111
|
def setup_signal_handlers
|
|
103
|
-
@
|
|
104
|
-
|
|
105
|
-
Signal.trap('
|
|
106
|
-
@queue << proc { @runner.pause }
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
Signal.trap('CONT') do
|
|
110
|
-
@queue << proc { @runner.start }
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
Signal.trap('TTIN') do
|
|
114
|
-
@queue << proc { @runner.print_debug_info }
|
|
115
|
-
end
|
|
112
|
+
Signal.trap('TSTP') { @event_queue << runner.method(:pause) }
|
|
113
|
+
Signal.trap('TTIN') { @event_queue << runner.method(:print_debug_info) }
|
|
114
|
+
Signal.trap('INT') { @event_queue << method(:shutdown) }
|
|
116
115
|
end
|
|
117
116
|
|
|
118
117
|
def shutdown
|
|
119
118
|
STDOUT.flush
|
|
120
|
-
|
|
119
|
+
runner.gracefully_shutdown
|
|
120
|
+
ensure
|
|
121
|
+
@finished_shutting_down = true
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def finished_shutting_down?
|
|
125
|
+
@finished_shutting_down == true
|
|
121
126
|
end
|
|
122
127
|
end
|
|
123
128
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rack'
|
|
4
|
+
|
|
5
|
+
module Hanami
|
|
6
|
+
module Events
|
|
7
|
+
module CloudPubsub
|
|
8
|
+
# Simple server for health checks
|
|
9
|
+
class HealthCheckServer
|
|
10
|
+
def initialize(runner, logger)
|
|
11
|
+
@runner = runner
|
|
12
|
+
@logger = logger
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def start
|
|
16
|
+
@logger.info 'Starting healthcheck server on port 0.0.0.0:8080'
|
|
17
|
+
server.start
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def run_in_background(on_shutdown:)
|
|
21
|
+
log_error = proc { |err| logger.error(err.message) }
|
|
22
|
+
|
|
23
|
+
Concurrent::Promise.execute(on_reject: log_error) do
|
|
24
|
+
server.start
|
|
25
|
+
on_shutdown.call(server)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def server
|
|
32
|
+
@server ||= Rack::Server.new(
|
|
33
|
+
Port: 8080,
|
|
34
|
+
Host: '0.0.0.0',
|
|
35
|
+
quiet: true,
|
|
36
|
+
app: app
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def app
|
|
41
|
+
health_endpoint = method(:health_endpoint)
|
|
42
|
+
|
|
43
|
+
Rack::Builder.app do
|
|
44
|
+
run health_endpoint
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def health_endpoint(_env)
|
|
49
|
+
status = @runner.healthy? ? 200 : 503
|
|
50
|
+
headers = { 'Content-Type' => 'text/html' }
|
|
51
|
+
body = [status.to_s]
|
|
52
|
+
|
|
53
|
+
[status, headers, body]
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -14,7 +14,8 @@ module Hanami
|
|
|
14
14
|
:subscriber_id,
|
|
15
15
|
:logger,
|
|
16
16
|
:handler,
|
|
17
|
-
:event_name
|
|
17
|
+
:event_name,
|
|
18
|
+
:subscriber_opts
|
|
18
19
|
|
|
19
20
|
def initialize(topic:, logger:, handler:, event_name:, subscriber_id:)
|
|
20
21
|
@topic = topic
|
|
@@ -22,12 +23,13 @@ module Hanami
|
|
|
22
23
|
@handler = handler
|
|
23
24
|
@event_name = event_name
|
|
24
25
|
@subscriber_id = subscriber_id
|
|
26
|
+
@subscriber_opts = CloudPubsub.config.subscriber.to_h
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
def register
|
|
28
30
|
subscription = subscription_for(subscriber_id)
|
|
29
31
|
|
|
30
|
-
listener = subscription.listen do |message|
|
|
32
|
+
listener = subscription.listen(subscriber_opts) do |message|
|
|
31
33
|
handle_message(message)
|
|
32
34
|
end
|
|
33
35
|
|
|
@@ -97,7 +99,7 @@ module Hanami
|
|
|
97
99
|
def subscription_for(name)
|
|
98
100
|
topic.create_subscription(name)
|
|
99
101
|
rescue Google::Cloud::AlreadyExistsError
|
|
100
|
-
|
|
102
|
+
topic.find_subscription(name)
|
|
101
103
|
end
|
|
102
104
|
|
|
103
105
|
def ensure_subscriber!
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hanami-events-cloud_pubsub
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ian Ker-Seymer
|
|
@@ -14,16 +14,16 @@ dependencies:
|
|
|
14
14
|
name: dry-configurable
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
17
|
+
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version:
|
|
19
|
+
version: 0.7.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
|
-
- - "
|
|
24
|
+
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
26
|
+
version: 0.7.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: google-cloud-pubsub
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -42,30 +42,44 @@ dependencies:
|
|
|
42
42
|
name: hanami-cli
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
|
-
- - "
|
|
45
|
+
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version:
|
|
47
|
+
version: 0.2.0
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
|
-
- - "
|
|
52
|
+
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version:
|
|
54
|
+
version: 0.2.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: hanami-events
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
|
-
- - "
|
|
59
|
+
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '0'
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
|
-
- - "
|
|
66
|
+
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rack
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: 2.0.5
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: 2.0.5
|
|
69
83
|
- !ruby/object:Gem::Dependency
|
|
70
84
|
name: bundler
|
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -138,6 +152,7 @@ files:
|
|
|
138
152
|
- lib/hanami/events/cloud_pubsub.rb
|
|
139
153
|
- lib/hanami/events/cloud_pubsub/cli.rb
|
|
140
154
|
- lib/hanami/events/cloud_pubsub/handler.rb
|
|
155
|
+
- lib/hanami/events/cloud_pubsub/health_check_server.rb
|
|
141
156
|
- lib/hanami/events/cloud_pubsub/listener.rb
|
|
142
157
|
- lib/hanami/events/cloud_pubsub/mixin.rb
|
|
143
158
|
- lib/hanami/events/cloud_pubsub/runner.rb
|