raioquic 0.1.0

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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/.containerignore +4 -0
  3. data/.rubocop.yml +93 -0
  4. data/CHANGELOG.md +5 -0
  5. data/CODE_OF_CONDUCT.md +84 -0
  6. data/Containerfile +6 -0
  7. data/Gemfile +24 -0
  8. data/Gemfile.lock +113 -0
  9. data/LICENSE +28 -0
  10. data/README.md +48 -0
  11. data/Rakefile +16 -0
  12. data/Steepfile +8 -0
  13. data/example/curlcatcher.rb +18 -0
  14. data/example/interoperability/README.md +9 -0
  15. data/example/interoperability/aioquic/aioquic_client.py +47 -0
  16. data/example/interoperability/aioquic/aioquic_server.py +34 -0
  17. data/example/interoperability/key.pem +28 -0
  18. data/example/interoperability/localhost-unasuke-dev.crt +21 -0
  19. data/example/interoperability/quic-go/sample_server.go +61 -0
  20. data/example/interoperability/raioquic_client.rb +42 -0
  21. data/example/interoperability/raioquic_server.rb +43 -0
  22. data/example/parse_curl_example.rb +108 -0
  23. data/lib/raioquic/buffer.rb +202 -0
  24. data/lib/raioquic/core_ext.rb +54 -0
  25. data/lib/raioquic/crypto/README.md +5 -0
  26. data/lib/raioquic/crypto/aesgcm.rb +52 -0
  27. data/lib/raioquic/crypto/backend/aead.rb +52 -0
  28. data/lib/raioquic/crypto/backend.rb +12 -0
  29. data/lib/raioquic/crypto.rb +10 -0
  30. data/lib/raioquic/quic/configuration.rb +81 -0
  31. data/lib/raioquic/quic/connection.rb +2776 -0
  32. data/lib/raioquic/quic/crypto.rb +317 -0
  33. data/lib/raioquic/quic/event.rb +69 -0
  34. data/lib/raioquic/quic/logger.rb +272 -0
  35. data/lib/raioquic/quic/packet.rb +471 -0
  36. data/lib/raioquic/quic/packet_builder.rb +301 -0
  37. data/lib/raioquic/quic/rangeset.rb +113 -0
  38. data/lib/raioquic/quic/recovery.rb +528 -0
  39. data/lib/raioquic/quic/stream.rb +343 -0
  40. data/lib/raioquic/quic.rb +20 -0
  41. data/lib/raioquic/tls.rb +1659 -0
  42. data/lib/raioquic/version.rb +5 -0
  43. data/lib/raioquic.rb +12 -0
  44. data/misc/export_x25519.py +43 -0
  45. data/misc/gen_rfc8448_keypair.rb +90 -0
  46. data/raioquic.gemspec +37 -0
  47. data/sig/raioquic/buffer.rbs +37 -0
  48. data/sig/raioquic/core_ext.rbs +7 -0
  49. data/sig/raioquic/crypto/aesgcm.rbs +20 -0
  50. data/sig/raioquic/crypto/backend/aead.rbs +11 -0
  51. data/sig/raioquic/quic/configuration.rbs +34 -0
  52. data/sig/raioquic/quic/connection.rbs +277 -0
  53. data/sig/raioquic/quic/crypto.rbs +88 -0
  54. data/sig/raioquic/quic/event.rbs +51 -0
  55. data/sig/raioquic/quic/logger.rbs +57 -0
  56. data/sig/raioquic/quic/packet.rbs +157 -0
  57. data/sig/raioquic/quic/packet_builder.rbs +76 -0
  58. data/sig/raioquic/quic/rangeset.rbs +17 -0
  59. data/sig/raioquic/quic/recovery.rbs +142 -0
  60. data/sig/raioquic/quic/stream.rbs +87 -0
  61. data/sig/raioquic/tls.rbs +444 -0
  62. data/sig/raioquic.rbs +9 -0
  63. metadata +121 -0
