docs: async def createAnswer(self):
          """
          Create an SDP answer to an offer received from a remote peer during
          the offer/answer negotiation of a WebRTC connection.
  
          :rtype: :class:`RTCSessionDescription`
          """
          # check state is valid
          self.__assertNotClosed()
          if self.signalingState not in ['have-remote-offer', 'have-local-pranswer']:
              raise InvalidStateError('Cannot create answer in signaling state "%s"' %
                                      self.signalingState)
  
          # create description
          ntp_seconds = clock.current_ntp_time() >> 32
          description = sdp.SessionDescription()
          description.origin = '- %d %d IN IP4 0.0.0.0' % (ntp_seconds, ntp_seconds)
          description.msid_semantic.append(sdp.GroupDescription(
              semantic='WMS',
              items=['*']))
          description.type = 'answer'
  
          for remote_m in self.__remoteDescription().media:
              if remote_m.kind in ['audio', 'video']:
                  transceiver = self.__getTransceiverByMid(remote_m.rtp.muxId)
                  description.media.append(create_media_description_for_transceiver(
                      transceiver,
                      cname=self.__cname,
                      direction=and_direction(transceiver.direction, transceiver._offerDirection),
                      mid=transceiver.mid))
              else:
                  description.media.append(create_media_description_for_sctp(
                      self.__sctp, legacy=self._sctpLegacySdp, mid=self.__sctp.mid))
  
          bundle = sdp.GroupDescription(semantic='BUNDLE', items=[])
          for media in description.media:
              bundle.items.append(media.rtp.muxId)
          description.group.append(bundle)
  
          return wrap_session_description(description)