88
99from typing_extensions import override
1010
11- from .base import BaseLogStorage , Lease , Offset
11+ from .base import LogStorage
1212
1313if TYPE_CHECKING :
1414 from collections .abc import AsyncGenerator
1515
16- from duron .log .entry import UnknownEntry
16+ from duron .log .entry import AnyEntry
1717
1818 from ..entry import Entry
1919
2020
21- class FileLogStorage (BaseLogStorage ):
21+ class FileLogStorage (LogStorage [ int , str ] ):
2222 _log_file : Path
23- _leases : Lease | None
23+ _leases : str | None
2424 _lock : asyncio .Lock
2525
2626 def __init__ (self , log_file : str | Path ):
@@ -31,12 +31,12 @@ def __init__(self, log_file: str | Path):
3131
3232 @override
3333 async def stream (
34- self , start : Offset | None , live : bool
35- ) -> AsyncGenerator [tuple [Offset , Entry | UnknownEntry ], None ]:
34+ self , start : int | None , live : bool
35+ ) -> AsyncGenerator [tuple [int , AnyEntry ], None ]:
3636 if not self ._log_file .exists ():
3737 return
3838
39- start_offset : int = int . from_bytes ( start , "little" ) if start is not None else 0
39+ start_offset : int = start if start is not None else 0
4040
4141 with open (self ._log_file , "rb" ) as f :
4242 # Seek to start offset
@@ -51,8 +51,8 @@ async def stream(
5151 entry = json .loads (line .decode ().strip ())
5252 if isinstance (entry , dict ):
5353 yield (
54- Offset ( line_start_offset . to_bytes ( 8 , "little" )) ,
55- cast ("UnknownEntry " , cast ("object" , entry )),
54+ line_start_offset ,
55+ cast ("AnyEntry " , cast ("object" , entry )),
5656 )
5757 except (json .JSONDecodeError , UnicodeDecodeError ):
5858 pass
@@ -70,29 +70,29 @@ async def stream(
7070 entry = json .loads (line .decode ().strip ())
7171 if isinstance (entry , dict ):
7272 yield (
73- Offset ( line_start_offset . to_bytes ( 8 , "little" )) ,
74- cast ("UnknownEntry " , cast ("object" , entry )),
73+ line_start_offset ,
74+ cast ("AnyEntry " , cast ("object" , entry )),
7575 )
7676 except (json .JSONDecodeError , UnicodeDecodeError ):
7777 pass
7878 else :
7979 await asyncio .sleep (0.1 )
8080
8181 @override
82- async def acquire_lease (self ) -> Lease :
83- lease_id = Lease (uuid .uuid4 (). bytes )
82+ async def acquire_lease (self ) -> str :
83+ lease_id = str (uuid .uuid4 ())
8484 async with self ._lock :
8585 self ._leases = lease_id
8686 return lease_id
8787
8888 @override
89- async def release_lease (self , token : Lease ) -> None :
89+ async def release_lease (self , token : str ) -> None :
9090 async with self ._lock :
9191 if token == self ._leases :
9292 self ._leases = None
9393
9494 @override
95- async def append (self , token : Lease , entry : Entry ) -> Offset :
95+ async def append (self , token : str , entry : Entry ) -> int :
9696 async with self ._lock :
9797 if token != self ._leases :
9898 raise ValueError ("Invalid lease token" )
@@ -102,34 +102,34 @@ async def append(self, token: Lease, entry: Entry) -> Offset:
102102 json .dump (entry , f , separators = ("," , ":" ))
103103 _ = f .write ("\n " )
104104
105- return Offset ( entry_offset . to_bytes ( 8 , "little" ))
105+ return entry_offset
106106
107107
108- class MemoryLogStorage (BaseLogStorage ):
109- _entries : list [Entry ]
110- _leases : Lease | None
108+ class MemoryLogStorage (LogStorage [ int , str ] ):
109+ _entries : list [AnyEntry ]
110+ _leases : str | None
111111 _lock : asyncio .Lock
112112 _condition : asyncio .Condition
113113
114- def __init__ (self , entries : list [Entry ] | None = None ):
114+ def __init__ (self , entries : list [AnyEntry ] | None = None ):
115115 self ._entries = entries or []
116116 self ._leases = None
117117 self ._lock = asyncio .Lock ()
118118 self ._condition = asyncio .Condition (self ._lock )
119119
120120 @override
121121 async def stream (
122- self , start : Offset | None , live : bool
123- ) -> AsyncGenerator [tuple [Offset , Entry | UnknownEntry ], None ]:
124- start_index : int = int . from_bytes ( start , "little" ) if start is not None else 0
122+ self , start : int | None , live : bool
123+ ) -> AsyncGenerator [tuple [int , AnyEntry ], None ]:
124+ start_index : int = start if start is not None else 0
125125
126126 # Yield existing entries
127127 async with self ._lock :
128128 entries_snapshot = self ._entries .copy ()
129129
130130 for index in range (start_index , len (entries_snapshot )):
131131 yield (
132- Offset ( index . to_bytes ( 8 , "little" )) ,
132+ index ,
133133 entries_snapshot [index ],
134134 )
135135
@@ -146,36 +146,36 @@ async def stream(
146146
147147 for index in range (last_seen_index + 1 , current_length ):
148148 yield (
149- Offset ( index . to_bytes ( 8 , "little" )) ,
149+ index ,
150150 self ._entries [index ],
151151 )
152152 last_seen_index = index
153153
154154 @override
155- async def acquire_lease (self ) -> Lease :
156- lease_id = Lease (uuid .uuid4 (). bytes )
155+ async def acquire_lease (self ) -> str :
156+ lease_id = str (uuid .uuid4 ())
157157 async with self ._lock :
158158 self ._leases = lease_id
159159 return lease_id
160160
161161 @override
162- async def release_lease (self , token : Lease ) -> None :
162+ async def release_lease (self , token : str ) -> None :
163163 async with self ._lock :
164164 if token == self ._leases :
165165 self ._leases = None
166166
167167 @override
168- async def append (self , token : Lease , entry : Entry ) -> Offset :
168+ async def append (self , token : str , entry : Entry ) -> int :
169169 async with self ._condition :
170170 if token != self ._leases :
171171 raise ValueError ("Invalid lease token" )
172172
173173 index = len (self ._entries )
174- self ._entries .append (entry )
174+ self ._entries .append (cast ( "AnyEntry" , cast ( "object" , entry )) )
175175 self ._condition .notify_all ()
176176
177- return Offset ( index . to_bytes ( 8 , "little" ))
177+ return index
178178
179- async def entries (self ) -> list [Entry ]:
179+ async def entries (self ) -> list [AnyEntry ]:
180180 async with self ._lock :
181181 return self ._entries .copy ()
0 commit comments