sidekiq-eventbus 0.0.2 → 0.1.1
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 +5 -5
- data/README.md +4 -0
- data/lib/sidekiq/event_bus.rb +3 -9
- data/lib/sidekiq/event_bus/adapters/buffered.rb +53 -0
- data/lib/sidekiq/event_bus/adapters/default.rb +3 -4
- data/lib/sidekiq/event_bus/adapters/inline.rb +3 -3
- data/lib/sidekiq/event_bus/adapters/log.rb +3 -3
- data/lib/sidekiq/event_bus/adapters/test.rb +6 -7
- data/lib/sidekiq/event_bus/configuration.rb +6 -5
- data/lib/sidekiq/event_bus/consumer.rb +20 -19
- data/lib/sidekiq/event_bus/event_worker.rb +2 -4
- data/lib/sidekiq/event_bus/producer.rb +4 -7
- data/lib/sidekiq/event_bus/utils.rb +11 -11
- data/lib/sidekiq/event_bus/version.rb +5 -0
- metadata +71 -11
- data/lib/sidekiq/event_bus/topic_middleware.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9eaab7d24f9c7b4c0c99abba98571139000d64f3ada45407715da23db8c98098
|
4
|
+
data.tar.gz: e0a830587be3568625753368fab690eae383f03a547d553c71030090daea9499
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2544bded9aff5a1e694e786b6a8406cfb985f0d9ec191f140fe8d5dddbb861fedcb9c214f30069dc205a87c7a0908b5da5ff11b50fe71b608baa5506cd80ff2
|
7
|
+
data.tar.gz: 115b47ceda5d54b64125b9e9a61dc32ccad32be24c99b0da4aa40e4967b80b3985680e7c2e3933ad48a02a965d6faeded6a3c8c7d0b83553d2bf0bf134668192
|
data/README.md
CHANGED
data/lib/sidekiq/event_bus.rb
CHANGED
@@ -8,14 +8,14 @@ module Sidekiq
|
|
8
8
|
autoload :Consumer, 'sidekiq/event_bus/consumer'
|
9
9
|
autoload :Producer, 'sidekiq/event_bus/producer'
|
10
10
|
|
11
|
-
autoload :TopicMiddleware, 'sidekiq/event_bus/topic_middleware'
|
12
11
|
autoload :EventWorker, 'sidekiq/event_bus/event_worker'
|
13
12
|
|
14
13
|
module Adapters
|
15
14
|
autoload :Default, 'sidekiq/event_bus/adapters/default'
|
15
|
+
autoload :Buffered, 'sidekiq/event_bus/adapters/buffered'
|
16
16
|
autoload :Inline, 'sidekiq/event_bus/adapters/inline'
|
17
17
|
autoload :Test, 'sidekiq/event_bus/adapters/test'
|
18
|
-
autoload :Log,
|
18
|
+
autoload :Log, 'sidekiq/event_bus/adapters/log'
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.config
|
@@ -23,7 +23,7 @@ module Sidekiq
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def self.utils
|
26
|
-
@utils ||= Utils.new
|
26
|
+
@utils ||= Utils.new
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.configure
|
@@ -31,9 +31,3 @@ module Sidekiq
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
34
|
-
|
35
|
-
Sidekiq.configure_server do |config|
|
36
|
-
config.server_middleware do |chain|
|
37
|
-
chain.add Sidekiq::EventBus::TopicMiddleware
|
38
|
-
end
|
39
|
-
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'concurrent'
|
2
|
+
|
3
|
+
class Sidekiq::EventBus::Adapters::Buffered
|
4
|
+
def initialize adapter: Sidekiq::EventBus::Adapters::Default.new
|
5
|
+
@adapter = adapter
|
6
|
+
@bufferes = Concurrent::Map.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def push event, payload
|
10
|
+
if is_buffered?
|
11
|
+
event_buffer << [ event, payload ]
|
12
|
+
nil
|
13
|
+
else
|
14
|
+
@adapter.push(event, payload)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def buffered
|
19
|
+
buffer!
|
20
|
+
begin
|
21
|
+
yield
|
22
|
+
flush!
|
23
|
+
ensure
|
24
|
+
clear!
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def event_buffer
|
29
|
+
@bufferes[buffer_key] ||= Array.new
|
30
|
+
end
|
31
|
+
|
32
|
+
def is_buffered?
|
33
|
+
@bufferes.key?(buffer_key)
|
34
|
+
end
|
35
|
+
|
36
|
+
def buffer!
|
37
|
+
@bufferes[buffer_key] ||= Array.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def flush!
|
41
|
+
event_buffer.map do |event, payload|
|
42
|
+
@adapter.push(event, payload)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def clear!
|
47
|
+
@bufferes.delete(buffer_key)
|
48
|
+
end
|
49
|
+
|
50
|
+
def buffer_key
|
51
|
+
Thread.current.object_id
|
52
|
+
end
|
53
|
+
end
|
@@ -1,9 +1,8 @@
|
|
1
1
|
class Sidekiq::EventBus::Adapters::Default
|
2
|
-
def push
|
2
|
+
def push event, payload
|
3
3
|
Sidekiq::Client.push({
|
4
4
|
'class' => Sidekiq::EventBus::EventWorker,
|
5
|
-
'args' => [ event, payload ]
|
6
|
-
'queue' => topic,
|
5
|
+
'args' => [ event, payload ]
|
7
6
|
})
|
8
7
|
end
|
9
|
-
end
|
8
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Sidekiq::EventBus::Adapters::Log
|
2
|
-
def push
|
2
|
+
def push event, payload
|
3
3
|
id = SecureRandom.hex(8)
|
4
|
-
puts "
|
4
|
+
puts "event=#{event} id=#{id} payload=#{payload.to_json}"
|
5
5
|
id
|
6
6
|
end
|
7
|
-
end
|
7
|
+
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
class Sidekiq::EventBus::Adapters::Test
|
2
|
-
attr_accessor :
|
2
|
+
attr_accessor :events
|
3
3
|
|
4
4
|
def initialize
|
5
|
-
self.
|
5
|
+
self.events = []
|
6
6
|
end
|
7
7
|
|
8
|
-
def push
|
8
|
+
def push event, payload
|
9
9
|
id = SecureRandom.hex(8)
|
10
|
-
self.
|
11
|
-
topic: topic,
|
10
|
+
self.events.push({
|
12
11
|
event: event,
|
13
12
|
payload: payload,
|
14
13
|
id: id
|
@@ -18,6 +17,6 @@ class Sidekiq::EventBus::Adapters::Test
|
|
18
17
|
end
|
19
18
|
|
20
19
|
def clear!
|
21
|
-
self.
|
20
|
+
self.events.clear
|
22
21
|
end
|
23
|
-
end
|
22
|
+
end
|
@@ -1,13 +1,14 @@
|
|
1
1
|
class Sidekiq::EventBus::Configuration
|
2
|
-
attr_accessor :adapter, :consumers, :sidekiq_worker_options
|
2
|
+
attr_accessor :adapter, :consumers, :sidekiq_worker_options, :error_handler
|
3
|
+
|
3
4
|
def initialize
|
4
5
|
self.adapter = Sidekiq::EventBus::Adapters::Default.new
|
5
|
-
self.consumers =
|
6
|
+
self.consumers = Set.new
|
6
7
|
self.sidekiq_worker_options = { retry: 0, dead: true }
|
7
8
|
end
|
8
9
|
|
9
|
-
def register_consumer
|
10
|
+
def register_consumer klass
|
10
11
|
klass = klass.name unless klass.is_a?(String)
|
11
|
-
consumers
|
12
|
+
consumers << klass
|
12
13
|
end
|
13
|
-
end
|
14
|
+
end
|
@@ -1,12 +1,8 @@
|
|
1
1
|
class Sidekiq::EventBus::Consumer
|
2
|
-
|
3
|
-
|
4
|
-
Array(topics).each do |topic|
|
5
|
-
Sidekiq::EventBus.config.register_consumer(topic, self)
|
6
|
-
end
|
2
|
+
def self.register_consumer!
|
3
|
+
Sidekiq::EventBus.config.register_consumer(self)
|
7
4
|
end
|
8
5
|
|
9
|
-
|
10
6
|
# Store handlers for this consumer
|
11
7
|
def self.handlers
|
12
8
|
@handlers ||= Hash.new { |hash, key| hash[key] = Array.new }
|
@@ -22,22 +18,27 @@ class Sidekiq::EventBus::Consumer
|
|
22
18
|
end
|
23
19
|
end
|
24
20
|
|
21
|
+
PAYLOAD_WITH_INDIFFERENT_ACCESS = defined?(ActiveSupport::HashWithIndifferentAccess)
|
25
22
|
|
26
|
-
def consume
|
27
|
-
|
23
|
+
def consume event, payload
|
24
|
+
if self.class.handlers.key? event
|
25
|
+
_payload = payload.merge('event'.freeze => event).freeze
|
26
|
+
|
27
|
+
if PAYLOAD_WITH_INDIFFERENT_ACCESS
|
28
|
+
_payload = ActiveSupport::HashWithIndifferentAccess.new(_payload)
|
29
|
+
end
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
31
|
+
self.class.handlers[event].each do |handler|
|
32
|
+
begin
|
33
|
+
if handler.is_a? Proc
|
34
|
+
instance_exec( _payload.dup, &handler )
|
35
|
+
else
|
36
|
+
handler.call( _payload.dup )
|
37
|
+
end
|
38
|
+
rescue => e
|
39
|
+
Sidekiq::EventBus.utils.handle_error(e)
|
35
40
|
end
|
36
|
-
rescue => e
|
37
|
-
puts "OH NO!!!"
|
38
|
-
puts e.inspect
|
39
|
-
puts e.backtrace
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
43
|
-
end
|
44
|
+
end
|
@@ -1,11 +1,9 @@
|
|
1
1
|
class Sidekiq::EventBus::EventWorker
|
2
2
|
include Sidekiq::Worker
|
3
3
|
|
4
|
-
attr_accessor :topic
|
5
|
-
|
6
4
|
sidekiq_options Sidekiq::EventBus.config.sidekiq_worker_options
|
7
5
|
|
8
6
|
def perform(event, payload)
|
9
|
-
Sidekiq::EventBus.utils.handle_event(
|
7
|
+
Sidekiq::EventBus.utils.handle_event(event, payload)
|
10
8
|
end
|
11
|
-
end
|
9
|
+
end
|
@@ -1,14 +1,11 @@
|
|
1
1
|
class Sidekiq::EventBus::Producer
|
2
|
-
attr_reader :
|
2
|
+
attr_reader :adapter
|
3
3
|
|
4
|
-
def initialize
|
5
|
-
@topics = Array(topics)
|
4
|
+
def initialize adapter: Sidekiq::EventBus.config.adapter
|
6
5
|
@adapter = adapter
|
7
6
|
end
|
8
7
|
|
9
8
|
def publish event, payload
|
10
|
-
|
11
|
-
adapter.push topic, event, payload
|
12
|
-
end
|
9
|
+
adapter.push event, payload
|
13
10
|
end
|
14
|
-
end
|
11
|
+
end
|
@@ -1,19 +1,19 @@
|
|
1
1
|
class Sidekiq::EventBus::Utils
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
2
|
+
def consumers
|
3
|
+
Sidekiq::EventBus.config.consumers.map do |klass_name|
|
4
|
+
klass_name.constantize.new
|
5
|
+
end
|
6
6
|
end
|
7
7
|
|
8
|
-
def
|
9
|
-
|
10
|
-
|
8
|
+
def handle_event event, payload
|
9
|
+
consumers.each do |consumer|
|
10
|
+
consumer.consume(event, payload)
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
14
|
+
def handle_error exception
|
15
|
+
unless Sidekiq::EventBus.config.error_handler.nil?
|
16
|
+
Sidekiq::EventBus.config.error_handler.call(exception)
|
17
17
|
end
|
18
18
|
end
|
19
|
-
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,16 +1,76 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-eventbus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Monroe
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2020-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: concurrent-ruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '2.0'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.0'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: sidekiq
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 4.0.0
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '7.0'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 4.0.0
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '7.0'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rspec
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 3.5.0
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '4.0'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 3.5.0
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '4.0'
|
73
|
+
description: A simple asynchronous Producer/Consumer event bus extension for Sidekiq
|
14
74
|
email: phil@rakefire.io
|
15
75
|
executables: []
|
16
76
|
extensions: []
|
@@ -21,6 +81,7 @@ files:
|
|
21
81
|
- README.md
|
22
82
|
- lib/sidekiq-eventbus.rb
|
23
83
|
- lib/sidekiq/event_bus.rb
|
84
|
+
- lib/sidekiq/event_bus/adapters/buffered.rb
|
24
85
|
- lib/sidekiq/event_bus/adapters/default.rb
|
25
86
|
- lib/sidekiq/event_bus/adapters/inline.rb
|
26
87
|
- lib/sidekiq/event_bus/adapters/log.rb
|
@@ -29,13 +90,13 @@ files:
|
|
29
90
|
- lib/sidekiq/event_bus/consumer.rb
|
30
91
|
- lib/sidekiq/event_bus/event_worker.rb
|
31
92
|
- lib/sidekiq/event_bus/producer.rb
|
32
|
-
- lib/sidekiq/event_bus/topic_middleware.rb
|
33
93
|
- lib/sidekiq/event_bus/utils.rb
|
94
|
+
- lib/sidekiq/event_bus/version.rb
|
34
95
|
homepage: https://github.com/Rakefire/sidekiq-eventbus
|
35
96
|
licenses:
|
36
97
|
- MIT
|
37
98
|
metadata: {}
|
38
|
-
post_install_message:
|
99
|
+
post_install_message:
|
39
100
|
rdoc_options: []
|
40
101
|
require_paths:
|
41
102
|
- lib
|
@@ -50,9 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
50
111
|
- !ruby/object:Gem::Version
|
51
112
|
version: '0'
|
52
113
|
requirements: []
|
53
|
-
|
54
|
-
|
55
|
-
signing_key:
|
114
|
+
rubygems_version: 3.0.3
|
115
|
+
signing_key:
|
56
116
|
specification_version: 4
|
57
|
-
summary:
|
117
|
+
summary: Producer/Consumer event bus via Sidekiq
|
58
118
|
test_files: []
|