from abc import ABC, abstractmethod

from multiaddr import Multiaddr

from libp2p.network.connection.raw_connection_interface import IRawConnection

from .listener_interface import IListener
from .typing import THandler


class ITransport(ABC):
    @abstractmethod
    async def dial(self, maddr: Multiaddr) -> IRawConnection:
        """
        dial a transport to peer listening on multiaddr.

        :param multiaddr: multiaddr of peer
        :param self_id: peer_id of the dialer (to send to receiver)
        :return: list of multiaddrs
        """

    @abstractmethod
    def create_listener(self, handler_function: THandler) -> IListener:
        """
        create listener on transport.

        :param handler_function: a function called when a new conntion is received
            that takes a connection as argument which implements interface-connection
        :return: a listener object that implements listener_interface.py
        """