from flask import Flask, render_template, request, jsonify from flask_socketio import SocketIO, emit import uuid app = Flask(__name__) app.config['SECRET_KEY'] = 'secret!' socketio = SocketIO(app) # Словарь для хранения соответствия токена и идентификатора сессии (socket id) clients = {} # {token: sid} @app.route('/') def index(): # Главная страница с базовой информацией return render_template('index.html') @app.route('/register') def register(): # Генерация уникального токена для нового пользователя token = str(uuid.uuid4()) # Изначально сессия не установлена clients[token] = None return render_template('register.html', token=token) @app.route('/file/') def file_info(token): """ Эндпоинт для проверки статуса клиента по токену. Если клиент (отправитель) онлайн – возвращается статус "ready", иначе – "offline". """ if token in clients and clients[token] is not None: return jsonify({"status": "ready"}) return jsonify({"status": "offline"}) @socketio.on('register') def handle_register(data): """ При подключении через WebSocket клиент отправляет свой токен. Здесь мы сохраняем привязку токена к session id. """ token = data.get('token') if token: clients[token] = request.sid emit('registered', {'message': f'Токен {token} успешно зарегистрирован.'}) else: emit('error', {'message': 'Токен отсутствует.'}) @socketio.on('signal') def handle_signal(data): """ Обработка сигналов для установления P2P-соединения. Клиент передаёт объект с полями: - target: токен целевого клиента - signal: сигнальные данные (например, offer/answer ICE) Сервер пересылает сигнал нужному клиенту по session id. """ target = data.get('target') signal_data = data.get('signal') if target in clients and clients[target]: socketio.emit('signal', {'signal': signal_data, 'from': request.sid}, room=clients[target]) else: emit('error', {'message': 'Целевой клиент не доступен.'}) if __name__ == '__main__': socketio.run(app, debug=True)