Module: RSMP::Proxy::Modules::Lifecycle
- Included in:
- RSMP::Proxy
- Defined in:
- lib/rsmp/proxy/modules/lifecycle.rb
Overview
Owns one connection session and translates expected termination into lifecycle events without swallowing unexpected task exceptions.
Instance Method Summary collapse
- #begin_session ⇒ Object
- #close(reason: :peer_closed, failure: nil, session_id: @session_id) ⇒ Object
- #close_from_result(result) ⇒ Object
- #close_socket ⇒ Object
- #close_stream ⇒ Object
- #connect! ⇒ Object
- #connection_end_failure(reason) ⇒ Object
- #disconnect ⇒ Object
- #disconnect! ⇒ Object
- #distribute_event(event) ⇒ Object
- #publish_connection_attempt_failure(failure) ⇒ Object
- #stop_reader ⇒ Object
- #stop_subtasks ⇒ Object
- #stop_task ⇒ Object
- #stop_timer ⇒ Object
- #wait_for_reader ⇒ Object
Instance Method Details
#begin_session ⇒ Object
24 25 26 27 28 29 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 24 def begin_session clear @session_id += 1 @session_closed = false @session_id end |
#close(reason: :peer_closed, failure: nil, session_id: @session_id) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 31 def close(reason: :peer_closed, failure: nil, session_id: @session_id) return if session_id != @session_id || @session_closed @session_closed = true log 'Closing connection', level: :warning close_stream close_socket stop_reader self.state = :disconnected publish_connection_end(reason, failure, session_id) stop_timer end |
#close_from_result(result) ⇒ Object
98 99 100 101 102 103 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 98 def close_from_result(result) return close(reason: :peer_closed) if result.nil? || result.success? reason = result.failure.context[:reason] || :transport_failure close(reason: reason, failure: result.failure) end |
#close_socket ⇒ Object
71 72 73 74 75 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 71 def close_socket @socket&.close ensure @socket = nil end |
#close_stream ⇒ Object
65 66 67 68 69 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 65 def close_stream @stream&.close ensure @stream = nil end |
#connect! ⇒ Object
16 17 18 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 16 def connect! connect.value! end |
#connection_end_failure(reason) ⇒ Object
88 89 90 91 92 93 94 95 96 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 88 def connection_end_failure(reason) local = reason == :local_stop Failure.new( code: local ? :cancelled : :disconnected, message: "Connection ended (#{reason})", source: local ? :local : :connection, context: { reason: reason, session_id: @session_id } ) end |
#disconnect ⇒ Object
7 8 9 10 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 7 def disconnect close(reason: :local_stop) Result.success(self) end |
#disconnect! ⇒ Object
12 13 14 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 12 def disconnect! disconnect.value! end |
#distribute_event(event) ⇒ Object
82 83 84 85 86 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 82 def distribute_event(event) super @node&.publish_event(event) event end |
#publish_connection_attempt_failure(failure) ⇒ Object
105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 105 def publish_connection_attempt_failure(failure) log failure., level: :warning distribute_event( Event.new( type: :connection_attempt_failed, source: self, session_id: @session_id, failure: failure ) ) end |
#stop_reader ⇒ Object
58 59 60 61 62 63 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 58 def stop_reader current = Async::Task.current? @reader&.cancel unless @reader.equal?(current) ensure @reader = nil end |
#stop_subtasks ⇒ Object
44 45 46 47 48 49 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 44 def stop_subtasks stop_timer stop_reader clear super end |
#stop_task ⇒ Object
77 78 79 80 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 77 def stop_task close(reason: :local_stop) super end |
#stop_timer ⇒ Object
51 52 53 54 55 56 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 51 def stop_timer current = Async::Task.current? @timer&.cancel unless @timer.equal?(current) ensure @timer = nil end |
#wait_for_reader ⇒ Object
20 21 22 |
# File 'lib/rsmp/proxy/modules/lifecycle.rb', line 20 def wait_for_reader wait_for_session end |