
    i              
          S r SSKrSSKrSSKrSSKrSSKrSSKJrJr  SSK	J
r
JrJrJrJrJr  SSKrSSKJr  Sr\R(                  r\R,                  rS r " S S	5      rS
\S\
4   S\S\\
   4   4S jrS\R6                  S\R6                  4S jrSS\S\4S jjrS\S\4S jr S\S\
4S jr!SS\S\S\\SS4   4S jjr"g)u   
本模块存放工具函数
    N)partialwraps)Any	AwaitableCallableDict	GeneratorOptional)Aria2rpcExceptionzutf-8c                      g N r       ;/app/mltbenv/lib/python3.13/site-packages/aioaria2/utils.py__init__r      s    r   c            
           \ rS rSr% SrSr0 r\\\	R                  4   \S'   \S\4S j5       r\S\\\4   SS4S	 j5       r\ SS
\S\\   S\\\4   4S jj5       rSrg)ResultStore   u   
websocket 结果缓存类
   _futuresreturnc                 h    U R                   nU R                   S-   [        R                  -  U l         U$ )u;   
jsonrpc的自增id 默认的id生成工厂函数
:return:
r   )_idsysmaxsize)clsss     r   get_idResultStore.get_id"   s*     GG77Q;#++-r   resultNc                 .   [        U[        5      (       a  U R                  R                  US   5      nU(       a  UR	                  5       (       a4  [
        R                  " 5       R                  5       nX R                  US   '   UR                  U5        gg)u   
收到websocket消息的时候,用这个类存储结果 表示一次特定的请求返回了
:param result: jsonrpc的回复格式 {'id':int,'jsonrpc','2.0','result':xxx}
:return:
idN)	
isinstancedictr   getdoneasyncioget_running_loopcreate_future
set_result)r   r    futures      r   
add_resultResultStore.add_result,   sp     fd##\\%%fTl3FV[[]] 113AAC-3VD\*f% $r   identitytimeoutc                   #    U R                   R                  U5      (       a  U R                   U   nO1[        R                  " 5       R	                  5       nX0R                   U'    [        R
                  " X25      I Sh  vN U R                   U	 $  N! [        R                   a    [        S5      Sef = f! U R                   U	 f = f7f)u   
返回暂存在本类中的结果
:param identity: jsonrpc返回的id
:param timeout: 等待结果超时
:return: 返回完整的jsonrpc 返回数据而不是仅仅有result字段 判断在后续来处理
Nz#jsonrpc over websocket call timeout)r   r%   r'   r(   r)   wait_forTimeoutErrorr   )r   r.   r/   r+   s       r   fetchResultStore.fetch;   s      <<H%%\\(+F ((*88:  &,LL"	' ))&:: X&	 ;## 	U#$IJPTT	U X&s<   A"C%B >B?B CB !B33B6 6CCr   r   )__name__
__module____qualname____firstlineno____doc__r   r   r   intr'   Future__annotations__classmethodr   strr   r,   r
   floatr3   __static_attributes__r   r   r   r   r      s     C*,Hd3&',s   &S#X &4 & & 7;''%-e_'	c3h' 'r   r   func.r   c                 X   ^  [        T 5      S[        S[        S[        4U 4S jj5       nU$ )uX   
一个用于包装 sync function 为 async function 的装饰器
:param func:
:return:
argskwargsr   c                     >#    [         R                  " 5       n[        T/U Q70 UD6n[        R                  " 5       nUR
                  nUR                  S XS5      I S h  vN nU$  N7fr   )r'   r(   r   contextvarscopy_contextrunrun_in_executor)rC   rD   looppfunccontextcontext_runr    rA   s          r   _wrapperrun_sync.<locals>._wrapper[   s_     '').t.v.**,kk++D+EE Fs   AA'A%A')r   r   )rA   rN   s   ` r   run_syncrP   T   s7     4[c S S   Or   taskc                    #    [         R                  " U5      (       d   S5       eU I S h  vN nU" U 5      I S h  vN   U$  N N7f)Nz$callback must be a coroutinefunction)r'   iscoroutinefunction)rQ   callbackr    s      r   add_async_callbackrU   g   sC     &&x00X2XX0ZF
4.M s   (AAAAAAparamsc                     U(       a  U R                  U5        U(       a8  [        U[        5      (       d   [        U5      nUS:  a  U R                  U5        U $ ! [         a    Sn N'f = f)zC
Convenience method for adding options and position to parameters.
r   )appendr#   r:   
ValueError)rV   optionspositions      r   add_options_and_positionr]   n   sa     g(C((x= q=MM(#M	  s   A A)(A)pathc                    #    [         R                  " U S5       ISh  vN n[        [        R                  " UR                  5       I Sh  vN 5      [        5      sSSS5      ISh  vN   $  NO N$ N	! , ISh  vN  (       d  f       g= f7f)u    
读取文件，转换b64编码
rbN)aiofilesopenr>   base64	b64encodereadJSON_ENCODING)r^   handles     r   b64encode_filerh      sT      }}T4((F6##&++-$78-H )(($7 )(((sV   BA.B)A4A0A4B(A2)B0A42B4B:A=;BBresponsec                 >    U (       d  g U S   $ ! [          a     gf = f)z
Process a status response.
errorstatus)KeyError)ri   s    r   
get_statusrn      s,     !! s    
prefixc              #      #    [        U S5       nUR                  5        H:  nUR                  5       nU(       d  M  UR                  S5      (       a  M4  X-   v   M<     SSS5        g! , (       d  f       g= f7f)ux   
从配置文件中读取可用配置
:param path: aria2配置文件路径
:param prefix: yield之前的前缀
:return:
r#N)rb   	readlinesstrip
startswith)r^   ro   flines       r   read_configfilerx      sQ      
dCAKKMD::<DtDOOC00m# " 
s'   A8)A'A'
A'	A8'
A51A8)NN)z--)#r9   r'   rc   rF   jsonr   	functoolsr   r   typingr   r   r   r   r	   r
   ra   aioaria2.exceptionsr   rf   loadsDEFAULT_JSON_DECODERdumpsDEFAULT_JSON_ENCODERr   r   rP   TaskrU   listr]   r>   rh   rn   rx   r   r   r   <module>r      s        
 $ F F  1zz zz 	7' 7't8CH% (3	#3F*G &7<< gll T 4 "Is Is I	 	# 	$# $s $iT46P $ r   