Compare commits
No commits in common. "b41339a8c5d548da18142ec4cd9991cff8550a69" and "41f5369b2f932d5466411fbb79ece6956f00d8ff" have entirely different histories.
b41339a8c5
...
41f5369b2f
4 changed files with 41 additions and 10 deletions
|
|
@ -5,6 +5,9 @@
|
|||
"kind": {
|
||||
"const": "cocoa",
|
||||
"default": "cocoa",
|
||||
"enum": [
|
||||
"cocoa"
|
||||
],
|
||||
"title": "Kind",
|
||||
"type": "string"
|
||||
}
|
||||
|
|
@ -49,14 +52,28 @@
|
|||
"WebsocketsReceiverConfig": {
|
||||
"properties": {
|
||||
"host": {
|
||||
"anyOf": [
|
||||
{
|
||||
"format": "hostname",
|
||||
"type": "string"
|
||||
},
|
||||
{
|
||||
"items": {
|
||||
"format": "hostname",
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
],
|
||||
"description": "The hostname you'd like your WebSockets server to listen on. In most cases the default behaviour, which binds to all network interfaces, will be fine.",
|
||||
"format": "hostname",
|
||||
"title": "Host",
|
||||
"type": "string"
|
||||
"title": "Host"
|
||||
},
|
||||
"kind": {
|
||||
"const": "websockets",
|
||||
"default": "websockets",
|
||||
"enum": [
|
||||
"websockets"
|
||||
],
|
||||
"title": "Kind",
|
||||
"type": "string"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -136,6 +136,9 @@
|
|||
},
|
||||
{
|
||||
"const": "oneshot",
|
||||
"enum": [
|
||||
"oneshot"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
|
|
@ -169,6 +172,9 @@
|
|||
},
|
||||
{
|
||||
"const": "oneshot",
|
||||
"enum": [
|
||||
"oneshot"
|
||||
],
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
|
|
@ -322,6 +328,9 @@
|
|||
"state": {
|
||||
"const": "stop",
|
||||
"default": "stop",
|
||||
"enum": [
|
||||
"stop"
|
||||
],
|
||||
"title": "State",
|
||||
"type": "string"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ class WebsocketsReceiverConfig(BaseReceiverConfig):
|
|||
#: The hostname you'd like your WebSockets server to listen on. In most
|
||||
#: cases the default behaviour, which binds to all network interfaces, will
|
||||
#: be fine.
|
||||
host: Optional[Host] = None
|
||||
host: Optional[Host | tuple[Host, ...]] = None
|
||||
|
||||
|
||||
ReceiverConfig = Annotated[
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ from pathlib import Path
|
|||
|
||||
import ormsgpack
|
||||
from websockets import broadcast
|
||||
from websockets.asyncio.server import Server, ServerConnection, serve
|
||||
from websockets.server import WebSocketServerProtocol, serve
|
||||
from yarl import URL
|
||||
|
||||
from ...config.model import WebsocketsReceiverConfig
|
||||
|
|
@ -24,11 +24,12 @@ def default(value: object) -> object:
|
|||
class WebsocketsReceiver(Receiver):
|
||||
config: WebsocketsReceiverConfig
|
||||
player: Player
|
||||
server: Server
|
||||
connections: set[WebSocketServerProtocol]
|
||||
last_status: bytes = MSGPACK_NULL
|
||||
|
||||
def __init__(self, config: WebsocketsReceiverConfig):
|
||||
self.config = config
|
||||
self.connections = set()
|
||||
|
||||
@classmethod
|
||||
def loop_factory(cls) -> DefaultLoopFactory:
|
||||
|
|
@ -36,14 +37,18 @@ class WebsocketsReceiver(Receiver):
|
|||
|
||||
async def start(self, player: Player) -> None:
|
||||
self.player = player
|
||||
self.server = await serve(
|
||||
await serve(
|
||||
self.handle, host=self.config.host, port=self.config.port, reuse_port=True
|
||||
)
|
||||
|
||||
async def handle(self, conn: ServerConnection) -> None:
|
||||
async def handle(self, conn: WebSocketServerProtocol) -> None:
|
||||
self.connections.add(conn)
|
||||
await conn.send(self.last_status)
|
||||
await conn.wait_closed()
|
||||
try:
|
||||
await conn.wait_closed()
|
||||
finally:
|
||||
self.connections.remove(conn)
|
||||
|
||||
async def update(self, playback: Playback) -> None:
|
||||
self.last_status = ormsgpack.packb(playback, default=default)
|
||||
broadcast(self.server.connections, self.last_status)
|
||||
broadcast(self.connections, self.last_status)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue