feat(signalr): kick device on a login on another device
This commit is contained in:
@@ -99,6 +99,16 @@ class Hub[TState: UserState]:
|
|||||||
return client
|
return client
|
||||||
return default
|
return default
|
||||||
|
|
||||||
|
def get_before_clients(self, id: str, current_token: str) -> list[Client]:
|
||||||
|
clients = []
|
||||||
|
for client in self.clients.values():
|
||||||
|
if client.connection_id != id:
|
||||||
|
continue
|
||||||
|
if client.connection_token == current_token:
|
||||||
|
continue
|
||||||
|
clients.append(client)
|
||||||
|
return clients
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def create_state(self, client: Client) -> TState:
|
def create_state(self, client: Client) -> TState:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
@@ -117,6 +127,11 @@ class Hub[TState: UserState]:
|
|||||||
if group_id in self.groups:
|
if group_id in self.groups:
|
||||||
self.groups[group_id].discard(client)
|
self.groups[group_id].discard(client)
|
||||||
|
|
||||||
|
async def kick_client(self, client: Client) -> None:
|
||||||
|
await self.call_noblock(client, "DisconnectRequested")
|
||||||
|
await client.send_packet(ClosePacket(allow_reconnect=False))
|
||||||
|
await client.connection.close(code=1000, reason="Disconnected by server")
|
||||||
|
|
||||||
async def add_client(
|
async def add_client(
|
||||||
self,
|
self,
|
||||||
connection_id: str,
|
connection_id: str,
|
||||||
|
|||||||
@@ -98,6 +98,11 @@ async def connect(
|
|||||||
if error or not client:
|
if error or not client:
|
||||||
await websocket.close(code=1008)
|
await websocket.close(code=1008)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
connected_clients = hub_.get_before_clients(user_id, id)
|
||||||
|
for connected_client in connected_clients:
|
||||||
|
await hub_.kick_client(connected_client)
|
||||||
|
|
||||||
await hub_.clean_state(client, False)
|
await hub_.clean_state(client, False)
|
||||||
task = asyncio.create_task(hub_.on_connect(client))
|
task = asyncio.create_task(hub_.on_connect(client))
|
||||||
hub_.tasks.add(task)
|
hub_.tasks.add(task)
|
||||||
|
|||||||
Reference in New Issue
Block a user