code: def wrap(cls, socket, hostname, session=None):
          
  
          if not isinstance(socket, socket_.socket):
              raise TypeError(pretty_message(
                  '''
                  socket must be an instance of socket.socket, not %s
                  ''',
                  type_name(socket)
              ))
  
          if not isinstance(hostname, str_cls):
              raise TypeError(pretty_message(
                  '''
                  hostname must be a unicode string, not %s
                  ''',
                  type_name(hostname)
              ))
  
          if session is not None and not isinstance(session, TLSSession):
              raise TypeError(pretty_message(
                  '''
                  session must be an instance of oscrypto.tls.TLSSession, not %s
                  ''',
                  type_name(session)
              ))
  
          new_socket = cls(None, None, session=session)
          new_socket._socket = socket
          new_socket._hostname = hostname
          new_socket._handshake()
  
          return new_socket
docs: Takes an existing socket and adds TLS
  
          :param socket:
              A socket.socket object to wrap with TLS
  
          :param hostname:
              A unicode string of the hostname or IP the socket is connected to
  
          :param session:
              An existing TLSSession object to allow for session reuse, specific
              protocol or manual certificate validation
  
          :raises:
              ValueError - when any of the parameters contain an invalid value
              TypeError - when any of the parameters are of the wrong type
              OSError - when an error is returned by the OS crypto library