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.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/Gemfile.lock +177 -0
  4. data/README.md +38 -0
  5. data/bin/console +15 -0
  6. data/bin/setup +8 -0
  7. data/lib/bbk/app/dispatcher/message.rb +47 -0
  8. data/lib/bbk/app/dispatcher/message_stream.rb +42 -0
  9. data/lib/bbk/app/dispatcher/queue_stream_strategy.rb +54 -0
  10. data/lib/bbk/app/dispatcher/result.rb +20 -0
  11. data/lib/bbk/app/dispatcher/route.rb +37 -0
  12. data/lib/bbk/app/dispatcher.rb +210 -0
  13. data/lib/bbk/app/factory.rb +26 -0
  14. data/lib/bbk/app/handler.rb +69 -0
  15. data/lib/bbk/app/matchers/base.rb +50 -0
  16. data/lib/bbk/app/matchers/delivery_info.rb +35 -0
  17. data/lib/bbk/app/matchers/full.rb +41 -0
  18. data/lib/bbk/app/matchers/headers.rb +23 -0
  19. data/lib/bbk/app/matchers/payload.rb +23 -0
  20. data/lib/bbk/app/matchers.rb +28 -0
  21. data/lib/bbk/app/middlewares/active_record_pool.rb +21 -0
  22. data/lib/bbk/app/middlewares/base.rb +20 -0
  23. data/lib/bbk/app/middlewares/from_block.rb +26 -0
  24. data/lib/bbk/app/middlewares/self_killer.rb +66 -0
  25. data/lib/bbk/app/middlewares/watchdog.rb +78 -0
  26. data/lib/bbk/app/middlewares.rb +12 -0
  27. data/lib/bbk/app/processors/base.rb +46 -0
  28. data/lib/bbk/app/processors/ping.rb +26 -0
  29. data/lib/bbk/app/processors/pong.rb +16 -0
  30. data/lib/bbk/app/processors.rb +3 -0
  31. data/lib/bbk/app/proxy_logger.rb +42 -0
  32. data/lib/bbk/app/thread_pool.rb +75 -0
  33. data/lib/bbk/app/version.rb +8 -0
  34. data/lib/bbk/app.rb +23 -0
  35. data/sig/bbk/app/callable.rbs +3 -0
  36. data/sig/bbk/app/dispatcher/message.rbs +33 -0
  37. data/sig/bbk/app/dispatcher/message_stream.rbs +15 -0
  38. data/sig/bbk/app/dispatcher/queue_stream_strategy.rbs +12 -0
  39. data/sig/bbk/app/dispatcher/result.rbs +12 -0
  40. data/sig/bbk/app/dispatcher/route.rbs +18 -0
  41. data/sig/bbk/app/dispatcher/stream_strategy.rbs +13 -0
  42. data/sig/bbk/app/dispatcher.rbs +62 -0
  43. data/sig/bbk/app/factory.rbs +21 -0
  44. data/sig/bbk/app/handler.rbs +19 -0
  45. data/sig/bbk/app/matchers.rbs +12 -0
  46. data/sig/bbk/app/middlewares/self_killer.rbs +26 -0
  47. data/sig/bbk/app/middlewares/watchdog.rbs +40 -0
  48. data/sig/bbk/app/processors/base.rbs +21 -0
  49. 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
+
@@ -0,0 +1,8 @@
1
+ module BBK
2
+ module App
3
+
4
+ VERSION = '1.0.0'
5
+
6
+ end
7
+ end
8
+
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,3 @@
1
+ interface _Callable
2
+ def call: (*untyped, **untyped) -> untyped
3
+ end
@@ -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,12 @@
1
+ module BBK
2
+ module App
3
+ class Dispatcher
4
+ class QueueStreamStrategy
5
+ include _StreamStrategy
6
+
7
+ def initialize: (untyped, logger: _Logger|BBK::Utils::ProxyLogger) -> void
8
+
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ module BBK
2
+ module App
3
+ class Dispatcher
4
+ class Result
5
+ attr_accessor route: Route
6
+ attr_accessor message: _Message
7
+
8
+ def initialize: (String|Route route, _Message message) -> void
9
+ end
10
+ end
11
+ end
12
+ 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,13 @@
1
+ module BBK
2
+ module App
3
+ class Dispatcher
4
+ interface _StreamStrategy
5
+ def run: (Array[_Consumer]) {(_Message) -> void} -> void
6
+ end
7
+
8
+ class StreamStrategyClass
9
+ def new: (*untyped, **untyped) -> _StreamStrategy
10
+ end
11
+ end
12
+ end
13
+ 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