Skip to content

refactor: runtime defaults into settings#219

Merged
artrixdotdev merged 4 commits into
mainfrom
refactor/client-configurable-settings
Jul 2, 2026
Merged

refactor: runtime defaults into settings#219
artrixdotdev merged 4 commits into
mainfrom
refactor/client-configurable-settings

Conversation

@artrixdotdev

@artrixdotdev artrixdotdev commented Jul 1, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add public Settings types for engine, torrent, peer, and tracker runtime defaults
  • Thread settings through engine, torrent, peer, tracker, and UDP/HTTP tracker construction
  • Keep protocol/BEP wire constants local while preserving existing defaults and builder overrides

Tests

  • cargo test

Summary by CodeRabbit

  • New Features

    • Added configurable runtime settings for engine, torrent, peer, and tracker behavior.
    • Exposed the new settings in the public API for easier customization.
  • Bug Fixes

    • Replaced several fixed timeouts, retry limits, and concurrency values with configurable defaults.
    • Improved tracker and peer handling to better respect configured connection and announce timing.
  • Refactor

    • Consolidated runtime configuration into shared settings across engine, torrent, peer, and tracker components.

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@artrixdotdev, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 30 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 48373613-60f6-4ae3-8c82-164d12baf937

📥 Commits

Reviewing files that changed from the base of the PR and between 96d65d9 and 4ea2305.

📒 Files selected for processing (11)
  • crates/libtortillas/src/engine/actor.rs
  • crates/libtortillas/src/engine/messages.rs
  • crates/libtortillas/src/engine/mod.rs
  • crates/libtortillas/src/lib.rs
  • crates/libtortillas/src/peer/actor.rs
  • crates/libtortillas/src/settings.rs
  • crates/libtortillas/src/torrent/actor.rs
  • crates/libtortillas/src/torrent/choking_flow.rs
  • crates/libtortillas/src/torrent/piece_flow.rs
  • crates/libtortillas/src/tracker/actor.rs
  • crates/libtortillas/src/tracker/udp.rs

Walkthrough

This PR introduces a centralized Settings module (EngineSettings, TorrentSettings, PeerSettings, TrackerSettings) and replaces scattered hardcoded constants and per-field arguments across engine, peer, torrent, and tracker actors with configuration read from Settings, including new *_with_settings constructors for trackers.

Changes

Settings-driven configuration refactor

Layer / File(s) Summary
Settings module and public export
crates/libtortillas/src/settings.rs, crates/libtortillas/src/lib.rs
New Settings struct with EngineSettings, TorrentSettings, PeerSettings, TrackerSettings, each with Default impls; module is declared and re-exported via the crate prelude.
Engine actor and Engine::new wiring
crates/libtortillas/src/engine/actor.rs, crates/libtortillas/src/engine/messages.rs, crates/libtortillas/src/engine/mod.rs
EngineActor/EngineActorArgs replace mailbox_size/autostart/sufficient_peers with a single settings field; bind addresses, UDP server buffer size, handshake timeout, and torrent restart limits now derive from settings; Engine::new accepts an optional Settings.
PeerActor settings wiring
crates/libtortillas/src/peer/actor.rs
PeerActor gains a settings: PeerSettings field used for pending message capacity, keepalive timeout, and disconnect timeout.
TorrentActor settings wiring
crates/libtortillas/src/torrent/actor.rs, .../choking.rs, .../choking_flow.rs, .../messages.rs, .../swarm.rs, .../piece_flow.rs
TorrentActor/TorrentActorArgs carry Settings, driving request window sizing, rechoke interval, restart policies, choking scheduler defaults, peer-stats timeout/concurrency, max in-flight limits, mailbox sizing, and broadcast concurrency; tests updated with Settings::default().
Tracker actor, HTTP, UDP, and model settings wiring
crates/libtortillas/src/tracker/actor.rs, .../http.rs, .../udp.rs, .../model.rs, .../mod.rs
TrackerActorArgs carries TrackerSettings; HttpTracker/UdpTracker gain new_with_settings constructors; TrackerRequest.compact becomes required; UdpServer::new_with_receive_buffer_size added; connect/message timeouts, backoff, retry attempts, and announce parameters now come from settings.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant Engine
  participant EngineActor
  participant TorrentActor
  participant TrackerActor
  Caller->>Engine: new(settings: Option<Settings>)
  Engine->>Engine: settings.unwrap_or_default()
  Engine->>EngineActor: spawn(EngineActorArgs { settings })
  EngineActor->>EngineActor: bind sockets, UDP server from settings
  EngineActor->>TorrentActor: spawn(TorrentActorArgs { settings })
  TorrentActor->>TrackerActor: spawn(TrackerActorArgs { settings: settings.tracker })
  TrackerActor->>TrackerActor: schedule_next_announce using settings
