Skip to content

Commit f0ee0db

Browse files
authored
Add first_seq support to StreamConfig (#779)
Signed-off-by: Casper Beyer <casper@synadia.com>
1 parent cb3ed6d commit f0ee0db

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

nats/src/nats/js/api.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,9 @@ class StreamConfig(Base):
352352
deny_purge: bool = False
353353
allow_rollup_hdrs: bool = False
354354

355+
# Sequence from which the stream starts when created. Introduced in nats-server 2.10.0.
356+
first_seq: Optional[int] = None
357+
355358
# Allow republish of the message after being sequenced and stored.
356359
republish: Optional[RePublish] = None
357360
subject_transform: Optional[SubjectTransform] = None

nats/tests/test_js.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5442,6 +5442,49 @@ async def test_fetch_pull_subscribe_bind(self):
54425442

54435443
await nc.close()
54445444

5445+
@async_test
5446+
async def test_stream_first_seq(self):
5447+
nc = await nats.connect()
5448+
5449+
js = nc.jetstream()
5450+
5451+
# Create a stream with first_seq set to 1000
5452+
await js.add_stream(
5453+
name="FIRSTSEQ",
5454+
subjects=["test"],
5455+
first_seq=1000,
5456+
)
5457+
5458+
# Publish some messages
5459+
ack1 = await js.publish("test", b"message 1")
5460+
assert ack1.seq == 1000
5461+
5462+
ack2 = await js.publish("test", b"message 2")
5463+
assert ack2.seq == 1001
5464+
5465+
ack3 = await js.publish("test", b"message 3")
5466+
assert ack3.seq == 1002
5467+
5468+
# Verify stream info shows the correct first_seq in state
5469+
sinfo = await js.stream_info("FIRSTSEQ")
5470+
assert sinfo.state.first_seq == 1000
5471+
assert sinfo.state.last_seq == 1002
5472+
assert sinfo.state.messages == 3
5473+
5474+
# Verify the config has first_seq set
5475+
assert sinfo.config.first_seq == 1000
5476+
5477+
# Test retrieving messages by sequence (reverse order to verify seeking)
5478+
msg = await js.get_msg("FIRSTSEQ", seq=1001)
5479+
assert msg.seq == 1001
5480+
assert msg.data == b"message 2"
5481+
5482+
msg = await js.get_msg("FIRSTSEQ", seq=1000)
5483+
assert msg.seq == 1000
5484+
assert msg.data == b"message 1"
5485+
5486+
await nc.close()
5487+
54455488

54465489
class BadStreamNamesTest(SingleJetStreamServerTestCase):
54475490
@async_test

0 commit comments

Comments
 (0)