# -rw-r--r-- 1.5 KiB View raw
                                                                                
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;
            }
        }
    }
}