Starchik1 commited on
Commit
a460fdc
·
verified ·
1 Parent(s): 1ee9753

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +41 -65
main.py CHANGED
@@ -1,76 +1,52 @@
1
- from flask import Flask, request, jsonify, Response
2
- from flask_executor import Executor
3
- import uuid
4
- import time
5
- import logging
6
- from collections import defaultdict, deque
7
- from threading import Lock
8
 
9
  app = Flask(__name__)
10
- executor = Executor(app)
 
11
 
12
- # Хранилище для передачи чанков
13
- transfers = defaultdict(deque)
14
- locks = defaultdict(Lock)
15
- metadata = {}
16
- CHUNK_TIMEOUT = 3600 # 5 минут
17
 
18
- @app.route('/create_transfer', methods=['POST'])
19
- def create_transfer():
20
- transfer_id = str(uuid.uuid4())
21
- metadata[transfer_id] = {
22
- 'filename': request.json.get('filename', 'file'),
23
- 'created_at': time.time(),
24
- 'completed': False
25
- }
26
- return jsonify({'transfer_id': transfer_id})
27
-
28
- @app.route('/upload/<transfer_id>', methods=['POST'])
29
- def upload_chunk(transfer_id):
30
- if transfer_id not in metadata:
31
- return jsonify({'error': 'Invalid transfer ID'}), 404
32
 
33
- with locks[transfer_id]:
34
- chunk = request.data
35
- if chunk:
36
- transfers[transfer_id].append(chunk)
37
- else:
38
- metadata[transfer_id]['completed'] = True
39
 
40
- return jsonify({'status': 'ok'})
41
 
42
- @app.route('/stream/<transfer_id>')
43
- def stream_chunks(transfer_id):
44
- def generate():
45
- last_activity = time.time()
46
-
47
- while True:
48
- with locks[transfer_id]:
49
- if transfers[transfer_id]:
50
- chunk = transfers[transfer_id].popleft()
51
- last_activity = time.time()
52
- yield chunk
53
- elif metadata.get(transfer_id, {}).get('completed', False):
54
- break
55
- elif time.time() - last_activity > CHUNK_TIMEOUT:
56
- break
57
-
58
- time.sleep(0.1) # Задержка для уменьшения нагрузки
59
 
60
- # Очистка данных
61
- if transfer_id in metadata:
62
- del metadata[transfer_id]
63
- del transfers[transfer_id]
64
- del locks[transfer_id]
65
 
66
- return Response(
67
- generate(),
68
- mimetype='application/octet-stream',
69
- headers={
70
- 'Content-Disposition': f'attachment; filename="{metadata[transfer_id]["filename"]}"',
71
- 'Transfer-Encoding': 'chunked'
72
- }
73
- )
74
 
75
  if __name__ == '__main__':
76
- app.run(debug=True)
 
1
+ from flask import Flask, request, jsonify
2
+ import random
3
+ import string
4
+ import threading
 
 
 
5
 
6
  app = Flask(__name__)
7
+ connections = {}
8
+ lock = threading.Lock()
9
 
10
+ def generate_id():
11
+ return ''.join(random.choices(string.ascii_letters + string.digits, k=8))
 
 
 
12
 
13
+ @app.route('/create_offer', methods=['POST'])
14
+ def create_offer():
15
+ offer = request.json
16
+ conn_id = generate_id()
 
 
 
 
 
 
 
 
 
 
17
 
18
+ with lock:
19
+ connections[conn_id] = {
20
+ 'offer': offer,
21
+ 'answer': None
22
+ }
 
23
 
24
+ return jsonify({'connection_id': conn_id})
25
 
26
+ @app.route('/get_offer/<conn_id>', methods=['GET'])
27
+ def get_offer(conn_id):
28
+ with lock:
29
+ conn = connections.get(conn_id)
30
+ if not conn:
31
+ return jsonify({'error': 'Invalid ID'}), 404
32
+ return jsonify(conn['offer'])
33
+
34
+ @app.route('/send_answer/<conn_id>', methods=['POST'])
35
+ def send_answer(conn_id):
36
+ with lock:
37
+ if conn_id not in connections:
38
+ return jsonify({'error': 'Invalid ID'}), 404
 
 
 
 
39
 
40
+ connections[conn_id]['answer'] = request.json
41
+ return jsonify({'status': 'success'})
 
 
 
42
 
43
+ @app.route('/get_answer/<conn_id>', methods=['GET'])
44
+ def get_answer(conn_id):
45
+ with lock:
46
+ conn = connections.get(conn_id)
47
+ if not conn or not conn['answer']:
48
+ return jsonify({'error': 'Not ready'}), 404
49
+ return jsonify(conn['answer'])
 
50
 
51
  if __name__ == '__main__':
52
+ app.run(host='0.0.0.0', port=5000, threaded=True)