docs: def send_frame(self, frame):
          '''
          Queue a frame for sending.  Will send immediately if there are no
          pending synchronous transactions on this connection.
          '''
          if self.closed:
              if self.close_info and len(self.close_info['reply_text']) > 0:
                  raise ChannelClosed(
                      "channel %d is closed: %s : %s",
                      self.channel_id,
                      self.close_info['reply_code'],
                      self.close_info['reply_text'])
              raise ChannelClosed()
  
          # If there's any pending event at all, then it means that when the
          # current dispatch loop started, all possible frames were flushed
          # and the remaining item(s) starts with a sync callback. After careful
          # consideration, it seems that it's safe to assume the len>0 means to
          # buffer the frame. The other advantage here is
          if not len(self._pending_events):
              if not self._active and \
                      isinstance(frame, (ContentFrame, HeaderFrame)):
                  raise Channel.Inactive(
                      "Channel %d flow control activated", self.channel_id)
              self._connection.send_frame(frame)
          else:
              self._pending_events.append(frame)