bbk-app 1.0.0.72899
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 +7 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +177 -0
- data/README.md +38 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/lib/bbk/app/dispatcher/message.rb +47 -0
- data/lib/bbk/app/dispatcher/message_stream.rb +42 -0
- data/lib/bbk/app/dispatcher/queue_stream_strategy.rb +54 -0
- data/lib/bbk/app/dispatcher/result.rb +20 -0
- data/lib/bbk/app/dispatcher/route.rb +37 -0
- data/lib/bbk/app/dispatcher.rb +210 -0
- data/lib/bbk/app/factory.rb +26 -0
- data/lib/bbk/app/handler.rb +69 -0
- data/lib/bbk/app/matchers/base.rb +50 -0
- data/lib/bbk/app/matchers/delivery_info.rb +35 -0
- data/lib/bbk/app/matchers/full.rb +41 -0
- data/lib/bbk/app/matchers/headers.rb +23 -0
- data/lib/bbk/app/matchers/payload.rb +23 -0
- data/lib/bbk/app/matchers.rb +28 -0
- data/lib/bbk/app/middlewares/active_record_pool.rb +21 -0
- data/lib/bbk/app/middlewares/base.rb +20 -0
- data/lib/bbk/app/middlewares/from_block.rb +26 -0
- data/lib/bbk/app/middlewares/self_killer.rb +66 -0
- data/lib/bbk/app/middlewares/watchdog.rb +78 -0
- data/lib/bbk/app/middlewares.rb +12 -0
- data/lib/bbk/app/processors/base.rb +46 -0
- data/lib/bbk/app/processors/ping.rb +26 -0
- data/lib/bbk/app/processors/pong.rb +16 -0
- data/lib/bbk/app/processors.rb +3 -0
- data/lib/bbk/app/proxy_logger.rb +42 -0
- data/lib/bbk/app/thread_pool.rb +75 -0
- data/lib/bbk/app/version.rb +8 -0
- data/lib/bbk/app.rb +23 -0
- data/sig/bbk/app/callable.rbs +3 -0
- data/sig/bbk/app/dispatcher/message.rbs +33 -0
- data/sig/bbk/app/dispatcher/message_stream.rbs +15 -0
- data/sig/bbk/app/dispatcher/queue_stream_strategy.rbs +12 -0
- data/sig/bbk/app/dispatcher/result.rbs +12 -0
- data/sig/bbk/app/dispatcher/route.rbs +18 -0
- data/sig/bbk/app/dispatcher/stream_strategy.rbs +13 -0
- data/sig/bbk/app/dispatcher.rbs +62 -0
- data/sig/bbk/app/factory.rbs +21 -0
- data/sig/bbk/app/handler.rbs +19 -0
- data/sig/bbk/app/matchers.rbs +12 -0
- data/sig/bbk/app/middlewares/self_killer.rbs +26 -0
- data/sig/bbk/app/middlewares/watchdog.rbs +40 -0
- data/sig/bbk/app/processors/base.rbs +21 -0
- metadata +327 -0
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'timeouter'
|
2
|
+
|
3
|
+
module BBK
|
4
|
+
module App
|
5
|
+
class ThreadPool
|
6
|
+
|
7
|
+
attr_reader :jobs, :threads
|
8
|
+
|
9
|
+
def initialize(size, queue: 10)
|
10
|
+
@jobs = SizedQueue.new(queue)
|
11
|
+
@shutdown = false
|
12
|
+
@term = false
|
13
|
+
|
14
|
+
@threads = size.times.map do
|
15
|
+
Thread.new(@jobs) do |jobs|
|
16
|
+
begin
|
17
|
+
Thread.current.report_on_exception = true
|
18
|
+
Thread.current.abort_on_exception = true
|
19
|
+
|
20
|
+
unless @shutdown
|
21
|
+
until @term
|
22
|
+
job, args = jobs.pop
|
23
|
+
break if @term || job == :exit
|
24
|
+
|
25
|
+
job.call(*args)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
rescue StandardError => e
|
29
|
+
warn "[CRITICAL]: ThreadPool exception: #{e}"
|
30
|
+
warn "[CRITICAL]: #{e.backtrace.join("\n")}"
|
31
|
+
# Thread.main.raise e
|
32
|
+
exit(1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def post(*args, &block)
|
39
|
+
@jobs << [block, args] unless @shutdown
|
40
|
+
end
|
41
|
+
|
42
|
+
def shutdown
|
43
|
+
return if @shutdown
|
44
|
+
|
45
|
+
@shutdown = true
|
46
|
+
Thread.new { @threads.size.times { @jobs.push(:exit) } }
|
47
|
+
end
|
48
|
+
|
49
|
+
def wait_for_termination(timeout = 0)
|
50
|
+
Timeouter.run(timeout) do |t|
|
51
|
+
@threads.all? do |thread|
|
52
|
+
thread.join(t.left)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
alias wait wait_for_termination
|
58
|
+
|
59
|
+
def kill(timeout = 1)
|
60
|
+
return if @term
|
61
|
+
|
62
|
+
@term = true
|
63
|
+
shutdown
|
64
|
+
if wait_for_termination(timeout)
|
65
|
+
true
|
66
|
+
else
|
67
|
+
@threads.each(&:kill)
|
68
|
+
false
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
data/lib/bbk/app.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'bbk/app/version'
|
2
|
+
require 'bbk/app/factory'
|
3
|
+
require 'bbk/app/handler'
|
4
|
+
require 'bbk/app/matchers'
|
5
|
+
require 'bbk/app/middlewares'
|
6
|
+
require 'bbk/app/dispatcher'
|
7
|
+
require 'bbk/app/processors'
|
8
|
+
require 'bbk/utils/logger'
|
9
|
+
|
10
|
+
module BBK
|
11
|
+
module App
|
12
|
+
|
13
|
+
class << self
|
14
|
+
|
15
|
+
attr_accessor :logger
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
self.logger = BBK::Utils::Logger.default
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
class Dispatcher
|
4
|
+
interface _Message
|
5
|
+
def headers: () -> Hash[String|Symbol, untyped]
|
6
|
+
def payload: () -> Hash[untyped, untyped]?
|
7
|
+
end
|
8
|
+
|
9
|
+
interface _Mapping
|
10
|
+
def []: (untyped) -> untyped
|
11
|
+
def []=: (untyped, untyped) -> untyped
|
12
|
+
end
|
13
|
+
|
14
|
+
interface _IncomingMessage
|
15
|
+
include _Message
|
16
|
+
def delivery_info: () -> untyped
|
17
|
+
def body: () -> String
|
18
|
+
|
19
|
+
def ack: (*untyped, ?answer: Result?, **untyped) -> void
|
20
|
+
def nack: (*untyped, ?error: untyped, **untyped) -> void
|
21
|
+
def message_id: () -> String
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
class Message
|
26
|
+
include _IncomingMessage
|
27
|
+
|
28
|
+
def initialize: (_Consumer, untyped?, Hash[String|Symbol, untyped], untyped, *untyped) -> void
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
class Dispatcher
|
4
|
+
class MessageStream
|
5
|
+
|
6
|
+
def initialize: (?size: Integer) -> void
|
7
|
+
def push: (_Message) -> void
|
8
|
+
def each: () -> Enumerator[_IncomingMessage|Symbol, void]
|
9
|
+
| {(_IncomingMessage) -> void} -> void
|
10
|
+
def close: () -> void
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
class Dispatcher
|
4
|
+
class Route
|
5
|
+
attr_reader uri: ::URI::Generic
|
6
|
+
attr_reader scheme: String?
|
7
|
+
attr_reader domain: String?
|
8
|
+
attr_reader routing_key: String
|
9
|
+
|
10
|
+
def initialize: (String|::URI::Generic) -> void
|
11
|
+
|
12
|
+
def to_s: () -> String
|
13
|
+
def ==: (untyped) -> bool
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
class Dispatcher
|
4
|
+
|
5
|
+
ANSWER_DOMAIN: 'answer'
|
6
|
+
|
7
|
+
interface _Consumer
|
8
|
+
def stop: () -> void
|
9
|
+
end
|
10
|
+
|
11
|
+
interface _Publisher
|
12
|
+
def publish: (Result) -> untyped # Concurrent::Promises::ResolvableFuture
|
13
|
+
def close: () -> void
|
14
|
+
end
|
15
|
+
|
16
|
+
interface _Middleware
|
17
|
+
def call: (_Message) -> Array[Result]
|
18
|
+
end
|
19
|
+
|
20
|
+
interface _MiddlewareClass
|
21
|
+
def new: (untyped) -> _Middleware
|
22
|
+
end
|
23
|
+
|
24
|
+
interface _MiddlewareBuilder
|
25
|
+
def build: (untyped) -> _Middleware
|
26
|
+
end
|
27
|
+
|
28
|
+
interface _ProcessorsStack
|
29
|
+
def call: (_Message) -> Array[Result]
|
30
|
+
end
|
31
|
+
|
32
|
+
interface _PoolFactory
|
33
|
+
def call: (Integer pool_size, Integer queue_size) -> untyped
|
34
|
+
end
|
35
|
+
|
36
|
+
type logger = BBK::Utils::_ProxyObject|_Logger
|
37
|
+
|
38
|
+
attr_accessor force_quit: bool
|
39
|
+
attr_reader consumers: Array[_Consumer]
|
40
|
+
attr_reader publishers: Array[_Publisher]
|
41
|
+
attr_reader middlewares: Array[_MiddlewareBuilder|_MiddlewareClass]
|
42
|
+
attr_reader logger: logger
|
43
|
+
|
44
|
+
def initialize: (Handler, ?pool_size: Integer, ?logger: logger, ?pool_factory: _PoolFactory, ?stream_strategy: StreamStrategyClass) -> void
|
45
|
+
def register_consumer: (_Consumer) -> void
|
46
|
+
def register_publisher: (_Publisher) -> void
|
47
|
+
def register_middleware: (_MiddlewareBuilder|_MiddlewareClass) -> void
|
48
|
+
def run: () -> void
|
49
|
+
def close: (?Integer time) -> void
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def process: (_Message) -> void
|
54
|
+
def process_message: (_Message) -> Array[Result]
|
55
|
+
def find_processor: (_Message) -> [untyped, _Processor]
|
56
|
+
def build_processing_stack: () -> _ProcessorsStack
|
57
|
+
def send_results: (_Message, Array[untyped]) -> void
|
58
|
+
def publish_result: (Result) -> untyped
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
class Factory
|
4
|
+
|
5
|
+
interface _ArgFactory
|
6
|
+
def new: (*untyped, **untyped) -> untyped
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_accessor klass: _ArgFactory
|
10
|
+
attr_accessor instanceargs: Array[untyped]
|
11
|
+
attr_accessor instancekwargs: Hash[Symbol, untyped]
|
12
|
+
|
13
|
+
def initialize: (_ArgFactory, *untyped) -> void
|
14
|
+
|
15
|
+
def create: () -> _Callable
|
16
|
+
|
17
|
+
def call: (*untyped) -> void
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
class Handler
|
4
|
+
@handlers: Hash[BBK::App::Matchers::_Matcher, _Callable]
|
5
|
+
@default: untyped
|
6
|
+
|
7
|
+
type hashKey = String | Symbol
|
8
|
+
|
9
|
+
def initialize: () ?{() -> void} -> void
|
10
|
+
|
11
|
+
def register: (*untyped, **untyped) ?{() -> void} -> void
|
12
|
+
|
13
|
+
def default: () {()->void} -> void
|
14
|
+
|
15
|
+
def match: (Hash[hashKey, untyped] metadata, Hash[hashKey, untyped] payload, Hash[hashKey, untyped] delivery_info) -> Array[untyped]?
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
module Matchers
|
4
|
+
|
5
|
+
interface _Matcher
|
6
|
+
def match: (Hash[String|Symbol, untyped], Hash[String|Symbol, untyped], Hash[String|Symbol, untyped], *untyped) -> boolish
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.create: (Symbol|String, *untyped) -> _Matcher
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
module Middlewares
|
4
|
+
class SelfKiller
|
5
|
+
|
6
|
+
attr_reader dispatcher: untyped
|
7
|
+
attr_reader count: Integer
|
8
|
+
attr_reader threshold: Integer
|
9
|
+
attr_reader stop_time: Integer|Float
|
10
|
+
|
11
|
+
def initialize: (untyped, ?delay: Integer, ?threshold: Integer, ?logger: _Logger) -> void
|
12
|
+
def build: (untyped) -> void
|
13
|
+
def call: (untyped) -> void
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def reset_log_time: () -> void
|
18
|
+
def stop?: () -> void
|
19
|
+
def threshold_exceed?: () -> bool
|
20
|
+
def time_exceed?: (?Float) -> bool
|
21
|
+
def close_dispatcher: () -> void
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
module Middlewares
|
4
|
+
class Watchdog
|
5
|
+
|
6
|
+
interface _App
|
7
|
+
def call: (untyped) -> untyped
|
8
|
+
end
|
9
|
+
|
10
|
+
interface _MessageFactory
|
11
|
+
def build: (String) -> BBK::App::Dispatcher::_Message
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader publisher: untyped
|
15
|
+
attr_reader route: String
|
16
|
+
attr_reader message_factory: _MessageFactory
|
17
|
+
attr_reader reply_to: String
|
18
|
+
attr_reader delay: Integer
|
19
|
+
attr_reader timeout: Integer
|
20
|
+
attr_reader watched_delay: Integer
|
21
|
+
attr_reader pinger_thread: Thread?
|
22
|
+
attr_reader watched_thread: Thread?
|
23
|
+
|
24
|
+
def initialize: (untyped, String, _MessageFactory, String, ?delay: Integer, ?timeout: Integer, ?watcher_delay: Integer) -> void
|
25
|
+
|
26
|
+
def build: (_App) -> void
|
27
|
+
def call:(BBK::App::Dispatcher::_Message) -> Array[BBK::App::Dispatcher::Result]
|
28
|
+
def start: () -> void
|
29
|
+
def stop: () -> void
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def start_ping: () -> void
|
34
|
+
def start_watch: () -> void
|
35
|
+
def touch: () -> void
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module BBK
|
2
|
+
module App
|
3
|
+
|
4
|
+
interface _Processor
|
5
|
+
def call: (BBK::App::Dispatcher::_Message message, ?results: Array[BBK::App::Dispatcher::Result]) -> void
|
6
|
+
end
|
7
|
+
|
8
|
+
module Processors
|
9
|
+
class Base
|
10
|
+
|
11
|
+
include _Processor
|
12
|
+
type processorLogger = _Logger | BBK::Utils::ProxyLogger
|
13
|
+
|
14
|
+
attr_reader logger: processorLogger
|
15
|
+
def initialize: (*untyped, ?logger: processorLogger, **untyped) -> void
|
16
|
+
def rule: () -> untyped
|
17
|
+
def process: (BBK::App::Dispatcher::_Message message, ?results: Array[BBK::App::Dispatcher::Result]) -> void
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|