code: async def setLocalDescription(self, sessionDescription):
          
          # parse and validate description
          description = sdp.SessionDescription.parse(sessionDescription.sdp)
          description.type = sessionDescription.type
          self.__validate_description(description, is_local=True)
  
          # update signaling state
          if description.type == 'offer':
              self.__setSignalingState('have-local-offer')
          elif description.type == 'answer':
              self.__setSignalingState('stable')
  
          # assign MID
          for i, media in enumerate(description.media):
              mid = media.rtp.muxId
              self.__seenMids.add(mid)
              if media.kind in ['audio', 'video']:
                  transceiver = self.__getTransceiverByMLineIndex(i)
                  transceiver._set_mid(mid)
              elif media.kind == 'application':
                  self.__sctp.mid = mid
  
          # set ICE role
          if self.__initialOfferer is None:
              self.__initialOfferer = (description.type == 'offer')
              for iceTransport in self.__iceTransports:
                  iceTransport._connection.ice_controlling = self.__initialOfferer
  
          # configure direction
          for t in self.__transceivers:
              if description.type in ['answer', 'pranswer']:
                  t._currentDirection = and_direction(t.direction, t._offerDirection)
  
          # gather candidates
          await self.__gather()
          for i, media in enumerate(description.media):
              if media.kind in ['audio', 'video']:
                  transceiver = self.__getTransceiverByMLineIndex(i)
                  add_transport_description(media, transceiver._transport)
              elif media.kind == 'application':
                  add_transport_description(media, self.__sctp.transport)
  
          # connect
          asyncio.ensure_future(self.__connect())
  
          # replace description
          if description.type == 'answer':
              self.__currentLocalDescription = description
              self.__pendingLocalDescription = None
          else:
              self.__pendingLocalDescription = description
docs: Change the local description associated with the connection.
  
          :param: sessionDescription: An :class:`RTCSessionDescription` generated
                                      by :meth:`createOffer` or :meth:`createAnswer()`.