hanami-events-cloud_pubsub 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|