Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -1,20 +1,30 @@
|
|
1 |
from fastapi import FastAPI, WebSocket
|
2 |
from fastapi.responses import HTMLResponse
|
3 |
import uvicorn
|
|
|
4 |
|
5 |
app = FastAPI()
|
6 |
|
7 |
class ConnectionManager:
|
8 |
def __init__(self):
|
9 |
-
self.active_connections =
|
10 |
|
11 |
async def connect(self, websocket: WebSocket):
|
12 |
await websocket.accept()
|
13 |
-
self.active_connections
|
14 |
|
15 |
-
|
16 |
-
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
manager = ConnectionManager()
|
20 |
|
@@ -23,18 +33,27 @@ async def get():
|
|
23 |
return HTMLResponse("""
|
24 |
<html>
|
25 |
<body>
|
26 |
-
<h1>
|
27 |
<div id="chat" style="height:300px;overflow-y:scroll"></div>
|
28 |
<input id="msg" type="text">
|
29 |
<button onclick="send()">Send</button>
|
30 |
<script>
|
31 |
const ws = new WebSocket('wss://' + window.location.host + '/ws');
|
|
|
|
|
|
|
32 |
ws.onmessage = e => {
|
|
|
33 |
document.getElementById('chat').innerHTML +=
|
34 |
-
`<div>${
|
35 |
};
|
36 |
const send = () => {
|
37 |
-
|
|
|
|
|
|
|
|
|
|
|
38 |
document.getElementById('msg').value = '';
|
39 |
};
|
40 |
</script>
|
@@ -42,15 +61,52 @@ async def get():
|
|
42 |
</html>
|
43 |
""")
|
44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
@app.websocket("/ws")
|
46 |
async def websocket_endpoint(websocket: WebSocket):
|
47 |
await manager.connect(websocket)
|
48 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
while True:
|
50 |
message = await websocket.receive_text()
|
51 |
-
|
52 |
-
|
53 |
-
|
|
|
|
|
|
|
54 |
|
55 |
if __name__ == "__main__":
|
56 |
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
|
1 |
from fastapi import FastAPI, WebSocket
|
2 |
from fastapi.responses import HTMLResponse
|
3 |
import uvicorn
|
4 |
+
import json
|
5 |
|
6 |
app = FastAPI()
|
7 |
|
8 |
class ConnectionManager:
|
9 |
def __init__(self):
|
10 |
+
self.active_connections = {} # WebSocket: source
|
11 |
|
12 |
async def connect(self, websocket: WebSocket):
|
13 |
await websocket.accept()
|
14 |
+
self.active_connections[websocket] = None
|
15 |
|
16 |
+
def set_source(self, websocket: WebSocket, source: str):
|
17 |
+
if websocket in self.active_connections:
|
18 |
+
self.active_connections[websocket] = source
|
19 |
+
|
20 |
+
async def send_to_destination(self, destination: str, message: str):
|
21 |
+
for ws, src in self.active_connections.items():
|
22 |
+
if src == destination:
|
23 |
+
await ws.send_text(message)
|
24 |
+
|
25 |
+
def remove(self, websocket: WebSocket):
|
26 |
+
if websocket in self.active_connections:
|
27 |
+
del self.active_connections[websocket]
|
28 |
|
29 |
manager = ConnectionManager()
|
30 |
|
|
|
33 |
return HTMLResponse("""
|
34 |
<html>
|
35 |
<body>
|
36 |
+
<h1>Chat Client</h1>
|
37 |
<div id="chat" style="height:300px;overflow-y:scroll"></div>
|
38 |
<input id="msg" type="text">
|
39 |
<button onclick="send()">Send</button>
|
40 |
<script>
|
41 |
const ws = new WebSocket('wss://' + window.location.host + '/ws');
|
42 |
+
ws.onopen = () => {
|
43 |
+
ws.send(JSON.stringify({ source: 'user' }));
|
44 |
+
};
|
45 |
ws.onmessage = e => {
|
46 |
+
const msg = JSON.parse(e.data);
|
47 |
document.getElementById('chat').innerHTML +=
|
48 |
+
`<div>${msg.content}</div>`;
|
49 |
};
|
50 |
const send = () => {
|
51 |
+
const message = {
|
52 |
+
content: document.getElementById('msg').value,
|
53 |
+
source: 'user',
|
54 |
+
destination: 'proxy'
|
55 |
+
};
|
56 |
+
ws.send(JSON.stringify(message));
|
57 |
document.getElementById('msg').value = '';
|
58 |
};
|
59 |
</script>
|
|
|
61 |
</html>
|
62 |
""")
|
63 |
|
64 |
+
@app.get("/proxy")
|
65 |
+
async def get_proxy():
|
66 |
+
return HTMLResponse("""
|
67 |
+
<html>
|
68 |
+
<body>
|
69 |
+
<h1>Proxy Client</h1>
|
70 |
+
<script>
|
71 |
+
const ws = new WebSocket('wss://' + window.location.host + '/ws');
|
72 |
+
ws.onopen = () => {
|
73 |
+
ws.send(JSON.stringify({ source: 'proxy' }));
|
74 |
+
};
|
75 |
+
ws.onmessage = e => {
|
76 |
+
const msg = JSON.parse(e.data);
|
77 |
+
if (msg.destination === 'proxy') {
|
78 |
+
const response = {
|
79 |
+
content: "Hello user!",
|
80 |
+
source: 'proxy',
|
81 |
+
destination: 'user'
|
82 |
+
};
|
83 |
+
ws.send(JSON.stringify(response));
|
84 |
+
}
|
85 |
+
};
|
86 |
+
</script>
|
87 |
+
</body>
|
88 |
+
</html>
|
89 |
+
""")
|
90 |
+
|
91 |
@app.websocket("/ws")
|
92 |
async def websocket_endpoint(websocket: WebSocket):
|
93 |
await manager.connect(websocket)
|
94 |
try:
|
95 |
+
# Handle initial source identification
|
96 |
+
data = await websocket.receive_text()
|
97 |
+
init_msg = json.loads(data)
|
98 |
+
if 'source' in init_msg:
|
99 |
+
manager.set_source(websocket, init_msg['source'])
|
100 |
+
|
101 |
+
# Handle messages
|
102 |
while True:
|
103 |
message = await websocket.receive_text()
|
104 |
+
msg_data = json.loads(message)
|
105 |
+
await manager.send_to_destination(msg_data['destination'], message)
|
106 |
+
|
107 |
+
except Exception as e:
|
108 |
+
manager.remove(websocket)
|
109 |
+
await websocket.close()
|
110 |
|
111 |
if __name__ == "__main__":
|
112 |
uvicorn.run(app, host="0.0.0.0", port=8000)
|