y vddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZddlmZddlmZddlmZddlmZdd lmZdd lmZmZmZmZmZmZm Z m!Z!dd l"m#Z#m$Z$ dd l%m&Z&n #e'$rdZ&YnwxYwddl(Z)dd l)m*Z*ddl+m,Z,ddl-m.Z/ddl0m1Z1m2Z2m3Z3m4Z4m5Z5ddl*m6Z6m7Z7ddl8m9Z9ddl:m;Z;mm?Z?m@Z@mAZA ddlBmCZCeCdZDn #eE$rdZDYnwxYwdZFejGeHZIdZJdZKdZLdZMdZNdZOdZPd ZQeReQZSd!ZTd"ZUd#ZVeMeQzZWeNeQzZXd$ZYd%ZZd&Z[d'Z\d(Z]d)Z^d'Z_d*Z`d+Zad,Zbd'Zcd-Zdd+Zeefd.ZgeRegZhd/Zid0Zjd1ZkegedfZleeEgedfZmege!efenffZoeepgenfZqegepfZrGd2d3e Zse!epe epepfesefZteGd4d5ZueGd6d7Zveeeueepefge eeuewffZxGd8d9ZydAd>ZzGd?d@Z{dS)B) annotationsN) UserString) dataclass) BytesParser)BytesIO)Path)shuffle) token_hex)Any AwaitableCallableDictListOptionalTupleUnion) ParseResulturlparse) parse_email)errors)NUID)command)AUTHORIZATION_VIOLATIONPERMISSIONS_ERRPONGSTALE_CONNECTIONParser)ErrInvalidUserCredentialsErrStaleConnection)Msg)DEFAULT_SUB_PENDING_BYTES_LIMITDEFAULT_SUB_PENDING_MSGS_LIMIT Subscription) TcpTransport TransportWebSocketTransport)versionznats-pyz0.0.0python3sINFOsCONNECTsPINGsPONGs+OKs-ERRs  s_INBOXi i<xii sNATS/1.0503100ceZdZdS)RawCredentialsN)__name__ __module__ __qualname__o/builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/nats/aio/client.pyr6r6ssDr;r6c,eZdZUdZded<dZded<dS)ServerzA Server represents a NATS server in the connection pool. rurirint reconnectsN)r7r8r9__doc____annotations__rAr:r;r<r>r>zs;Jr;r>creZdZUdZded<dZded<dZded <d Zd ed <d Zd ed <dZ ded<dZ ded<dS)SrvzC Srv is a helper data structure to hold state of a server. rr?rr@rANOptional[float] last_attemptFbool did_connect discovered Optional[str]tls_nameserver_version) r7r8r9rBrCrArGrIrJrLrMr:r;r<rErEsJ$(L((((KJ"H""""$(N((((((r;rEceZdZddZddZeddZedd Zedd Zedd Z edd Z edd Z ddZ dS) ServerVersionrMstrreturnNonech||_d|_d|_d|_d|_d|_d|_dSN)_server_version_major_version_minor_version_patch_version_prerelease_version_build_version _dev_version)selfrMs r<__init__zServerVersion.__init__s@--1-1-126 -1+/r;c$d}tj|tj}||j}|t |jd|}t|d|_t|d|_ t|d|_ |dpd|_ |dpd|_ |j r(d |j |j g|_dS|j |_dS) Na ^ (?P0|[1-9]\d*) \. (?P0|[1-9]\d*) \. (?P0|[1-9]\d*) (?:-(?P (?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*) (?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))* ))? (?:\+(?P [0-9a-zA-Z-]+ (?:\.[0-9a-zA-Z-]+)* ))? $ z is not a valid Semantic Versionmajorminorpatch prereleaser, buildmetadata+)recompileVERBOSEmatchrU ValueError groupdictr@rVrWrXrYrZjoinr[)r\ _SEMVER_REGEX_REGEXrhmatchess r< parse_versionzServerVersion.parse_versions "M2:66 T122 = 4VVVWW W//##!''"233!''"233!''"233#*<#8#>B %o6<"   9 #$*BDDW)X Y YD    $ 8D   r;r@cF|js||jSrT)rVror\s r<r_zServerVersion.major(" !    ""r;cF|js||jSrT)rWrorqs r<r`zServerVersion.minorrrr;cF|js||jSrT)rXrorqs r<razServerVersion.patchrrr;cF|js||jSrT)rYrorqs r<rbzServerVersion.prereleases(' !    ''r;cF|js||jSrT)rZrorqs r<buildzServerVersion.buildrrr;cJ|js||jpdS)Nr,)r[rorqs r<devzServerVersion.devs-  !     &B&r;cd|jdS)Nz)rUrqs r<__repr__zServerVersion.__repr__s7 47777r;N)rMrPrQrRrQrRrQr@rQrP) r7r8r9r]ropropertyr_r`rarbrwryr|r:r;r<rOrOs0000 9 9 9 9D###X# ###X# ###X# (((X( ###X# '''X' 888888r;rOex ExceptionrQrRcBKtd|dS)z] Provides a default way to handle async errors if the user does not provide one. nats: encountered errorexc_infoN)_loggererror)rs r<_default_error_callbackrs%  MM+bM99999r;c#eZdZUdZeZded<dZdZdZ dZ dZ d Z d Z dd ZddZdgdddddddddeeeeededddddddedddddeedddf#ddFZddGZddHZddLZddNZddOZddPZdddSZ ddTZ! ddd]Z"dd`Z#dVddde$e%fddjZ&dddlZ'ddnZ(ddoZ)ddrZ* dddwZ+ dddxZ,ddyZ-dddzZ.ddd|Z/e0fdd}Z1e2ddZ3e2ddZ4e2ddZ5e2ddZ6ddZ7e2ddZ8e2ddZ9e2ddZ:e2ddZ;e2ddZe2ddZ?e2ddZ@e2ddZAe2ddZBe2ddZCdddZD dddZEeFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUdddZVddZWddZXdddZYddZZddZ[ddZ\dd„Z]ddÄZ^ddńZ_ddDŽZ`dS)Clientz( Asyncio based client for NATS. z type[Msg] msg_classrrr-r4rQrPcdtdS)Nz )$(D !  ! -1A1MQUQeQq$(D !  % % ' ' '$M2DEEE"., <( )U 2 2 D% & & & 9 9..00000000000222222222+dd-ddd+23$/(   < 89A==HHHH V\7+?@ 9 9 9 nnQ'''''''''|$56Gkk&"5u========='38<8H8HD(5(33q833 9 9s,:AK N9K;2 K;;$N9BN44N9ch|j|dS|dSrT)r_setup_nkeys_jwt_connect_setup_nkeys_seed_connectrqs r<rzClient._setup_nkeys_connect@s;  ! -  ) ) + + + + +  * * , , , , ,r;cjs Jdddlddljttr4t dksJd fd }|_dfd }|_dStts*ttsttrd fd }|_dfd }|_dSdS)Nz_user_credentials requiredrr-rQrcd}tdd5}t|j}||dddn #1swxYwY|SNrrb)openrfstatfilenost_sizereadinto)contentsfcredsoss r<user_cbz0Client._setup_nkeys_jwt_connect..user_cbQs%(D)))Q(!((**)=)=)EFFHJJx((())))))))))))))) AA55A9<A9noncerPrcd}tdd5}t|j}||dddn #1swxYwY|}||}tj |}| ~~|S)Nrr) rrrrrr from_seedsignrbase64 b64encodewipe) r#seedrkp raw_signedsigrnkeysr s r<sig_cbz/Client._setup_nkeys_jwt_connect..sig_cbZs%(D))%Q$RXXahhjj%9%9%ABBDJJt$$$%%%%%%%%%%%%%%%__T**WWU\\^^44 &z22  r"c.SrT)_read_creds_user_jwt)rr\sr<r!z0Client._setup_nkeys_jwt_connect..user_cbls00777r;c}|}||}t j|}|~~|SrT)_read_creds_user_nkeyr%r&rr'r(r))r# user_seedr+r,r-rr.r\s r<r/z/Client._setup_nkeys_jwt_connect..sig_cbqsj 66u== __Y//WWU\\^^44 &z22  r;)rQrr#rPrQr) rr r.rtuplerrrrPrr)r\r!r/rr.r s` @@@r<rzClient._setup_nkeys_jwt_connectFsg%CC'CCC%  !3 eU # #/ (u::????       !(D         "(D    s # # (z%'D'D ( SXZ^H_H_ ( 8 8 8 8 8 8 8!(D         "(D   ' ( (r;rstr | UserString | Pathrcd}t|tr/|t|jSt |dd5}||cdddS#1swxYwYdS)Nc>|D]}d|vr|} t|n#t$rtwxYw|}||z dz }||t |}|||cSdS)NsBEGIN USER NKEY SEEDr)tellnext StopIterationrseekrr)rlinenkey_start_pos nkey_end_pos nkey_sizer4s r< get_user_seedz3Client._read_creds_user_nkey..get_user_seeds % %+d22%&VVXXN8Q(888778#$6688L ,~ = AIFF>***!*) 4 4IJJy)))$$$$3  % %s .Arr) bufferingrrrdatarr)r\rrBrs r<r3zClient._read_creds_user_nkeys % % %* eZ ( ( ? =):):)<)> > % + + + $q =## $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $s A22A69A6str | RawCredentials | Pathcd}t|tr/|t|jSt |d5}||cdddS#1swxYwYdS)Ncd} t|}d|vr"t|}nH|dt|dz S)NTsBEGIN NATS USER JWTr)rreadliner)ruser_jwtr>s r< get_user_jwtz1Client._read_creds_user_jwt..get_user_jwtsgH  ..)T11(66H   /c(mma//0 0r;rrD)r\rrKrs r<r1zClient._read_creds_user_jwts 1 1 1 eZ ( ( >< (9(9(;(; < <== = %   #!<?? # # # # # # # # # # # # # # # # # #s A00A47A4cjsjs Jdddld fd }|j_|~d fd }|_dS) N#Client.connect must be called firstrrQ nkeys.KeyPaircddl}jr'tj}n}j}t |d5}t||j}| |dddn #1swxYwY |}~|Sr) r rrrrrrrrrr%)r r*rrkey_pairr.r\s r<_get_nkeys_seedz9Client._setup_nkeys_seed_connect.._get_nkeys_seeds III# % !5!!>??(%&&%!$RXXahhjj%9%9%ABBDJJt$$$%%%%%%%%%%%%%%%t,,HOs AB&&B*-B*r#rPrc}||}tj|}|~|SrT)r&rr'r(r))r#r+r,r-rQs r<r/z0Client._setup_nkeys_seed_connect..sig_cbsP ""B00J":..C GGIIIJr;)rQrNr5)rrr. public_keydecoderr)r)r\r+r/rQr.s` @@r<rz Client._setup_nkeys_seed_connects^4#7^^9^^^7        _  M0022        $r;cTK|tjd{VdS)z Closes the socket to which we are connected and sets the client to be in the CLOSED state. No further reconnections occur once reaching this point. Nr rCLOSEDrqs r<closez Client.closes4 kk&-(((((((((((r;statusdo_cbscxK|jr ||_dStj|_|d{V|j2|js|j|j2|js|j|j 2|j s|j |j |j s|j  |j D|j s+tj|j |jdd{Vn!#tjtjf$rYnwxYwtjdd{V|jf|jr_|jdkrT|j|jddg|_d|_|jd{V|jD]}|jr2|j s|j|jr|j|jrI|jD]}||j|j|jl|j  |j!d{Vn2#tD$r%}|#|d{VYd}~nd}~wwxYw|rB|j$|$d{V|j%|%d{Vd|_&d|_'dS)Nrr)( is_closedrrrW_flush_pendingr cancelledcancelrrrdonerrwait_forrCancelledErrorrsleeprrr writelinesrdrainrvalues_wait_for_msgs_task_message_iterator_cancel_pending_next_msgs_callsclearrX wait_closedrrrrrr)r\rYrZsubfutrs r<r z Client._closes, > !DL F} !!#########   )$2D2N2N2P2P )   % % ' ' '  # /8P8Z8Z8\8\ /  $ + + - - -   )$2D2N2N2P2P )   % % ' ' '  " .t7N7S7S7U7U .  # * * , , , 1=dFdFnFnFpFp=!*6 %:;*G,@A    mA   + +&****4=+;<<< " *+'o++---------:$$&& 5 5C& 1s/F/K/K/M/M 1'..000$ 0%--///+ 57>>@@!!CJJLLLL,22444  ? & O ! ! # # # (o113333333333 ( ( (nnQ'''''''''''''' (  ($0++---------*oo''''''''' $s+#A E//F  F L66 M%M  M%cNK|jrdS|jr tj|js|jr tjg}|jD]Q}| }tj |}| |Rtj|}tjdd{Vt j|_ tj||jdd{Vny#tj$rW|||tjd{VYntj$rYnwxYwt j|_|d{V|t jd{VdS#t j|_|d{V|t jd{VwxYw)a drain will put a connection into a drain state. All subscriptions will immediately be put into a drain state. Upon completion, the publishers will be drained and can not publish any additional messages. Upon draining of the publishers, the connection will be closed. Use the `closed_cb` option to know when the connection has moved from draining to closed. Nrr) is_drainingr\rConnectionClosedError is_connectingis_reconnectingConnectionReconnectingErrorrrf_drainrget_running_loop create_taskappendgatherrcr DRAINING_SUBSrrarr exceptionr_rDrainTimeoutErrorrb DRAINING_PUBSflushr rW)r\ drain_tasksrmcorotask drain_is_dones r<rez Client.drain#sY    F > /. .   5!5 54 4 :$$&& % %C::< /. .   10 07||   6%**lT=T.TW[Wm.m.m55 $+ + +( (  %,PPPPPPPPPPPr;rOptional[Dict[str, Any]]cK|dkr tjd}|tj|||}n5t }|t |t|D]\}} | } | s|| |d| } || |t|ttj ||||}|j dxxdz cc<|j dxx|z cc<| |d{V|j5|jr|d{VdSdSdS)z7 Sends PUB command to the NATS server. r,Ns: rrr)rBadSubjectError prot_commandpub_cmdrextend NATS_HDR_LINE_CRLF_itemsstriprhpub_cmdr _send_commandremptyr]) r\rrrrrrhdrkvkeyvalues r<rzClient._send_publishs b==( ( ?"*7E7CCGG++C JJ} % % % JJv     # #1ggii 3::<<((( 5!!!  5<<>>*** 6"""" JJv   "+GUCIIG :!# ;</  )))))))))   (T->-D-D-F-F (%%'' ' ' ' ' ' ' ' ' ' ) ( ( (r;queuer *Optional[Callable[[Msg], Awaitable[None]]]futureOptional[asyncio.Future]max_msgspending_msgs_limitpending_bytes_limitr$c zK|rd|vr tj|rd|vr tj|jr tj|jr tj|xjdz c_|j}t||||||||| } | |j | |j |<| | d{V| S)a subscribe registers interest in a given subject. If a callback is provided, messages will be processed asynchronously. If a callback isn't provided, messages can be retrieved via an asynchronous iterator on the returned subscription object.  r)rr rrrrN) rrr\rqrprrr$_startrr_send_subscribe) r\rrr rrrrsidrms r< subscribezClient.subscribes$ )3'>>( (  )cUll( ( > /. .   10 0 Q i   1 3     4>""" 3""3''''''''' r;rc<|j|ddSrT)rpop)r\rrs r< _remove_subzClient._remove_subs sD!!!!!r;rmcKd}|j&tj|jt|j}n%tj|j|j|j}||d{V|d{VdSrT)_queuersub_cmd_subjectEMPTY_idrr])r\rmrs r<rzClient._send_subscribes : "*3<HHGG"*3<SWMMG  )))))))))!!###########r;cKi|_|jdd|_|jd|j|j|jd|jdd}|d|||jd{VdS)N.*)r ) rrrrrr;rrT_request_sub_callback)r\resp_mux_subjects r<_init_request_subzClient._init_request_subs $ 2111 5 $$T*** $$TZ__%6%6777 $$T***03%%%nn-44664;UnVVVVVVVVVVVr;msgr!cK|jt|jdzdzd}|j|}|sdS|s||dSdS)Nr-)rrrrgetr` set_result)r\rrrs r<rzClient._request_sub_callbacks C 233b81<>>?##E**  F{{}} #   c " " " " " # #r;?timeoutfloat old_stylec&K|r||||d{VS|||||d{V}|jrH|jtjjjjtkr tj |S)z Implements the request/response pattern via pub/sub using a single wildcard subscription that handles the responses. )rN)rr) _request_old_style_request_new_stylerrnatsjsapiHeaderSTATUSNO_RESPONDERS_STATUSrNoRespondersError)r\rrrrrrs r<requestzClient.requests  d00'70SSSSSSSS S//'[b/ccccccccC ; +3;??47;+=+DEEI]]]* * r;cKjr tjjsd{VjsJjtd jdd}|tj }| fd|j <||||d{V tj||d{VS#tj$r tjwxYw)Nr-c^jdSrT)rrrT)rr\rs r<z+Client._request_new_style..;s!4>+=+=ellnnd+S+Sr;)rr)rrrrrrr;rr rrFutureadd_done_callbackrrTrrar)r\rrrrinboxrrs` @r<rzClient._request_new_style%s   10 0$ +((** * * * * * * *$$$$ !! Yq\\((**+++%aaa( U")!1!1  !S!S!S!S!STTT)/u||~~&ll7G5<<>>7lSSSSSSSSS & )&':::::::: :# & & &% % &s -EE$c|jdd}|d||j|S)aW new_inbox returns a unique inbox that can be used for NATS requests or subscriptions:: # Create unique subscription to receive direct messages. inbox = nc.new_inbox() sub = await nc.subscribe(inbox) nc.publish('broadcast', b'', reply=inbox) msg = sub.next_msg() Nr)rrrr;rT)r\ next_inboxs r< new_inboxzClient.new_inboxGs['* $$*//++,,,  """r;cxK|}tj}|||dd{V}|dd{V||||d{V tj||d{V}|jrH|jtj j j j tkr tj|S#tj$r;|d{V|tjwxYw)z Implements the request/response pattern via pub/sub using an ephemeral subscription which will be published with a limited interest of 1 reply returning the response or raising a Timeout error. r)rrN)limit)r)rrrr unsubscriberrarrrrrrrrrrrr_)r\rrrrrrmrs r<rzClient._request_old_styleWsX  &-n&6&6NN5!NDDDDDDDDooAo&&&&&&&&&ll7G5l999999999 &(99999999C{ 3;??47;#5#<==AUUU 22J# & & &//## # # # # # # # MMOOO% % &sA+C//A D9rcKtj||}||d{V|d{VdSrT)r unsub_cmdrr])r\rrrs r<_send_unsubscribezClient._send_unsubscribepsh *366   +++++++++!!###########r;cNK|dkr tj|jr tjt j} ||d{Vt j||d{VdS#tj$r!| tj wxYw)a7 Sends a ping to the server expecting a pong back ensuring what we have written so far has made it to the server and also enabling measuring of roundtrip time. In case a pong is not returned within the allowed timeout, then it will raise nats.errors.TimeoutError rN) rBadTimeoutErrorr\rqrr _send_pingrarr_FlushTimeoutError)r\rrs r<r~z Client.flushus a<<( ( > /. .!(!1!1 +//&)) ) ) ) ) ) ) )"6733 3 3 3 3 3 3 3 3 3# + + + MMOOO* * +s 6A440B$Optional[ParseResult]c:|jr|jr |jjSdSrT)rrr?rqs r< connected_urlzClient.connected_urls(   ,D$5 ,'+ +tr;List[ParseResult]cRg}|jD]}||j|SrT)rrxr?r\rsrvs r<rzClient.serverss5$ $ $C NN37 # # # #r;c`g}|jD]#}|jr||j$|SrT)rrJrxr?rs r<discovered_serverszClient.discovered_serverss=$ ( (C~ (sw'''r; List[Server]c$d|jDS)z< Returns a copy of the current server pool. cDg|]}t|j|jS)r?rAr>r?rA).0rs r< z&Client.server_pool..s)\\\337s~>>>\\\r;)rrqs r< server_poolzClient.server_pools ]\$J[\\\\r; List[str]c|jr tjg}|D]}||}t |}|jD]=}|jj|jkr&|j|_|j |_ |j |_ n>| |||_|j W|j jj}d}|D]}|jj|kr ||_ d}n|s$t|dkr|d|_ dSdSdSdS)a Replaces the current server pool with the provided list of server URLs. The new pool will be used on the next reconnect attempt. It does not trigger an immediate reconnect. The new pool is subject to the same rules as the default one (randomization unless disabled, max reconnect attempts, etc). Unless advertised server discovery is disabled, the client will continue to discover and add new servers to the pool as it receives INFO messages from the server. :param servers: List of server URLs to use as the new pool. :raises errors.ConnectionClosedError: If the connection is closed. NFTr)r\rrq_parse_server_urirErr?netlocrArIrGrxrr) r\rnew_poolrr?rold_srvcurrent_netlocfounds r<set_server_poolzClient.set_server_poolsN > /. .! ! !F((00Cc((C,  ;%33%,%7CN&-&9CO'.';C$E 4 OOC $   +!15^33+.D( EE4 3S]]Q..'/{$$$ , + 3 3..r;c|jS)zQ Returns the max payload which we received from the servers INFO )rrqs r< max_payloadzClient.max_payloads   r; Optional[int]c|jS)zO Returns the client id which we received from the servers INFO )rrqs r< client_idzClient.client_ids r;Optional[Exception]c|jS)zA Returns the last error which may have occurred. )rrqs r< last_errorzClient.last_errors yr;c|jSrT)rrqs r<pending_data_sizezClient.pending_data_sizes &&r;c,|jtjkSrT)rrrWrqs r<r\zClient.is_closeds|v},,r;c,|jtjkSrT)rr RECONNECTINGrqs r<rszClient.is_reconnectings|v222r;c:|jtjkp|jSrT)rr CONNECTEDrprqs r<rzClient.is_connecteds  00ET5EEr;c,|jtjkSrT)rr CONNECTINGrqs r<rrzClient.is_connectings|v000r;cV|jtjkp|jtjkSrT)rrrzr}rqs r<rpzClient.is_drainings!|v33[t|vG[7[[r;c,|jtjkSrT)rrr}rqs r<rzClient.is_draining_pubss|v333r;rOcx|jr%|jjrt|jjStdS)zm Returns the ServerVersion of the server to which the client is currently connected. z 0.0.0-unknown)rrMrOrqs r<connected_server_versionzClient.connected_server_versions@   FD$8$G F !5!DEE E_---r;ssl.SSLContextcd}d|jvr|jd}ntj}|t jd|S)Nrznats: no ssl context provided)rrsslcreate_default_contextrr)r\ ssl_contexts r<rzClient.ssl_contextsV04 DL ,**511KK466K  ,>?? ?r;cmdpriorityc*K|r|jd|n|j||xjt |z c_|jdkr.|j|jkr |dd{VdSdSdS)NrT) force_flush)rinsertrxrrrr])r\rrs r<rzClient._send_commands  & M C ( ( ( ( M  % % % 3s88+  !A % %$*ADDZ*Z*Z%%$%77 7 7 7 7 7 7 7 7 7 & %*Z*Zr;rr cK|js Jd tj}|js|d|S|j|d{V|re tj||jd{VdS#tj$r0| tj d{VYdSwxYwdS#tj $rYdSwxYwNrM) rrrrrputrarrrrrrb)r\rrs r<r]zClient._flush_pending'sI GG"GGG  %,^%5%5F$ !!$''' #''// / / / / / / / EE!*643FGGGGGGGGGGG+EEE..)A)C)CDDDDDDDDDDDDE E E%    DD s50C"C) B ;C C C  CC"!C" connect_urlrc d|vsd|vrt|}nBd|vsd|vrt|}n*d|vrtd|}ntd|d}|j!|jdvrtd|jd}n"#t$rt jd wxYw|j |jd krt jd |S) zy Parse a single server URL string into a ParseResult. Handles scheme defaults and port defaults. znats://ztls://zws://zwss://:z:4222Nwswss nats: invalid connect url optionnonez%nats: invalid hostname in connect url)rportschemehostnamerirr)r"r?s r<rzClient._parse_server_uri?s CK''8{+B+B{++K''8{+B+B{++ ##66677;;;;<<xCJm$C$C<<<<== C C C,ABB B C < 3<6#9#9,FGG G s BBB$Union[List[str]]c`t|tr>||}|jt |dSt|t r |D]8}t|}|jt |9n"#t$rtj dwxYwtd|jDs2td|jDstj ddSdStj d)Nr(c32K|]}|jjdvVdS))rrNr?r+rrs r< z,Client._setup_server_pool..es,YYVFJ%8YYYYYYr;c32K|]}|jjdvVdS)r%Nr0r1s r<r2z,Client._setup_server_pool..fs,ZZfvz(M9ZZZZZZr;z?nats: mixing of websocket and non websocket URLs is not allowed) rrPrrrxrElistrrirrall)r\r"r?rs r<rzClient._setup_server_poolXs] k3 ' ' C((55C   $ $SXX . . . . .  T * * C G)77F"6**C%,,SXX66667 G G Gl#EFFF GYYtGXYYYYY fZZHYZZZZZ fl#deee  f f f f ,ABB Bs *;B&&CsrEcKtj|_|jsB|jjdvr!t |jd|_nt|_|jjdkr@|j |j|j t|jdd{VdS|j |jt|jdd{VdS) zM Establishes a TCP/WebSocket connection to the given server. r%r) ws_headersr'r)r buffer_sizerN)r9r) r r rGrr?r+r'rr% connect_tlsrDEFAULT_BUFFER_SIZEr)r\r6s r<_connect_to_serverzClient._connect_to_serverls")) 1u|},,"4 Md@e"f"f"f"... 5<5 /-- ,/ $ -> ? .         /))/ $ -> ?*         r;cK t|jdkrd|_tjt j}|jd}|jddkr|j |jdkr|j ||j >||j |jdzkr%tj |jdd{V ||d{V||_dS#t$rU}t j|_ |xj dz c_ ||_||d{VYd}~_d}~wwxYw)zf Looks up in the server pool for an available server and attempts to connect. TrNrrr)rrrrrr r rrrArxrGrrcr<rrr)r\nowr6rs r<rzClient._select_next_servers  4$%%**'+$++.""C!%%a((A|4599<$,/G"HHH   $ $Q ' ' '~)cANT\RgEh4h.h.hmDL1F$GHHHHHHHHH --a000000000'($   !%!1!1 !  nnQ'''''''''  s$"D E'A E""E'err_msgcKt|vr.|tjd{VdSt|vrtj|_n[|d}d|}tj|}||_t|vr| |d{VdSd}|j sd}tj |tj|dS)zv Processes the raw error message sent by the server and close connection with current server. N'nats: FT)r_process_op_errrStaleConnectionErrorrAuthorizationErrorrrrrrrrrrwr rrW)r\r?prot_errmerrrZs r< _process_errzClient._process_errs w & &&&v'B'D'DEE E E E E E E E F "g - -133DII}}S))H###A,q//CDI!##nnS)))))))))! F DKK v>>?????r;rrc&K|js|jrdS|jdr|js|jrt j|_|j |j 2|j s|j tj||_ dS|||_|t jdd{VdS)z Process errors which occurred while reading or parsing the protocol. If allow_reconnect is enabled it will try to switch the server to which it is currently connected otherwise it will disconnect. NrT)r\rsrrrrrr rrresetrr^r_rrvrw_attempt_reconnect_process_disconnectrr rW)r\rs r<rCzClient._process_op_errs  > T1  F <) * 30A 3TEW 3!.DL HNN   &24;R;\;\;^;^2'..000&-&>&@&@&L<MdMdMfMf&g&gD # # #  $ $ & & &DI++fmT22 2 2 2 2 2 2 2 2 2r;c\ K|js Jd|j2|js|j|j2|js|j|j2|js|j|jl|j |jd{Vn2#t$r%}| |d{VYd}~nd}~wwxYwd|_ |j | d{V|j rdSd|jvs |jdst|jt#j|_ |jy|jddkrfd|jD}nt+|j}t-|dkr t.jd|D} |||j\}}n2#t$r%}| |d{VYd}~d}~wwxYw|]d}|D] }|jj|jjkr|}n!|||_n.| t/jd{Vd}| |d|_|dkrt#j|d{V||jd{Vn| d{V|jsJ|!d{V|j"dxxd z cc<d|j_#d|j_$g}|j%&D]\} } d} | j'dkr5| j(| j'kr|)| 8| j'| j(z } tUj+| j,| j-| } |j.| | dkr/tUj/| | } |j.| |D]} |j%0| |j1d{V|2d{Vtfj4|_5|6d{V|j7|7d{Vd|_n#t.j$r+}||_ |d{VYd}~nd}~wtpt.j9t"j:f$ro}||_ | |d{Vtfj;|_5tyj=|j_>|jxj$d z c_$Yd}~nd}~wt"j?$rYnwxYwG|j5|js|j@ddSdSdS) NrMrTrrc*g|]}|jk |Sr:)rA)rr6 max_reconnects r<rz-Client._attempt_reconnect..s&#b#b#b!ALTaDaDaADaDaDar;cDg|]}t|j|jSrr)rr6s r<rz-Client._attempt_reconnect.. s*&d&d&dVWv!%AL'Q'Q'Q&d&d&dr;rAr)Arrr^r_rrrrXrlrrrrr\rr rrrrrr4rrrrcopyr?rServerNotInPoolErrorrcr<rrrrIrArr _max_msgs _receivedrxrrrrwriterrrer]rrrr~rrrrr r r rGrbr)r\religibleserver_snapshotselectedcallback_delaymatchedr6subs_to_removerrmrrrrPs @r<rLzClient._attempt_reconnectsT#JJ%JJJ#   )$2D2N2N2P2P )   % % ' ' '  # /8P8Z8Z8\8\ /  $ + + - - -   )$2D2N2N2P2P )   % % ' ' ' ? & O ! ! # # # (o113333333333 ( ( (nnQ'''''''''''''' (  ,'')) ) ) ) ) ) ) ) >  F 4< / /t|DT7U / D% & & &*1)9)9&h g 4@$(L1I$JM$q((#b#b#b#bt/@#b#b#b#'(9#:#:8}}))$33&d&d[c&d&d&dO!373T3T+T->-C-C-E-E440..%!!!"nnQ///////// ! +"&!)&&A u|x|/BBB*+ % C#.3:D00"&..1L1N1N"O"OOOOOOOO'+H'/7{,%))%mN;;;;;;;;;11$2FGGGGGGGGGG22444444444&&00222222222 <(((A-(((48$023$/"$ $ 0 0 2 299HC H}q((=CM99*11#666$#&=3=#@*23<SQQGO))'222!||$0$:3$I$I --i888)((CJNN3''''o++--------- ))+++++++++%/ jjll"""""""'3..00000000015.(    jjll"""""""V\7+?@ 5 5 5 nnQ'''''''''%2 48N4D4D$1$//14///////)    Oh T  ) 5d>\>f>f>h>h 5  * 5 5d ; ; ; ; ; 6 5 5 5so!D D0 D++D0(A.T0IT I7I2-T2I77JTW) !U$W)*A%WW)(W)c|jd|jdtttd}d|jvr |jd|d<|jd|d<|jrfd|jvr|j|||jd}||d<|j,|}||d <n|j |j |d <n|jd .|jd !|jd |d <|jd |d <n|jd,|jd}t|r |}||d<nf|j r_|j j j N|j j j|j j j |d<n(|j j j |d <|j j j|d <|jd|jd|d<|jd|jd |d<tj|d}dt$t&z|zt*zgS)z Generates a JSON string with the params to be used when sending CONNECT to the server. ->> CONNECT {"lang": "python3"} rr)rrlangr(protocolr no_respondersr#Nr-jwtnkeyrrpassr auth_tokenrrechoT) sort_keysr;)r__lang__rPROTOCOLrrrrTrrcallablerr?rrjsondumpsrk CONNECT_OP_SPC_rr)r\rr-rar connect_optss r<_connect_commandzClient._connect_commandjsR|I. Z0"    ) ) )!%!29!=GI '+'8'CGO $   H$+++0B0N(():7)CDD!$$0++--C%(ZZ\\GENN&2&*&7GFOf%1dl:6N6Z"&,v"6"&,z":g&2 W-E??$!EGGE(- %%% H$*>*B*K*W'+4<,0,@,D,MGL))&*&:&>&GGFO&*&:&>&GGFO <  +"l62GFO < " ."&,y"99GFOz'T::: xxe+l.A.A.C.CCfLMNNNr;c~K|td{V|d{VdS)z. Process PING sent by server. N)rrr]rqs r< _process_pingzClient._process_pingsX  &&&&&&&&&!!###########r;cKt|jdkrH|jd}|d|xjdz c_d|_dSdS)z. Process PONG sent by server. rTrN)rrrrrrr\rs r< _process_pongzClient._process_pongsn t{  a  [__Q''F   d # # #  A % &'D # # # r;headerDict[str, str]ct|dkrdS|tjjjj}|tkr.|tjjjjSdS)Nr) rrrrrrr CTRL_STATUS DESCRIPTION)r\rErurYs r<_is_control_messagezClient._is_control_messages] t99q==4DGK.566 [ ::dgk0<== =tr;cb K|sdSd}|td}|dtkr|ttdzd}|dt}|tdzt|t z t z }|}i}|r#||tj j j j j<|t }||t zd}t|dkr|t }|dkr|d||tj j j j<|j||t zd} | D] \ } | | < n0||tj j j j<t|t ks|S|tt zd} t*rt+|j} n6d|j|D} |r|| n| }t*r[g} |D]< t3 fdt4jDr|  =| D] | =n4#t:$r'} || d{V|cYd} ~ Sd} ~ wwxYw|pdS)Nrrcbi|],\}}||-Sr:)r)rrrs r< z+Client._process_headers..s.ppptq!aggiipppr;c3 K|]}|vV dSrTr:)rcrs r<r2z*Client._process_headers..s'==a16======r;)NATS_HDR_LINE_SIZE _SPC_BYTE_rrSTATUS_MSG_LEN _CRLF_LEN_rrTisdigitrrrrrrfindrryr parsebytesrrrupdatekeysanystring whitespacerxrr)r\rr raw_headersr>rYdescstripped_statusi parsed_hdrr to_deleterrs @r<_process_headerszClient._process_headerss= 4(,0112  q>Z ' '3}--1334D/>/*F*SYY-Cj-PPQD$llnn3355OC&&(( G7FDGK&-34  ((A%a*n&6&67K4yy1}}IIf%%q55:>rr(//:K:KC *67!%!1!> L 3 3F ; ;L"wwtw{'9'JKKH     ::39EE6!9~~6!9~~39$$&)&@&@Q&O&O O O O O O OII!%qCI $CIF+ C{ ;((**F &&s+++  w!!\1!!+a//C4EIa4a4a%%5%%..0CI[^dghhhF"--c2222$ w w w!!S]]2!!nnV%=ckY\Ybhkqt%u%u%uvvvvvvvvvvv w x 4((333   ( ( CSY C38 C x((**ch.>>>977 BBB  ),,x(( ( ( ( ( ( ( (  @CI @(*=*=f*E*E @x @h::3??????????? @ @ @ @ @ @ @ @s5A6K-KA,L76L7c|||||||S)N)rrrEr_clientr)rrT)r\rrrrErs r<rzClient._build_messagesC~~NN$$,,..    r;c(tj|_dS)zf Process disconnection from the server and set client status to DISCONNECTED. N)rrrrqs r<rMzClient._process_disconnects * r;infoDict[str, Any]initial_connectioncK|js Jdd|vr@|dr9g}|dD]}d}|jjjdkrd}nd}t|d|}t |}d|_d|jvr=|jdr0||jr|jjj|_ d}|j D]} |j | jj krd }|r| ||j d durt||D]}|j ||s)|r)|jr$|d {Vd Sd Sd Sd Sd Sd S) z Process INFO lines sent by the server to reconfigure client with latest updates from cluster to enable server discovery. rM connect_urlsr,rrz://T tls_requiredFrN)rr?r+rrErJr _host_is_ipr,rLrrrxrr r) r\rrrr"r+r?r should_addr6s r< _process_infozClient._process_infos #JJ%JJJ# T ! !N## 7! #'#711KF+/6%??!&!'"f#>#>#>#>??Cc((C%)CN'$*;;; -n=< ,,S\::<(,';'?'H "&J!.//:55).J!1$++C000< 01==L)))'22C%,,S1111)7l7t?Y74466666666666I " !# 7# 7D777777r;cZ|dS tj|dS#t$rYdSwxYw)NFT) ipaddress ip_addressr)r\r"s r<rzClient._host_is_ipsJ  5    - - -4   55 s  **cX K|js Jd|js Jdtj|_d}d|jvr|jd}n*|jj |jj}n|jjj}|jd}|r8|j ||j t|jdd{V|j }tj||jdd{V}t|vrt!jd|tt&zd\}} t)j|}||_n"#t0$rt!jdwxYw|d d rd |_||d d{Vd |jvr|jd |j_d|jvr|jd|_d|jvr|jd|_d|jvr{|jdrn|jjjdkrY|sW|j d{V|j ||j t|jdd{V|j!r|j"#|jsJ|$}|j%||j d{V|jdr|j } tj| |jdd{V} tL| vrn`tN| vrW| } | dd\}} t!jd| (dz|j%tR|j d{V|j } tj| |jdd{V} tT| vrtj+|_n`tN| vrW| } | dd\}} t!jd| (dztT| vrtj+|_tj,-|.|_/g|_0d|_1tj,-|2|_3tj,-|4|_5dS)z Process INFO received from the server and CONNECT to the server with authentication. It is also responsible of setting up the reading and ping interval tasks from the client. z'must be called only from Client.connectNrrrz>++%^^C33 7 l8gnnV.D.D#DEEE j)))o##%%%%%%%%%))++(>O1PQQQQQQQQ  !+DLL w  ~~''H!Q//JAw ,x'..*@*@@AA A  !+DL$577CCDOODUDUVV "##*#;#=#=#I#I$J]J]J_J_#`#` %577CCDMMOOTTs -E11Fc@K|js Jd|tj}|j||jt |xjtt z c_| d{VdSr ) rrrrrxrVrrrr]rss r<rzClient._send_pingOsEE EEE >^%%F 6""" j))) 3z??2!!###########r;cK|js Jd|js Jd |jr|jrdS|jd{V} |jdkrT|j|jddg|_d|_|jd{Vn#t$rl}| |d{V| |d{VYd}~| s| ddSdSd}~wtjt t"f$r/Y| s| ddSdSwxYw| s| dn/#| s| dwwxYw)z} Coroutine which continuously tries to consume pending commands and then flushes them to the socket. rMTNr)rrrrrrrrdrrerrrCr`rrrb RuntimeErrorAttributeError)r\rrs r<rzClient._flusherXsB EE EEE GG"GGG  ,$ (: +/+<+@+@+B+B%B%B%B%B%B%BF ,*Q..O..t}QQQ/?@@@$&DM./D+///111111111   nnQ'''''''''**1--------- {{}},%%d+++++,, *L.I   {{}},%%d+++++,,   {{}},%%d+++{{}},%%d++++,+ ,s=AB65F"6 E56D'6F"'E5F"4E55F"",GcK tj|jdd{V|js. |xjdz c_|j|jdkr)|t d{VdS|d{Vn##tjttf$rYdSwxYw)NTrrr) rrcrrrrCr rrbrrrqs r<rzClient._ping_intervalws - _ =>> > > > > > > >$  ''1,''*T\:Q-RRR../A/C/CDDDDDDDDDFoo''''''''''*L.I     sA BBB<;B<cK |jp|j}|s|jdS|jrKt j}||d{V||d{VdS|jtd{V}|j |d{Vn#tj $r0|t j d{VYdSt$r&}||d{VYd}~dSd}~wtj$rYdSt $r'}t"d|Yd}~dSd}~wwxYwv)z Coroutine which gathers bytes sent by the server and feeds them to the protocol parser. In case of error while reading, it will stop running and its task has to be rescheduled. TNrr)r\rsrat_eofr UnexpectedEOFrrCreadr;rparse ProtocolErrorrrrbrrr)r\ should_bailrHbrrs r<rzClient._read_loops  "nD0D $/"9E?))++ .00C..---------..s333333333E/../BCCCCCCCChnnQ'''''''''''   **6+?+A+ABBBBBBBBB   **1---------)       7" EEE + s<CA"CAC;E5 E5D00E5 E5E00E5'Client'c K|S)z1For when NATS client is used in a context managerr:rqs r< __aenter__zClient.__aenter__s  r;cXK|tjdd{VdS)z7Close connection to NATS when used in a context managerT)rZNrV)r\rs r< __aexit__zClient.__aexit__s6kk&-k55555555555r;nats.js.JetStreamContextc 0tjj|fi|S)aA jetstream returns a context that can be used to produce and consume messages from NATS JetStream. :param prefix: Default JetStream API Prefix. :param domain: Optional domain used by the JetStream API. :param timeout: Timeout for all JS API actions. :: import asyncio import nats async def main(): nc = await nats.connect() js = nc.jetstream() await js.add_stream(name='hello', subjects=['hello']) ack = await js.publish('hello', b'Hello JS!') print(f'Ack: stream={ack.stream}, sequence={ack.seq}') # Ack: stream=hello, sequence=1 await nc.close() if __name__ == '__main__': asyncio.run(main()) )rrJetStreamContextr\optss r< jetstreamzClient.jetstreams6w'55555r;nats.js.JetStreamManagerc 0tjj|fi|S)z3JetStream context for managing JetStream via JS API)rrJetStreamManagerrs r<jsmz Client.jsmsw'55555r;rr})HrrrrrrrrrrrrrrKrrHrrHrrHrr@rr@rr@rr@rr@rrHrr@rrHrrrrKrrHrrKrrKrrrr@rrrrrrrrKrrKrrrr@rrFrrrrrQrR)rr7rQr)rrF)T)rYr@rZrHrQrR)r;r,N) rrPrrrrPrrrQrR) rrPrrPrrrr@rrrQrR)rrPrrPr rrrrr@rr@rr@rQr$)r)rr@rr@rQrR)rmr$rQrR)rr!rQrR)r;rFN) rrPrrrrrrHrrrQr!)rN) rrPrrrrrrrQr!)r)rrPrrrrrQr!)rr@rr@rQrR)rr@rQrR)rQr)rQr)rQr)rrrQrRr~)rQr)rQr)rQrH)rQrO)rQr)F)rrrrHrQrR)rrHrQr )r"rPrQr)r"r-rQrR)r6rErQrR)r?rPrQrR)rrrQrR)rQr)rurvrQrK)rQr) rr@rrrrrErrrrQrR) rr@rrrrrErrr)rrrrHrQrR)r"rKrQrHrT)rrrQrR)rQr)rQr)rQr)ar7r8r9rBr!rrCrrrWr rrzr}r|r]DEFAULT_CONNECT_TIMEOUTDEFAULT_RECONNECT_TIME_WAITDEFAULT_MAX_RECONNECT_ATTEMPTSDEFAULT_PING_INTERVALDEFAULT_MAX_OUTSTANDING_PINGSDEFAULT_MAX_FLUSHER_QUEUE_SIZEDEFAULT_DRAIN_TIMEOUTrDEFAULT_PENDING_SIZErrrr3r1rrXr rerrr#r"rrrrrrrrrrDEFAULT_FLUSH_TIMEOUTr~rrrrrrrrrr r\rsrrrrprrrrr] staticmethodrrr<rrIrCrLrorqrtrzrrrrMrrrrrrrrrrrr:r;r<rrsILI FLJMM////O O O O f+B)B,0.2(,37-1" $6#>&D2%B$"@(,&*$)""&59248-126$((,*>0)-@DJNIh9h9h9h9h9T---- 7(7(7(7(r$$$$8####""$"$"$"$H))))I%I%I%I%I%V)-)-)-)-\,0 BQBQBQBQBQH'('('('(X9=+/"@#B00000d"""""$$$$ W W W W####,0 6,0 & & & & &D#### &&&&&2$$$$$ *?+++++,X X X]]]X] .3.3.3.3`!!!X! X X '''X'---X-333X3FFFXF111X1\\\X\444X4...X.X88888"0\0CCCC(0""""H@@@@<33330J<J<J<J     D66666666:666666r;r)rrrQrR)| __future__rrr'rrjloggingrerrr  collectionsr dataclassesr email.parserriorpathlibrrandomr secretsr typingr r r rrrrr urllib.parserrfast_mail_parserr ImportErrornats.jsrr nats.nuidr nats.protocolrrnats.protocol.parserrrrrrrr rr! subscriptionr"r#r$ transportr%r&r'importlib.metadatar(rrrg getLoggerr7rrhrrlPING_OPPONG_OPrrrrrrmrrrrrrr;rrrrrrrrrMAX_CONTROL_LINE_SIZErrrrrxrCallback ErrorCallbackr JWTCallbackrPSignatureCallback TokenCallbackr6 Credentialsr>rErReconnectToServerHandlerrOrrr:r;r<rs#"""""   """"""!!!!!!$$$$$$OOOOOOOOOOOOOOOOOOOO........,,,,,,,KKK111111BAAAAAAA CBBBBBBBBB******')$$KKKKK  ' H % %        S[[      v  v   &!# !"!% +&& S''  B $' ()io56 r5E!1223 cUE\*S!      Z   CsCx.$>?     ) ) ) ) ) ) )  )$T&\4S>$BE(SYJZ\aJaDb$bcQ8Q8Q8Q8Q8Q8Q8Q8h::::^6^6^6^6^6^6^6^6^6^6s$2A99BB CC)(C)