Loading

Possibly related PRs

  • artrixdotdev/tortillas#76: Both PRs modify the TrackerRequest compact query field behavior in tracker/http.rs.
  • artrixdotdev/tortillas#84: Both PRs modify UdpServer/TrackerInstance tracker construction flow now wired via TrackerSettings and new_with_settings constructors.
  • artrixdotdev/tortillas#218: Both PRs modify torrent/choking.rs and torrent/choking_flow.rs, refactoring choking scheduling and peer-stats timeouts to use configuration values.

Suggested labels: enhancement, med prio, refactor

Suggested reviewers: kurealnum

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main refactor: moving runtime defaults into settings.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/client-configurable-settings

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.

@artrixdotdev artrixdotdev changed the title Refactor runtime defaults into settings refactor: runtime defaults into settings Jul 1, 2026
@artrixdotdev

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot added enhancement New feature or request med prio Medium Priority refactor Neither fixes a bug nor adds a feature labels Jul 1, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
crates/libtortillas/src/peer/actor.rs (1)

443-460: 🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Add a timer path for idle-peer keepalive/disconnect.

These checks run only before the actor blocks on mailbox or stream receive. If a peer becomes fully silent, nothing wakes this loop at keepalive_timeout or disconnect_timeout, so stale peer actors can remain open indefinitely. Add a timeout/sleep branch in the receive loop or schedule a self-message for the next deadline.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/peer/actor.rs` around lines 443 - 460, The idle-peer
keepalive/disconnect checks in actor receive flow are only evaluated when the
loop wakes for mailbox or stream activity, so silent peers can never trigger
them. Update the peer actor logic in actor.rs around the receive loop and the
last_message/keepalive_timeout/disconnect_timeout handling to add an explicit
timer path, either by sleeping until the next deadline or by scheduling a
self-message, so the actor wakes up even with no inbound traffic and can send
KeepAlive or stop the peer.
crates/libtortillas/src/torrent/choking_flow.rs (1)

53-84: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Clamp peer_stats_concurrency to at least 1.

buffer_unordered(0) stops this stream from making progress, so a custom Settings value of 0 can hang peer_stats() and stall rechoke_peers(). Clamp it before passing it into buffer_unordered.

Proposed fix
-         .buffer_unordered(self.settings.torrent.peer_stats_concurrency)
+         .buffer_unordered(self.settings.torrent.peer_stats_concurrency.max(1))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/torrent/choking_flow.rs` around lines 53 - 84, The
peer stats collection in peer_stats() can hang if torrent.peer_stats_concurrency
is set to 0 because buffer_unordered(0) makes the stream stop progressing. Clamp
the configured concurrency to at least 1 before passing it into
buffer_unordered, using the peer_stats() flow in choking_flow.rs so
rechoke_peers() always completes.
crates/libtortillas/src/tracker/udp.rs (1)

691-730: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Transaction registered in response_channels can leak on future cancellation.

register_transaction is paired with unregister_transaction via sequential .await calls, with no cleanup guard. If the future driving send_and_recv_retry is dropped mid-flight — which happens whenever an enclosing tokio::time::timeout fires while a request is in-flight (e.g. connect()'s timeout(connect_timeout, self.send_and_wait(request)) below, or the actor's timeout(self.settings.stop_timeout, self.tracker.stop()) in tracker/actor.rs) — execution never reaches the unregister_transaction call after recv_registered_response. The entry stays in UdpServer::response_channels (a DashMap) indefinitely, since nothing else ever removes it. Over time (repeated timeouts under degraded network conditions), this accumulates unbounded entries.

