Skip to content

fix(trogon-nats): preserve jetstream conflict detection#131

Merged
yordis merged 4 commits into
mainfrom
yordis/nats-conflicts
Apr 23, 2026
Merged

fix(trogon-nats): preserve jetstream conflict detection#131
yordis merged 4 commits into
mainfrom
yordis/nats-conflicts

Conversation

@yordis
Copy link
Copy Markdown
Member

@yordis yordis commented Apr 23, 2026

  • keep JetStream conflict classification reusable so bucket and stream provisioning continue to treat pre-existing resources consistently.
  • keep shared trait surfaces aligned with the underlying async-nats APIs so downstream code can propagate typed publish and subject-token errors without relying on concrete clients.

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@cursor
Copy link
Copy Markdown

cursor Bot commented Apr 23, 2026

PR Summary

Medium Risk
Medium risk because it changes public JetStream trait surfaces (new JetStreamPublishMessage and moved impls), which can impact downstream compilation/behavior; runtime logic changes are small and covered by focused tests.

Overview
Preserves reusable JetStream “already exists” conflict detection by extracting stream/KV create error classification into jetstream/create_conflicts.rs and reusing it from lease bucket provisioning.

Aligns the JetStream abstraction layer more closely with async-nats by adding JetStreamPublishMessage (publishing an OutboundMessage), implementing it for NatsJetStreamClient and jetstream::Context, and relocating consumer/stream trait impls into jetstream/traits.rs behind #[cfg(not(coverage))].

Improves error ergonomics by making SubjectTokenViolation implement Display + Error (with tests) and adds targeted unit tests for the new conflict helpers.

Reviewed by Cursor Bugbot for commit 36ce78f. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

Warning

Rate limit exceeded

@yordis has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 51 minutes and 15 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 51 minutes and 15 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dd374124-55b4-4abe-9924-26b53f7d3fb6

📥 Commits

Reviewing files that changed from the base of the PR and between 502bd3d and bcc6844.

📒 Files selected for processing (1)
  • rsworkspace/crates/trogon-nats/src/jetstream/traits.rs

Walkthrough

The PR reorganizes JetStream publishing and conflict detection logic. It adds a new JetStreamPublishMessage trait for publishing pre-built messages, updates NatsJetStreamClient to implement it while removing consumer trait implementations, centralizes "already exists" error detection into a reusable create_conflicts module, and adds Display and Error trait implementations to SubjectTokenViolation. Coverage-related conditional compilation gates are also introduced.

Changes

Cohort / File(s) Summary
JetStream message publishing
rsworkspace/crates/trogon-nats/src/jetstream/client.rs, rsworkspace/crates/trogon-nats/src/jetstream/traits.rs
Added JetStreamPublishMessage trait with associated types PublishError and AckFuture, implemented for both jetstream::Context and NatsJetStreamClient. Removed JetStreamCreateConsumer and JetStreamConsumer implementations from client. Added #[cfg(not(coverage))] gating to multiple trait implementations.
Conflict detection helpers
rsworkspace/crates/trogon-nats/src/jetstream/create_conflicts.rs
New module with predicates is_create_stream_already_exists() and is_create_key_value_already_exists() for classifying stream/bucket creation conflicts by inspecting error chains and error codes. Includes unit tests.
Module exports
rsworkspace/crates/trogon-nats/src/jetstream/mod.rs
Exposed new create_conflicts submodule and re-exported conflict detection predicates. Added JetStreamPublishMessage to exported traits list.
Lease provisioning refactor
rsworkspace/crates/trogon-nats/src/lease/provision.rs, rsworkspace/crates/trogon-nats/src/lease/mod.rs
Replaced local "already exists" detection logic with centralized crate::jetstream::is_create_key_value_already_exists(). Added #[cfg_attr(coverage, allow(dead_code))] annotations. Updated test imports.
Lease renewal coverage gates
rsworkspace/crates/trogon-nats/src/lease/renew.rs
Added #[cfg_attr(coverage, allow(dead_code))] annotations to internal items and #[cfg(not(coverage))] gating to RenewLease implementation.
Error formatting
rsworkspace/crates/trogon-nats/src/subject_token_violation.rs
Implemented Display and std::error::Error traits for SubjectTokenViolation, providing human-readable error messages with variant-specific details. Added comprehensive unit tests.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

