docs: async def connect(self):
          """
          Create a TURN allocation.
          """
          request = stun.Message(message_method=stun.Method.ALLOCATE,
                                 message_class=stun.Class.REQUEST)
          request.attributes['LIFETIME'] = self.lifetime
          request.attributes['REQUESTED-TRANSPORT'] = UDP_TRANSPORT
  
          try:
              response, _ = await self.request(request)
          except exceptions.TransactionFailed as e:
              response = e.response
              if response.attributes['ERROR-CODE'][0] == 401:
                  # update long-term credentials
                  self.nonce = response.attributes['NONCE']
                  self.realm = response.attributes['REALM']
                  self.integrity_key = make_integrity_key(self.username, self.realm, self.password)
  
                  # retry request with authentication
                  request.transaction_id = random_transaction_id()
                  response, _ = await self.request(request)
  
          self.relayed_address = response.attributes['XOR-RELAYED-ADDRESS']
          logger.info('TURN allocation created %s', self.relayed_address)
  
          # periodically refresh allocation
          self.refresh_handle = asyncio.ensure_future(self.refresh())
  
          return self.relayed_address