Now that udp_connect_timeout/stop_timeout are independently user-configurable via TrackerSettings (rather than tuned, fixed constants), a short timeout relative to the retry/backoff budget makes this cancellation path far more likely to be hit in practice.

🛡️ Suggested fix — use a cleanup guard so unregistration always runs, even on cancellation
   async fn send_and_recv_retry(
      &self, message: &TrackerRequest, transaction_id: &TransactionId,
   ) -> anyhow::Result<TrackerResponse, RetryError<TrackerActorError>> {
      let message_bytes = message.to_bytes();
      let (response_tx, mut response_rx) = mpsc::unbounded_channel();

      self
         .server
         .register_transaction(*transaction_id, response_tx)
         .await;
+     struct UnregisterGuard<'a> {
+        server: &'a UdpServer,
+        transaction_id: TransactionId,
+     }
+     impl Drop for UnregisterGuard<'_> {
+        fn drop(&mut self) {
+           let server = self.server.clone();
+           let transaction_id = self.transaction_id;
+           tokio::spawn(async move {
+              server.unregister_transaction(&transaction_id).await;
+           });
+        }
+     }
+     let _guard = UnregisterGuard { server: &self.server, transaction_id: *transaction_id };

      // Send the message through the shared message receiver
      let send_result = self.server.send_message(&message_bytes, self.addr).await;

      if let Err(err) = send_result {
-        self.server.unregister_transaction(transaction_id).await;
         return Err(RetryError::Permanent(err));
      }
      ...
-     let response = self
-        .recv_registered_response(transaction_id, &mut response_rx)
-        .await;
-     self.server.unregister_transaction(transaction_id).await;
-     response
+     self
+        .recv_registered_response(transaction_id, &mut response_rx)
+        .await
   }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/tracker/udp.rs` around lines 691 - 730,
`send_and_recv_retry` leaves a registered transaction in
`UdpServer::response_channels` if the future is cancelled before the final
`unregister_transaction` runs. Add a cleanup guard in `send_and_recv_retry` (or
a small RAII helper scoped around
`register_transaction`/`recv_registered_response`) so
`unregister_transaction(transaction_id)` is always executed even on
timeout/cancellation, while preserving the existing early-unregister path on
`send_message` failure.
crates/libtortillas/src/tracker/actor.rs (1)

146-161: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Unclamped delay when tracker interval is still at its sentinel default.

Duration::from_secs(self.tracker.interval() as u64).max(self.settings.minimum_announce_interval) only enforces a lower bound. HttpTracker/UdpTracker initialize interval to usize::MAX/u32::MAX (see crates/libtortillas/src/tracker/http.rs interval: Arc::new(usize::MAX.into()) and crates/libtortillas/src/tracker/udp.rs interval: Arc::new(AtomicU32::new(u32::MAX))), and announce() only updates the interval on a successful response. If the very first announce fails, schedule_next_announce computes a delay on the order of u32::MAX/usize::MAX seconds, effectively disabling all further announces/re-tries for that tracker for the lifetime of the actor.

🐛 Suggested fix
-      let delay = Duration::from_secs(self.tracker.interval() as u64)
-         .max(self.settings.minimum_announce_interval);
+      let interval_secs = self.tracker.interval();
+      let delay = if interval_secs == u32::MAX as usize || interval_secs == usize::MAX {
+         self.settings.minimum_announce_interval
+      } else {
+         Duration::from_secs(interval_secs as u64).max(self.settings.minimum_announce_interval)
+      };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/tracker/actor.rs` around lines 146 - 161, In
TrackerActor::schedule_next_announce, the delay only has a lower bound today, so
the sentinel default from HttpTracker/UdpTracker can produce an absurdly large
timeout on the first failed announce. Update the delay calculation to also clamp
or replace sentinel/default interval values from self.tracker.interval() before
calling SetTimeout::new, using a sane maximum (or a fallback announce interval)
so retries continue normally. Keep the existing minimum_announce_interval
behavior and preserve the abort-and-reschedule flow in schedule_next_announce.
🧹 Nitpick comments (3)
crates/libtortillas/src/settings.rs (2)

17-25: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚖️ Poor tradeoff

Repeated restart-policy and backoff shape could be extracted.

