Initial commit: multi-peer torrent download engine

Reactor/loop-pool engine with TCP/µTP/MSE transports, per-connection
pipelining, priority-driven piece selection with endgame, and the Python
FFI test harness.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ookami125 2026-06-21 23:12:32 -04:00
commit d8208685a2
55 changed files with 9989 additions and 0 deletions

82
interop/seed_deluge.py Normal file
View file

@ -0,0 +1,82 @@
from __future__ import annotations
import argparse
import os
import signal
import subprocess
import time
from common import touch_ready, wait_for_tcp
def console(config: str, command: str, check: bool = True) -> subprocess.CompletedProcess:
return subprocess.run(
["deluge-console", "-c", config, command],
text=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
check=check,
timeout=15,
)
def main() -> int:
ap = argparse.ArgumentParser(description="Seed a fixture with Deluge.")
ap.add_argument("--torrent", required=True)
ap.add_argument("--data", required=True)
ap.add_argument("--port", type=int, required=True)
ap.add_argument("--daemon-port", type=int, default=58846)
args = ap.parse_args()
config = "/tmp/deluge-config"
os.makedirs(config, exist_ok=True)
proc = subprocess.Popen([
"deluged",
"-d",
"-c", config,
"-i", "0.0.0.0",
"-p", str(args.daemon_port),
"-L", "warning",
])
stop = False
def _stop(signum, frame):
nonlocal stop
stop = True
proc.terminate()
signal.signal(signal.SIGTERM, _stop)
signal.signal(signal.SIGINT, _stop)
try:
wait_for_tcp("127.0.0.1", args.daemon_port, timeout=45)
settings = [
("listen_ports", f"({args.port}, {args.port})"),
("random_port", "False"),
("dht", "False"),
("lsd", "False"),
("upnp", "False"),
("natpmp", "False"),
("add_paused", "False"),
("download_location", args.data),
]
for key, value in settings:
console(config, f"config -s {key} {value}")
console(config, f"add -p {args.data} {args.torrent}")
wait_for_tcp("127.0.0.1", args.port, timeout=45)
touch_ready()
print(f"Deluge seeding on {args.port}", flush=True)
while not stop and proc.poll() is None:
time.sleep(1)
return proc.returncode or 0
finally:
if proc.poll() is None:
proc.terminate()
try:
proc.wait(timeout=10)
except subprocess.TimeoutExpired:
proc.kill()
if __name__ == "__main__":
raise SystemExit(main())