rust:coverage-baseline-reset

Poem

🐰 A rabbit hops through jetstreams flowing,
Publishing messages, detection glowing,
Error traits now sing their tale,
Coverage gates both strong and hale,
Conflicts caught before they sail!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.74% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'fix(trogon-nats): preserve jetstream conflict detection' accurately summarizes the main change—preserving JetStream conflict detection capabilities across the codebase by extracting shared conflict-detection helpers.
Description check ✅ Passed The description clearly relates to the changeset by addressing two key objectives: maintaining consistent conflict detection for bucket/stream provisioning and aligning trait surfaces with async-nats APIs.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch yordis/nats-conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 23, 2026

badge

Code Coverage Summary

Details
Filename                                                                      Stmts    Miss  Cover    Missing
--------------------------------------------------------------------------  -------  ------  -------  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
crates/acp-nats/src/agent/set_session_model.rs                                   67       0  100.00%
crates/acp-nats/src/agent/set_session_mode.rs                                    67       0  100.00%
crates/acp-nats/src/agent/ext_notification.rs                                    82       0  100.00%
crates/acp-nats/src/agent/ext_method.rs                                          82       0  100.00%
crates/acp-nats/src/agent/bridge.rs                                             123       4  96.75%   108-111
crates/acp-nats/src/agent/load_session.rs                                        89       0  100.00%
crates/acp-nats/src/agent/mod.rs                                                 65       0  100.00%
crates/acp-nats/src/agent/initialize.rs                                          79       0  100.00%
crates/acp-nats/src/agent/set_session_config_option.rs                           67       0  100.00%
crates/acp-nats/src/agent/authenticate.rs                                        49       0  100.00%
crates/acp-nats/src/agent/resume_session.rs                                      90       0  100.00%
crates/acp-nats/src/agent/test_support.rs                                       267       0  100.00%
crates/acp-nats/src/agent/logout.rs                                              49       0  100.00%
crates/acp-nats/src/agent/fork_session.rs                                        94       0  100.00%
crates/acp-nats/src/agent/close_session.rs                                       63       0  100.00%
crates/acp-nats/src/agent/js_request.rs                                         283       0  100.00%
crates/acp-nats/src/agent/list_sessions.rs                                       47       0  100.00%
crates/acp-nats/src/agent/prompt.rs                                             471       0  100.00%
crates/acp-nats/src/agent/new_session.rs                                         82       0  100.00%
crates/acp-nats/src/agent/cancel.rs                                             101       0  100.00%
crates/trogon-source-github/src/config.rs                                        17       0  100.00%
crates/trogon-source-github/src/server.rs                                       328       0  100.00%
crates/trogon-source-github/src/signature.rs                                     61       0  100.00%
crates/acp-nats/src/nats/subjects/commands/resume.rs                             15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_model.rs                          15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_config_option.rs                  15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/prompt.rs                             15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/load.rs                               15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/set_mode.rs                           15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/fork.rs                               15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/cancel.rs                             15       0  100.00%
crates/acp-nats/src/nats/subjects/commands/close.rs                              15       0  100.00%
crates/trogon-source-notion/src/signature.rs                                     56       1  98.21%   32
crates/trogon-source-notion/src/notion_verification_token.rs                     17       0  100.00%
crates/trogon-source-notion/src/notion_event_type.rs                             46       3  93.48%   47-49
crates/trogon-source-notion/src/server.rs                                       318       8  97.48%   92-96, 129-130, 149-150
crates/acp-telemetry/src/trace.rs                                                30       3  90.00%   21-22, 30
crates/acp-telemetry/src/lib.rs                                                 165      28  83.03%   28-34, 56-59, 94, 99, 104, 118-133, 170, 173, 176, 182
crates/acp-telemetry/src/log.rs                                                  67       1  98.51%   41
crates/acp-telemetry/src/service_name.rs                                         38       0  100.00%
crates/acp-telemetry/src/metric.rs                                               33       3  90.91%   28-29, 37
crates/acp-telemetry/src/signal.rs                                                7       1  85.71%   43
crates/trogon-nats/src/lease/lease_timing.rs                                     15       0  100.00%
crates/trogon-nats/src/lease/lease_config_error.rs                               11       0  100.00%
crates/trogon-nats/src/lease/provision.rs                                       177       0  100.00%
crates/trogon-nats/src/lease/release.rs                                           5       5  0.00%    8-12
crates/trogon-nats/src/lease/renew.rs                                           234       7  97.01%   24-30
crates/trogon-nats/src/lease/lease_key.rs                                        19       0  100.00%
crates/trogon-nats/src/lease/renew_interval.rs                                   61       0  100.00%
crates/trogon-nats/src/lease/acquire.rs                                           5       5  0.00%    9-14
crates/trogon-nats/src/lease/mod.rs                                             561      13  97.68%   180-193
crates/trogon-nats/src/lease/ttl.rs                                              73       0  100.00%
crates/trogon-nats/src/lease/lease_bucket.rs                                     19       0  100.00%
crates/trogon-nats/src/lease/nats_kv_lease_config.rs                             26       0  100.00%
crates/acp-nats/src/nats/subjects/mod.rs                                        362       0  100.00%
crates/acp-nats/src/nats/subjects/stream.rs                                      56       0  100.00%
crates/trogon-nats/src/jetstream/mocks.rs                                       670      32  95.22%   364-378, 384-392, 407-413, 427-430, 494-496
crates/trogon-nats/src/jetstream/claim_check.rs                                 346       0  100.00%
crates/trogon-nats/src/jetstream/stream_max_age.rs                               18       0  100.00%
crates/trogon-nats/src/jetstream/create_conflicts.rs                             24       0  100.00%
crates/trogon-nats/src/jetstream/publish.rs                                      64       0  100.00%
crates/trogon-source-linear/src/server.rs                                       386       0  100.00%
crates/trogon-source-linear/src/config.rs                                        17       0  100.00%
crates/trogon-source-linear/src/signature.rs                                     54       1  98.15%   16
crates/acp-nats/src/nats/subjects/client_ops/terminal_create.rs                  12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_request_permission.rs       12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/session_update.rs                   12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_write_text_file.rs               12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_output.rs                  12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/fs_read_text_file.rs                12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_wait_for_exit.rs           12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_release.rs                 12       0  100.00%
crates/acp-nats/src/nats/subjects/client_ops/terminal_kill.rs                    12       0  100.00%
crates/acp-nats-stdio/src/main.rs                                               135      25  81.48%   56, 104-111, 117-119, 136, 165-184
crates/acp-nats-stdio/src/config.rs                                              66       0  100.00%
crates/trogon-source-gitlab/src/config.rs                                        17       0  100.00%
crates/trogon-source-gitlab/src/server.rs                                       397       0  100.00%
crates/trogon-source-gitlab/src/signature.rs                                     28       0  100.00%
crates/trogon-source-incidentio/src/config.rs                                    16       0  100.00%
crates/trogon-source-incidentio/src/incidentio_event_type.rs                     62       0  100.00%
crates/trogon-source-incidentio/src/signature.rs                                369       0  100.00%
crates/trogon-source-incidentio/src/server.rs                                   343       0  100.00%
crates/trogon-source-incidentio/src/incidentio_signing_secret.rs                 67       0  100.00%
crates/trogon-std/src/duration.rs                                                45       0  100.00%
crates/trogon-std/src/json.rs                                                    30       0  100.00%
crates/trogon-std/src/http.rs                                                    19       0  100.00%
crates/trogon-std/src/secret_string.rs                                           35       0  100.00%
crates/trogon-std/src/args.rs                                                    10       0  100.00%
crates/trogon-std/src/fs/mem.rs                                                 216      10  95.37%   61-63, 77-79, 132-134, 157
crates/trogon-std/src/fs/system.rs                                               92       0  100.00%
crates/acp-nats-agent/src/connection.rs                                        1270       1  99.92%   607
crates/trogon-std/src/time/system.rs                                             31       0  100.00%
crates/trogon-std/src/time/mock.rs                                              125       0  100.00%
crates/acp-nats/src/jetstream/ext_policy.rs                                      26       0  100.00%
crates/acp-nats/src/jetstream/provision.rs                                       53       0  100.00%
crates/acp-nats/src/jetstream/streams.rs                                        163       4  97.55%   206-208, 218
crates/acp-nats/src/jetstream/consumers.rs                                       91       0  100.00%
crates/acp-nats/src/nats/subjects/responses/update.rs                            27       0  100.00%
crates/acp-nats/src/nats/subjects/responses/prompt_response.rs                   27       0  100.00%
crates/acp-nats/src/nats/subjects/responses/response.rs                          20       0  100.00%
crates/acp-nats/src/nats/subjects/responses/cancelled.rs                         15       0  100.00%
crates/acp-nats/src/nats/subjects/responses/ext_ready.rs                         12       0  100.00%
crates/acp-nats/src/nats/subjects/global/authenticate.rs                          6       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_list.rs                          6       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext_notify.rs                            9       0  100.00%
crates/acp-nats/src/nats/subjects/global/session_new.rs                           6       0  100.00%
crates/acp-nats/src/nats/subjects/global/ext.rs                                   9       0  100.00%
crates/acp-nats/src/nats/subjects/global/initialize.rs                            6       0  100.00%
crates/acp-nats/src/nats/subjects/global/logout.rs                                6       0  100.00%
crates/trogon-std/src/dirs/fixed.rs                                              80       0  100.00%
crates/trogon-std/src/dirs/system.rs                                             71       0  100.00%
crates/trogon-std/src/env/system.rs                                              17       0  100.00%
crates/trogon-std/src/env/in_memory.rs                                           73       0  100.00%
crates/trogon-source-slack/src/signature.rs                                      77       0  100.00%
crates/trogon-source-slack/src/config.rs                                         17       0  100.00%
crates/trogon-source-slack/src/server.rs                                        863       0  100.00%
crates/trogon-source-sentry/src/sentry_client_secret.rs                          17       0  100.00%
crates/trogon-source-sentry/src/server.rs                                       311       0  100.00%
crates/trogon-source-sentry/src/signature.rs                                     54       0  100.00%
crates/acp-nats/src/nats/mod.rs                                                  23       0  100.00%
crates/acp-nats/src/nats/parsing.rs                                             278       1  99.64%   151
crates/acp-nats/src/nats/extensions.rs                                            3       0  100.00%
crates/trogon-source-discord/src/config.rs                                      108       0  100.00%
crates/trogon-source-discord/src/gateway.rs                                     426       1  99.77%   137
crates/trogon-service-config/src/lib.rs                                          92       0  100.00%
crates/trogon-source-twitter/src/signature.rs                                    69       0  100.00%
crates/trogon-source-twitter/src/config.rs                                       17       0  100.00%
crates/trogon-source-twitter/src/server.rs                                      525       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent.rs                      9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_agent.rs                     15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_agent_ext.rs                  9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/global_all.rs                     9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_client.rs                     9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/prompt_wildcard.rs                9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/all_session.rs                    9       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_client.rs                    15       0  100.00%
crates/acp-nats/src/nats/subjects/subscriptions/one_session.rs                   12       0  100.00%
crates/acp-nats/src/telemetry/metrics.rs                                         53       0  100.00%
crates/trogon-nats/src/subject_token_violation.rs                                17       0  100.00%
crates/trogon-nats/src/auth.rs                                                  114       0  100.00%
crates/trogon-nats/src/token.rs                                                   6       0  100.00%
crates/trogon-nats/src/messaging.rs                                             561       2  99.64%   144, 154
crates/trogon-nats/src/mocks.rs                                                 284       0  100.00%
crates/trogon-nats/src/nats_token.rs                                            157       0  100.00%
crates/trogon-nats/src/connect.rs                                                94       9  90.43%   22-23, 33, 60-65
crates/trogon-nats/src/client.rs                                                 22      22  0.00%    50-86
crates/trogon-nats/src/telemetry/messaging.rs                                    82       0  100.00%
crates/acp-nats/src/config.rs                                                   203       0  100.00%
crates/acp-nats/src/error.rs                                                     82       0  100.00%
crates/acp-nats/src/session_id.rs                                                71       0  100.00%
crates/acp-nats/src/jsonrpc.rs                                                    6       0  100.00%
crates/acp-nats/src/client_proxy.rs                                             186       0  100.00%
crates/acp-nats/src/ext_method_name.rs                                           68       0  100.00%
crates/acp-nats/src/lib.rs                                                       69       0  100.00%
crates/acp-nats/src/pending_prompt_waiters.rs                                   134       0  100.00%
crates/acp-nats/src/req_id.rs                                                    39       0  100.00%
crates/acp-nats/src/acp_prefix.rs                                                50       0  100.00%
crates/acp-nats/src/in_flight_slot_guard.rs                                      32       0  100.00%
crates/trogon-gateway/src/main.rs                                                 4       0  100.00%
crates/trogon-gateway/src/streams.rs                                            138       0  100.00%
crates/trogon-gateway/src/source_status.rs                                       28       0  100.00%
crates/trogon-gateway/src/config.rs                                            1639       0  100.00%
crates/trogon-gateway/src/http.rs                                               110       0  100.00%
crates/acp-nats-server/src/config.rs                                            137       9  93.43%   41, 50-61
crates/acp-nats-server/src/connection.rs                                        171      32  81.29%   76-83, 88-99, 115, 117-118, 123, 132-133, 138, 142, 146, 149, 157, 161, 164, 167-171, 207
crates/acp-nats-server/src/main.rs                                              791      10  98.74%   96, 226-233, 387
crates/acp-nats-server/src/transport.rs                                        1949     141  92.77%   216-221, 294, 476-477, 487, 511, 545-546, 555-556, 564-572, 595-600, 651, 670, 675, 694, 706, 836, 854, 877-879, 931, 948-951, 1161, 1164, 1167, 1176, 1180, 1183, 1186-1189, 1207, 1236-1239, 1249-1254, 1272-1276, 1285-1294, 1303-1322, 1332-1333, 1343, 1372, 1382, 1401, 1422-1428, 1431-1435, 1438-1443, 1453-1455, 1464, 1466-1467, 1549-1550, 1562-1563, 1585-1586, 1638-1654, 1693, 1970, 2008, 2031, 2354, 2397, 2450, 2518, 2530
crates/acp-nats-server/src/acp_connection_id.rs                                  45       0  100.00%
crates/trogon-source-telegram/src/config.rs                                      17       0  100.00%
crates/trogon-source-telegram/src/server.rs                                     338       0  100.00%
crates/trogon-source-telegram/src/signature.rs                                   32       0  100.00%
crates/acp-nats/src/client/ext.rs                                               308       8  97.40%   163-172, 189-198
crates/acp-nats/src/client/mod.rs                                              2851       0  100.00%
crates/acp-nats/src/client/rpc_reply.rs                                          64       0  100.00%
crates/acp-nats/src/client/terminal_wait_for_exit.rs                            378       0  100.00%
crates/acp-nats/src/client/ext_session_prompt_response.rs                       135       0  100.00%
crates/acp-nats/src/client/terminal_create.rs                                   274       0  100.00%
crates/acp-nats/src/client/fs_read_text_file.rs                                 356       0  100.00%
crates/acp-nats/src/client/request_permission.rs                                308       0  100.00%
crates/acp-nats/src/client/session_update.rs                                     55       0  100.00%
crates/acp-nats/src/client/terminal_kill.rs                                     290       0  100.00%
crates/acp-nats/src/client/fs_write_text_file.rs                                418       0  100.00%
crates/acp-nats/src/client/terminal_output.rs                                   206       0  100.00%
crates/acp-nats/src/client/terminal_release.rs                                  347       0  100.00%
crates/trogon-std/src/telemetry/http.rs                                         217       0  100.00%
TOTAL                                                                         27954     390  98.60%

