|
from __future__ import annotations |
|
|
|
from collections.abc import Sequence |
|
|
|
from ..frames import Frame |
|
from ..typing import ExtensionName, ExtensionParameter |
|
|
|
|
|
__all__ = ["Extension", "ClientExtensionFactory", "ServerExtensionFactory"] |
|
|
|
|
|
class Extension: |
|
""" |
|
Base class for extensions. |
|
|
|
""" |
|
|
|
name: ExtensionName |
|
"""Extension identifier.""" |
|
|
|
def decode(self, frame: Frame, *, max_size: int | None = None) -> Frame: |
|
""" |
|
Decode an incoming frame. |
|
|
|
Args: |
|
frame: Incoming frame. |
|
max_size: Maximum payload size in bytes. |
|
|
|
Returns: |
|
Decoded frame. |
|
|
|
Raises: |
|
PayloadTooBig: If decoding the payload exceeds ``max_size``. |
|
|
|
""" |
|
raise NotImplementedError |
|
|
|
def encode(self, frame: Frame) -> Frame: |
|
""" |
|
Encode an outgoing frame. |
|
|
|
Args: |
|
frame: Outgoing frame. |
|
|
|
Returns: |
|
Encoded frame. |
|
|
|
""" |
|
raise NotImplementedError |
|
|
|
|
|
class ClientExtensionFactory: |
|
""" |
|
Base class for client-side extension factories. |
|
|
|
""" |
|
|
|
name: ExtensionName |
|
"""Extension identifier.""" |
|
|
|
def get_request_params(self) -> Sequence[ExtensionParameter]: |
|
""" |
|
Build parameters to send to the server for this extension. |
|
|
|
Returns: |
|
Parameters to send to the server. |
|
|
|
""" |
|
raise NotImplementedError |
|
|
|
def process_response_params( |
|
self, |
|
params: Sequence[ExtensionParameter], |
|
accepted_extensions: Sequence[Extension], |
|
) -> Extension: |
|
""" |
|
Process parameters received from the server. |
|
|
|
Args: |
|
params: Parameters received from the server for this extension. |
|
accepted_extensions: List of previously accepted extensions. |
|
|
|
Returns: |
|
An extension instance. |
|
|
|
Raises: |
|
NegotiationError: If parameters aren't acceptable. |
|
|
|
""" |
|
raise NotImplementedError |
|
|
|
|
|
class ServerExtensionFactory: |
|
""" |
|
Base class for server-side extension factories. |
|
|
|
""" |
|
|
|
name: ExtensionName |
|
"""Extension identifier.""" |
|
|
|
def process_request_params( |
|
self, |
|
params: Sequence[ExtensionParameter], |
|
accepted_extensions: Sequence[Extension], |
|
) -> tuple[list[ExtensionParameter], Extension]: |
|
""" |
|
Process parameters received from the client. |
|
|
|
Args: |
|
params: Parameters received from the client for this extension. |
|
accepted_extensions: List of previously accepted extensions. |
|
|
|
Returns: |
|
To accept the offer, parameters to send to the client for this |
|
extension and an extension instance. |
|
|
|
Raises: |
|
NegotiationError: To reject the offer, if parameters received from |
|
the client aren't acceptable. |
|
|
|
""" |
|
raise NotImplementedError |
|
|