11import asyncio
2+ import datetime
23import json
34import logging
45import os
5- import time
66import uuid
77from concurrent .futures import ThreadPoolExecutor
88
@@ -29,9 +29,12 @@ def __init__(self, dir_, key, loop):
2929 self .q .put_nowait (item )
3030
3131 async def put (self , data ):
32- ident = str (uuid .uuid4 ())
33- await self ._loop .run_in_executor (pool , self ._write_file , data , ident )
34- await self .q .put (ident )
32+ item = {
33+ "ident" : str (uuid .uuid4 ()),
34+ "expire_time" : datetime .datetime .now () + datetime .timedelta (minutes = 5 ),
35+ }
36+ await self ._loop .run_in_executor (pool , self ._write_file , data , item )
37+ await self .q .put (item )
3538 await self ._save_manifest ()
3639
3740 async def get (self , handle_only = False , delete = True ):
@@ -77,30 +80,29 @@ async def _get_file(self, ident, handle_only=False, delete=True):
7780 fp = await self ._loop .run_in_executor (pool , open , path , "rb" )
7881 if handle_only :
7982 return fp
80- bytes = await self ._loop .run_in_executor (pool , lambda : fp .read () )
83+ bytes_ = await self ._loop .run_in_executor (pool , fp .read )
8184 fp .close ()
8285 if delete :
8386 await self ._loop .run_in_executor (pool , os .remove , path )
84- return bytes
87+ return bytes_
8588
86- def _write_file (self , data , ident ):
87- with open (os .path .join (self ._message_path , ident ), "wb" ) as fp :
89+ def _write_file (self , data , item ):
90+ with open (os .path .join (self ._message_path , item [ " ident" ] ), "wb" ) as fp :
8891 fp .write (data )
8992
9093 async def expire (self ):
9194 async with self ._manifest_lock :
9295 new_queue = asyncio .Queue ()
9396 while self .q .qsize () > 0 :
94- ident = await self .q .get ()
95- data = await self ._get_file (ident , handle_only = True , delete = False )
96- # TODO: This will never work, it's not pure json anymore
97- msg = json .load (data )
98- if "expire_time" in msg and msg ['expire_time' ] < time .time ():
97+ item = await self .q .get ()
98+ ident = item ["ident" ]
99+ expire_time = item ["expire_time" ]
100+ if expire_time > datetime .datetime .now ():
99101 logger .info ("Expiring message %s" , ident )
100102 # TODO: Do something with expired message
101103 await self ._loop .run_in_executor (pool , os .remove , self ._path_for_ident (ident ))
102104 else :
103- await new_queue .put (ident )
105+ await new_queue .put (item )
104106 self .q = new_queue
105107
106108
0 commit comments