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.
- checksums.yaml +7 -0
- data/.containerignore +4 -0
- data/.rubocop.yml +93 -0
- data/CHANGELOG.md +5 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Containerfile +6 -0
- data/Gemfile +24 -0
- data/Gemfile.lock +113 -0
- data/LICENSE +28 -0
- data/README.md +48 -0
- data/Rakefile +16 -0
- data/Steepfile +8 -0
- data/example/curlcatcher.rb +18 -0
- data/example/interoperability/README.md +9 -0
- data/example/interoperability/aioquic/aioquic_client.py +47 -0
- data/example/interoperability/aioquic/aioquic_server.py +34 -0
- data/example/interoperability/key.pem +28 -0
- data/example/interoperability/localhost-unasuke-dev.crt +21 -0
- data/example/interoperability/quic-go/sample_server.go +61 -0
- data/example/interoperability/raioquic_client.rb +42 -0
- data/example/interoperability/raioquic_server.rb +43 -0
- data/example/parse_curl_example.rb +108 -0
- data/lib/raioquic/buffer.rb +202 -0
- data/lib/raioquic/core_ext.rb +54 -0
- data/lib/raioquic/crypto/README.md +5 -0
- data/lib/raioquic/crypto/aesgcm.rb +52 -0
- data/lib/raioquic/crypto/backend/aead.rb +52 -0
- data/lib/raioquic/crypto/backend.rb +12 -0
- data/lib/raioquic/crypto.rb +10 -0
- data/lib/raioquic/quic/configuration.rb +81 -0
- data/lib/raioquic/quic/connection.rb +2776 -0
- data/lib/raioquic/quic/crypto.rb +317 -0
- data/lib/raioquic/quic/event.rb +69 -0
- data/lib/raioquic/quic/logger.rb +272 -0
- data/lib/raioquic/quic/packet.rb +471 -0
- data/lib/raioquic/quic/packet_builder.rb +301 -0
- data/lib/raioquic/quic/rangeset.rb +113 -0
- data/lib/raioquic/quic/recovery.rb +528 -0
- data/lib/raioquic/quic/stream.rb +343 -0
- data/lib/raioquic/quic.rb +20 -0
- data/lib/raioquic/tls.rb +1659 -0
- data/lib/raioquic/version.rb +5 -0
- data/lib/raioquic.rb +12 -0
- data/misc/export_x25519.py +43 -0
- data/misc/gen_rfc8448_keypair.rb +90 -0
- data/raioquic.gemspec +37 -0
- data/sig/raioquic/buffer.rbs +37 -0
- data/sig/raioquic/core_ext.rbs +7 -0
- data/sig/raioquic/crypto/aesgcm.rbs +20 -0
- data/sig/raioquic/crypto/backend/aead.rbs +11 -0
- data/sig/raioquic/quic/configuration.rbs +34 -0
- data/sig/raioquic/quic/connection.rbs +277 -0
- data/sig/raioquic/quic/crypto.rbs +88 -0
- data/sig/raioquic/quic/event.rbs +51 -0
- data/sig/raioquic/quic/logger.rbs +57 -0
- data/sig/raioquic/quic/packet.rbs +157 -0
- data/sig/raioquic/quic/packet_builder.rbs +76 -0
- data/sig/raioquic/quic/rangeset.rbs +17 -0
- data/sig/raioquic/quic/recovery.rbs +142 -0
- data/sig/raioquic/quic/stream.rbs +87 -0
- data/sig/raioquic/tls.rbs +444 -0
- data/sig/raioquic.rbs +9 -0
- 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
|