11import asyncio
22from contextlib import asynccontextmanager
3- from datetime import datetime , timedelta
3+ from datetime import UTC , datetime , timedelta
44from os import getenv , path
55from typing import AsyncGenerator , Literal
66
1111from .local import LocalBox
1212
1313codebox = LocalBox ()
14- last_interaction = datetime .utcnow ( )
14+ last_interaction = datetime .now ( UTC )
1515
1616
1717@asynccontextmanager
1818async def lifespan (_ : FastAPI ) -> AsyncGenerator [None , None ]:
1919 async def timeout ():
2020 if (_timeout := getenv ("CODEBOX_TIMEOUT" , "15" )).lower () == "none" :
2121 return
22- while last_interaction + timedelta (minutes = float (_timeout )) > datetime .utcnow ( ):
22+ while last_interaction + timedelta (minutes = float (_timeout )) > datetime .now ( UTC ):
2323 await asyncio .sleep (1 )
2424 exit (0 )
2525
@@ -30,7 +30,7 @@ async def timeout():
3030
3131async def get_codebox () -> AsyncGenerator [LocalBox , None ]:
3232 global codebox , last_interaction
33- last_interaction = datetime .utcnow ( )
33+ last_interaction = datetime .now ( UTC )
3434 yield codebox
3535
3636
@@ -52,9 +52,8 @@ async def exec(
5252 async def event_stream () -> AsyncGenerator [str , None ]:
5353 async for chunk in codebox .astream_exec (
5454 exec .code , exec .kernel , exec .timeout , exec .cwd
55- ):
56- # protocol is <type>content</type>
57- yield f"<{ chunk .type } >{ chunk .content } </{ chunk .type } >"
55+ ): # protocol is <type>content</type>
56+ yield f"<{ chunk .type } >{ chunk .content } </{ chunk .type } >\n "
5857
5958 return StreamingResponse (event_stream ())
6059
@@ -78,9 +77,10 @@ async def upload(
7877 timeout : int | None = None ,
7978 codebox : LocalBox = Depends (get_codebox ),
8079) -> None :
81- if file .filename :
82- await codebox .aupload (file .filename , file .file , timeout )
83- raise HTTPException (status_code = 400 , detail = "A file name is required" )
80+ if not file .filename :
81+ raise HTTPException (status_code = 400 , detail = "A file name is required" )
82+ async with asyncio .timeout (timeout ):
83+ await codebox .aupload (file .filename , file .file )
8484
8585
8686@app .post ("/code/execute" )
0 commit comments