in lib/src/streams/stream_handler.dart [815:865]
void _changeState(Http2StreamImpl stream, StreamState to) {
var from = stream.state;
// In checked mode we'll test that the state transition is allowed.
assert((from == StreamState.Idle && to == StreamState.ReservedLocal) ||
(from == StreamState.Idle && to == StreamState.ReservedRemote) ||
(from == StreamState.Idle && to == StreamState.Open) ||
(from == StreamState.Open && to == StreamState.HalfClosedLocal) ||
(from == StreamState.Open && to == StreamState.HalfClosedRemote) ||
(from == StreamState.Open && to == StreamState.Closed) ||
(from == StreamState.HalfClosedLocal && to == StreamState.Closed) ||
(from == StreamState.HalfClosedRemote && to == StreamState.Closed) ||
(from == StreamState.ReservedLocal &&
to == StreamState.HalfClosedRemote) ||
(from == StreamState.ReservedLocal && to == StreamState.Closed) ||
(from == StreamState.ReservedRemote && to == StreamState.Closed) ||
(from == StreamState.ReservedRemote &&
to == StreamState.HalfClosedLocal) ||
(from != StreamState.Terminated && to == StreamState.Terminated));
// If we initiated the stream and it became "open" or "closed" we need to
// update the [_numberOfActiveStreams] counter.
if (_didInitiateStream(stream)) {
// NOTE: We wait until the stream is completely done.
// (If we waited only until `StreamState.Closed` then we might still have
// the endStream header/data message buffered, but not yet sent out).
switch (stream.state) {
case StreamState.ReservedLocal:
case StreamState.ReservedRemote:
case StreamState.Idle:
if (to == StreamState.Open ||
to == StreamState.HalfClosedLocal ||
to == StreamState.HalfClosedRemote) {
_numberOfActiveStreams++;
}
break;
case StreamState.Open:
case StreamState.HalfClosedLocal:
case StreamState.HalfClosedRemote:
case StreamState.Closed:
if (to == StreamState.Terminated) {
_numberOfActiveStreams--;
}
break;
case StreamState.Terminated:
// There is nothing to do here.
break;
}
}
stream.state = to;
}