class

HT2::StreamStateMachine

Inherits Reference < Object

Constants

ALLOWED_EVENTS = {StreamState::IDLE => [Event::SendHeaders, Event::SendHeadersEndStream, Event::ReceiveHeaders, Event::ReceiveHeadersEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::RESERVED_LOCAL => [Event::SendHeaders, Event::SendRstStream, Event::ReceiveRstStream], StreamState::RESERVED_REMOTE => [Event::ReceiveHeaders, Event::SendRstStream, Event::ReceiveRstStream], StreamState::OPEN => [Event::SendHeaders, Event::SendHeadersEndStream, Event::SendData, Event::SendDataEndStream, Event::ReceiveHeaders, Event::ReceiveHeadersEndStream, Event::ReceiveData, Event::ReceiveDataEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::HALF_CLOSED_LOCAL => [Event::ReceiveHeaders, Event::ReceiveHeadersEndStream, Event::ReceiveData, Event::ReceiveDataEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::HALF_CLOSED_REMOTE => [Event::SendHeaders, Event::SendHeadersEndStream, Event::SendData, Event::SendDataEndStream, Event::SendRstStream, Event::ReceiveRstStream], StreamState::CLOSED => [] of Event}

Define which events are allowed in each state (even if they don't cause transitions)

TRANSITIONS = { {StreamState::IDLE, Event::SendHeaders} => StreamState::OPEN, {StreamState::IDLE, Event::SendHeadersEndStream} => StreamState::HALF_CLOSED_LOCAL, {StreamState::IDLE, Event::ReceiveHeaders} => StreamState::OPEN, {StreamState::IDLE, Event::ReceiveHeadersEndStream} => StreamState::HALF_CLOSED_REMOTE, {StreamState::IDLE, Event::SendRstStream} => StreamState::CLOSED, {StreamState::IDLE, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::RESERVED_LOCAL, Event::SendHeaders} => StreamState::HALF_CLOSED_REMOTE, {StreamState::RESERVED_LOCAL, Event::SendRstStream} => StreamState::CLOSED, {StreamState::RESERVED_LOCAL, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::RESERVED_REMOTE, Event::ReceiveHeaders} => StreamState::HALF_CLOSED_LOCAL, {StreamState::RESERVED_REMOTE, Event::SendRstStream} => StreamState::CLOSED, {StreamState::RESERVED_REMOTE, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::OPEN, Event::SendDataEndStream} => StreamState::HALF_CLOSED_LOCAL, {StreamState::OPEN, Event::SendHeadersEndStream} => StreamState::HALF_CLOSED_LOCAL, {StreamState::OPEN, Event::ReceiveDataEndStream} => StreamState::HALF_CLOSED_REMOTE, {StreamState::OPEN, Event::ReceiveHeadersEndStream} => StreamState::HALF_CLOSED_REMOTE, {StreamState::OPEN, Event::SendRstStream} => StreamState::CLOSED, {StreamState::OPEN, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::ReceiveDataEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::ReceiveHeadersEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::SendRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_LOCAL, Event::ReceiveRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::SendDataEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::SendHeadersEndStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::SendRstStream} => StreamState::CLOSED, {StreamState::HALF_CLOSED_REMOTE, Event::ReceiveRstStream} => StreamState::CLOSED}

Define all valid state transitions

Constructors

new(stream_id : UInt32, current_state : StreamState = StreamState::IDLE)
Source

Class methods

data_event(end_stream : Bool, sending : Bool) : Event

Get the appropriate event for data

Source
headers_event(end_stream : Bool, sending : Bool) : Event

Get the appropriate event for headers

Source
rst_stream_event(sending : Bool) : Event

Get the appropriate event for RST_STREAM

Source

Instance methods

can_handle?(event : Event) : Bool

Check if an event is valid without transitioning

Source
current_state
Source
stream_id
Source
stream_id=(stream_id : UInt32)
Source
transition(event : Event) : TransitionResult

Attempt to transition to a new state based on an event

Source
validate_receive_data
Source
validate_receive_headers
Source
validate_send_data
Source
validate_send_headers

Validate that a specific operation is allowed

Source

Nested types