2828from __future__ import annotations
2929
3030import base64
31+ import inspect
3132import json
3233from typing import Any , cast
3334
@@ -97,6 +98,35 @@ def _is_encrypted_envelope(item: object) -> TypeGuard[EncryptedEnvelope]:
9798 )
9899
99100
101+ def _method_accepts_wrapper (method : Any ) -> bool :
102+ try :
103+ parameters = tuple (inspect .signature (method ).parameters .values ())
104+ except (TypeError , ValueError ):
105+ return False
106+
107+ return any (
108+ parameter .kind is inspect .Parameter .VAR_KEYWORD or parameter .name == "wrapper"
109+ for parameter in parameters
110+ )
111+
112+
113+ def _method_accepts_limit (method : Any ) -> bool :
114+ try :
115+ parameters = tuple (inspect .signature (method ).parameters .values ())
116+ except (TypeError , ValueError ):
117+ return False
118+
119+ return any (
120+ (
121+ parameter .kind
122+ in (inspect .Parameter .POSITIONAL_OR_KEYWORD , inspect .Parameter .KEYWORD_ONLY )
123+ and parameter .name == "limit"
124+ )
125+ or parameter .kind is inspect .Parameter .VAR_KEYWORD
126+ for parameter in parameters
127+ )
128+
129+
100130class EncryptedSession (SessionABC ):
101131 """Encrypted wrapper for Session implementations with TTL-based expiration.
102132
@@ -176,8 +206,10 @@ async def get_items(
176206 limit : int | None = None ,
177207 wrapper : RunContextWrapper [Any ] | None = None ,
178208 ) -> list [TResponseInputItem ]:
179- if wrapper is not None :
209+ if wrapper is not None and _method_accepts_wrapper ( self . underlying_session . get_items ) :
180210 encrypted_items = await self .underlying_session .get_items (limit , wrapper = wrapper )
211+ elif limit is None and not _method_accepts_limit (self .underlying_session .get_items ):
212+ encrypted_items = await self .underlying_session .get_items ()
181213 else :
182214 encrypted_items = await self .underlying_session .get_items (limit )
183215 valid_items : list [TResponseInputItem ] = []
@@ -194,7 +226,7 @@ async def add_items(
194226 ) -> None :
195227 wrapped : list [EncryptedEnvelope ] = [self ._wrap (it ) for it in items ]
196228 wrapped_items = cast (list [TResponseInputItem ], wrapped )
197- if wrapper is not None :
229+ if wrapper is not None and _method_accepts_wrapper ( self . underlying_session . add_items ) :
198230 await self .underlying_session .add_items (
199231 wrapped_items ,
200232 wrapper = wrapper ,
0 commit comments