Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BaseJSONProtocol and BaseWebsocketTransport classes for plain JSON over WS #7

Merged
merged 3 commits into from
Nov 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog], and this project adheres to [Semantic
### Added

- Python 3.12 support.
- `BaseJSONProtocol` and `BaseWebsocketTransport` classes for plain JSON over WebSockets and custom protocols.

### Other

Expand Down
9 changes: 9 additions & 0 deletions src/pysignalr/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,3 +328,12 @@ class StreamItemMessage(Message, type_=MessageType.stream_item):
invocation_id: str
item: Any
headers: Optional[Dict[str, Any]] = None


class JSONMessage(Message, type_=MessageType._):
"""Not a real message type; used in BaseJSONProtocol to skip pysignalr-specific things"""
def __init__(self, data: Dict[str, Any]) -> None:
self.data = data

def dump(self) -> Dict[str, Any]:
return self.data
17 changes: 17 additions & 0 deletions src/pysignalr/protocol/json.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@
from pysignalr.messages import CloseMessage # 7
from pysignalr.messages import CompletionMessage # 3
from pysignalr.messages import HandshakeMessage
from pysignalr.messages import HandshakeRequestMessage
from pysignalr.messages import HandshakeResponseMessage
from pysignalr.messages import InvocationMessage # 1
from pysignalr.messages import Message
from pysignalr.messages import MessageType
from pysignalr.messages import JSONMessage # virtual
from pysignalr.messages import PingMessage # 6
from pysignalr.messages import StreamInvocationMessage # 4
from pysignalr.messages import StreamItemMessage # 2
Expand All @@ -32,6 +34,21 @@ def default(self, obj: Union[Message, MessageType]) -> Union[str, int, Dict[str,
message_encoder = MessageEncoder()


class BaseJSONProtocol(Protocol):
def __init__(self) -> None:
pass

def decode(self, raw_message: Union[str, bytes]) -> Tuple[JSONMessage]:
json_message = orjson.loads(raw_message)
return (JSONMessage(data=json_message),)

def encode(self, message: Union[Message, HandshakeRequestMessage]) -> Union[str, bytes]:
return orjson.dumps(message.dump())

def decode_handshake(self, raw_message: Union[str, bytes]) -> Tuple[HandshakeResponseMessage, Iterable[Message]]:
raise NotImplementedError


class JSONProtocol(Protocol):
def __init__(self) -> None:
super().__init__(
Expand Down
8 changes: 8 additions & 0 deletions src/pysignalr/transport/websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,3 +215,11 @@ async def _on_raw_message(self, raw_message: Union[str, bytes]) -> None:

async def _on_message(self, message: Message) -> None:
await self._callback(message)


class BaseWebsocketTransport(WebsocketTransport):
async def _keepalive(self, conn: WebSocketClientProtocol) -> None:
return

async def _handshake(self, conn: WebSocketClientProtocol) -> None:
return