bittorrent-tracker: thư viện BitTorrent tracker Node.js
bittorrent-tracker là thư viện Node.js triển khai giao thức BitTorrent tracker cho cả client lẫn server, hỗ trợ đồng thời HTTP, UDP, và WebSocket trong cùng một mã nguồn. Hãy dùng khi bạn cần một tracker server hoặc một client để giao tiếp với tracker, trên Node hoặc trên trình duyệt, mà không phải tự viết giao thức từ đầu. Bỏ qua nếu bạn cần khám phá peer qua DHT thay vì qua tracker trung tâm; đó là một package khác.
Tìm hiểu về bittorrent-tracker
bittorrent-tracker là một package npm chứa bản triển khai Node.js của một BitTorrent tracker: dịch vụ mà các BitTorrent client báo cáo tiến trình tới và nhận về danh sách peer. Nó gồm cả một client và một server, server có thể nói cùng lúc HTTP, UDP, và WebSocket, phục vụ cả BitTorrent client truyền thống lẫn peer WebTorrent chạy trên trình duyệt.
Các tính năng cốt lõi và giao thức được hỗ trợ
- ✓Gộp cả client và server trong cùng một package, theo README.
- ✓Hỗ trợ HTTP tracker, UDP tracker (BEP 15), và giao thức tracker WebSocket của WebTorrent, phủ cả BitTorrent client truyền thống lẫn peer trên trình duyệt.
- ✓Hỗ trợ cả địa chỉ IPv4 lẫn IPv6, theo README.
- ✓Triển khai phần mở rộng scrape của tracker để truy vấn thống kê swarm mà không cần announce đầy đủ.
- ✓Có bộ kiểm thử mà README nói chạy hoàn toàn không cần mạng.
- ✓Cung cấp thống kê tracker qua giao diện web tại /stats và dạng JSON tại /stats.json.
- ✓Tuỳ chọn proxyOpts của client cho phép định tuyến request WSS, UDP (qua SOCKS), và HTTP tracker qua proxy.
Cài đặt và thiết lập
Cài đặt bằng `npm install bittorrent-tracker` để dùng như thư viện client/server trong dự án Node hoặc trình duyệt. Để chạy CLI tracker server độc lập, hãy cài đặt toàn cục: `npm install -g bittorrent-tracker`, lệnh này thêm command `bittorrent-tracker`. Chạy lệnh đó không kèm cờ nào sẽ khởi động cả HTTP, UDP, và WebSocket server cùng lúc trên port 8000 mặc định; thêm `--help` để xem toàn bộ danh sách cờ, gồm `-p`/`--port` để đổi port và `--trust-proxy` để tin header `x-forwarded-for` khi chạy sau reverse proxy.
Điểm mạnh
- ✓Một package duy nhất gồm cả code client lẫn server của tracker, nên bạn không cần hai thư viện riêng để kiểm thử tracker của mình với client của chính nó.
- ✓Ba giao thức truyền tải trong một server: HTTP, UDP, và WebSocket đều có thể chạy từ cùng một thực thể Server, theo các tuỳ chọn udp/http/ws trong README.
- ✓Phần mở rộng scrape cùng endpoint /stats và /stats.json cho bạn cái nhìn vào quy mô swarm mà không cần tự viết cơ chế đếm.
- ✓Tuỳ chọn filter là một hook thực sự để xây tracker riêng tư hoặc giới hạn theo danh sách cho phép, với quyền truy cập đầy đủ tham số request bên trong callback.
- ✓README nói client được dùng bởi các dự án thực tế khác: WebTorrent, peerflix, và playback.
Phạm vi và các điều cần lưu ý
- △README không nêu số BEP cho giao thức tracker WebSocket của WebTorrent; nó được ghi là 'BEP forthcoming', tức phần này chưa được chuẩn hoá chính thức.
- △Callback filter của server là cơ chế kiểm soát truy cập duy nhất được mô tả; README không nhắc tới xác thực, giới hạn tốc độ request, hay lớp lưu trữ dựng sẵn nào.
- △Không có benchmark nào được ghi lại cho quy mô peer hay torrent.
- △Server HTTP chỉ trả lời `/announce` và `/scrape`; request tới đường dẫn khác không được xử lý, theo README.
- △Hành vi proxy khác nhau theo phiên bản Node (undici Agent từ Node 16 trở lên, http.Agent trước đó) nhưng chỉ xuất hiện dưới dạng chú thích trong code, không có giải thích đầy đủ.
Các giải pháp BitTorrent tracker khác
Câu hỏi thường gặp
bittorrent-tracker hỗ trợ HTTP tracker, UDP tracker (BEP 15), và giao thức tracker qua WebSocket của WebTorrent, cùng phần mở rộng scrape để lấy thống kê swarm, tất cả từ cùng một thực thể server.
Phần client của bittorrent-tracker chạy được trên trình duyệt lẫn Node.js, và các tuỳ chọn `rtcConfig`, `wrtc` hỗ trợ kết nối WebRTC mà peer WebTorrent trên trình duyệt dùng để tới được nhau.
Server của bittorrent-tracker cung cấp trang thống kê web tại `/stats` và cùng dữ liệu đó dạng JSON tại `/stats.json` khi tuỳ chọn `stats` được bật, còn client có thể gọi `scrape()` để lấy số seeder, leecher, và lượt download theo từng torrent.
bittorrent-tracker phát hành theo giấy phép MIT, bản quyền thuộc về Feross Aboukhadijeh và WebTorrent, LLC.
Constructor Server của bittorrent-tracker nhận một callback `filter` với info hash, tham số request, và một callback bất đồng bộ, cho phép bạn chấp nhận hay từ chối torrent theo info hash, peer ID, hoặc secret key trước khi tracker phản hồi.
README của bittorrent-tracker liệt kê hỗ trợ IPv6 song song với IPv4 cho cả phía client lẫn server của giao thức tracker.
Vấn đề mà nó giải quyết
BitTorrent client chạy trên trình duyệt như WebTorrent không thể tự mở socket UDP hay kết nối TCP tuỳ ý như một BitTorrent client gốc, nên chúng không thể nói chuyện trực tiếp với tracker HTTP hay UDP thông thường. Server của bittorrent-tracker trả lời qua WebSocket cũng như HTTP và UDP từ cùng một tiến trình, còn client của nó nói đúng giao thức mà tracker trong `announce` sử dụng, nên một mã nguồn Node có thể phục vụ hoặc liên hệ tracker cho cả peer trên trình duyệt lẫn peer gốc, thay vì cần phần mềm tracker riêng cho từng giao thức.
Trường hợp sử dụng tốt nhất
- •Tự chạy một BitTorrent tracker server cho ứng dụng của riêng bạn, dùng CLI hoặc class Server thay vì phụ thuộc vào tracker công cộng.
- •Xây dựng ứng dụng kiểu WebTorrent trên trình duyệt cần thư viện client để announce tới tracker qua WebSocket và lấy danh sách peer.
- •Xây dựng tracker riêng tư chỉ cho phép một số torrent nhất định, dùng callback filter của server để cho phép hoặc chặn theo info hash, peer ID, hoặc secret key.
- •Lấy thống kê swarm theo thời gian thực (seeder, leecher, lượt download) cho một hoặc nhiều torrent qua scrape() của client hoặc endpoint /stats.json của server.
Cách sử dụng
Ở phía client, lấy đối tượng `Client` từ `bittorrent-tracker`, khởi tạo với `infoHash`, `peerId`, danh sách URL `announce`, và `port`, rồi gọi `client.start()` để bắt đầu announce; lắng nghe sự kiện `'peer'` để lấy địa chỉ các thành viên khác trong swarm và `'update'` để biết số seeder/leecher, rồi gọi `client.stop()` hoặc `client.destroy()` để rời swarm nhẹ nhàng hoặc ngay lập tức. Ở phía server, lấy đối tượng `Server` và khởi tạo với các boolean `udp`, `http`, `ws`, và `stats` để chọn giao thức truyền tải nào chạy, rồi gọi `server.listen(port, hostname)`; thực thể đang chạy cung cấp `server.torrents`, đánh index theo info hash, với các trường `complete`, `incomplete`, và `peers` cho mỗi torrent, và chỉ trả lời request tới `/announce` và `/scrape`. Từ command line, chạy binary `bittorrent-tracker` đã cài toàn cục mà không kèm cờ nào sẽ khởi động cả ba giao thức truyền tải trên port 8000, còn cờ `--http`, `--udp`, hoặc `--ws` cho phép chỉ chạy một trong số đó.
Ai nên dùng — và ai nên bỏ qua
Hãy thử bittorrent-tracker nếu bạn đang xây dựng thứ gì đó cần chạy hoặc giao tiếp với một BitTorrent tracker từ Node hoặc trình duyệt: ứng dụng kiểu WebTorrent, tracker riêng tư giới hạn theo danh sách cho phép, hay hạ tầng kiểm thử cho các công cụ BitTorrent khác. Bỏ qua nếu bạn muốn khám phá swarm không cần tracker qua DHT, vì đó là package khác (bittorrent-dht) và giao thức khác, hoặc nếu bạn cần một tracker viết ngoài hệ sinh thái Node.js cho môi trường triển khai không phải JS.
Repo liên quan
bittorrent-tracker có đáng để bạn bỏ thời gian?
ChatGPT, Claude và Perplexity đều đọc được trang này. Hỏi thử xem họ nghĩ gì về bittorrent-tracker.
