Commit Graph
7 Commits
Author SHA1 Message Date
TZGyn c8f670e920 Add Dockerfile to deploy the relay server
Multi-stage build: compiles with CGO disabled in golang:1.25-alpine,
runs the static binary in a plain alpine:3.20 image. Defaults to
"share relay" on port 9009; override with extra args at `docker run`.
2026-07-20 12:29:46 +08:00
TZGyn 15a6658d1c Add "share status" command and a relay-piped fallback for cross-network peers
status: swarm.Client.Status()/RoomStatus/FileStatus report per-room peer
count and per-file chunk progress; daemon gets a "status" control action;
CLI gets "share status" to display it.

Relay fallback: peers advertising a LAN-only address can't be dialed
directly by peers on a different network. connectToPeer now races a
direct dial against a relay-piped connection (both sides derive the same
pairing key from their two IDs, independent of who arrives first) and
uses whichever succeeds. The relay grows a second, on-demand path
alongside room membership: a "pipe" request pairs two connections on a
key and forwards raw bytes between them from then on, same as the
original relay's behavior before the rendezvous-only redesign, just now
triggered per-pair only when direct connection fails.
2026-07-20 12:27:27 +08:00
TZGyn 26cef8ee12 Turn the client into a background daemon; add per-chunk hash verification
Daemon (src/daemon): a Unix-socket control server holds every room this
machine is participating in. "share send"/"share <code>" resolve paths to
absolute, ask the daemon to join (auto-starting it if needed), and exit
immediately instead of blocking. "share stop" leaves every room and shuts
the daemon down; a stale socket from a crashed daemon self-heals on next
start.

swarm.Client is now a Start/Wait/Stop handle instead of a single blocking
Run, so the daemon can hold many rooms concurrently.

Also added per-chunk sha256 verification: the original seeder publishes a
hash for every chunk alongside the whole-file hash, and each chunk is
checked against it the moment it arrives — before it's written to disk or
reshared to other peers — rather than only catching corruption after the
whole file is assembled.
2026-07-20 11:45:33 +08:00
TZGyn 34ce1f4e65 Remove all schollz/* dependencies: fork pake, replicate logger and CLI
- src/pake: trimmed fork of schollz/pake/v3, P256-only (stdlib
  crypto/elliptic), dropping the tscholl2/siec and filippo.io/edwards25519
  transitive deps along with it.
- src/logger: minimal in-repo replacement for schollz/logger with the
  same leveled-logging call surface.
- src/cli: replaced schollz/cli (urfave/cli fork) with a small
  flag-package-based parser for the send/relay/receive commands actually
  in use; subcommand keyword can appear before or after its flags.
- Dropped schollz/progressbar entirely (its show-progress code paths were
  already unreachable dead code since no CLI flag wired them up).

go.mod/go.sum no longer reference any schollz/* module.
2026-07-20 11:26:59 +08:00
TZGyn 3a0ab392c0 Add .gitignore for local-only reference and test scratch folders 2026-07-20 11:13:49 +08:00
TZGyn 7936de736d Turn the relay into a rendezvous-only swarm: everyone sends and receives
Peers join a room and the relay just broadcasts membership (id + dialable
address); peers then connect to each other directly, PAKE-handshake per
link using the room codephrase, and exchange 1MB chunks. Resume reuses
croc's zero-block scan to detect already-received chunks, whole-file hash
verifies completion, and every peer keeps reseeding what it has to others
until stopped (--one-time restores exit-on-complete for a quick fetch).
2026-07-20 11:12:18 +08:00
TZGyn 95726d9e45 Initial commit: minimal relay server and CLI structure
Relay pairs connections by room name and pipes bytes between them,
with no password/PAKE handshake at the relay layer — codephrase-based
encryption is left to the client side of the transfer.
2026-07-20 10:13:37 +08:00