bbk-app 1.1.4.345715 → 1.2.0.352691
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 +13 -10
- data/lib/bbk/app/dispatcher/message.rb +49 -0
- data/lib/bbk/app/dispatcher.rb +20 -8
- data/lib/bbk/app/handler.rb +8 -0
- data/lib/bbk/app/spec/shared/dispatcher/message.rb +4 -1
- data/lib/bbk/app/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: 3fdd4d2062e762078e538d9f8dcd44e5f47b85dd0b31ddeacd10c20caafe5475
|
|
4
|
+
data.tar.gz: b31fcc3260b70553b24ce500af73b96e888e7e472f2dfa2ee0bc4d9a00db70d8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 68fbf3dd3307789e4094f289dd7f9837f27396ce7fd77ccca246de70f14cc5c692638303404d6a439ae338506d3aade5a6660f4ce5f846edc2b693bd10d90cc6
|
|
7
|
+
data.tar.gz: baa246afbee6385803b0ceb4f2472e4cd80a78f318a8090aa262ec9f0ce6e87734897168cd41a236f32e02b8d011f897a0f43d901798d98dd1084fb4dccdab79
|
data/Gemfile.lock
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
bbk-app (1.
|
|
5
|
-
activesupport (
|
|
4
|
+
bbk-app (1.2.0)
|
|
5
|
+
activesupport (>= 6.0)
|
|
6
6
|
bbk-utils (> 1.0.1)
|
|
7
7
|
oj
|
|
8
8
|
timeouter
|
|
@@ -38,11 +38,12 @@ GEM
|
|
|
38
38
|
ice_nine (~> 0.11.0)
|
|
39
39
|
thread_safe (~> 0.3, >= 0.3.1)
|
|
40
40
|
base64 (0.3.0)
|
|
41
|
-
bbk-utils (1.
|
|
42
|
-
activesupport (>=
|
|
41
|
+
bbk-utils (1.1.4.347221)
|
|
42
|
+
activesupport (>= 7.0)
|
|
43
43
|
russian
|
|
44
|
+
securerandom (~> 0.3.2)
|
|
44
45
|
benchmark (0.5.0)
|
|
45
|
-
bigdecimal (
|
|
46
|
+
bigdecimal (4.0.1)
|
|
46
47
|
bunny (2.19.0)
|
|
47
48
|
amq-protocol (~> 2.3, >= 2.3.1)
|
|
48
49
|
sorted_set (~> 1, >= 1.0.2)
|
|
@@ -51,8 +52,8 @@ GEM
|
|
|
51
52
|
byebug (11.1.3)
|
|
52
53
|
coercible (1.0.0)
|
|
53
54
|
descendants_tracker (~> 0.0.1)
|
|
54
|
-
concurrent-ruby (1.3.
|
|
55
|
-
connection_pool (3.0.
|
|
55
|
+
concurrent-ruby (1.3.6)
|
|
56
|
+
connection_pool (3.0.2)
|
|
56
57
|
database_cleaner (2.1.0)
|
|
57
58
|
database_cleaner-active_record (>= 2, < 3)
|
|
58
59
|
database_cleaner-active_record (2.2.2)
|
|
@@ -85,7 +86,8 @@ GEM
|
|
|
85
86
|
addressable (~> 2.7)
|
|
86
87
|
logger (1.7.0)
|
|
87
88
|
mini_portile2 (2.8.9)
|
|
88
|
-
minitest (
|
|
89
|
+
minitest (6.0.0)
|
|
90
|
+
prism (~> 1.5)
|
|
89
91
|
oj (3.16.13)
|
|
90
92
|
bigdecimal (>= 3.0)
|
|
91
93
|
ostruct (>= 0.2)
|
|
@@ -94,6 +96,7 @@ GEM
|
|
|
94
96
|
parser (3.0.3.2)
|
|
95
97
|
ast (~> 2.4.1)
|
|
96
98
|
path_expander (1.1.0)
|
|
99
|
+
prism (1.7.0)
|
|
97
100
|
public_suffix (4.0.6)
|
|
98
101
|
rainbow (3.1.1)
|
|
99
102
|
rake (12.3.3)
|
|
@@ -146,7 +149,7 @@ GEM
|
|
|
146
149
|
virtus (~> 1.0)
|
|
147
150
|
russian (0.6.0)
|
|
148
151
|
i18n (>= 0.5.0)
|
|
149
|
-
securerandom (0.
|
|
152
|
+
securerandom (0.3.2)
|
|
150
153
|
set (1.1.0)
|
|
151
154
|
sexp_processor (4.16.0)
|
|
152
155
|
simplecov (0.21.2)
|
|
@@ -187,7 +190,7 @@ PLATFORMS
|
|
|
187
190
|
x86_64-linux-musl
|
|
188
191
|
|
|
189
192
|
DEPENDENCIES
|
|
190
|
-
activerecord (
|
|
193
|
+
activerecord (>= 6.0)
|
|
191
194
|
bbk-app!
|
|
192
195
|
bundler (~> 2.0)
|
|
193
196
|
bunny-mock (~> 1.7.0)
|
|
@@ -3,6 +3,7 @@ require 'oj'
|
|
|
3
3
|
module BBK
|
|
4
4
|
module App
|
|
5
5
|
class Dispatcher
|
|
6
|
+
# Базовый класс сообщений для фреймворка BBK
|
|
6
7
|
class Message
|
|
7
8
|
|
|
8
9
|
attr_reader :consumer, :delivery_info, :headers, :body
|
|
@@ -14,6 +15,7 @@ module BBK
|
|
|
14
15
|
@body = body
|
|
15
16
|
@acked = false
|
|
16
17
|
@nacked = false
|
|
18
|
+
@restored = false
|
|
17
19
|
end
|
|
18
20
|
|
|
19
21
|
# Lazy body parsing
|
|
@@ -88,6 +90,53 @@ module BBK
|
|
|
88
90
|
acked? || nacked?
|
|
89
91
|
end
|
|
90
92
|
|
|
93
|
+
# Признак того что обхект восстановлен после сериализации через {#marshal_dump}
|
|
94
|
+
def restored?
|
|
95
|
+
@restored
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# типы данных, допустимые для {::Marshal#dump}
|
|
99
|
+
ALLOWED_FOR_DUMP = [ Time, FalseClass, TrueClass, NilClass, String, Integer, Float, Symbol ].freeze
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# Реализация быстрой и "полной" сериализации через {::Marshal#dump}
|
|
103
|
+
# Сложные объекты (которые могут содержать `Proc`, `IO` и пр.) нельзя сериализовывать,
|
|
104
|
+
# например в нутриBBK::AMQP::Message находится Consumer с такими членами.
|
|
105
|
+
#
|
|
106
|
+
# Используется например при передачи объекта Message куда-то, например в ActiveJob
|
|
107
|
+
#
|
|
108
|
+
# При наследовании можно использолвать так:
|
|
109
|
+
# ```ruby
|
|
110
|
+
# def marshal_dump
|
|
111
|
+
# [@my_attribute] + super
|
|
112
|
+
# end
|
|
113
|
+
#
|
|
114
|
+
# def marshal_load(array)
|
|
115
|
+
# @my_attribute, *parent_attributes = array
|
|
116
|
+
# super(parent_attributes)
|
|
117
|
+
# end
|
|
118
|
+
# ```
|
|
119
|
+
def marshal_dump
|
|
120
|
+
[ nil, marshal_dump_object(@delivery_info), @headers, @body, @payload, true]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Реализация быстрой и "полной" сериализации через {::Marshal#dump}
|
|
124
|
+
# @see marshal_dump
|
|
125
|
+
def marshal_load(array)
|
|
126
|
+
@consumer, @delivery_info, @headers, @body, @payload, @restored = array
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def marshal_dump_object(object)
|
|
130
|
+
case object
|
|
131
|
+
when Hash
|
|
132
|
+
object.transform_values {|v| marshal_dump_object(v) }
|
|
133
|
+
when Array, Enumerable
|
|
134
|
+
object.map {|v| marshal_dump_object(v) }
|
|
135
|
+
else
|
|
136
|
+
ALLOWED_FOR_DUMP.include?(object.class) ? object : nil
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
91
140
|
end
|
|
92
141
|
end
|
|
93
142
|
end
|
data/lib/bbk/app/dispatcher.rb
CHANGED
|
@@ -118,7 +118,7 @@ module BBK
|
|
|
118
118
|
next unless m.respond_to?(:stop)
|
|
119
119
|
m.stop
|
|
120
120
|
rescue StandardError => e
|
|
121
|
-
logger.error "
|
|
121
|
+
logger.error "Middleware #{m} stop error: #{e}"
|
|
122
122
|
logger.debug e.backtrace
|
|
123
123
|
end
|
|
124
124
|
|
|
@@ -185,17 +185,29 @@ match: matched, processor: processor, exception: e
|
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
def find_processor(msg)
|
|
188
|
-
matched, callback = @observer.
|
|
188
|
+
matched, callback = if @observer.respond_to?(:match_message)
|
|
189
|
+
# Новый интерфейс рассчитаный на BBK::Message
|
|
190
|
+
@observer.match_message(msg)
|
|
191
|
+
else
|
|
192
|
+
# старый интерфейс
|
|
193
|
+
@observer.match(msg.headers, msg.payload, msg.delivery_info)
|
|
194
|
+
end
|
|
195
|
+
|
|
189
196
|
[matched, callback.is_a?(BBK::App::Factory) ? callback.create : callback]
|
|
190
197
|
end
|
|
191
198
|
|
|
192
199
|
def build_processing_stack
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
200
|
+
# Оптимизация.Строим стэк только один раз. Могут быть проблемы, но надеюсь что всё будет норм
|
|
201
|
+
# Если какая-то мидлварь НЕ должна сохранять состояние (а случайно сохраняет), пусть
|
|
202
|
+
# реализует метод build и чистит состояние
|
|
203
|
+
@processing_stack ||= begin
|
|
204
|
+
stack = proc{|msg| process_message(msg) }
|
|
205
|
+
middlewares.reverse.reduce(stack) do |stack, middleware|
|
|
206
|
+
if middleware.respond_to?(:build)
|
|
207
|
+
middleware.build(stack)
|
|
208
|
+
else
|
|
209
|
+
middleware.new(stack)
|
|
210
|
+
end
|
|
199
211
|
end
|
|
200
212
|
end
|
|
201
213
|
end
|
data/lib/bbk/app/handler.rb
CHANGED
|
@@ -54,6 +54,9 @@ module BBK
|
|
|
54
54
|
@default = block
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
+
# Старый интерфейс в {Dispatcher} он требовал обязательной распоковки всех полей:
|
|
58
|
+
# например метод `.body` у {Message} это байты, а `.payload` это `JSON.parse(body)`
|
|
59
|
+
# новый {.match_message} получает целиком message и потом моэно решить надо распаковывать или нет
|
|
57
60
|
def match(metadata, payload, delivery_info)
|
|
58
61
|
@handlers.each_with_object([nil, @default]) do |p, _res|
|
|
59
62
|
m, h = p
|
|
@@ -63,6 +66,11 @@ module BBK
|
|
|
63
66
|
end
|
|
64
67
|
end
|
|
65
68
|
|
|
69
|
+
# новый интерфейс для возможной оптимизации
|
|
70
|
+
def match_message(msg)
|
|
71
|
+
match(msg.headers, msg.payload, msg.delivery_info)
|
|
72
|
+
end
|
|
73
|
+
|
|
66
74
|
end
|
|
67
75
|
end
|
|
68
76
|
end
|
|
@@ -83,7 +83,7 @@ RSpec.shared_examples 'BBK::App::Dispatcher::Message' do
|
|
|
83
83
|
let(:message_id) { SecureRandom.hex }
|
|
84
84
|
let(:addon) { SecureRandom.hex }
|
|
85
85
|
let(:first_call) { message.reply_message_id(addon) }
|
|
86
|
-
subject(:
|
|
86
|
+
subject(:reply_message_id) { message.message_id }
|
|
87
87
|
|
|
88
88
|
it {
|
|
89
89
|
expect(message).to receive(:message_id).and_return(message_id)
|
|
@@ -95,6 +95,9 @@ RSpec.shared_examples 'BBK::App::Dispatcher::Message' do
|
|
|
95
95
|
expect(first_call).to eq(message.reply_message_id(addon))
|
|
96
96
|
}
|
|
97
97
|
end
|
|
98
|
+
|
|
99
|
+
|
|
98
100
|
end
|
|
101
|
+
|
|
99
102
|
end
|
|
100
103
|
|
data/lib/bbk/app/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: bbk-app
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0.352691
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Samoilenko Yuri
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-01-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|