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; } } } }