socketio: adds support for logging client information

This commit is contained in:
Mose Müller 2024-11-27 09:30:23 +01:00
parent 192075057f
commit e3c144fa6e

View File

@ -141,22 +141,41 @@ def setup_sio_server(
def setup_sio_events(sio: socketio.AsyncServer, state_manager: StateManager) -> None: # noqa: C901
@sio.event # type: ignore
async def connect(sid: str, environ: Any) -> None:
logger.debug("Client [%s] connected", click.style(str(sid), fg="cyan"))
client_id_header = environ.get("HTTP_X_CLIENT_ID", None)
remote_username_header = environ.get("HTTP_REMOTE_USER", None)
if client_id_header is not None:
log_id = f"id={click.style(client_id_header, fg='cyan')}"
elif remote_username_header is not None:
log_id = f"user={click.style(remote_username_header, fg='cyan')}"
else:
log_id = f"sid={click.style(sid, fg='cyan')}"
async with sio.session(sid) as session:
session["client_id"] = log_id
logger.info("Client [%s] connected", session["client_id"])
@sio.event # type: ignore
async def disconnect(sid: str) -> None:
logger.debug("Client [%s] disconnected", click.style(str(sid), fg="cyan"))
async with sio.session(sid) as session:
logger.info("Client [%s] disconnected", session["client_id"])
@sio.event # type: ignore
async def service_serialization(sid: str) -> SerializedObject:
logger.debug(
"Client [%s] requested service serialization",
click.style(str(sid), fg="cyan"),
)
async with sio.session(sid) as session:
logger.info(
"Client [%s] requested service serialization", session["client_id"]
)
return state_manager.cache_manager.cache
@sio.event
async def update_value(sid: str, data: UpdateDict) -> SerializedObject | None:
async with sio.session(sid) as session:
logger.info(
"Client [%s] is updating the value of '%s'",
session["client_id"],
data["access_path"],
)
try:
endpoints.update_value(state_manager=state_manager, data=data)
except Exception as e:
@ -166,6 +185,12 @@ def setup_sio_events(sio: socketio.AsyncServer, state_manager: StateManager) ->
@sio.event
async def get_value(sid: str, access_path: str) -> SerializedObject:
async with sio.session(sid) as session:
logger.info(
"Client [%s] is getting the value of '%s'",
session["client_id"],
access_path,
)
try:
return endpoints.get_value(
state_manager=state_manager, access_path=access_path
@ -178,6 +203,12 @@ def setup_sio_events(sio: socketio.AsyncServer, state_manager: StateManager) ->
async def trigger_method(sid: str, data: TriggerMethodDict) -> Any:
method = get_object_attr_from_path(state_manager.service, data["access_path"])
async with sio.session(sid) as session:
logger.debug(
"Client [%s] is triggering the method '%s'",
session["client_id"],
data["access_path"],
)
try:
if inspect.iscoroutinefunction(method):
return await endpoints.trigger_async_method(