diff --git a/api/app.py b/api/app.py index 47b59dc3a5..5d5f3af179 100644 --- a/api/app.py +++ b/api/app.py @@ -40,9 +40,7 @@ else: if __name__ == "__main__": from gevent import pywsgi - host = os.environ.get('HOST', '0.0.0.0') - port = int(os.environ.get('PORT', 5001)) - - print(f"Starting server on {host}:{port}") + host = os.environ.get("HOST", "0.0.0.0") + port = int(os.environ.get("PORT", 5001)) server = pywsgi.WSGIServer((host, port), socketio_app) server.serve_forever() diff --git a/api/app_factory.py b/api/app_factory.py index 6ad46c0a45..8b875e3fcf 100644 --- a/api/app_factory.py +++ b/api/app_factory.py @@ -34,6 +34,7 @@ def create_app() -> tuple[any, DifyApp]: import socketio from extensions.ext_socketio import sio + sio.app = app socketio_app = socketio.WSGIApp(sio, app) diff --git a/api/controllers/console/app/online_user.py b/api/controllers/console/app/online_user.py index 9727c62871..93c4a34f6b 100644 --- a/api/controllers/console/app/online_user.py +++ b/api/controllers/console/app/online_user.py @@ -7,14 +7,14 @@ from libs.passport import PassportService from services.account_service import AccountService -@sio.on('connect') +@sio.on("connect") def socket_connect(sid, environ, auth): """ WebSocket connect event, do authentication here. """ token = None if auth and isinstance(auth, dict): - token = auth.get('token') + token = auth.get("token") if not token: return False @@ -29,11 +29,7 @@ def socket_connect(sid, environ, auth): if not user: return False - sio.save_session(sid, { - 'user_id': user.id, - 'username': user.name, - 'avatar': user.avatar - }) + sio.save_session(sid, {"user_id": user.id, "username": user.name, "avatar": user.avatar}) return True @@ -52,7 +48,7 @@ def handle_user_connect(sid, data): return {"msg": "workflow_id is required"}, 400 session = sio.get_session(sid) - user_id = session.get('user_id') + user_id = session.get("user_id") if not user_id: return {"msg": "unauthorized"}, 401 @@ -66,8 +62,8 @@ def handle_user_connect(sid, data): user_info = { "user_id": user_id, - "username": session.get('username', 'Unknown'), - "avatar": session.get('avatar', None), + "username": session.get("username", "Unknown"), + "avatar": session.get("avatar", None), "sid": sid, } @@ -107,11 +103,7 @@ def broadcast_online_users(workflow_id): users.append(json.loads(user_info_json)) except Exception: continue - sio.emit( - "online_users", - {"workflow_id": workflow_id, "users": users}, - room=workflow_id - ) + sio.emit("online_users", {"workflow_id": workflow_id, "users": users}, room=workflow_id) @sio.on("collaboration_event") @@ -140,14 +132,9 @@ def handle_collaboration_event(sid, data): sio.emit( "collaboration_update", - { - "type": event_type, - "userId": user_id, - "data": event_data, - "timestamp": timestamp - }, + {"type": event_type, "userId": user_id, "data": event_data, "timestamp": timestamp}, room=workflow_id, - skip_sid=sid + skip_sid=sid, ) return {"msg": "event_broadcasted"} diff --git a/api/controllers/console/app/workflow.py b/api/controllers/console/app/workflow.py index d95be3665e..9cf9af85db 100644 --- a/api/controllers/console/app/workflow.py +++ b/api/controllers/console/app/workflow.py @@ -789,6 +789,7 @@ class DraftWorkflowNodeLastRunApi(Resource): raise NotFound("last run not found") return node_exec + class WorkflowOnlineUsersApi(Resource): @setup_required @login_required diff --git a/api/fields/online_user_fields.py b/api/fields/online_user_fields.py index be41fd19a5..7b1266792f 100644 --- a/api/fields/online_user_fields.py +++ b/api/fields/online_user_fields.py @@ -9,9 +9,9 @@ online_user_partial_fields = { workflow_online_users_fields = { "workflow_id": fields.String, - "users": fields.List(fields.Nested(online_user_partial_fields)) + "users": fields.List(fields.Nested(online_user_partial_fields)), } online_user_list_fields = { "data": fields.List(fields.Nested(workflow_online_users_fields)), -} \ No newline at end of file +}