void _trySendMessage()

in lib/src/flowcontrol/connection_queues.dart [113:155]


  void _trySendMessage() {
    var message = _messages.first;
    if (message is HeadersMessage) {
      _messages.removeFirst();
      _frameWriter.writeHeadersFrame(message.streamId, message.headers,
          endStream: message.endStream);
    } else if (message is PushPromiseMessage) {
      _messages.removeFirst();
      _frameWriter.writePushPromiseFrame(
          message.streamId, message.promisedStreamId, message.headers);
    } else if (message is DataMessage) {
      _messages.removeFirst();

      if (_connectionWindow.peerWindowSize >= message.bytes.length) {
        _connectionWindow.decreaseWindow(message.bytes.length);
        _frameWriter.writeDataFrame(message.streamId, message.bytes,
            endStream: message.endStream);
      } else {
        // NOTE: We need to fragment the DataMessage.
        // TODO: Do not fragment if the number of bytes we can send is too low
        var len = _connectionWindow.peerWindowSize;
        var head = viewOrSublist(message.bytes, 0, len);
        var tail =
            viewOrSublist(message.bytes, len, message.bytes.length - len);

        _connectionWindow.decreaseWindow(head.length);
        _frameWriter.writeDataFrame(message.streamId, head, endStream: false);

        var tailMessage =
            DataMessage(message.streamId, tail, message.endStream);
        _messages.addFirst(tailMessage);
      }
    } else if (message is ResetStreamMessage) {
      _messages.removeFirst();
      _frameWriter.writeRstStreamFrame(message.streamId, message.errorCode);
    } else if (message is GoawayMessage) {
      _messages.removeFirst();
      _frameWriter.writeGoawayFrame(
          message.lastStreamId, message.errorCode, message.debugData);
    } else {
      throw StateError('Unexpected message in queue: ${message.runtimeType}');
    }
  }