(limit: u32, period: Duration) is duplicated four times (EngineSettings.torrent_restart_*, and TorrentSettings.scheduler_restart_*, tracker_restart_*, piece_store_restart_*), and the UDP backoff fields in TrackerSettings (udp_retry_initial_delay/factor/max_delay/attempts) form another repeated shape. A small reusable type (e.g. RestartPolicySettings { limit: u32, period: Duration }) would reduce duplication, though this would ripple into the actor files that already destructure these fields directly.

Also applies to: 42-61, 106-124

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/settings.rs` around lines 17 - 25, Extract the
repeated restart-policy shape into a reusable settings type, since
EngineSettings, TorrentSettings, and related actor destructuring all duplicate
the same limit/period pair. Introduce a shared RestartPolicySettings (or
equivalent) and replace the torrent_restart_*, scheduler_restart_*,
tracker_restart_*, and piece_store_restart_* fields with it, then update the
corresponding constructors and destructuring sites in the settings and actor
code to use the new type. If you also address the TrackerSettings retry/backoff
fields, consider a second reusable backoff config type for the udp_retry_*
group.

17-148: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Public settings fields lack per-field documentation.

All four settings structs expose public fields with no doc comments explaining units/semantics (e.g. is stop_timeout vs http_stop_timeout a fallback vs override? what unit is udp_announce_key?). Since this is a new public API surface, brief doc comments would help consumers.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/settings.rs` around lines 17 - 148, The public fields
on EngineSettings, TorrentSettings, PeerSettings, and TrackerSettings are
exposed without per-field documentation, making the new API hard to use
correctly. Add brief doc comments to each public field in these structs,
especially clarifying units, defaults, and semantics for ambiguous values like
stop_timeout versus http_stop_timeout and raw tracker/UDP fields such as
udp_announce_key and udp_announce_ip_address. Keep the documentation close to
the field definitions so the meaning is clear when reading EngineSettings,
TorrentSettings, PeerSettings, and TrackerSettings.
crates/libtortillas/src/engine/mod.rs (1)

111-134: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Clarify precedence between settings and legacy builder options.

These docs still say None uses fixed defaults, but now None preserves values from the supplied Settings; only Some(...) overrides them. Please document that precedence to avoid surprising builder users.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/libtortillas/src/engine/mod.rs` around lines 111 - 134, Update the
documentation for the builder options in engine/mod.rs to reflect the actual
precedence between `Settings` and the legacy fields: `mailbox_size`,
`autostart`, and `sufficient_peers` should be described as overriding the
supplied `Settings` only when set to `Some(...)`, while `None` preserves the
corresponding value from `Settings` instead of falling back to a fixed default.
Keep the wording aligned with the existing field docs so users understand that
builder values take precedence only when explicitly provided.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/libtortillas/src/engine/actor.rs`:
- Around line 143-147: The UDP startup path in actor initialization currently
panics because UdpServer::new_with_receive_buffer_size unwraps UdpSocket::bind
instead of returning an error. Update UdpServer::new_with_receive_buffer_size to
return a Result and propagate bind failures, then handle that Result in the
actor startup code alongside the TCP/uTP setup by mapping it to
EngineError::NetworkSetupFailed.

---

Outside diff comments:
In `@crates/libtortillas/src/peer/actor.rs`:
- Around line 443-460: The idle-peer keepalive/disconnect checks in actor
receive flow are only evaluated when the loop wakes for mailbox or stream
activity, so silent peers can never trigger them. Update the peer actor logic in
actor.rs around the receive loop and the
last_message/keepalive_timeout/disconnect_timeout handling to add an explicit
timer path, either by sleeping until the next deadline or by scheduling a
self-message, so the actor wakes up even with no inbound traffic and can send
KeepAlive or stop the peer.

In `@crates/libtortillas/src/torrent/choking_flow.rs`:
- Around line 53-84: The peer stats collection in peer_stats() can hang if
torrent.peer_stats_concurrency is set to 0 because buffer_unordered(0) makes the
stream stop progressing. Clamp the configured concurrency to at least 1 before
passing it into buffer_unordered, using the peer_stats() flow in choking_flow.rs
so rechoke_peers() always completes.

