bbk-app 1.0.0.72899

Sign up to get free protection for your applications and to get access to all the features.
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