code: def events(self):
          # type: () -> Generator[Event, None, None]
          
          while self._events:
              yield self._events.popleft()
  
          try:
              for frame in self._proto.received_frames():
                  if frame.opcode is Opcode.PING:
                      assert frame.frame_finished and frame.message_finished
                      yield Ping(payload=frame.payload)
  
                  elif frame.opcode is Opcode.PONG:
                      assert frame.frame_finished and frame.message_finished
                      yield Pong(payload=frame.payload)
  
                  elif frame.opcode is Opcode.CLOSE:
                      code, reason = frame.payload
                      if self.state is ConnectionState.LOCAL_CLOSING:
                          self._state = ConnectionState.CLOSED
                      else:
                          self._state = ConnectionState.REMOTE_CLOSING
                      yield CloseConnection(code=code, reason=reason)
  
                  elif frame.opcode is Opcode.TEXT:
                      yield TextMessage(
                          data=frame.payload,
                          frame_finished=frame.frame_finished,
                          message_finished=frame.message_finished,
                      )
  
                  elif frame.opcode is Opcode.BINARY:
                      yield BytesMessage(
                          data=frame.payload,
                          frame_finished=frame.frame_finished,
                          message_finished=frame.message_finished,
                      )
          except ParseFailed as exc:
              yield CloseConnection(code=exc.code, reason=str(exc))
docs: Return a generator that provides any events that have been generated
          by protocol activity.
  
          :returns: generator of :class:`Event <wsproto.events.Event>` subclasses