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