Skip to content

Farsight v2.3.0

Choose a tag to compare

@github-actions github-actions released this 18 Jul 14:49

What's changed

  • feat(diagnostics): one-tap Copy ID button on the diagnostics upload result (4d584ae)
  • fix(transfer): send-flows close() fails its channels so a cancel unwinds the pool + closes the file reader (no fd/closure leak) (ca0faab)
  • fix(transfer): sendBulk rejects on flow death so the pool retires+requeues (no deadlock on flow drops); ctrl anchors flow 0 (edb8209)
  • fix(transfer): pin multi-flow receiver close-on-settle wiring + bound the close/persist await (no hang on a wedged fd) (25e6da8)
  • fix(transfer): multi-flow receiver closes open .part handles on every settle (no fd leak on cancel/stall) (b66dfd5)
  • test(transfer): headless single-process multi-flow E2E (loopback signaling, real striping asserted) (2898286)
  • fix(transfer): clamp flowCount to [1,16] at the service + override site (no unbounded flow count from any source) (1718be9)
  • feat(transfer): parallel-connections setting (default 8, 1-16) plumbed to flowCount (e99a92f)
  • fix(transfer): multi-flow receiver persists the record immediately on accept (no vanish on fast cancel) (db94e64)
  • fix(transfer): deterministic teardown of all N multi-flow workers (no app-alive leak) (db6f5eb)
  • feat(signaling): per-flow-unique TURN username via flowIndex (uncaps N relay allocations); tighten openChannel guards (26ec06d)
  • feat(transfer): openChannel opens N grouped transfer workers -> {ctrl,flows}; per-flow rendezvous (d18b39a)
  • test(transfer): pin ctrl-frame watchdog reset; isolate pagination test from watchdog; fix mirrors-createReceiver comment (ede3a6b)
  • fix(transfer): multi-flow receiver handles inbound cancel + inactivity stall (mirrors single-flow) — no hang on drop (3f4a30d)
  • feat(transfer): transfer-service multi-flow branch + real io/store seam wiring + range-based resume (82cb208)
  • fix(transfer): group-rendezvous cancel-after-ready keeps live flows; pin once-fire race + cancel semantics (59f0712)
  • feat(transfer): group-rendezvous coordinator -- N flow requests -> one grouped receive, single consent (07cb2db)
  • fix(transfer): range_report batching bounds by measured bytes (not count) — worst-case frame under 256KB (149f8c7)
  • feat(transfer): bounded + file-paginated range_report (fits the 256KB data-channel limit) (29bcc6f)
  • fix(transfer): multi-flow completion terminates cleanly — receiver reports finalized files as covered + sender pump settled-guard/unref (812c8ef)
  • feat(signaling): relay groupId/flowIndex/flowCount on transfer requests (whitelisted, pairing unchanged) (d470584)
  • test(transfer): multi-flow service loopback to real disk — stripe, drop, reconcile, byte-identical (a32a89e)
  • fix(transfer): thread the open partFile into multi-flow receiver's verifyAndFinalize (d2bfb42)
  • test(transfer): pin multi-flow receiver periodic range_report cadence + timer teardown (fake clock) (d0f8cba)
  • feat(transfer): createMultiFlowReceiver — router-driven reassembly, periodic range_report, coverage completion (593cbd8)
  • fix(transfer): multi-flow sender hashes+file_end even a resumed byte-complete file; gap passes re-read only gaps + re-send file_end (71246e7)
  • feat(transfer): createMultiFlowSender — producer+pool+reconcile over N flows, coverage-defined completion (d3fd7e1)
  • feat(transfer): router.resetFile clears a verify-failed file for reconciliation re-send (76ae923)
  • feat(transfer): positional sparse .part writer + positional source reader (aabf839)
  • fix(transfer): router doesn't finalize a verify-failed/errored file; memoize openPart; guard chunkSize>0 (ae3b142)
  • test(transfer): pin reconciliation sends only gaps (round-2 offsets) + direct coveredFor assertion (b2fe13d)
  • test(transfer): in-memory multi-flow loopback -- stripe, drop a range, reconcile, reassemble byte-identical (4dfe08c)
  • feat(transfer): sender coverage tracker for range reconciliation + coverage-defined completion (ef798e7)
  • feat(transfer): positional-write receive router with range tracking + finalize-on-complete (4c37b8f)
  • fix(transfer): send pool dispatches to idle flows (real N-way concurrency) + retire rejecting flows (dfbd0ab)
  • feat(transfer): dynamic send pool with credit backpressure + dead-flow requeue (b78940b)
  • feat(transfer): sequential hasher-reader that yields only uncovered chunks (aa91af9)
  • feat(turn): optional per-flow-unique username so coturn user-quota stops capping parallel flows (a778d44)
  • fix(shared): declare transfer-chunk + transfer-ranges in package exports (exports.test guard) (7d022dd)
  • feat(transfer): range_report frame, accept.ranges, offer flowCount/groupId (dfa3372)
  • fix(transfer): isComplete matches covers([0,size)) contract, not ivals.length shortcut (caa696a)
  • feat(transfer): coalesced received-ranges interval set (covers/gaps/isComplete) (cca9eab)
  • feat(transfer): self-addressing bulk chunk frame (fileId/offset/length header) (24a0daf)

Full changelog: v2.2.1...v2.3.0


Download

  • Farsight — one app that controls other machines, lets you host (be controlled), and transfers files. Install it on every machine.

Upgrading from v1? v2 is a fresh install with a new identity, so it will not auto-update from the old Farsight Host / Farsight Controller — download and run the installer once. The old apps can be uninstalled.

Unsigned build: on first run Windows SmartScreen may warn ("More info" → "Run anyway").