Diff against main

Filename                                                Stmts    Miss  Cover
----------------------------------------------------  -------  ------  --------
crates/trogon-nats/src/lease/provision.rs                 -24     -10  +4.98%
crates/trogon-nats/src/lease/renew.rs                     -12     -12  +4.73%
crates/trogon-nats/src/jetstream/create_conflicts.rs      +24       0  +100.00%
crates/trogon-nats/src/subject_token_violation.rs         +17       0  +100.00%
TOTAL                                                      +5     -22  +0.20%

Results for commit: 36ce78f

Minimum allowed coverage is 95%

♻️ This comment has been updated with latest results

Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
rsworkspace/crates/trogon-nats/src/jetstream/create_conflicts.rs (1)

14-22: Implementation is correct for async-nats 0.47.0; consider defensive guards for future wrapping.

The source chain works as documented: CreateKeyValueError::with_source(BucketCreate, CreateStreamError) stores the stream error as the direct source, so one-level traversal via std::error::Error::source() followed by downcast_ref::<CreateStreamError>() is correct. Tests confirm this behavior.

However, if async-nats ever wraps the source in an intermediate adapter type, downcast_ref() will silently return None and this function would incorrectly report "not already exists" — stopping the fallback to get_key_value for legitimate bucket-exists conflicts.