In `@crates/libtortillas/src/tracker/actor.rs`:
- Around line 146-161: In TrackerActor::schedule_next_announce, the delay only
has a lower bound today, so the sentinel default from HttpTracker/UdpTracker can
produce an absurdly large timeout on the first failed announce. Update the delay
calculation to also clamp or replace sentinel/default interval values from
self.tracker.interval() before calling SetTimeout::new, using a sane maximum (or
a fallback announce interval) so retries continue normally. Keep the existing
minimum_announce_interval behavior and preserve the abort-and-reschedule flow in
schedule_next_announce.

In `@crates/libtortillas/src/tracker/udp.rs`:
- Around line 691-730: `send_and_recv_retry` leaves a registered transaction in
`UdpServer::response_channels` if the future is cancelled before the final
`unregister_transaction` runs. Add a cleanup guard in `send_and_recv_retry` (or
a small RAII helper scoped around
`register_transaction`/`recv_registered_response`) so
`unregister_transaction(transaction_id)` is always executed even on
timeout/cancellation, while preserving the existing early-unregister path on
`send_message` failure.

---

Nitpick comments:
In `@crates/libtortillas/src/engine/mod.rs`:
- Around line 111-134: Update the documentation for the builder options in
engine/mod.rs to reflect the actual precedence between `Settings` and the legacy
fields: `mailbox_size`, `autostart`, and `sufficient_peers` should be described
as overriding the supplied `Settings` only when set to `Some(...)`, while `None`
preserves the corresponding value from `Settings` instead of falling back to a
fixed default. Keep the wording aligned with the existing field docs so users
understand that builder values take precedence only when explicitly provided.

In `@crates/libtortillas/src/settings.rs`:
- Around line 17-25: Extract the repeated restart-policy shape into a reusable
settings type, since EngineSettings, TorrentSettings, and related actor
destructuring all duplicate the same limit/period pair. Introduce a shared
RestartPolicySettings (or equivalent) and replace the torrent_restart_*,
scheduler_restart_*, tracker_restart_*, and piece_store_restart_* fields with
it, then update the corresponding constructors and destructuring sites in the
settings and actor code to use the new type. If you also address the
TrackerSettings retry/backoff fields, consider a second reusable backoff config
type for the udp_retry_* group.
- Around line 17-148: The public fields on EngineSettings, TorrentSettings,
PeerSettings, and TrackerSettings are exposed without per-field documentation,
making the new API hard to use correctly. Add brief doc comments to each public
field in these structs, especially clarifying units, defaults, and semantics for
ambiguous values like stop_timeout versus http_stop_timeout and raw tracker/UDP
fields such as udp_announce_key and udp_announce_ip_address. Keep the
documentation close to the field definitions so the meaning is clear when
reading EngineSettings, TorrentSettings, PeerSettings, and TrackerSettings.
🪄 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: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d470123c-e032-4c08-ba27-79bed9b0b760

📥 Commits

Reviewing files that changed from the base of the PR and between 6453ac0 and 96d65d9.

📒 Files selected for processing (17)
  • crates/libtortillas/src/engine/actor.rs
  • crates/libtortillas/src/engine/messages.rs
  • crates/libtortillas/src/engine/mod.rs
  • crates/libtortillas/src/lib.rs
  • crates/libtortillas/src/peer/actor.rs
  • crates/libtortillas/src/settings.rs
  • crates/libtortillas/src/torrent/actor.rs
  • crates/libtortillas/src/torrent/choking.rs
  • crates/libtortillas/src/torrent/choking_flow.rs
  • crates/libtortillas/src/torrent/messages.rs
  • crates/libtortillas/src/torrent/piece_flow.rs
  • crates/libtortillas/src/torrent/swarm.rs
  • crates/libtortillas/src/tracker/actor.rs
  • crates/libtortillas/src/tracker/http.rs
  • crates/libtortillas/src/tracker/mod.rs
  • crates/libtortillas/src/tracker/model.rs
  • crates/libtortillas/src/tracker/udp.rs

Comment thread crates/libtortillas/src/engine/actor.rs Outdated
@artrixdotdev artrixdotdev merged commit 7797155 into main Jul 2, 2026
3 checks passed
@artrixdotdev artrixdotdev deleted the refactor/client-configurable-settings branch July 2, 2026 00:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request med prio Medium Priority refactor Neither fixes a bug nor adds a feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant