M\ mge ddlmZddlZddlZddlZddlZddlmZddlm Z m Z m Z ddl Z ddlZ ddlmZe rddlmZdZdZd Zd ZejeZejd ZddZGddZGddZdS)) annotationsN) dataclass) TYPE_CHECKINGListOptional)api)JetStreamContextz KV-OperationDELPURGEsubz^[-/_=\.a-zA-Z0-9]+$keystrreturnboolct|dks|ddks |ddkrdStt|S)Nr.F)lenr VALID_KEY_REmatchr s j/builddir/build/BUILD/imunify360-venv-2.6.2/opt/imunify360/venv/lib/python3.11/site-packages/nats/js/kv.py _is_key_validr)sJ 3xx1}}A# RCu  ""3'' ( ((ceZdZdZdS)StopIterSentinelz=A sentinel class used to indicate that iteration should stop.N)__name__ __module__ __qualname____doc__rrrr/sGGDrrc*eZdZdZeGddZedGddZd3dZd4d5dZd6d7dZ d8d9dZ d:d;d Z dd#Z d6d?d$Zd@dAd'ZdBd(ZGd)d*ZdCd+Zd6dDd.ZdEd0Z dFdCd2ZdS)GKeyValuea KeyValue uses the JetStream KeyValue functionality. :: import asyncio import nats async def main(): nc = await nats.connect() js = nc.jetstream() # Create a KV kv = await js.create_key_value(bucket='MY_KV') # Set and retrieve a value await kv.put('hello', b'world') entry = await kv.get('hello') print(f'KeyValue.Entry: key={entry.key}, value={entry.value}') # KeyValue.Entry: key=hello, value=world await nc.close() if __name__ == '__main__': asyncio.run(main()) cZeZdZUdZded<ded<ded<ded<ded <ded <d ed <d S)KeyValue.Entryz> An entry from a KeyValue store in JetStream. rbucketr zOptional[bytes]value Optional[int]revisiondeltacreatedz Optional[str] operationN)rrrr __annotations__r!rrEntryr%Rsl          rr.T)frozencpeZdZUdZded<ded<ed dZed d Zedd Zd S)KeyValue.BucketStatuszB BucketStatus is the status of a KeyValue bucket. zapi.StreamInfo stream_inforr&rintc$|jjjS)zU values returns the number of stored messages in the stream. )r2statemessagesselfs rvalueszKeyValue.BucketStatus.valuesis #)2 2rc$|jjjS)zC history returns the max msgs per subject. )r2configmax_msgs_per_subjectr7s rhistoryzKeyValue.BucketStatus.historyps #*? ?rOptional[float]cJ|jjjdS|jjjS)z= ttl returns the max age in seconds. N)r2r;max_ager7s rttlzKeyValue.BucketStatus.ttlws' &.6t#*2 2rN)rr3)rr>) rrrr r-propertyr9r=rAr!rr BucketStatusr1`s   $###  3 3 3  3  @ @ @  @  3 3 3  3 3 3rrCnamerstreamprejsr directrrNonecL||_||_||_||_||_dSN)_name_stream_pre_js_direct)r8rDrErFrGrHs r__init__zKeyValue.__init__s+    rNr r)r( validate_keysc8K|r%t|stjjjd} |||d{V}nP#tjjj$r4}tjj|j|j d}~wwxYw|S)z; get returns the latest value for the key. N) rnatsrGerrorsInvalidKeyError_getKeyDeletedErrorKeyNotFoundErrorentryop)r8r r)rRrZerrs rgetz KeyValue.gets  1s!3!3 1'.0 0 E))C22222222EEw~- E E E'.11#)SVDD D E sA B#/BBc Kd}|j|} |r.|j|j||jd{V}n.|j|j|||jd{V}n3#t jjj$rt jjj wxYw||j kr1t jj d|d|j dt |j ||j|jddd}|jr[|jt$d}|t&ks |t(kr%t jj|||S)N)seqrH)subjectr_rHz expected 'z ', but got '')messager&r r'r)r*r+r,)rNrOget_msgrMrPrTrGrU NotFoundErrorrYr`r#r.rLdatar_headersr]KV_OPKV_DELKV_PURGErX)r8r r)msgr`rZr[s rrWz KeyValue._getsY%%% 2  H,,L <- !H,,L# < - w~+ 2 2 2'.1 1 2 ck ! !'.11:jw:j:j\_\g:j:j:j1kk k:(W   ; @--BV||rX~~gn44UB??? s AA000B r'bytesr3cK|r3t|s$tjj||j|j||d{V}|jS)aV put will place the new value for the key into the store and return the revision number. Note: This method does not support TTL. Use create() if you need TTL support. :param key: The key to put :param value: The value to store :param validate_keys: Whether to validate the key format N) rrTrGrUrVrOpublishrNr_)r8r r'rRpas rputz KeyValue.putst  6s!3!3 6'.0055 58##ty$7#$7$7?? ? ? ? ? ? ?v rmsg_ttlr>c K|r3t|s$tjj|d} |||d||d{V}n#tjjj$rx} ||d{V|#tjjj$r4}||||j j ||d{V}Yd}~nd}~wwxYwYd}~nd}~wwxYw|S)a5 create will add the key/value pair iff it does not exist. :param key: The key to create :param value: The value to store :param validate_keys: Whether to validate the key format :param msg_ttl: Optional TTL (time-to-live) in seconds for this specific message Nr)lastrRrq) rrTrGrUrVupdateKeyWrongLastSequenceErrorrWrXrZr))r8r r'rRrqror\s rcreatezKeyValue.createsP  6s!3!3 6'.0055 5  {{3A]\c{ddddddddBBw~7    iinn$$$$$$$  7>1   ;;SY%7}^e' ' . s5 AC-6BC ,*CC(C  C((C-rscK|r3t|s$tjj|i}|sd}t ||t jj<d} |j |j ||||d{V}nX#tjjj $r<}|j dkr*tjj|j|d}~wwxYw|jS)z update will update the value if the latest revision matches. Note: TTL parameter is accepted for internal use by create(), but should not be used directly on update operations per NATS KV semantics. rNrgrqiW') description)rrTrGrUrVrrHeaderEXPECTED_LAST_SUBJECT_SEQUENCErOrnrNAPIErrorerr_coderuryr_) r8r r'rsrRrqhdrsror\s rrtzKeyValue.updates  6s!3!3 6'.0055 5 D:=d))SZ 67  x''49(;c(;(;UDZa'bbbbbbbbBBw~&   |u$$gn>>3?>[[[   v s"-BC%)7C  C%c@K|r3t|s$tjj|i}t |t <|r'|dkr!t||tj j <|j |j |||d{VdS)ac delete will place a delete marker and remove all previous revisions. :param key: The key to delete :param last: Expected last revision number (for optimistic concurrency) :param validate_keys: Whether to validate the key format :param msg_ttl: Optional TTL (time-to-live) in seconds for the delete marker rrxNT)rrTrGrUrVrirhrrrzr{rOrnrN)r8r rsrRrqr~s rdeletezKeyValue.delete s  6s!3!3 6'.0055 5U  HD1HH>A$iiD: ;h$)2S22D'RRRRRRRRRtrcKi}t|t<t|tjj<|j|j|||d{VdS)z purge will remove the key and all revisions. :param key: The key to purge :param msg_ttl: Optional TTL (time-to-live) in seconds for the purge marker rxNT) rjrhMSG_ROLLUP_SUBJECTrrzROLLUPrOrnrN)r8r rqr~s rpurgezKeyValue.purge7sfU "4SZ h$)2S22D'RRRRRRRRRtr olderthancK|d{V}g}|23d{V}|n7|jtks|jtkr||A6|D]}d}|j|j}tjtj j |j z }|dkr|| krd}|j |j||d{VdS)zo purge will remove all current delete markers older. :param olderthan: time in seconds Nr)r`keepT)watchallr,rirjappendrNr datetimenowtimezoneutcr+ total_secondsrO purge_streamrM) r8rwatcherdelete_markersrtrZrr`durations r purge_deleteszKeyValue.purge_deletesDs?  ''''''# . . . . . . .&~6))V-=-I-I%%f--- $$ R RED/EI//G(,,X->-BCCemSH1}}X-C-C-E-E!E!E('' gD'QQ Q Q Q Q Q Q Q QtsA"cK|j|jd{V}t||jS)zL status retrieves the status and configuration of a bucket. N)r2r&)rOr2rMr#rCrL)r8infos rstatuszKeyValue.status\sLX))$,77777777$$dj$IIIrcBeZdZeZdZdZddZdZdZ dS) KeyValue.KeyWatchercr||_tjd|_d|_d|_d|_dS)N)maxsizeF)rOasyncioQueue_updates_sub_pending _init_done)r8rGs rrQzKeyValue.KeyWatcher.__init__fs:DHU\UbknUoUoUoDMDI+/DM$DOOOrcK|jd{V|jtjjd{VdS)z6 stop will stop this watcher. N)r unsubscriberrpr# KeyWatcher STOP_ITERr7s rstopzKeyValue.KeyWatcher.stoppsb)'')) ) ) ) ) ) ) )-##H$7$ABB B B B B B B B B Br@cK tj|j|d{VS#tj$rt jjwxYw)zI updates fetches the next update from a watcher. N)rwait_forrr] TimeoutErrorrTrU)r8timeouts rupdateszKeyValue.KeyWatcher.updateswsg /$-dm.?.?.A.A7KKKKKKKKK' / / /k.. /s 16!Ac|SrKr!r7s r __aiter__zKeyValue.KeyWatcher.__aiter__sKrcK |jd{V}t|trt|SrK)rr] isinstancerStopAsyncIteration)r8rZs r __anext__zKeyValue.KeyWatcher.__anext__sN "m//11111111e%566-,, rN)r) rrrrrrQrrrrr!rrrrcsu$$&&  $ $ $ C C C / / / /        rrc,K|jdi|d{VS)zP watchall returns a KeyValue watcher that matches all the keys. >N)r)watch)r8kwargss rrzKeyValue.watchalls2 TZ..v.........rfilters List[str]c6K|ddd{V}g} |jd{V}|r,|r*|jjdkrt dn#t$r}|d}~wwxYw|23d{VsnT|r6tfd|Dr| j C| j ^6| d{V|stj jj|S)z Returns a list of the keys from a KeyValue store. Optionally filters the keys based on the provided filter list. T)ignore_deletes meta_onlyNrz/Server may ignore filters if version is < 2.10.c3*K|] }|jvVdSrKr).0fr s r z KeyValue.keys..s)55qCG|555555r)rr consumer_infor;filter_subjectloggerwarning Exceptionanyrr rrTrGrU NoKeysError)r8rrrkeysrer s @rrz KeyValue.keyss  &         "),"<"<">">>>>>>>M V V '6#==NN#TUUU   G ! % % % % % % %#  %5555W55555)KK((( CG$$$$!llnn -'., , sA A22 B<A>>BC& List[Entry]cK||dd{V}g}|23d{V}|sn||!6|d{V|stjjj|S)zA history retrieves a list of the entries so far. T)include_historyN)rrrrTrGrUr)r8r rentriesrZs rr=zKeyValue.historys 3 ========" " " " " " " "%  NN5 ! ! ! ! # llnn -'., ,sAFc Kj|}ttj  fd}d} |st jj} |sd}j ||d| ||d{V_ tj dd{V j d{V} | j _j j} d| j dkr-| dkr'jdd{Vd_nG#t($r:} j d{V| d} ~ wwxYwS)z watch will fire a callback when a key that matches the keys pattern is updated. The first update after starting the watch is None in case there are no pending updates. c Ks&tjjjd{V|j}d}|jrt|jvrr|jt}rQ|tks |tkr;|j dkr.j s'j dd{Vd_ dStj|jt'jd|j|jj|j |j|}j |d{V|j dkr0j s+j dd{Vd_ dSdSdS)N)rrTrc)donerrrO_timeoutmetadataheaderrhr]rjri num_pendingrrrpr#r.rLr`rrNrfsequencerE timestamp)rkmetar[rZr init_setupr8rs r watch_updatesz%KeyValue.watch..watch_updatess??$$ N&z48;LMMMMMMMMMM+;+;  * * * * * * * *D @ .?N" (!' !X// !)"1 0         mA !,4466666666E$0G  |-H  ! !$ ' ' ' A%%(a--&**4000000000%)"         ,**,, , , , , , , ,I  s&BD++ E/55E**E/) rDrrErrFrrGr rHrrrI)NT)r rr)r(rRrrr.rK)r rr)r(rr.)T)r rr'rlrRrrr3)TN) r rr'rlrRrrqr>rr3)NTN) r rr'rlrsr(rRrrqr>rr3) r rrsr(rRrrqr>rr)r rrqr>rr)r)rr3rr)rrC)rr)rrrr)r rrr)FFFFN)rrrr rr.rCrQr]rWrprvrtrrrrrrrr=rr!rrr#r#5s98 ! ! ! ! ! ! !Y !Yd33333333>         (((((T"&&&&&X#"#' Dlp.     0JJJJ%%%%%%%%N//// '''''R0[[[[[[[rr#)r rrr) __future__rrrloggingre dataclassesrtypingrrr nats.errorsrTnats.js.errorsnats.jsrr rhrirjr getLoggerrrcompilerrrr#r!rrrsb#""""" !!!!!!0000000000)((((((    8 $ $rz122 ))))         ttttttttttr