11import json
2+ from pathlib import Path
23from typing import Dict , Any
34
45from starlette .applications import Starlette
1213from .room_service import RoomService
1314
1415
15- # Initialize services
1616room_service = RoomService ()
17- templates = Jinja2Templates (directory = "templates" )
17+ templates = Jinja2Templates (directory = str ( Path ( __file__ ). resolve (). parent . parent / "templates" ) )
1818
1919
2020async def create_peer (request : Request ) -> Response :
21- """Create a new peer in a room."""
2221 try :
2322 body = await request .json ()
2423 room_name = body .get ("room_name" )
@@ -42,99 +41,60 @@ async def create_peer(request: Request) -> Response:
4241 except Exception as e :
4342 return JSONResponse ({"error" : str (e )}, status_code = 500 )
4443
45-
46- async def get_available_peers (request : Request ) -> Response :
47- """Get peers available for subscription."""
48- room_name = request .path_params .get ("room_name" )
49- peer_id = request .query_params .get ("peer_id" )
50-
51- if not room_name :
52- return JSONResponse ({"error" : "room_name is required" }, status_code = 400 )
53-
54- peers = room_service .get_available_peers (room_name , peer_id )
55-
56- return JSONResponse ({
57- "peers" : [
58- {
59- "id" : peer .id ,
60- "metadata" : peer .metadata if peer .metadata else {},
61- "tracks" : [
62- {
63- "id" : track ["id" ],
64- "type" : track .get ("type" , "unknown" )
65- }
66- for track in peer .tracks
67- ]
68- }
69- for peer in peers
70- ]
71- })
72-
73-
74- async def toggle_subscription (request : Request ) -> Response :
75- """Toggle subscription to a peer's tracks."""
44+ async def subscribe_peer (request : Request ) -> Response :
7645 try :
7746 body = await request .json ()
7847 peer_id = body .get ("peer_id" )
7948 target_peer_id = body .get ("target_peer_id" )
80-
49+
8150 if not peer_id or not target_peer_id :
8251 return JSONResponse (
8352 {"error" : "peer_id and target_peer_id are required" },
8453 status_code = 400
8554 )
86-
87- subscribed = room_service .toggle_subscription (peer_id , target_peer_id )
88-
89- return JSONResponse ({
90- "subscribed" : subscribed ,
91- "peer_id" : peer_id ,
92- "target_peer_id" : target_peer_id
93- })
55+
56+ room_service .subscibe_peer (peer_id , target_peer_id )
57+
58+ return JSONResponse ({"status" : "subscribed" })
9459
9560 except Exception as e :
9661 return JSONResponse ({"error" : str (e )}, status_code = 500 )
62+
63+ async def subscribe_tracks (request : Request ) -> Response :
64+ try :
65+ body = await request .json ()
66+ peer_id = body .get ("peer_id" )
67+ track_ids = body .get ("track_ids" )
9768
69+ if not peer_id or not track_ids :
70+ return JSONResponse (
71+ {"error" : "peer_id and track_ids are required" },
72+ status_code = 400
73+ )
9874
99- async def get_subscription_status (request : Request ) -> Response :
100- """Get current subscription status for a peer."""
101- peer_id = request .path_params .get ("peer_id" )
102-
103- if not peer_id :
104- return JSONResponse ({"error" : "peer_id is required" }, status_code = 400 )
105-
106- session = room_service .get_peer_session (peer_id )
107-
108- if not session :
109- return JSONResponse ({"error" : "Peer not found" }, status_code = 404 )
110-
111- return JSONResponse ({
112- "peer_id" : peer_id ,
113- "subscribed_peers" : list (session .subscribed_peers )
114- })
75+ room_service .subscribe_tracks (peer_id , track_ids )
11576
77+ return JSONResponse ({"status" : "subscribed" })
78+
79+ except Exception as e :
80+ return JSONResponse ({"error" : str (e )}, status_code = 500 )
11681
11782async def health_check (request : Request ) -> Response :
118- """Health check endpoint."""
11983 return JSONResponse ({"status" : "OK" })
12084
12185
12286async def serve_index (request : Request ) -> Response :
123- """Serve the main HTML interface."""
12487 return templates .TemplateResponse ("index.html" , {"request" : request })
12588
12689
127- # Define routes
12890routes = [
12991 Route ("/" , serve_index , methods = ["GET" ]),
13092 Route ("/health" , health_check , methods = ["GET" ]),
13193 Route ("/api/peers" , create_peer , methods = ["POST" ]),
132- Route ("/api/rooms/{room_name}/peers" , get_available_peers , methods = ["GET" ]),
133- Route ("/api/subscriptions" , toggle_subscription , methods = ["POST" ]),
134- Route ("/api/peers/{peer_id}/subscriptions" , get_subscription_status , methods = ["GET" ]),
94+ Route ("/api/subscribe_peer" , subscribe_peer , methods = ["POST" ]),
95+ Route ("/api/subscribe_tracks" , subscribe_tracks , methods = ["POST" ]),
13596]
13697
137- # Define middleware
13898middleware = [
13999 Middleware (
140100 CORSMiddleware ,
@@ -145,7 +105,6 @@ async def serve_index(request: Request) -> Response:
145105 )
146106]
147107
148- # Create application
149108app = Starlette (
150109 routes = routes ,
151110 middleware = middleware ,
0 commit comments