Two optional defensive measures:

  • Add a negative test asserting false when CreateKeyValueError::BucketCreate wraps a CreateStreamError with a different error code (the existing TimedOut test in lease/mod.rs covers one such case).
  • On async-nats upgrades, verify that CreateKeyValueError's source chain still yields CreateStreamError at depth 1.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@rsworkspace/crates/trogon-nats/src/jetstream/traits.rs`:
- Around line 214-225: The impl for JetStreamPublishMessage on
jetstream::Context currently calls the trait-qualified
context::traits::Publisher::publish_message(self, message); change this to use
the inherent method form used elsewhere (call
jetstream::Context::publish_message(self, message) or simply
self.publish_message(message)) so the implementation matches the file's pattern
and uses the stable async-nats API; update the body of pub fn publish_message in
the impl to call the inherent method and keep the return type and error types
unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8fcb85aa-e8c4-4a86-bd16-030eb005442e

📥 Commits

Reviewing files that changed from the base of the PR and between f0db40d and 502bd3d.

📒 Files selected for processing (8)
  • rsworkspace/crates/trogon-nats/src/jetstream/client.rs
  • rsworkspace/crates/trogon-nats/src/jetstream/create_conflicts.rs
  • rsworkspace/crates/trogon-nats/src/jetstream/mod.rs
  • rsworkspace/crates/trogon-nats/src/jetstream/traits.rs
  • rsworkspace/crates/trogon-nats/src/lease/mod.rs
  • rsworkspace/crates/trogon-nats/src/lease/provision.rs
  • rsworkspace/crates/trogon-nats/src/lease/renew.rs
  • rsworkspace/crates/trogon-nats/src/subject_token_violation.rs

Comment thread rsworkspace/crates/trogon-nats/src/jetstream/traits.rs
yordis added 2 commits April 23, 2026 02:03
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
@yordis yordis merged commit fd78260 into main Apr 23, 2026
7 checks passed
@yordis yordis deleted the yordis/nats-conflicts branch April 23, 2026 06:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant