bun-torrent 0.0.3-beta → 0.0.5-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -3
- package/dist/client.d.ts +11 -6
- package/dist/client.js +21 -20
- package/dist/client.js.map +1 -1
- package/dist/configs/defaults.d.ts +25 -0
- package/dist/configs/defaults.js +26 -0
- package/dist/configs/defaults.js.map +1 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/peer/pool/index.js +4 -5
- package/dist/peer/pool/index.js.map +1 -1
- package/dist/peer/session/index.d.ts +1 -1
- package/dist/peer/session/index.js +10 -5
- package/dist/peer/session/index.js.map +1 -1
- package/dist/torrent/download/PeerScorer.d.ts +15 -0
- package/dist/torrent/download/PeerScorer.js +24 -0
- package/dist/torrent/download/PeerScorer.js.map +1 -0
- package/dist/torrent/download/index.d.ts +3 -1
- package/dist/torrent/download/index.js +1 -0
- package/dist/torrent/download/index.js.map +1 -1
- package/dist/torrent/download/manager.d.ts +23 -17
- package/dist/torrent/download/manager.js +166 -53
- package/dist/torrent/download/manager.js.map +1 -1
- package/dist/torrent/index.d.ts +2 -2
- package/dist/torrent/index.js +1 -1
- package/dist/torrent/index.js.map +1 -1
- package/dist/torrent/pieces/DefaultPlanner.d.ts +1 -1
- package/dist/torrent/pieces/DefaultPlanner.js +6 -2
- package/dist/torrent/pieces/DefaultPlanner.js.map +1 -1
- package/dist/torrent/pieces/index.d.ts +1 -1
- package/dist/torrent/pieces/index.js +1 -1
- package/dist/torrent/pieces/index.js.map +1 -1
- package/dist/torrent/pieces/types.d.ts +1 -1
- package/dist/torrent/pieces/utils.d.ts +1 -2
- package/dist/torrent/pieces/utils.js +3 -3
- package/dist/torrent/pieces/utils.js.map +1 -1
- package/dist/torrent/session/index.d.ts +5 -2
- package/dist/torrent/session/index.js +17 -5
- package/dist/torrent/session/index.js.map +1 -1
- package/dist/tracker/http.js +4 -4
- package/dist/tracker/http.js.map +1 -1
- package/dist/tracker/index.js +3 -3
- package/dist/tracker/index.js.map +1 -1
- package/dist/tracker/types.d.ts +0 -1
- package/dist/tracker/types.js +1 -1
- package/dist/tracker/types.js.map +1 -1
- package/dist/tracker/udp.js +4 -3
- package/dist/tracker/udp.js.map +1 -1
- package/package.json +33 -33
package/README.md
CHANGED
|
@@ -66,8 +66,13 @@ import { Client } from 'bun-torrent';
|
|
|
66
66
|
|
|
67
67
|
const client = new Client({
|
|
68
68
|
outputDirectory: './downloads',
|
|
69
|
+
targetConnections: 20,
|
|
70
|
+
maxConnecting: 30,
|
|
69
71
|
maxInFlightRequestsPerPeer: 20,
|
|
72
|
+
peerConnectTimeoutMs: 5_000,
|
|
73
|
+
trackerTimeoutMs: 5_000,
|
|
70
74
|
requestTimeoutMs: 15_000,
|
|
75
|
+
seed: false,
|
|
71
76
|
progressEvents: 'piece',
|
|
72
77
|
speedSampleIntervalMs: 500,
|
|
73
78
|
});
|
|
@@ -77,8 +82,14 @@ Client options:
|
|
|
77
82
|
|
|
78
83
|
- `outputDirectory`: directory where downloaded files are written. Defaults to `process.cwd()`.
|
|
79
84
|
- `files`: optional default file selection for downloads.
|
|
85
|
+
- `targetConnections`: preferred number of connected peers. Defaults to `20`.
|
|
86
|
+
- `minConnections`: minimum connectable peer count before downloading starts. Defaults to `0`.
|
|
87
|
+
- `maxConnecting`: maximum simultaneous peer connection attempts. Defaults to `30`.
|
|
88
|
+
- `peerConnectTimeoutMs`: timeout for connecting to one peer. Defaults to `5000`.
|
|
89
|
+
- `trackerTimeoutMs`: timeout for tracker announces. Defaults to `5000`.
|
|
80
90
|
- `maxInFlightRequestsPerPeer`: maximum active block requests per peer. Defaults to `20`.
|
|
81
91
|
- `requestTimeoutMs`: timeout for an individual block request. Defaults to `15000`.
|
|
92
|
+
- `seed`: reserved for future seeding support. Currently only `false` is supported.
|
|
82
93
|
- `progressEvents`: `'piece'` emits progress when a piece completes, `'block'` emits for every received block. Defaults to `'piece'`.
|
|
83
94
|
- `speedSampleIntervalMs`: minimum interval used to refresh speed calculations. Defaults to `500`.
|
|
84
95
|
|
|
@@ -109,8 +120,11 @@ const torrent = await client.download(
|
|
|
109
120
|
},
|
|
110
121
|
{
|
|
111
122
|
outputDirectory: './downloads',
|
|
123
|
+
targetConnections: 50,
|
|
124
|
+
maxConnecting: 100,
|
|
112
125
|
minConnections: 5,
|
|
113
126
|
announcePort: 6881,
|
|
127
|
+
seed: false,
|
|
114
128
|
progressEvents: 'block',
|
|
115
129
|
onChangeState: (state) => {
|
|
116
130
|
console.log('client state:', state);
|
|
@@ -123,10 +137,15 @@ Download options:
|
|
|
123
137
|
|
|
124
138
|
- `outputDirectory`: override the output directory for this download.
|
|
125
139
|
- `files`: download only selected files.
|
|
140
|
+
- `targetConnections`: override the preferred peer connection count.
|
|
126
141
|
- `minConnections`: minimum connectable peer count requested before downloading starts.
|
|
142
|
+
- `maxConnecting`: override simultaneous peer connection attempts.
|
|
143
|
+
- `peerConnectTimeoutMs`: override peer connection timeout.
|
|
144
|
+
- `trackerTimeoutMs`: override tracker announce timeout.
|
|
127
145
|
- `announcePort`: port sent to trackers in announce requests.
|
|
128
146
|
- `maxInFlightRequestsPerPeer`: override request concurrency per peer.
|
|
129
147
|
- `requestTimeoutMs`: override block request timeout.
|
|
148
|
+
- `seed`: reserved for future seeding support. Currently only `false` is supported.
|
|
130
149
|
- `progressEvents`: `'piece'` or `'block'`.
|
|
131
150
|
- `speedSampleIntervalMs`: override speed sample interval.
|
|
132
151
|
- `onChangeState`: receives client setup states: `parsing`, `tracking`, `connecting`, `downloading`.
|
|
@@ -185,8 +204,8 @@ torrent.on('progress', (progress) => {
|
|
|
185
204
|
console.log(progress.percent, progress.speed);
|
|
186
205
|
});
|
|
187
206
|
|
|
188
|
-
torrent.on('peer', (
|
|
189
|
-
console.log('peer connected',
|
|
207
|
+
torrent.on('peer', (stats) => {
|
|
208
|
+
console.log('peer connected', stats.connections, '/', stats.targetConnections);
|
|
190
209
|
});
|
|
191
210
|
|
|
192
211
|
torrent.on('done', () => {
|
|
@@ -209,7 +228,7 @@ The current torrent state is also available through `torrent.state`. Possible st
|
|
|
209
228
|
- `failed`
|
|
210
229
|
- `closed`
|
|
211
230
|
|
|
212
|
-
Call `torrent.close()` to stop
|
|
231
|
+
When a download completes, `torrent.done` resolves, the state becomes `completed`, and internal peer connections are closed automatically because seeding is not implemented yet. Call `torrent.close()` to stop an active download early or to mark a completed torrent as explicitly closed.
|
|
213
232
|
|
|
214
233
|
## Progress Shape
|
|
215
234
|
|
package/dist/client.d.ts
CHANGED
|
@@ -11,16 +11,16 @@ export declare enum DownloadState {
|
|
|
11
11
|
export type ClientConfig = {
|
|
12
12
|
files?: TorrentFileSelection;
|
|
13
13
|
maxInFlightRequestsPerPeer?: number;
|
|
14
|
+
maxConnecting?: number;
|
|
15
|
+
minConnections?: number;
|
|
14
16
|
outputDirectory?: string;
|
|
17
|
+
peerConnectTimeoutMs?: number;
|
|
15
18
|
progressEvents?: DownloadProgressEventMode;
|
|
16
19
|
requestTimeoutMs?: number;
|
|
20
|
+
seed?: false;
|
|
17
21
|
speedSampleIntervalMs?: number;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
readonly maxInFlightRequestsPerPeer: 20;
|
|
21
|
-
readonly progressEvents: "piece";
|
|
22
|
-
readonly requestTimeoutMs: 15000;
|
|
23
|
-
readonly speedSampleIntervalMs: 500;
|
|
22
|
+
targetConnections?: number;
|
|
23
|
+
trackerTimeoutMs?: number;
|
|
24
24
|
};
|
|
25
25
|
export declare class Client {
|
|
26
26
|
private readonly config;
|
|
@@ -38,12 +38,17 @@ export type DownloadOptions = {
|
|
|
38
38
|
announcePort?: number;
|
|
39
39
|
files?: TorrentFileSelection;
|
|
40
40
|
maxInFlightRequestsPerPeer?: number;
|
|
41
|
+
maxConnecting?: number;
|
|
41
42
|
minConnections?: number;
|
|
42
43
|
onChangeState?: (state: DownloadState) => unknown;
|
|
43
44
|
outputDirectory?: string;
|
|
45
|
+
peerConnectTimeoutMs?: number;
|
|
44
46
|
progressEvents?: DownloadProgressEventMode;
|
|
45
47
|
requestTimeoutMs?: number;
|
|
48
|
+
seed?: false;
|
|
46
49
|
speedSampleIntervalMs?: number;
|
|
50
|
+
targetConnections?: number;
|
|
51
|
+
trackerTimeoutMs?: number;
|
|
47
52
|
};
|
|
48
53
|
export type TorrentFileInput = string | Uint8Array | ArrayBuffer;
|
|
49
54
|
export declare const readTorrentFile: (input: TorrentFileInput) => Promise<Uint8Array>;
|
package/dist/client.js
CHANGED
|
@@ -6,6 +6,7 @@ import { Torrent } from './torrent/session/index';
|
|
|
6
6
|
import { ClientError, ClientErrorCode } from './client.error';
|
|
7
7
|
import { trackPeers, TrackerError, TrackerErrorCode } from './tracker';
|
|
8
8
|
import { getUnknownSelectedFiles, normalizeTorrentFileSelection } from './torrent/file-selection';
|
|
9
|
+
import { defaults } from './configs/defaults';
|
|
9
10
|
export var DownloadState;
|
|
10
11
|
(function (DownloadState) {
|
|
11
12
|
DownloadState["PARSING"] = "parsing";
|
|
@@ -13,12 +14,6 @@ export var DownloadState;
|
|
|
13
14
|
DownloadState["CONNECTING"] = "connecting";
|
|
14
15
|
DownloadState["DOWNLOADING"] = "downloading";
|
|
15
16
|
})(DownloadState || (DownloadState = {}));
|
|
16
|
-
export const DEFAULT_CLIENT_CONFIG = {
|
|
17
|
-
maxInFlightRequestsPerPeer: 20,
|
|
18
|
-
progressEvents: 'piece',
|
|
19
|
-
requestTimeoutMs: 15_000,
|
|
20
|
-
speedSampleIntervalMs: 500,
|
|
21
|
-
};
|
|
22
17
|
export class Client {
|
|
23
18
|
config;
|
|
24
19
|
peerId;
|
|
@@ -32,16 +27,16 @@ export class Client {
|
|
|
32
27
|
const downloadConfig = resolveDownloadConfig(this.config, options);
|
|
33
28
|
assertValidFileSelection(meta, downloadConfig.files);
|
|
34
29
|
options.onChangeState?.(DownloadState.TRACKING);
|
|
35
|
-
const peers = await this.trackPeers(meta, options);
|
|
30
|
+
const peers = await this.trackPeers(meta, options, downloadConfig);
|
|
36
31
|
options.onChangeState?.(DownloadState.CONNECTING);
|
|
37
32
|
const pool = await openPeerPool(peers, {
|
|
38
33
|
infoHash: meta.infoHash,
|
|
39
34
|
peerId: this.peerId,
|
|
40
|
-
targetConnections:
|
|
35
|
+
targetConnections: downloadConfig.targetConnections,
|
|
41
36
|
totalPieces: meta.pieces.length,
|
|
42
|
-
minConnections:
|
|
43
|
-
maxConnecting:
|
|
44
|
-
timeoutMs:
|
|
37
|
+
minConnections: downloadConfig.minConnections,
|
|
38
|
+
maxConnecting: downloadConfig.maxConnecting,
|
|
39
|
+
timeoutMs: downloadConfig.peerConnectTimeoutMs,
|
|
45
40
|
});
|
|
46
41
|
options.onChangeState?.(DownloadState.DOWNLOADING);
|
|
47
42
|
return new Torrent(meta, pool, new DownloadManager({
|
|
@@ -53,19 +48,19 @@ export class Client {
|
|
|
53
48
|
progressEvents: downloadConfig.progressEvents,
|
|
54
49
|
requestTimeoutMs: downloadConfig.requestTimeoutMs,
|
|
55
50
|
speedSampleIntervalMs: downloadConfig.speedSampleIntervalMs,
|
|
56
|
-
}), normalizeTorrentFileSelection(downloadConfig.files));
|
|
51
|
+
}), normalizeTorrentFileSelection(downloadConfig.files), downloadConfig.seed);
|
|
57
52
|
}
|
|
58
53
|
async inspect(input) {
|
|
59
54
|
const bytes = await readTorrentFile(input.torrentFile);
|
|
60
55
|
return parseTorrent(bytes);
|
|
61
56
|
}
|
|
62
|
-
async trackPeers(meta, options) {
|
|
57
|
+
async trackPeers(meta, options, config) {
|
|
63
58
|
try {
|
|
64
59
|
return await trackPeers({
|
|
65
60
|
meta,
|
|
66
61
|
peerId: this.peerId,
|
|
67
62
|
announcePort: options.announcePort,
|
|
68
|
-
timeoutMs:
|
|
63
|
+
timeoutMs: config.trackerTimeoutMs,
|
|
69
64
|
});
|
|
70
65
|
}
|
|
71
66
|
catch (error) {
|
|
@@ -83,15 +78,21 @@ const resolveDownloadConfig = (config, options) => ({
|
|
|
83
78
|
files: options.files ?? config.files ?? null,
|
|
84
79
|
maxInFlightRequestsPerPeer: options.maxInFlightRequestsPerPeer ??
|
|
85
80
|
config.maxInFlightRequestsPerPeer ??
|
|
86
|
-
|
|
81
|
+
defaults.download.maxInFlightRequestsPerPeer,
|
|
82
|
+
maxConnecting: options.maxConnecting ?? config.maxConnecting ?? defaults.peers.maxConnecting,
|
|
83
|
+
minConnections: options.minConnections ?? config.minConnections ?? defaults.peers.minConnections,
|
|
87
84
|
outputDirectory: options.outputDirectory ?? config.outputDirectory ?? process.cwd(),
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
85
|
+
peerConnectTimeoutMs: options.peerConnectTimeoutMs ??
|
|
86
|
+
config.peerConnectTimeoutMs ??
|
|
87
|
+
defaults.peers.connectTimeoutMs,
|
|
88
|
+
progressEvents: options.progressEvents ?? config.progressEvents ?? defaults.progress.events,
|
|
89
|
+
requestTimeoutMs: options.requestTimeoutMs ?? config.requestTimeoutMs ?? defaults.download.requestTimeoutMs,
|
|
90
|
+
seed: options.seed ?? config.seed ?? defaults.download.seed,
|
|
92
91
|
speedSampleIntervalMs: options.speedSampleIntervalMs ??
|
|
93
92
|
config.speedSampleIntervalMs ??
|
|
94
|
-
|
|
93
|
+
defaults.progress.speedSampleIntervalMs,
|
|
94
|
+
targetConnections: options.targetConnections ?? config.targetConnections ?? defaults.peers.targetConnections,
|
|
95
|
+
trackerTimeoutMs: options.trackerTimeoutMs ?? config.trackerTimeoutMs ?? defaults.trackers.timeoutMs,
|
|
95
96
|
});
|
|
96
97
|
const assertValidFileSelection = (metadata, files) => {
|
|
97
98
|
const unknownFiles = getUnknownSelectedFiles(metadata, files);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAkC,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEvE,OAAO,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export declare const defaults: {
|
|
2
|
+
readonly pieces: {
|
|
3
|
+
readonly blockSize: number;
|
|
4
|
+
};
|
|
5
|
+
readonly peers: {
|
|
6
|
+
readonly targetConnections: 20;
|
|
7
|
+
readonly minConnections: 0;
|
|
8
|
+
readonly maxConnecting: 30;
|
|
9
|
+
readonly connectTimeoutMs: 5000;
|
|
10
|
+
};
|
|
11
|
+
readonly download: {
|
|
12
|
+
readonly maxInFlightRequestsPerPeer: 300;
|
|
13
|
+
readonly baseInFlightRequestsPerPeer: 8;
|
|
14
|
+
readonly requestTimeoutMs: 15000;
|
|
15
|
+
readonly seed: false;
|
|
16
|
+
};
|
|
17
|
+
readonly progress: {
|
|
18
|
+
readonly events: "piece";
|
|
19
|
+
readonly speedSampleIntervalMs: 500;
|
|
20
|
+
};
|
|
21
|
+
readonly trackers: {
|
|
22
|
+
readonly announcePort: 6881;
|
|
23
|
+
readonly timeoutMs: 5000;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export const defaults = {
|
|
2
|
+
pieces: {
|
|
3
|
+
blockSize: 16 * 1024,
|
|
4
|
+
},
|
|
5
|
+
peers: {
|
|
6
|
+
targetConnections: 20,
|
|
7
|
+
minConnections: 0,
|
|
8
|
+
maxConnecting: 30,
|
|
9
|
+
connectTimeoutMs: 5_000,
|
|
10
|
+
},
|
|
11
|
+
download: {
|
|
12
|
+
maxInFlightRequestsPerPeer: 300,
|
|
13
|
+
baseInFlightRequestsPerPeer: 8,
|
|
14
|
+
requestTimeoutMs: 15_000,
|
|
15
|
+
seed: false,
|
|
16
|
+
},
|
|
17
|
+
progress: {
|
|
18
|
+
events: 'piece',
|
|
19
|
+
speedSampleIntervalMs: 500,
|
|
20
|
+
},
|
|
21
|
+
trackers: {
|
|
22
|
+
announcePort: 6881,
|
|
23
|
+
timeoutMs: 5_000,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/configs/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,MAAM,EAAE;QACJ,SAAS,EAAE,EAAE,GAAG,IAAI;KACvB;IACD,KAAK,EAAE;QACH,iBAAiB,EAAE,EAAE;QACrB,cAAc,EAAE,CAAC;QACjB,aAAa,EAAE,EAAE;QACjB,gBAAgB,EAAE,KAAK;KAC1B;IACD,QAAQ,EAAE;QACN,0BAA0B,EAAE,GAAG;QAC/B,2BAA2B,EAAE,CAAC;QAC9B,gBAAgB,EAAE,MAAM;QACxB,IAAI,EAAE,KAAK;KACd;IACD,QAAQ,EAAE;QACN,MAAM,EAAE,OAAO;QACf,qBAAqB,EAAE,GAAG;KAC7B;IACD,QAAQ,EAAE;QACN,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,KAAK;KACnB;CACK,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
* Copyright (c) 2026 Nikola Nedeljkovic
|
|
3
3
|
* SPDX-License-Identifier: MIT
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
5
|
+
export { Client, DownloadState, TorrentClient } from './client';
|
|
6
6
|
export { ClientError, ClientErrorCode } from './client.error';
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
7
|
+
export type { ClientConfig, DownloadOptions, TorrentFileInput } from './client';
|
|
8
|
+
export { Torrent, TorrentState, TorrentParseError, TorrentParseErrorCode, TorrentStorageError, TorrentStorageErrorCode, PiecePlannerError, PiecePlannerErrorCode, } from './torrent/index';
|
|
9
|
+
export { PeerPoolError, PeerPoolErrorCode, PeerSessionError, PeerSessionErrorCode } from './peer';
|
|
9
10
|
export { TrackerError, TrackerErrorCode } from './tracker';
|
|
10
|
-
export type {
|
|
11
|
+
export type { DownloadProgress, DownloadProgressEventMode, TorrentFileSelection, TorrentFiles, TorrentMetadata, TorrentStats, TorrentStateChange, } from './torrent/index';
|
|
12
|
+
export type { TorrentFile } from './torrent/types';
|
|
11
13
|
export { BunTorrentError } from './utils/errors';
|
|
12
|
-
export type { BBytes, BDict, BInteger, BList, BValue, BencodeInput, TorrentFiles, TorrentStats, TorrentStateChange, } from './torrent/index';
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* Copyright (c) 2026 Nikola Nedeljkovic
|
|
3
3
|
* SPDX-License-Identifier: MIT
|
|
4
4
|
*/
|
|
5
|
-
export
|
|
5
|
+
export { Client, DownloadState, TorrentClient } from './client';
|
|
6
6
|
export { ClientError, ClientErrorCode } from './client.error';
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
7
|
+
export { Torrent, TorrentState, TorrentParseError, TorrentParseErrorCode, TorrentStorageError, TorrentStorageErrorCode, PiecePlannerError, PiecePlannerErrorCode, } from './torrent/index';
|
|
8
|
+
export { PeerPoolError, PeerPoolErrorCode, PeerSessionError, PeerSessionErrorCode } from './peer';
|
|
9
9
|
export { TrackerError, TrackerErrorCode } from './tracker';
|
|
10
10
|
export { BunTorrentError } from './utils/errors';
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,EACH,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAa3D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/peer/pool/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { PeerSession } from '../session';
|
|
2
2
|
import { PeerPoolError, PeerPoolErrorCode } from './pool.error';
|
|
3
|
-
|
|
4
|
-
const DEFAULT_CONNECT_TIMEOUT_MS = 3_000;
|
|
3
|
+
import { defaults } from '../../configs/defaults';
|
|
5
4
|
export class PeerPool {
|
|
6
5
|
peers;
|
|
7
6
|
options;
|
|
@@ -175,7 +174,7 @@ export const connectToPeers = async (peers, options) => {
|
|
|
175
174
|
};
|
|
176
175
|
const normalizeOptions = (options) => {
|
|
177
176
|
const targetConnections = assertPositiveInteger(options.targetConnections, 'targetConnections');
|
|
178
|
-
const minConnections = assertNonNegativeInteger(options.minConnections ??
|
|
177
|
+
const minConnections = assertNonNegativeInteger(options.minConnections ?? defaults.peers.minConnections, 'minConnections');
|
|
179
178
|
if (minConnections > targetConnections) {
|
|
180
179
|
throw new PeerPoolError(PeerPoolErrorCode.INVALID_OPTION, 'minConnections cannot be greater than targetConnections');
|
|
181
180
|
}
|
|
@@ -185,8 +184,8 @@ const normalizeOptions = (options) => {
|
|
|
185
184
|
targetConnections,
|
|
186
185
|
totalPieces: options.totalPieces,
|
|
187
186
|
minConnections,
|
|
188
|
-
maxConnecting: Math.max(1, options.maxConnecting ??
|
|
189
|
-
timeoutMs: options.timeoutMs ??
|
|
187
|
+
maxConnecting: Math.max(1, options.maxConnecting ?? defaults.peers.maxConnecting),
|
|
188
|
+
timeoutMs: options.timeoutMs ?? defaults.peers.connectTimeoutMs,
|
|
190
189
|
createSession: options.createSession ??
|
|
191
190
|
((peer) => new PeerSession(peer)),
|
|
192
191
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer/pool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkC,MAAM,YAAY,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer/pool/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type PeerMessage } from '../messages';
|
|
2
|
-
import { PeerPieceAvailability } from '../availability';
|
|
2
|
+
import { type PeerPieceAvailability } from '../availability';
|
|
3
3
|
import type { PeerInfo } from '../../tracker/types';
|
|
4
4
|
export type PeerSessionConnectOptions = {
|
|
5
5
|
timeoutMs?: number;
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { HANDSHAKE_LENGTH } from '../consts';
|
|
2
2
|
import { decodeHandshake, encodeHandshake } from '../handshake';
|
|
3
3
|
import { decodePeerMessage, encodePeerMessage } from '../messages';
|
|
4
|
-
import {
|
|
4
|
+
import { createPeerPieceAvailability } from '../availability';
|
|
5
5
|
import { concatBytes } from '../../utils/buffers';
|
|
6
6
|
import { BunTorrentError } from '../../utils/errors';
|
|
7
7
|
import { createConnection } from 'node:net';
|
|
8
8
|
import { PeerSessionError, PeerSessionErrorCode } from './session.error';
|
|
9
|
-
|
|
9
|
+
import { defaults } from '../../configs/defaults';
|
|
10
10
|
export class PeerSession {
|
|
11
11
|
peer;
|
|
12
12
|
peerChoking = true;
|
|
13
13
|
peerInterested = false;
|
|
14
14
|
amChoking = true;
|
|
15
15
|
amInterested = false;
|
|
16
|
-
availability =
|
|
16
|
+
availability = createPeerPieceAvailability(0);
|
|
17
17
|
messageListeners = new Set();
|
|
18
18
|
closeListeners = new Set();
|
|
19
19
|
handshakeDone = false;
|
|
@@ -25,8 +25,8 @@ export class PeerSession {
|
|
|
25
25
|
this.peer = peer;
|
|
26
26
|
}
|
|
27
27
|
async connect(infoHash, peerId, options = {}) {
|
|
28
|
-
const timeoutMs = options.timeoutMs ??
|
|
29
|
-
this.availability =
|
|
28
|
+
const timeoutMs = options.timeoutMs ?? defaults.peers.connectTimeoutMs;
|
|
29
|
+
this.availability = createPeerPieceAvailability(options.totalPieces ?? 0);
|
|
30
30
|
return new Promise((resolve, reject) => {
|
|
31
31
|
if (this.closed) {
|
|
32
32
|
reject(new PeerSessionError(PeerSessionErrorCode.CLOSED, 'Peer session is already closed'));
|
|
@@ -146,6 +146,11 @@ export class PeerSession {
|
|
|
146
146
|
}
|
|
147
147
|
while (this.handshakeDone && this.buffer.byteLength >= 4) {
|
|
148
148
|
const frameLength = new DataView(this.buffer.buffer, this.buffer.byteOffset, 4).getUint32(0, false);
|
|
149
|
+
const maxPeerMessageLength = 1 + 8 + defaults.pieces.blockSize; // add 4 bytes prefix
|
|
150
|
+
if (frameLength > maxPeerMessageLength) {
|
|
151
|
+
this.close();
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
149
154
|
const totalLength = 4 + frameLength;
|
|
150
155
|
if (this.buffer.byteLength < totalLength)
|
|
151
156
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoB,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/peer/session/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type PeerDownloadStats = {
|
|
2
|
+
receivedBytes: number;
|
|
3
|
+
receivedBlocks: number;
|
|
4
|
+
timedOutRequests: number;
|
|
5
|
+
sentRequests: number;
|
|
6
|
+
completedPieces: number;
|
|
7
|
+
invalidPieces: number;
|
|
8
|
+
lastBlockAt: number | null;
|
|
9
|
+
totalRequestTimeMs: number;
|
|
10
|
+
completedRequests: number;
|
|
11
|
+
};
|
|
12
|
+
export declare class PeerScorer {
|
|
13
|
+
getScore(stats: PeerDownloadStats): number;
|
|
14
|
+
getRequestLimit(stats: PeerDownloadStats, defaultLimit: number): number;
|
|
15
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class PeerScorer {
|
|
2
|
+
getScore(stats) {
|
|
3
|
+
const averageRequestTime = stats.completedRequests === 0
|
|
4
|
+
? Number.POSITIVE_INFINITY
|
|
5
|
+
: stats.totalRequestTimeMs / stats.completedRequests;
|
|
6
|
+
const timeoutPenalty = stats.timedOutRequests * 1000;
|
|
7
|
+
const invalidPenalty = stats.invalidPieces * 2000;
|
|
8
|
+
const speedBonus = stats.receivedBytes / Math.max(1, averageRequestTime);
|
|
9
|
+
return speedBonus + stats.completedPieces * 100 - timeoutPenalty - invalidPenalty;
|
|
10
|
+
}
|
|
11
|
+
getRequestLimit(stats, defaultLimit) {
|
|
12
|
+
if (stats.timedOutRequests >= 3 && stats.completedRequests === 0)
|
|
13
|
+
return 1;
|
|
14
|
+
if (stats.completedRequests < 3)
|
|
15
|
+
return defaultLimit;
|
|
16
|
+
const timeoutRate = stats.timedOutRequests / Math.max(1, stats.sentRequests);
|
|
17
|
+
if (timeoutRate > 0.5)
|
|
18
|
+
return Math.max(1, Math.floor(defaultLimit / 4));
|
|
19
|
+
if (timeoutRate > 0.25)
|
|
20
|
+
return Math.max(1, Math.floor(defaultLimit / 2));
|
|
21
|
+
return defaultLimit;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=PeerScorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PeerScorer.js","sourceRoot":"","sources":["../../../src/torrent/download/PeerScorer.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,UAAU;IACZ,QAAQ,CAAC,KAAwB;QACpC,MAAM,kBAAkB,GACpB,KAAK,CAAC,iBAAiB,KAAK,CAAC;YACzB,CAAC,CAAC,MAAM,CAAC,iBAAiB;YAC1B,CAAC,CAAC,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAE7D,MAAM,cAAc,GAAG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QACrD,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAClD,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEzE,OAAO,UAAU,GAAG,KAAK,CAAC,eAAe,GAAG,GAAG,GAAG,cAAc,GAAG,cAAc,CAAC;IACtF,CAAC;IAEM,eAAe,CAAC,KAAwB,EAAE,YAAoB;QACjE,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,iBAAiB,GAAG,CAAC;YAAE,OAAO,YAAY,CAAC;QAErD,MAAM,WAAW,GAAG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAE7E,IAAI,WAAW,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,WAAW,GAAG,IAAI;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAEzE,OAAO,YAAY,CAAC;IACxB,CAAC;CACJ"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { DownloadManager } from './manager';
|
|
2
|
-
export type { DownloadManagerOptions,
|
|
2
|
+
export type { DownloadManagerOptions, DownloadProgress, DownloadProgressEventMode, DownloadProgressListener, } from './manager';
|
|
3
|
+
export { PeerScorer } from './PeerScorer';
|
|
4
|
+
export type { PeerDownloadStats } from './PeerScorer';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/torrent/download/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/torrent/download/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAO5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|