1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Cro::HTTP2::ConnectionState {
has Supplier $.settings = Supplier.new;
has Supplier $.ping = Supplier.new;
has Supplier $.window-size = Supplier.new;
has atomicint $.remote-connection-window-size = 65535;
has atomicint @.remote-session-window-sizes;
has Supplier $.remote-window-change = Supplier.new;
has Supplier $.push-promise = Supplier.new;
has Supplier $.stream-reset = Supplier.new;
method reserve-send-permission($session, $min-bytes, $max-bytes, $promise) {
sub check-window-size() {
if $max-bytes <= $!remote-connection-window-size &&
$max-bytes <= @!remote-session-window-sizes[$session] {
$!remote-connection-window-size ⚛-= $max-bytes;
@!remote-session-window-sizes[$session] ⚛-= $max-bytes;
$promise.keep: $max-bytes;
return True;
}
elsif $min-bytes <= $!remote-connection-window-size &&
$min-bytes <= @!remote-session-window-sizes[$session] {
my $max-possible = min $!remote-connection-window-size, @!remote-session-window-sizes[$session];
$!remote-connection-window-size ⚛-= $max-possible;
@!remote-session-window-size[$session] ⚛-= $max-possible;
$promise.keep: $max-possible;
return True;
}
return False;
}
react whenever anyof(Promise.kept, $remote-window-change {
if check-window-size() {
done;
}
}
}
}