"""
The :mod:`websockets.extensions.base` defines abstract classes for extensions.

See https://tools.ietf.org/html/rfc6455#section-9.

"""


class ClientExtensionFactory:
    """
    Abstract class for client-side extension factories.

    Extension factories handle configuration and negotiation.

    """

    name = ...

    def get_request_params(self):
        """
        Build request parameters.

        Return a list of (name, value) pairs.

        """

    def process_response_params(self, params, accepted_extensions):
        """"
        Process response parameters.

        ``params`` are a list of (name, value) pairs.

        ``accepted_extensions`` is a list of previously accepted extensions,
        represented by extension instances.

        Return an extension instance (an instance of a subclass of
        :class:`Extension`) if these parameters are acceptable.

        Raise :exc:`~websockets.exceptions.NegotiationError` if they aren't.

        """


class ServerExtensionFactory:
    """
    Abstract class for server-side extension factories.

    Extension factories handle configuration and negotiation.

    """

    name = ...

    def process_request_params(self, params, accepted_extensions):
        """"
        Process request parameters.

        ``accepted_extensions`` is a list of previously accepted extensions,
        represented by extension instances.

        Return response params (a list of (name, value) pairs) and an
        extension instance (an instance of a subclass of :class:`Extension`)
        to accept this extension.

        Raise :exc:`~websockets.exceptions.NegotiationError` to reject it.

        """


class Extension:
    """
    Abstract class for extensions.

    """

    name = ...

    def decode(self, frame, *, max_size=None):
        """
        Decode an incoming frame.

        Return a frame.

        """

    def encode(self, frame):
        """
        Encode an outgoing frame.

        Return a frame.

        """
