raioquic 0.1.0

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