@@ -0,0 +1,51 @@
1
+ module Raioquic
2
+ module Quic
3
+ module Event
4
+ class QuicEvent
5
+ end
6
+
7
+ class ConnectionIdIssued < QuicEvent
8
+ attr_accessor connection_id: ::String
9
+ end
10
+
11
+ class ConnectionIdRetired < QuicEvent
12
+ attr_accessor connection_id: ::String
13
+ end
14
+
15
+ class ConnectionTerminated < QuicEvent
16
+ attr_accessor error_code: ::Integer
17
+ attr_accessor frame_type: ::Integer | nil
18
+ attr_accessor reason_phrase: ::String
19
+ end
20
+
21
+ class DatagramFrameReceived < QuicEvent
22
+ attr_accessor data: ::String
23
+ end
24
+
25
+ class HandshakeCompleted < QuicEvent
26
+ attr_accessor alpn_protocol: ::String | nil
27
+ attr_accessor early_data_accepted: bool
28
+ attr_accessor session_resumed: bool
29
+ end
30
+
31
+ class PingAcknowledged < QuicEvent
32
+ attr_accessor uid: ::Integer
33
+ end
34
+
35
+ class ProtocolNegotiated < QuicEvent
36
+ attr_accessor alpn_protocol: ::String | nil
37
+ end
38
+
39
+ class StreamDataReceived < QuicEvent
40
+ attr_accessor data: ::String
41
+ attr_accessor end_stream: bool
42
+ attr_accessor stream_id: ::Integer
43
+ end
44
+
45
+ class StreamReset < QuicEvent
46
+ attr_accessor error_code: ::Integer
47
+ attr_accessor stream_id: ::Integer
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,57 @@
1
+ module Raioquic
2
+ module Quic
3
+ module Logger
4
+ QLOG_VERSION: ::String
5
+
6
+ class QuicLoggerTrace
7
+ PACKET_TYPE_NAMES: ::Hash[::Integer, ::String]
8
+ @odcid: ::String
9
+ @events: ::Array[untyped]
10
+ @vantage_point: { name: ::String, type: ("client"|"server")}
11
+
12
+ def initialize: (is_client: bool, odcid: ::String) -> void
13
+ def encode_ack_frame: (ranges: ::Raioquic::Quic::Rangeset, delay: ::Float) -> { ack_delay: ::Float, acked_ranges: ::Array[untyped], frame_type: "ack" }
14
+ # type connection_close_frame_attrs = { error_code: ::Integer, error_space: ("application"|"transport"), frame_type: "connection_close", raw_error_code: ::Integer, reason: ::String }
15
+ def encode_connection_close_frame: (error_code: ::Integer, ?frame_type: (::Integer | nil), reason_phrase: ::String) -> ::Hash[::Symbol, (::String|::Integer)]
16
+ # (connection_close_frame_attrs | (connection_close_frame_attrs & { triggerr_frame_type: ("unidirectional"|"bidirectional")}))
17
+ # { error_code: ::Integer, error_space: ("application"|"transport"), frame_type: "connection_close", raw_error_code: ::Integer, reason: ::String, triggerr_frame_type: ::Integer }
18
+ def encode_connection_limit_frame: (frame_type: ::Integer, maximum: ::Integer) -> ({ frame_type: "max_data", maximum: ::Integer } | { frame_type: "max_streams", maximum: ::Integer, stream_type: ("unidirectional"|"bidirectional") })
19
+ def encode_crypto_frame: (frame: ::Raioquic::Quic::Packet::QuicStreamFrame) -> { frame_type: "crypto", length: ::Integer, offset: ::Integer }
20
+ def encode_data_blocked_frame: (limit: ::Integer) -> { frame_type: "data_blocked", limit: ::Integer }
21
+ def encode_datagram_frame: (length: ::Integer) -> { frame_type: "datagram", length: ::Integer }
22
+ def encode_handshake_done_frame: () -> { frame_type: "handshake_done" }
23
+ def encode_max_stream_data_frame: (maximum: ::Integer, stream_id: ::String) -> { frame_type: "max_stream_data", maximum: ::Integer, stream_id: ::String }
24
+ def encode_new_connection_id_frame: (connection_id: ::String, retire_prior_to: ::Integer, sequence_number: ::Integer, stateless_reset_token: ::String) ->
25
+ { connection_id: ::String, frame_type: "new_connection_id", length: ::Integer, reset_token: ::String, retire_prior_to: ::Integer, sequence_number: ::Integer }
26
+ def encode_new_token_frame: (token: ::String) -> { frame_type: "new_token", length: ::Integer, token: ::String }
27
+ def encode_padding_frame: () -> { frame_type: "padding" }
28
+ def encode_path_challenge_frame: (data: ::String) -> { frame_type: "path_challenge", data: ::String }
29
+ def encode_path_response_frame: (data: ::String) -> { frame_type: "path_response", data: ::String }
30
+ def encode_ping_frame: () -> { frame_type: "ping" }
31
+ def encode_reset_stream_frame: (error_code: ::Integer, final_size: ::Integer, stream_id: ::String) -> { error_code: ::Integer, final_size: ::Integer, frame_type: "reset_stream", stream_id: ::String }
32
+ def encode_retire_connection_id_frame: (sequence_number: ::Integer) -> { frame_type: "retire_connection_id", sequence_number: ::Integer }
33
+ def encode_stream_data_blocked_frame: (limit: ::Integer, stream_id: ::String) -> { frame_type: "stream_data_blocked", limit: ::Integer, stream_id: ::String }
34
+ def encode_stop_sending_frame: (error_code: ::Integer, stream_id: ::String) -> { frame_type: "stop_sending", error_code: ::Integer, stream_id: ::String }
35
+ def encode_stream_frame: (frame: ::Raioquic::Quic::Packet::QuicStreamFrame, stream_id: ::String) -> { fin: bool, frame_type: "stream", length: ::Integer, offset: ::Integer, stream_id: ::String }
36
+ def encode_streams_blocked_frame: (is_unidirectional: bool, limit: ::Integer) -> { frame_type: "streams_blocked", limit: ::Integer, stream_type: ("unidirectional"|"bidirectional") }
37
+ def encode_time: (::Float seconds) -> ::Float
38
+ def encode_transport_parameters: (owner: ::String, parameters: ::Raioquic::Quic::Packet::QuicTransportParameters) -> ::Hash[::Symbol, (::String|::Integer)]
39
+ def packet_type: (::Integer packet_type) -> ::String
40
+ def log_event: (category: ::String, event: ::String, data: ::Hash[::Symbol, untyped]) -> void
41
+ def to_dict: () -> ::Hash[::Symbol, untyped]
42
+ end
43
+
44
+ class QuicLogger
45
+ def initialize: () -> void
46
+ def start_trace: (is_client: bool, odcid: ::String) -> QuicLoggerTrace
47
+ def to_dict: () -> { qlog_format: ::String, qlog_version: ::String, traces: ::Array[untyped] }
48
+ def end_trace: (QuicLoggerTrace trace) -> void
49
+ end
50
+
51
+ class QuicFileLogger < QuicLogger
52
+ def initialize: (path: ::String) -> void
53
+ # def end_trace: (QuicLoggerTrace trace) -> void
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,157 @@
1
+ module Raioquic
2
+ module Quic
3
+ class Packet
4
+ PACKET_LONG_HEADER: ::Integer
5
+ PACKET_FIXED_BIT: ::Integer
6
+ PACKET_SPIN_BIT: ::Integer
7
+ PACKET_TYPE_INITIAL: ::Integer
8
+ PACKET_TYPE_ZERO_RTT: ::Integer
9
+ PACKET_TYPE_HANDSHAKE: ::Integer
10
+ PACKET_TYPE_RETRY: ::Integer
11
+ PACKET_TYPE_ONE_RTT: ::Integer
12
+ PACKET_TYPE_MASK: ::Integer
13
+ CONNECTION_ID_MAX_SIZE: ::Integer
14
+ PACKET_NUMBER_MAX_SIZE: ::Integer
15
+ RETRY_AEAD_KEY_VERSION_1: ::String
16
+ RETRY_AEAD_NONCE_VERSION_1: ::String
17
+ RETRY_INTEGRITY_TAG_SIZE: ::Integer
18
+ STATELESS_RESET_TOKEN_SIZE: ::Integer
19
+
20
+ class QuicErrorCode
21
+ NO_ERROR: ::Integer
22
+ INTERNAL_ERROR: ::Integer
23
+ CONNECTION_REFUSED: ::Integer
24
+ FLOW_CONTROL_ERROR: ::Integer
25
+ STREAM_LIMIT_ERROR: ::Integer
26
+ STREAM_STATE_ERROR: ::Integer
27
+ FINAL_SIZE_ERROR: ::Integer
28
+ FRAME_ENCODING_ERROR: ::Integer
29
+ TRANSPORT_PARAMETER_ERROR: ::Integer
30
+ CONNECTION_ID_LIMIT_ERROR: ::Integer
31
+ PROTOCOL_VIOLATION: ::Integer
32
+ INVALID_TOKEN: ::Integer
33
+ APPLICATION_ERROR: ::Integer
34
+ CRYPTO_BUFFER_EXCEEDED: ::Integer
35
+ KEY_UPDATE_ERROR: ::Integer
36
+ AEAD_LIMIT_REACHED: ::Integer
37
+ CRYPTO_ERROR: ::Integer
38
+ end
39
+
40
+ class QuicProtocolVersion
41
+ NEGOTIATION: ::Integer
42
+ VERSION_1: ::Integer
43
+ end
44
+
45
+ class QuicHeader
46
+ attr_accessor is_long_header: bool
47
+ attr_accessor version: Integer?
48
+ attr_accessor packet_type: Integer
49
+ attr_accessor destination_cid: String
50
+ attr_accessor source_cid: String
51
+ attr_accessor token: String
52
+ attr_accessor integrity_tag: String
53
+ attr_accessor rest_length: Integer
54
+ end
55
+
56
+ def self.decode_packet_number: (truncated: Integer, num_bits: Integer, expected: Integer) -> Integer
57
+ def self.get_retry_integrity_tag: (packet_without_tag: String, original_destination_cid: String) -> String
58
+ def self.get_spin_bit: (::Integer) -> bool
59
+ def self.is_draft_version: (::Integer) -> FalseClass
60
+ def self.is_long_header: (::Integer) -> bool
61
+ def self.pull_quic_header: (buf: ::Raioquic::Buffer, host_cid_length: ::Integer) -> QuicHeader
62
+ def self.encode_quic_retry: (version: untyped, source_cid: ::String, destination_cid: ::String, original_destination_cid: ::String, retry_token: ::String:writing) -> ::String
63
+ def self.encode_quic_version_negotiation: (source_cid: ::String, destination_cid: ::String, supported_versions: ::Array[untyped]) -> ::String
64
+
65
+ private def self.get_urandom_byte: -> ::Integer
66
+
67
+ class QuicPreferredAddress
68
+ attr_accessor ipv4_address: ::Hash[::Symbol, untyped]?
69
+ attr_accessor ipv6_address: ::Hash[::Symbol, untyped]?
70
+ attr_accessor connection_id: ::String
71
+ attr_accessor stateless_reset_token: ::String
72
+ end
73
+
74
+ class QuicTransportParameters
75
+ attr_accessor original_destination_connection_id: ::String?
76
+ attr_accessor max_idle_timeout: ::Integer?
77
+ attr_accessor stateless_reset_token: ::String?
78
+ attr_accessor max_udp_payload_size: ::Integer?
79
+ attr_accessor initial_max_data: ::Integer?
80
+ attr_accessor initial_max_stream_data_bidi_local: ::Integer?
81
+ attr_accessor initial_max_stream_data_bidi_remote: ::Integer?
82
+ attr_accessor initial_max_stream_data_uni: ::Integer?
83
+ attr_accessor initial_max_streams_bidi: ::Integer?
84
+ attr_accessor initial_max_streams_uni: ::Integer?
85
+ attr_accessor ack_delay_exponent: ::Integer?
86
+ attr_accessor max_ack_delay: ::Integer?
87
+ attr_accessor disable_active_migration: bool?
88
+ attr_accessor preferred_address: QuicPreferredAddress?
89
+ attr_accessor active_connection_id_limit: ::Integer?
90
+ attr_accessor initial_source_connection_id: ::String?
91
+ attr_accessor retry_source_connection_id: ::String?
92
+ attr_accessor max_datagram_frame_size: ::Integer?
93
+ attr_accessor quantum_readiness: ::String?
94
+ end
95
+
96
+ PARAMS: ::Hash[::Integer, ::Hash[::Symbol, ::Symbol]]
97
+
98
+ def self.pull_quic_preferred_address: (::Raioquic::Buffer buf) -> untyped
99
+ def self.push_quic_preferred_address: (buf: ::Raioquic::Buffer, preferred_address: QuicPreferredAddress) -> void
100
+ def self.pull_quic_transport_parameters: (::Raioquic::Buffer buf) -> QuicTransportParameters
101
+ def self.push_quic_transport_parameters: (buf: ::Raioquic::Buffer, params: QuicTransportParameters) -> void
102
+
103
+ class QuicFrameType
104
+ PADDING: ::Integer
105
+ PING: ::Integer
106
+ ACK: ::Integer
107
+ ACK_ECN: ::Integer
108
+ RESET_STREAM: ::Integer
109
+ STOP_SENDING: ::Integer
110
+ CRYPTO: ::Integer
111
+ NEW_TOKEN: ::Integer
112
+ STREAM_BASE: ::Integer
113
+ MAX_DATA: ::Integer
114
+ MAX_STREAM_DATA: ::Integer
115
+ MAX_STREAMS_BIDI: ::Integer
116
+ MAX_STREAMS_UNI: ::Integer
117
+ DATA_BLOCKED: ::Integer
118
+ STREAM_DATA_BLOCKED: ::Integer
119
+ STREAMS_BLOCKED_BIDI: ::Integer
120
+ STREAMS_BLOCKED_UNI: ::Integer
121
+ NEW_CONNECTION_ID: ::Integer
122
+ RETIRE_CONNECTION_ID: ::Integer
123
+ PATH_CHALLENGE: ::Integer
124
+ PATH_RESPONSE: ::Integer
125
+ TRANSPORT_CLOSE: ::Integer
126
+ APPLICATION_CLOSE: ::Integer
127
+ HANDSHAKE_DONE: ::Integer
128
+ DATAGRAM: ::Integer
129
+ DATAGRAM_WITH_LENGTH: ::Integer
130
+ end
131
+
132
+ NON_ACK_ELICITING_FRAME_TYPES: ::Array[::Integer]
133
+ NON_IN_FLIGHT_FRAME_TYPES: ::Array[::Integer]
134
+ PROBING_FRAME_TYPES: ::Array[::Integer]
135
+
136
+ class QuicResetStreamFrame
137
+ attr_accessor error_code: ::Integer
138
+ attr_accessor final_size: ::Integer
139
+ attr_accessor stream_id: ::Integer
140
+ end
141
+
142
+ class QuicStopSendingFrame
143
+ attr_accessor error_code: ::Integer
144
+ attr_accessor stream_id: ::Integer
145
+ end
146
+
147
+ class QuicStreamFrame
148
+ attr_accessor data: ::String
149
+ attr_accessor fin: bool
150
+ attr_accessor offset: ::Integer
151
+ end
152
+
153
+ def self.pull_ack_frame: (::Raioquic::Buffer) -> untyped
154
+ def self.push_ack_frame: (buf: ::Raioquic::Buffer, rangeset: Rangeset, delay: ::Integer) -> ::Integer
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,76 @@
1
+ module Raioquic
2
+ module Quic
3
+ class PacketBuilder
4
+ PACKET_MAX_SIZE: 1280
5
+ PACKET_LENGTH_SEND_SIZE: 2
6
+ PACKET_NUMBER_SEND_SIZE: 2
7
+
8
+ class QuicDeliveryState
9
+ ACKED: 0
10
+ LOST: 1
11
+ EXPIRED: 2
12
+ end
13
+
14
+ class QuicSentPacket
15
+ attr_accessor epoch: ::Integer
16
+ attr_accessor in_flight: bool
17
+ attr_accessor is_ack_eliciting: bool
18
+ attr_accessor is_crypto_packet: bool
19
+ attr_accessor packet_number: ::Integer
20
+ attr_accessor packet_type: ::Integer
21
+ attr_accessor sent_time: ::Integer
22
+ attr_accessor sent_bytes: ::Integer
23
+ attr_accessor delivery_handlers: ::Array[[^() -> void, untyped]]
24
+ attr_accessor quic_logger_frames: untyped
25
+ end
26
+
27
+ class QuicPacketBuilderStop < StandardError
28
+ end
29
+
30
+ class QuicPacketBuilder
31
+ attr_reader packet_number: ::Integer
32
+ attr_reader quic_logger_frames: ::Array[untyped] | nil
33
+ attr_accessor max_flight_bytes: ::Integer | nil
34
+ attr_accessor max_total_bytes: ::Integer | nil
35
+
36
+ @packet: QuicSentPacket | nil
37
+ @max_flight_bytes: ::Integer | nil
38
+ @max_total_bytes: ::Integer | nil
39
+ @quic_logger_frames: ::Array[untyped] | nil
40
+ @host_cid: ::String
41
+ @peer_cid: ::String
42
+ @is_client: bool
43
+ @peer_token: ::String
44
+ @quic_logger: ::Raioquic::Quic::Logger::QuicLoggerTrace
45
+ @spin_bit: bool
46
+ @version: ::Integer
47
+ @datagrams: ::Array[::String]
48
+ @datagram_flight_bytes: ::Integer
49
+ @datagram_init: bool
50
+ @packets: ::Array[QuicSentPacket]
51
+ @flight_bytes: ::Integer
52
+ @total_bytes: ::Integer
53
+ @header_size: ::Integer
54
+ @packet: untyped
55
+ @packet_crypto: untyped
56
+ @packet_long_header: bool
57
+ @packet_number: ::Integer
58
+ @packet_start: ::Integer
59
+ @packet_type: ::Integer
60
+ @buffer: Buffer
61
+ @buffer_capacity: ::Integer
62
+ @flight_capacity: ::Integer
63
+
64
+ def initialize: (host_cid: ::String, peer_cid: ::String, version: ::Integer, is_client: bool, ?packet_number: ::Integer, ?peer_token: ::String, ?quic_logger: untyped?, ?spin_bit: bool) -> void
65
+ def packet_is_empty: () -> bool
66
+ def remaining_buffer_space: () -> ::Integer
67
+ def remaining_flight_space: () -> ::Integer
68
+ def flush: () -> [::Array[::String], ::Array[QuicSentPacket]]
69
+ def start_frame: (frame_type: ::Integer, ?capacity: ::Integer, ?handler: untyped?, ?handler_args: untyped) -> ::Raioquic::Buffer
70
+ def start_packet: (packet_type: ::Integer, crypto: ::Raioquic::Quic::Crypto::CryptoPair) -> void
71
+ def end_packet: () -> void
72
+ def flush_current_datagram: () -> void
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,17 @@
1
+ module Raioquic
2
+ module Quic
3
+ class Rangeset
4
+ @ranges: ::Array[::Range[::Integer]]
5
+
6
+ def initialize: (?ranges: ::Array[::Range[::Integer]]) -> Rangeset
7
+ def list: () -> ::Array[::Range[::Integer]]
8
+ def add: (::Integer, ?(::Integer|nil)) -> void
9
+ def bounds: () -> ::Range[::Integer]
10
+ def length: () -> ::Integer
11
+ def subtract: (::Integer, ::Integer) -> void
12
+ def eql?: (untyped) -> bool
13
+ def ==: (untyped) -> bool
14
+ private def sort: () -> void
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,142 @@
1
+ module Raioquic
2
+ module Quic
3
+ module Recovery
4
+ K_PACKET_THRESHOLD: ::Integer
5
+ K_GRANULARITY: ::Float
6
+ K_TIME_THRESHOLD: ::Float
7
+ K_MICRO_SECOND: ::Float
8
+ K_SECOND: ::Float
9
+ K_MAX_DATAGRAM_SIZE: ::Integer
10
+ K_INITIAL_WINDOW: ::Integer
11
+ K_MINIMUM_WINDOW: ::Integer
12
+ K_LOSS_REDUCTION_FACTOR: ::Float
13
+
14
+ class QuicPacketSpace
15
+ type sent_packets = ::Hash[::Integer, ::Raioquic::Quic::PacketBuilder::QuicSentPacket]
16
+
17
+ attr_accessor sent_packets: sent_packets
18
+ attr_accessor ack_at: ::Float | nil
19
+ attr_accessor ack_eliciting_in_flight: ::Integer
20
+ attr_accessor loss_time: ::Float | nil
21
+ attr_accessor largest_acked_packet: ::Integer
22
+ attr_accessor expected_packet_number: ::Integer
23
+ attr_accessor largest_received_packet: ::Integer
24
+ attr_accessor largest_received_time: ::Float | nil
25
+ attr_accessor ack_queue: Rangeset
26
+ attr_accessor discarded: bool
27
+
28
+ @ack_at: ::Float | nil
29
+ @ack_queue: Rangeset
30
+ @discarded: bool
31
+ @expected_packet_number: ::Integer
32
+ @largest_received_packet: ::Integer
33
+ @largest_received_time: ::Float | nil
34
+ @ack_eliciting_in_flight: ::Integer
35
+ @largest_acked_packet: ::Integer
36
+ @loss_time: ::Float | nil
37
+ @sent_packets: sent_packets
38
+
39
+ def initialize: () -> void
40
+ end
41
+
42
+ class QuicPacketPacer
43
+ attr_reader bucket_max: ::Float
44
+ attr_reader bucket_time: ::Float
45
+ attr_reader packet_time: ::Float | nil
46
+ @bucket_max: ::Float
47
+ @bucket_time: ::Float
48
+ @evaluation_time: ::Float
49
+ @packet_time: ::Float | nil
50
+
51
+ def initialize: () -> void
52
+ def next_send_time: (now: ::Float) -> (::Float | nil)
53
+ def update_after_send: (now: ::Float) -> void
54
+ def update_bucket: (now: ::Float) -> void
55
+ def update_rate: (congestion_window: ::Integer, smoothed_rtt: ::Float) -> void
56
+ end
57
+
58
+ class QuicCongestionControl
59
+ attr_reader congestion_window: ::Numeric
60
+ attr_reader ssthresh: ::Integer | nil
61
+
62
+ attr_accessor bytes_in_flight: ::Integer
63
+
64
+ @bytes_in_flight: ::Integer
65
+ @congestion_window: ::Numeric
66
+ @congestion_recovery_start_time: ::Float
67
+ @congestion_stash: ::Numeric
68
+ @rtt_monitor: QuicRttMonitor
69
+ @ssthresh: ::Integer | nil
70
+
71
+ def initialize: () -> void
72
+ def on_packet_acked: (packet: ::Raioquic::Quic::PacketBuilder::QuicSentPacket) -> void
73
+ def on_packet_sent: (packet: ::Raioquic::Quic::PacketBuilder::QuicSentPacket) -> void
74
+ def on_packets_expired: (packets: ::Array[::Raioquic::Quic::PacketBuilder::QuicSentPacket]) -> void
75
+ def on_packets_lost: (packets: ::Array[::Raioquic::Quic::PacketBuilder::QuicSentPacket], now: ::Float) -> void
76
+ def on_rtt_measurement: (latest_rtt: ::Float, now: ::Float) -> void
77
+ end
78
+
79
+ class QuicPacketRecovery
80
+ attr_reader rtt_initialized: bool
81
+ attr_reader rtt_latest: ::Float
82
+ attr_reader rtt_min: ::Float
83
+ attr_reader rtt_smoothed: ::Float
84
+
85
+ attr_accessor spaces: ::Array[QuicPacketSpace]
86
+ attr_accessor peer_completed_address_validation: bool
87
+ attr_accessor pacer: QuicPacketPacer
88
+ attr_accessor max_ack_delay: ::Float
89
+
90
+ @max_ack_delay: ::Float
91
+ @peer_completed_address_validation: bool
92
+ @spaces: ::Array[QuicPacketSpace]
93
+ @logger: untyped
94
+ @quic_logger: ::Raioquic::Quic::Logger::QuicLoggerTrace | nil
95
+ @send_probe: (^() -> untyped) | nil
96
+ @pto_count: ::Integer
97
+ @rtt_initial: ::Float
98
+ @rtt_initialized: bool
99
+ @rtt_latest: ::Float
100
+ @rtt_min: ::Float
101
+ @rtt_smoothed: ::Float
102
+ @rtt_variance: ::Float
103
+ @time_of_last_sent_ack_eliciting_packet: ::Float
104
+ @cc: QuicCongestionControl
105
+ @pacer: QuicPacketPacer
106
+
107
+ def initialize: (initial_rtt: ::Float, peer_completed_address_validation: bool, ?send_probe: (^() -> untyped) | nil, ?logger: untyped, ?quic_logger: untyped) -> void
108
+ def discard_space: (space: QuicPacketSpace) -> void
109
+ def get_loss_detection_time: () -> ::Float
110
+ def get_probe_timeout: () -> ::Float
111
+ def on_ack_received: (space: QuicPacketSpace, ack_rangeset: Rangeset, ack_delay: ::Float, now: ::Float) -> void
112
+ def on_loss_detection_timeout: (now: ::Float) -> void
113
+ def on_packet_sent: (packet: ::Raioquic::Quic::PacketBuilder::QuicSentPacket, space: QuicPacketSpace) -> void
114
+ def reschedule_data: (now: ::Float) -> void
115
+ def detect_loss: (space: QuicPacketSpace, now: ::Float) -> void
116
+ def get_loss_space: () -> (QuicPacketSpace | nil)
117
+ def log_metrics_updated: (?bool log_rtt) -> void
118
+ def on_packets_lost: (packets: ::Array[::Raioquic::Quic::PacketBuilder::QuicSentPacket], space: QuicPacketSpace, now: ::Float) -> void
119
+ end
120
+
121
+ class QuicRttMonitor
122
+ attr_reader samples: ::Array[::Float]
123
+ attr_reader ready: bool
124
+ attr_reader increases: ::Integer
125
+
126
+ @increases: ::Integer
127
+ @last_time: ::Integer | nil
128
+ @ready: bool
129
+ @size: ::Integer
130
+ @filtered_min: ::Float | nil
131
+ @sample_idx: ::Integer
132
+ @sample_max: ::Float | nil
133
+ @sample_min: ::Float | nil
134
+ @sample_time: ::Float
135
+ @samples: ::Array[::Float]
136
+
137
+ def add_rtt: (rtt: ::Float) -> void
138
+ def is_rtt_increasing: (rtt: ::Float, now: ::Float) -> bool
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,87 @@
1
+ module Raioquic::Quic::Stream
2
+ class FinalSizeError < StandardError
3
+ end
4
+
5
+ class StreamFinishedError < StandardError
6
+ end
7
+
8
+ class QuicStreamReceiver
9
+ attr_reader is_finished: bool
10
+ attr_reader buffer: ::String
11
+ attr_reader ranges: ::Raioquic::Quic::Rangeset
12
+ attr_reader buffer_start: ::Integer
13
+ attr_reader highest_offset: ::Integer
14
+ attr_reader stop_pending: bool
15
+
16
+ @highest_offset: ::Integer
17
+ @is_finished: bool
18
+ @stop_pending: bool
19
+ @buffer: ::String
20
+ @buffer_start: ::Integer
21
+ @final_size: ::Integer | nil
22
+ @ranges: ::Raioquic::Quic::Rangeset
23
+ @stream_id: ::Integer | nil
24
+ @stop_error_code: ::Integer | nil
25
+
26
+ def initialize: (?stream_id: ::Integer | nil, ?readable: bool) -> void
27
+ def get_stop_frame: () -> ::Raioquic::Quic::Packet::QuicStopSendingFrame
28
+ def handle_frame: (frame: ::Raioquic::Quic::Packet::QuicStreamFrame) -> (::Raioquic::Quic::Event::StreamDataReceived | nil)
29
+ def handle_reset: (final_size: :Integer, error_code: ::Integer) -> (::Raioquic::Quic::Event::StreamReset | nil)
30
+ def on_stop_sending_delivery: (delivery: ::Integer) -> void
31
+ def stop: (error_code: ::Integer) -> void
32
+ def pull_data: () -> ::String
33
+ end
34
+
35
+ class QuicStreamSender
36
+ attr_reader is_finished: bool
37
+ attr_reader buffer: ::String
38
+ attr_reader pending: ::Raioquic::Quic::Rangeset
39
+ attr_reader buffer_is_empty: bool
40
+ attr_reader reset_pending: bool
41
+ attr_accessor highest_offset: ::Integer
42
+
43
+ @buffer_is_empty: bool
44
+ @highest_offset: ::Integer
45
+ @is_finished: bool
46
+ @reset_pending: bool
47
+ @acked: ::Raioquic::Quic::Rangeset
48
+ @buffer: ::String
49
+ @buffer_fin: ::Integer | nil
50
+ @buffer_start: ::Integer
51
+ @buffer_stop: ::Integer
52
+ @pending: ::Raioquic::Quic::Rangeset
53
+ @pending_eof: bool
54
+ @reset_error_code: ::Integer | nil
55
+ @stream_id: ::Integer | nil
56
+
57
+ def initialize: (?stream_id: ::Integer | nil, writable: bool) -> void
58
+ def next_offset: () -> ::Integer
59
+ def get_frame: (max_size: ::Integer, ?max_offset: ::Integer | nil) -> (::Raioquic::Quic::Packet::QuicStreamFrame | nil)
60
+ def get_reset_frame: () -> ::Raioquic::Quic::Packet::QuicResetStreamFrame
61
+ def on_data_delivery: (delivery: ::Integer, start: ::Integer, stop: ::Integer) -> void
62
+ def on_reset_delivery: (delivery: ::Integer) -> void
63
+ def reset: (error_code: ::Integer) -> void
64
+ def write: (data: ::String, ?end_stream: bool) -> void
65
+ end
66
+
67
+ class QuicStream
68
+ attr_reader receiver: QuicStreamReceiver
69
+ attr_reader sender: QuicStreamSender
70
+ attr_reader stream_id: ::Integer | nil
71
+ attr_accessor is_blocked: bool
72
+ attr_accessor max_stream_data_local: ::Integer
73
+ attr_accessor max_stream_data_local_sent: ::Integer
74
+ attr_accessor max_stream_data_remote: ::Integer
75
+
76
+ @is_blocked: bool
77
+ @max_stream_data_local: ::Integer
78
+ @max_stream_data_local_sent: ::Integer
79
+ @max_stream_data_remote: ::Integer
80
+ @receiver: QuicStreamReceiver
81
+ @sender: QuicStreamSender
82
+ @stream_id: ::Integer | nil
83
+
84
+ def initialize: (?stream_id: ::Integer | nil, ?max_stream_data_local: ::Integer, ?max_stream_data_remote: ::Integer, ?readable: bool, ?writable: bool) -> bool
85
+ def is_finished: () -> bool
86
+ end
87
+ end