|
@@ -3,14 +3,15 @@ from flask import Flask, render_template, request
|
|
|
from flask_socketio import SocketIO, join_room, leave_room
|
|
|
from flask_cors import CORS
|
|
|
import logging
|
|
|
+import os
|
|
|
|
|
|
app = Flask(__name__)
|
|
|
CORS(app, resources={r"/*": {"origins": "*"}})
|
|
|
-app.config['SECRET_KEY'] = 'secret!'
|
|
|
-socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=True)
|
|
|
+app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'secret!')
|
|
|
+socketio = SocketIO(app, cors_allowed_origins="*", logger=True, engineio_logger=True, ping_timeout=60)
|
|
|
|
|
|
# 配置日志
|
|
|
-logging.basicConfig(level=logging.DEBUG)
|
|
|
+logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
|
|
rooms = {}
|
|
|
|
|
@@ -21,6 +22,11 @@ def on_connect():
|
|
|
@socketio.on('disconnect')
|
|
|
def on_disconnect():
|
|
|
logging.info(f"Client disconnected: {request.sid}")
|
|
|
+ room = rooms.get(request.sid)
|
|
|
+ if room:
|
|
|
+ leave_room(room)
|
|
|
+ del rooms[request.sid]
|
|
|
+ socketio.emit('user_left', request.sid, room=room)
|
|
|
|
|
|
@socketio.on('join')
|
|
|
def on_join(data):
|
|
@@ -44,24 +50,28 @@ def on_leave():
|
|
|
@socketio.on('offer')
|
|
|
def handle_offer(data):
|
|
|
data['sender'] = request.sid
|
|
|
- logging.info(f"Offer from {request.sid} to {data['target']}")
|
|
|
- socketio.emit('offer', data, room=data['target'])
|
|
|
+ logging.info(f"Offer from {request.sid} to {data.get('target')}")
|
|
|
+ socketio.emit('offer', data, room=data.get('target'))
|
|
|
|
|
|
@socketio.on('answer')
|
|
|
def handle_answer(data):
|
|
|
data['sender'] = request.sid
|
|
|
- logging.info(f"Answer from {request.sid} to {data['target']}")
|
|
|
- socketio.emit('answer', data, room=data['target'])
|
|
|
+ logging.info(f"Answer from {request.sid} to {data.get('target')}")
|
|
|
+ socketio.emit('answer', data, room=data.get('target'))
|
|
|
|
|
|
@socketio.on('candidate')
|
|
|
def handle_candidate(data):
|
|
|
data['sender'] = request.sid
|
|
|
- logging.info(f"ICE candidate from {request.sid} to {data['target']}")
|
|
|
- socketio.emit('candidate', data, room=data['target'])
|
|
|
+ logging.info(f"ICE candidate from {request.sid} to {data.get('target')}")
|
|
|
+ socketio.emit('candidate', data, room=data.get('target'))
|
|
|
|
|
|
@app.route('/room/<room_id>')
|
|
|
def room(room_id):
|
|
|
return render_template('room.html', room_id=room_id)
|
|
|
|
|
|
+@socketio.on_error()
|
|
|
+def error_handler(e):
|
|
|
+ logging.error(f"SocketIO error: {str(e)}")
|
|
|
+
|
|
|
if __name__ == '__main__':
|
|
|
- socketio.run(app, host='0.0.0.0', port=15000, debug=True, allow_unsafe_werkzeug=True)
|
|
|
+ socketio.run(app, host='0.0.0.0', port=int(os.environ.get('PORT', 15000)), debug=False)
|