Skip to content

Commit dbf56ec

Browse files
authored
Implemented KV. (#24)
1 parent 8911fbb commit dbf56ec

File tree

5 files changed

+544
-25
lines changed

5 files changed

+544
-25
lines changed

python/natsrpy/_natsrpy_rs/js/kv.pyi

Lines changed: 88 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,68 @@
1+
from datetime import datetime, timedelta
12
from typing import final
23

3-
from natsrpy._natsrpy_rs.js.stream import Placement, Republish, Source, StorageType
44
from typing_extensions import Self
55

6+
from .stream import (
7+
Placement,
8+
Republish,
9+
Source,
10+
StorageType,
11+
StreamInfo,
12+
)
13+
614
__all__ = [
715
"KVConfig",
16+
"KVEntry",
17+
"KVEntryIterator",
18+
"KVOperation",
19+
"KVStatus",
820
"KeyValue",
21+
"KeysIterator",
922
]
1023

24+
@final
25+
class KVStatus:
26+
info: StreamInfo
27+
bucket: str
28+
29+
@final
30+
class KVOperation:
31+
Put: KVOperation
32+
Delete: KVOperation
33+
Purge: KVOperation
34+
35+
@final
36+
class KVEntry:
37+
@property
38+
def bucket(self) -> str: ...
39+
@property
40+
def key(self) -> str: ...
41+
@property
42+
def value(self) -> bytes: ...
43+
@property
44+
def revision(self) -> int: ...
45+
@property
46+
def delta(self) -> int: ...
47+
@property
48+
def created(self) -> datetime: ...
49+
@property
50+
def operation(self) -> KVOperation: ...
51+
@property
52+
def seen_current(self) -> bool: ...
53+
54+
@final
55+
class KVEntryIterator:
56+
def __aiter__(self) -> Self: ...
57+
async def __anext__(self) -> KVEntry: ...
58+
async def next(self, timeout: float | timedelta | None = None) -> KVEntry: ...
59+
60+
@final
61+
class KeysIterator:
62+
def __aiter__(self) -> Self: ...
63+
async def __anext__(self) -> str: ...
64+
async def next(self, timeout: float | timedelta | None = None) -> str: ...
65+
1166
@final
1267
class KVConfig:
1368
"""
@@ -63,6 +118,36 @@ class KeyValue:
63118
def use_jetstream_prefix(self) -> bool: ...
64119
@property
65120
def name(self) -> str: ...
66-
async def put(self, key: str, value: bytes) -> int: ...
67121
async def get(self, key: str) -> bytes | None: ...
68-
async def delete(self, key: str) -> int: ...
122+
async def delete(
123+
self,
124+
key: str,
125+
expect_revision: int | None = None,
126+
) -> int: ...
127+
async def update(self, key: str, value: bytes | str, revision: int) -> None: ...
128+
async def create(
129+
self,
130+
key: str,
131+
value: bytes | str,
132+
ttl: float | timedelta | None = None,
133+
) -> int: ...
134+
async def put(self, key: str, value: bytes | str) -> int: ...
135+
async def purge(
136+
self,
137+
key: str,
138+
ttl: float | timedelta | None = None,
139+
expect_revision: int | None = None,
140+
) -> None: ...
141+
async def history(self, key: str) -> KVEntryIterator: ...
142+
async def entry(self, key: str, revision: int | None = None) -> KVEntry | None: ...
143+
async def watch(
144+
self,
145+
key: str,
146+
from_revision: int | None = None,
147+
) -> KVEntryIterator: ...
148+
async def watch_with_history(self, key: str) -> KVEntryIterator: ...
149+
async def watch_all(self, from_revision: int | None = None) -> KVEntryIterator: ...
150+
async def watch_many(self, keys: list[str]) -> KVEntryIterator: ...
151+
async def watch_many_with_history(self, keys: list[str]) -> KVEntryIterator: ...
152+
async def keys(self) -> KeysIterator: ...
153+
async def status(self) -> KVStatus: ...

python/natsrpy/js.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
1-
from ._natsrpy_rs.js import JetStream
1+
from ._natsrpy_rs.js import JetStream, JetStreamMessage, Publication
22
from ._natsrpy_rs.js.consumers import (
33
AckPolicy,
44
DeliverPolicy,
5+
MessagesIterator,
56
PriorityPolicy,
67
PullConsumer,
78
PullConsumerConfig,
89
PushConsumer,
910
PushConsumerConfig,
1011
ReplayPolicy,
1112
)
12-
from ._natsrpy_rs.js.kv import KeyValue, KVConfig
13+
from ._natsrpy_rs.js.kv import (
14+
KeysIterator,
15+
KeyValue,
16+
KVConfig,
17+
KVEntry,
18+
KVEntryIterator,
19+
KVOperation,
20+
KVStatus,
21+
)
1322
from ._natsrpy_rs.js.object_store import (
1423
ObjectInfo,
1524
ObjectInfoIterator,
@@ -18,40 +27,55 @@
1827
ObjectStoreConfig,
1928
)
2029
from ._natsrpy_rs.js.stream import (
30+
ClusterInfo,
2131
Compression,
2232
ConsumerLimits,
2333
DiscardPolicy,
2434
External,
35+
PeerInfo,
2536
PersistenceMode,
2637
Placement,
2738
Republish,
2839
RetentionPolicy,
2940
Source,
41+
SourceInfo,
3042
StorageType,
3143
Stream,
3244
StreamConfig,
45+
StreamInfo,
3346
StreamMessage,
47+
StreamState,
3448
SubjectTransform,
3549
)
3650

3751
__all__ = [
3852
"AckPolicy",
53+
"ClusterInfo",
3954
"Compression",
4055
"ConsumerLimits",
4156
"DeliverPolicy",
4257
"DiscardPolicy",
4358
"External",
4459
"JetStream",
60+
"JetStreamMessage",
4561
"KVConfig",
62+
"KVEntry",
63+
"KVEntryIterator",
64+
"KVOperation",
65+
"KVStatus",
4666
"KeyValue",
67+
"KeysIterator",
68+
"MessagesIterator",
4769
"ObjectInfo",
4870
"ObjectInfoIterator",
4971
"ObjectLink",
5072
"ObjectStore",
5173
"ObjectStoreConfig",
74+
"PeerInfo",
5275
"PersistenceMode",
5376
"Placement",
5477
"PriorityPolicy",
78+
"Publication",
5579
"PullConsumer",
5680
"PullConsumerConfig",
5781
"PushConsumer",
@@ -60,9 +84,12 @@
6084
"Republish",
6185
"RetentionPolicy",
6286
"Source",
87+
"SourceInfo",
6388
"StorageType",
6489
"Stream",
6590
"StreamConfig",
91+
"StreamInfo",
6692
"StreamMessage",
93+
"StreamState",
6794
"SubjectTransform",
6895
]

src/exceptions/rust_err.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ pub type NatsrpyResult<T> = Result<T, NatsrpyError>;
88
pub enum NatsrpyError {
99
#[error(transparent)]
1010
StdIOError(#[from] std::io::Error),
11+
#[error(transparent)]
12+
UnknownError(#[from] Box<dyn std::error::Error + Send + Sync + 'static>),
1113
#[error("NATS session error: {0}")]
1214
SessionError(String),
1315
#[error("Invalid arguemnt: {0}")]
@@ -43,32 +45,40 @@ pub enum NatsrpyError {
4345
#[error(transparent)]
4446
UnsubscribeError(#[from] async_nats::UnsubscribeError),
4547
#[error(transparent)]
46-
KeyValueError(#[from] async_nats::jetstream::context::KeyValueError),
48+
JSKVError(#[from] async_nats::jetstream::context::KeyValueError),
4749
#[error(transparent)]
48-
CreateKeyValueError(#[from] async_nats::jetstream::context::CreateKeyValueError),
50+
JSKVCreateError(#[from] async_nats::jetstream::context::CreateKeyValueError),
4951
#[error(transparent)]
50-
CreateStreamError(#[from] async_nats::jetstream::context::CreateStreamError),
52+
JSStreamCreateError(#[from] async_nats::jetstream::context::CreateStreamError),
5153
#[error(transparent)]
52-
GetStreamError(#[from] async_nats::jetstream::context::GetStreamError),
54+
JSStreamGetError(#[from] async_nats::jetstream::context::GetStreamError),
5355
#[error(transparent)]
54-
KVUpdateError(#[from] async_nats::jetstream::context::UpdateKeyValueError),
56+
JSKVUpdateError(#[from] async_nats::jetstream::context::UpdateKeyValueError),
5557
#[error(transparent)]
5658
JSPublishError(#[from] async_nats::jetstream::context::PublishError),
5759
#[error(transparent)]
60+
JSObjectStoreError(#[from] async_nats::jetstream::context::ObjectStoreError),
61+
#[error(transparent)]
5862
KVEntryError(#[from] async_nats::jetstream::kv::EntryError),
5963
#[error(transparent)]
6064
KVPutError(#[from] async_nats::jetstream::kv::PutError),
6165
#[error(transparent)]
62-
DeleteError(#[from] async_nats::jetstream::kv::DeleteError),
66+
KVUpdateError(#[from] async_nats::jetstream::kv::UpdateError),
67+
#[error(transparent)]
68+
KVCreateError(#[from] async_nats::jetstream::kv::CreateError),
69+
#[error(transparent)]
70+
KVWatcherError(#[from] async_nats::jetstream::kv::WatcherError),
71+
#[error(transparent)]
72+
KVHistoryError(#[from] async_nats::jetstream::kv::HistoryError),
73+
#[error(transparent)]
74+
KVStatusError(#[from] async_nats::jetstream::kv::StatusError),
6375
#[error(transparent)]
6476
StreamDirectGetError(#[from] async_nats::jetstream::stream::DirectGetError),
6577
#[error(transparent)]
6678
StreamInfoError(#[from] async_nats::jetstream::stream::InfoError),
6779
#[error(transparent)]
6880
StreamPurgeError(#[from] async_nats::jetstream::stream::PurgeError),
6981
#[error(transparent)]
70-
UnknownError(#[from] Box<dyn std::error::Error + Send + Sync + 'static>),
71-
#[error(transparent)]
7282
PullMessageError(#[from] async_nats::jetstream::consumer::pull::MessagesError),
7383
#[error(transparent)]
7484
ConsumerError(#[from] async_nats::jetstream::stream::ConsumerError),
@@ -81,8 +91,6 @@ pub enum NatsrpyError {
8191
#[error(transparent)]
8292
ConsumerUpdateError(#[from] async_nats::jetstream::stream::ConsumerUpdateError),
8393
#[error(transparent)]
84-
ObjectStoreError(#[from] async_nats::jetstream::context::ObjectStoreError),
85-
#[error(transparent)]
8694
ObjectStoreGetError(#[from] async_nats::jetstream::object_store::GetError),
8795
#[error(transparent)]
8896
ObjectStorePutError(#[from] async_nats::jetstream::object_store::PutError),

0 commit comments

Comments
 (0)