|
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) |
|
|
|
|
|
clients = {} |
|
|
|
@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/<token>') |
|
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) |
|
|