Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
023afb9
fix: typo in ws example (#417)
rfinnie Mar 6, 2022
048bc45
chore(release): 9.18.4
semantic-release-bot Mar 6, 2022
e077218
chore(deps): update actions/setup-node action to v3 (#414)
renovate[bot] Mar 6, 2022
aa2dc81
chore(deps): update actions/stale action to v5 (#416)
renovate[bot] Mar 6, 2022
330301a
chore(deps): update actions/checkout action to v3 (#415)
renovate[bot] Mar 6, 2022
f7928cf
fix: connection leaks (#420)
lookis Mar 25, 2022
2a79101
chore(release): 9.18.5
semantic-release-bot Mar 25, 2022
4b041ca
chore(deps): update actions/cache action to v3 (#419)
renovate[bot] Mar 27, 2022
38c4fdb
chore(deps): update dependency tape to v5.5.3
renovate-bot Apr 8, 2022
8d54938
fix: revert #420
DiegoRBaquero May 11, 2022
0120218
ci: rollback to node 14
DiegoRBaquero May 11, 2022
a048097
chore(release): 9.18.6
semantic-release-bot May 11, 2022
ef76b3f
feat(events): Support of `paused` client event (#411)
pavloniym Jun 1, 2022
4b5299b
chore(release): 9.19.0
semantic-release-bot Jun 1, 2022
e6d3189
feat: esm (#431)
ThaUnknown Dec 5, 2022
de947a7
chore(release): 10.0.0
semantic-release-bot Dec 5, 2022
15bcf89
chore(deps): update dependency @webtorrent/semantic-release-config to…
renovate[bot] Dec 5, 2022
bf74ecf
chore(deps): update dependency tape to v5.6.1
renovate[bot] Dec 6, 2022
926ceee
fix(deps): update dependency bencode to v3 (#434) [skip ci]
renovate[bot] Dec 7, 2022
35ede9c
chore(deps): update dependency webtorrent-fixtures to v2 (#436) [skip…
renovate[bot] Dec 7, 2022
40c2567
chore(deps): update actions/stale action to v6 (#428) [skip ci]
renovate[bot] Dec 7, 2022
ac84fbd
chore(deps): update dependency semantic-release to v19 [security] (#4…
renovate[bot] Dec 7, 2022
9be843c
fix(deps): update dependency string2compact to v2 (#437)
renovate[bot] Dec 7, 2022
cb0bdfc
chore(deps): update dependency semantic-release to v19.0.5 (#438)
renovate[bot] Dec 7, 2022
df39fed
chore(release): 10.0.1
semantic-release-bot Dec 7, 2022
0d297e4
chore(deps): update dependency tape to v5.6.3
renovate[bot] Jan 17, 2023
dda9935
ci: upgrade node
DiegoRBaquero Jan 26, 2023
b38acbd
ci: add node-pre-gyp
DiegoRBaquero Jan 30, 2023
90ee337
chore(deps): update actions/stale action to v7 (#439)
renovate[bot] Jan 30, 2023
4bf8cb5
chore(deps): update dependency semantic-release to v20 (#441)
renovate[bot] Jan 30, 2023
138c6e7
chore(deps): update dependency magnet-uri to v7 (#444)
renovate[bot] Jan 30, 2023
b72d226
chore(deps): update webtorrent (#445)
renovate[bot] Feb 1, 2023
7c4578f
ci: update release node version (#447)
ThaUnknown Feb 1, 2023
2209d4f
fix(deps): update dependency ws to v8 (#448)
renovate[bot] Feb 1, 2023
7356e34
chore(release): 10.0.2
semantic-release-bot Feb 1, 2023
bf4481c
chore(deps): update dependency semantic-release to v20.1.1
renovate[bot] Mar 1, 2023
bf8831c
adds handling for x-forwarded-for comma-separated syntax (#452)
tdjsnelling Mar 17, 2023
76a2c7a
chore(deps): update dependency semantic-release to v20.1.3
renovate[bot] Mar 18, 2023
d31e8b6
chore(deps): update dependency magnet-uri to v7.0.3
renovate[bot] Apr 2, 2023
fc7c232
chore(deps): update dependency @webtorrent/semantic-release-config to…
renovate[bot] May 8, 2023
3f01c29
perf: replace simple websocket with maintained one (#464)
ThaUnknown May 25, 2023
6864ef9
chore(release): 10.0.3
semantic-release-bot May 25, 2023
c99eb89
fix: drop buffer (#465)
ThaUnknown May 26, 2023
51a6b6d
chore(release): 10.0.4
semantic-release-bot May 26, 2023
52f5502
fix: only stringify views (#467)
ThaUnknown May 27, 2023
c5f70dd
chore(release): 10.0.5
semantic-release-bot May 27, 2023
3b2dedb
fix: replace simple-peer with maintained one (#466)
ThaUnknown May 27, 2023
17d4c66
chore(release): 10.0.6
semantic-release-bot May 27, 2023
c338104
chore(deps): update dependency magnet-uri to v7.0.4 (#468)
renovate[bot] May 27, 2023
ac3ea82
chore(deps): update dependency magnet-uri to v7.0.5
renovate[bot] May 30, 2023
a12022a
fix: imports (#471)
ThaUnknown Jun 5, 2023
a6bb919
chore(release): 10.0.7
semantic-release-bot Jun 5, 2023
d7061f7
fix: bigInt (#472)
ThaUnknown Jun 7, 2023
f9e8700
chore(deps): update dependency semantic-release to v21 (#459)
renovate[bot] Jun 7, 2023
ff778f4
chore(release): 10.0.8
semantic-release-bot Jun 7, 2023
0ddb991
chore(deps): update dependency semantic-release to v21.0.5
renovate[bot] Jun 11, 2023
7c845f0
perf: use peer/lite (#474)
ThaUnknown Jun 16, 2023
e3dd9b9
chore(release): 10.0.9
semantic-release-bot Jun 16, 2023
5b8db06
perf: use simple-peer/lite (#475)
ThaUnknown Jun 16, 2023
fcafbe5
chore(release): 10.0.10
semantic-release-bot Jun 16, 2023
9840d4c
chore(deps): update dependency semantic-release to v21.0.6
renovate[bot] Jun 29, 2023
5c97a2e
chore(deps): update dependency tape to v5.6.4
renovate[bot] Jul 3, 2023
e4aa137
chore(deps): update dependency semantic-release to v21.0.7
renovate[bot] Jul 6, 2023
9ca7468
chore(deps): update dependency tape to v5.6.5
renovate[bot] Jul 13, 2023
d2d361f
chore(deps): update dependency tape to v5.6.6
renovate[bot] Jul 19, 2023
63e5144
chore(deps): update dependency @mapbox/node-pre-gyp to v1.0.11 (#482)
renovate[bot] Jul 23, 2023
bd1acfb
chore(deps): update actions/stale action to v8 (#484)
renovate[bot] Jul 23, 2023
b487809
chore(deps): update dependency @webtorrent/semantic-release-config to…
renovate[bot] Jul 24, 2023
11cce83
fix: mangled scrape infohashes (#486)
ThaUnknown Aug 1, 2023
ae54372
chore(release): 10.0.11
semantic-release-bot Aug 1, 2023
aeccf9c
fix(deps): update dependency bencode to v4 (#487)
renovate[bot] Aug 9, 2023
ad00e13
chore(release): 10.0.12
semantic-release-bot Aug 9, 2023
6c85f1e
chore(deps): update dependency semantic-release to v21.0.8
renovate[bot] Aug 21, 2023
0f61147
chore(deps): update dependency semantic-release to v21.0.9
renovate[bot] Aug 21, 2023
3268ae5
chore(deps): update dependency semantic-release to v21.1.0
renovate[bot] Aug 25, 2023
a6922f7
chore(deps): update dependency semantic-release to v21.1.1
renovate[bot] Aug 25, 2023
7ddd003
chore(deps): update dependency semantic-release to v21.1.2
renovate[bot] Sep 17, 2023
de4a34b
chore(deps): update dependency tape to v5.7.0
renovate[bot] Sep 22, 2023
5e86736
chore(deps): update dependency tape to v5.7.1
renovate[bot] Oct 12, 2023
e14738b
chore(deps): update dependency tape to v5.7.2
renovate[bot] Oct 22, 2023
bce64e1
feat(major): drop simple-get (#443)
ThaUnknown Oct 31, 2023
e44bfe8
chore(release): 11.0.0
semantic-release-bot Oct 31, 2023
d9dacc8
chore(deps): update dependency tape to v5.7.3
renovate[bot] Jan 14, 2024
3f59b58
fix: update build badge url (#506)
GridexX Jan 16, 2024
a96ea91
chore(release): 11.0.1
semantic-release-bot Jan 16, 2024
5e2f59b
chore(deps): update dependency tape to v5.7.4
renovate[bot] Jan 26, 2024
ea1e78e
chore(deps): update dependency tape to v5.7.5
renovate[bot] Feb 15, 2024
fe75272
fix(parse-http): ignore announcements from peers with invalid announc…
SilentBot1 Mar 12, 2024
a4f956e
chore(release): 11.0.2
semantic-release-bot Mar 12, 2024
f6a7993
Add event timestamp (#516)
krazak Apr 11, 2024
633d68a
feat: updated webrtc implementation (#519)
ThaUnknown May 22, 2024
428fb22
fix: semantic release (#520)
ThaUnknown May 22, 2024
683fca8
chore(release): 11.1.0
semantic-release-bot May 22, 2024
ed57d0c
chore(deps): update dependency tape to v5.8.0
renovate[bot] Jun 16, 2024
b21a6a5
chore(deps): update dependency tape to v5.8.1
renovate[bot] Jun 17, 2024
83a24ce
perf: drop clone (#523)
ThaUnknown Jul 1, 2024
6a6280a
chore(release): 11.1.1
semantic-release-bot Jul 1, 2024
e9d8f8c
fix: statuscode (#526)
ThaUnknown Aug 13, 2024
fd5ea54
chore(release): 11.1.2
semantic-release-bot Aug 13, 2024
8b02864
chore(deps): update dependency tape to v5.9.0
renovate[bot] Sep 17, 2024
f2f4990
Add subpath import for client and server (#535)
Chocobozzz Nov 7, 2024
e45516d
Bugfix - when using AbortController, errors on resulting stream must …
uriva Nov 29, 2024
7c963a6
chore(deps): update actions/cache action to v4 (#543)
renovate[bot] Dec 28, 2024
e7de90c
feat: release #539 and #535 (#544)
SilentBot1 Dec 28, 2024
9809195
chore(release): 11.2.0
semantic-release-bot Dec 28, 2024
934dc1b
chore(deps): update dependency magnet-uri to v7.0.7 (#545)
renovate[bot] Jan 4, 2025
3cd77f3
fix: http announce no left (#548)
ThaUnknown Jan 19, 2025
b4557a7
chore(release): 11.2.1
semantic-release-bot Jan 19, 2025
1571551
fix: export WebSocketTracker (#558)
subins2000 Sep 6, 2025
295c69a
chore(release): 11.2.2
semantic-release-bot Sep 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: esm (webtorrent#431)
BREAKING CHANGE: ESM only

* feat: esm

* fix: linter oops
  • Loading branch information
ThaUnknown authored Dec 5, 2022
commit e6d3189edf1a170197a799b97d84c632692b394f
4 changes: 2 additions & 2 deletions bin/cmd.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node

const minimist = require('minimist')
const Server = require('../').Server
import minimist from 'minimist'
import { Server } from '../index.js'

const argv = minimist(process.argv.slice(2), {
alias: {
Expand Down
26 changes: 14 additions & 12 deletions client.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
const debug = require('debug')('bittorrent-tracker:client')
const EventEmitter = require('events')
const once = require('once')
const parallel = require('run-parallel')
const Peer = require('simple-peer')
const queueMicrotask = require('queue-microtask')

const common = require('./lib/common')
const HTTPTracker = require('./lib/client/http-tracker') // empty object in browser
const UDPTracker = require('./lib/client/udp-tracker') // empty object in browser
const WebSocketTracker = require('./lib/client/websocket-tracker')
import Debug from 'debug'
import EventEmitter from 'events'
import once from 'once'
import parallel from 'run-parallel'
import Peer from 'simple-peer'
import queueMicrotask from 'queue-microtask'

import common from './lib/common.js'
import HTTPTracker from './lib/client/http-tracker.js' // empty object in browser
import UDPTracker from './lib/client/udp-tracker.js' // empty object in browser
import WebSocketTracker from './lib/client/websocket-tracker.js'

const debug = Debug('bittorrent-tracker:client')

/**
* BitTorrent tracker client.
Expand Down Expand Up @@ -289,4 +291,4 @@ Client.scrape = (opts, cb) => {
return client
}

module.exports = Client
export default Client
4 changes: 2 additions & 2 deletions examples/express-embed/server.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env node

const Server = require('../..').Server
const express = require('express')
import { Server } from '../../index.js'
import express from 'express'
const app = express()

// https://wiki.theory.org/BitTorrentSpecification#peer_id
Expand Down
9 changes: 4 additions & 5 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/*! bittorrent-tracker. MIT License. WebTorrent LLC <https://webtorrent.io/opensource> */
const Client = require('./client')
const Server = require('./server')
import Client from './client.js'
import Server from './server.js'

module.exports = Client
module.exports.Client = Client
module.exports.Server = Server
export default Client
export { Client, Server }
25 changes: 13 additions & 12 deletions lib/client/http-tracker.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
const arrayRemove = require('unordered-array-remove')
const bencode = require('bencode')
const clone = require('clone')
const compact2string = require('compact2string')
const debug = require('debug')('bittorrent-tracker:http-tracker')
const get = require('simple-get')
const Socks = require('socks')

const common = require('../common')
const Tracker = require('./tracker')

import arrayRemove from 'unordered-array-remove'
import bencode from 'bencode'
import clone from 'clone'
import Debug from 'debug'
import get from 'simple-get'
import Socks from 'socks'

import common from '../common.js'
import Tracker from './tracker.js'
import compact2string from 'compact2string'

const debug = Debug('bittorrent-tracker:http-tracker')
const HTTP_SCRAPE_SUPPORT = /\/(announce)[^/]*$/

/**
Expand Down Expand Up @@ -256,4 +257,4 @@ class HTTPTracker extends Tracker {

HTTPTracker.prototype.DEFAULT_ANNOUNCE_INTERVAL = 30 * 60 * 1000 // 30 minutes

module.exports = HTTPTracker
export default HTTPTracker
4 changes: 2 additions & 2 deletions lib/client/tracker.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const EventEmitter = require('events')
import EventEmitter from 'events'

class Tracker extends EventEmitter {
constructor (client, announceUrl) {
Expand All @@ -25,4 +25,4 @@ class Tracker extends EventEmitter {
}
}

module.exports = Tracker
export default Tracker
26 changes: 14 additions & 12 deletions lib/client/udp-tracker.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
const arrayRemove = require('unordered-array-remove')
const BN = require('bn.js')
const clone = require('clone')
const compact2string = require('compact2string')
const debug = require('debug')('bittorrent-tracker:udp-tracker')
const dgram = require('dgram')
const randombytes = require('randombytes')
const Socks = require('socks')

const common = require('../common')
const Tracker = require('./tracker')
import arrayRemove from 'unordered-array-remove'
import BN from 'bn.js'
import clone from 'clone'
import Debug from 'debug'
import dgram from 'dgram'
import randombytes from 'randombytes'
import Socks from 'socks'

import common from '../common.js'
import Tracker from './tracker.js'
import compact2string from 'compact2string'

const debug = Debug('bittorrent-tracker:udp-tracker')

/**
* UDP torrent tracker client (for an individual tracker)
Expand Down Expand Up @@ -329,4 +331,4 @@ function toUInt64 (n) {

function noop () {}

module.exports = UDPTracker
export default UDPTracker
20 changes: 11 additions & 9 deletions lib/client/websocket-tracker.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
const clone = require('clone')
const debug = require('debug')('bittorrent-tracker:websocket-tracker')
const Peer = require('simple-peer')
const randombytes = require('randombytes')
const Socket = require('simple-websocket')
const Socks = require('socks')
import clone from 'clone'
import Debug from 'debug'
import Peer from 'simple-peer'
import randombytes from 'randombytes'
import Socket from 'simple-websocket'
import Socks from 'socks'

const common = require('../common')
const Tracker = require('./tracker')
import common from '../common.js'
import Tracker from './tracker.js'

const debug = Debug('bittorrent-tracker:websocket-tracker')

// Use a socket pool, so tracker clients share WebSocket objects for the same server.
// In practice, WebSockets are pretty slow to establish, so this gives a nice performance
Expand Down Expand Up @@ -439,4 +441,4 @@ WebSocketTracker._socketPool = socketPool

function noop () {}

module.exports = WebSocketTracker
export default WebSocketTracker
29 changes: 14 additions & 15 deletions lib/common-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@
* These are separate from common.js so they can be skipped when bundling for the browser.
*/

const querystring = require('querystring')
import querystring from 'querystring'

exports.IPV4_RE = /^[\d.]+$/
exports.IPV6_RE = /^[\da-fA-F:]+$/
exports.REMOVE_IPV4_MAPPED_IPV6_RE = /^::ffff:/
export const IPV4_RE = /^[\d.]+$/
export const IPV6_RE = /^[\da-fA-F:]+$/
export const REMOVE_IPV4_MAPPED_IPV6_RE = /^::ffff:/

exports.CONNECTION_ID = Buffer.concat([toUInt32(0x417), toUInt32(0x27101980)])
exports.ACTIONS = { CONNECT: 0, ANNOUNCE: 1, SCRAPE: 2, ERROR: 3 }
exports.EVENTS = { update: 0, completed: 1, started: 2, stopped: 3, paused: 4 }
exports.EVENT_IDS = {
export const CONNECTION_ID = Buffer.concat([toUInt32(0x417), toUInt32(0x27101980)])
export const ACTIONS = { CONNECT: 0, ANNOUNCE: 1, SCRAPE: 2, ERROR: 3 }
export const EVENTS = { update: 0, completed: 1, started: 2, stopped: 3, paused: 4 }
export const EVENT_IDS = {
0: 'update',
1: 'completed',
2: 'started',
3: 'stopped',
4: 'paused'
}
exports.EVENT_NAMES = {
export const EVENT_NAMES = {
update: 'update',
completed: 'complete',
started: 'start',
Expand All @@ -31,36 +31,35 @@ exports.EVENT_NAMES = {
* Client request timeout. How long to wait before considering a request to a
* tracker server to have timed out.
*/
exports.REQUEST_TIMEOUT = 15000
export const REQUEST_TIMEOUT = 15000

/**
* Client destroy timeout. How long to wait before forcibly cleaning up all
* pending requests, open sockets, etc.
*/
exports.DESTROY_TIMEOUT = 1000
export const DESTROY_TIMEOUT = 1000

function toUInt32 (n) {
export function toUInt32 (n) {
const buf = Buffer.allocUnsafe(4)
buf.writeUInt32BE(n, 0)
return buf
}
exports.toUInt32 = toUInt32

/**
* `querystring.parse` using `unescape` instead of decodeURIComponent, since bittorrent
* clients send non-UTF8 querystrings
* @param {string} q
* @return {Object}
*/
exports.querystringParse = q => querystring.parse(q, null, null, { decodeURIComponent: unescape })
export const querystringParse = q => querystring.parse(q, null, null, { decodeURIComponent: unescape })

/**
* `querystring.stringify` using `escape` instead of encodeURIComponent, since bittorrent
* clients send non-UTF8 querystrings
* @param {Object} obj
* @return {string}
*/
exports.querystringStringify = obj => {
export const querystringStringify = obj => {
let ret = querystring.stringify(obj, null, null, { encodeURIComponent: escape })
ret = ret.replace(/[@*/+]/g, char => // `escape` doesn't encode the characters @*/+ so we do it manually
`%${char.charCodeAt(0).toString(16).toUpperCase()}`)
Expand Down
21 changes: 14 additions & 7 deletions lib/common.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
/**
* Functions/constants needed by both the client and server.
*/
import * as common from './common-node.js'

exports.DEFAULT_ANNOUNCE_PEERS = 50
exports.MAX_ANNOUNCE_PEERS = 82
export const DEFAULT_ANNOUNCE_PEERS = 50
export const MAX_ANNOUNCE_PEERS = 82

exports.binaryToHex = str => {
export const binaryToHex = str => {
if (typeof str !== 'string') {
str = String(str)
}
return Buffer.from(str, 'binary').toString('hex')
}

exports.hexToBinary = str => {
export const hexToBinary = str => {
if (typeof str !== 'string') {
str = String(str)
}
Expand All @@ -31,7 +32,7 @@ exports.hexToBinary = str => {
// Bug reports:
// - Chrome: https://bugs.chromium.org/p/chromium/issues/detail?id=734880
// - Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=1374505
exports.parseUrl = str => {
export const parseUrl = str => {
const url = new URL(str.replace(/^udp:/, 'http:'))

if (str.match(/^udp:/)) {
Expand All @@ -45,5 +46,11 @@ exports.parseUrl = str => {
return url
}

const config = require('./common-node')
Object.assign(exports, config)
export default {
DEFAULT_ANNOUNCE_PEERS,
MAX_ANNOUNCE_PEERS,
binaryToHex,
hexToBinary,
parseUrl,
...common
}
4 changes: 2 additions & 2 deletions lib/server/parse-http.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = parseHttpRequest
import common from '../common.js'

const common = require('../common')
export default parseHttpRequest

function parseHttpRequest (req, opts) {
if (!opts) opts = {}
Expand Down
6 changes: 3 additions & 3 deletions lib/server/parse-udp.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module.exports = parseUdpRequest
import ipLib from 'ip'
import common from '../common.js'

const ipLib = require('ip')
const common = require('../common')
export default parseUdpRequest

function parseUdpRequest (msg, rinfo) {
if (msg.length < 16) throw new Error('received packet is too short')
Expand Down
4 changes: 2 additions & 2 deletions lib/server/parse-websocket.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module.exports = parseWebSocketRequest
import common from '../common.js'

const common = require('../common')
export default parseWebSocketRequest

function parseWebSocketRequest (socket, opts, params) {
if (!opts) opts = {}
Expand Down
12 changes: 7 additions & 5 deletions lib/server/swarm.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
const arrayRemove = require('unordered-array-remove')
const debug = require('debug')('bittorrent-tracker:swarm')
const LRU = require('lru')
const randomIterate = require('random-iterate')
import arrayRemove from 'unordered-array-remove'
import Debug from 'debug'
import LRU from 'lru'
import randomIterate from 'random-iterate'

const debug = Debug('bittorrent-tracker:swarm')

// Regard this as the default implementation of an interface that you
// need to support when overriding Server.createSwarm() and Server.getSwarm()
Expand Down Expand Up @@ -159,4 +161,4 @@ class Swarm {
}
}

module.exports = Swarm
export default Swarm
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"bugs": {
"url": "https://github.com/webtorrent/bittorrent-tracker/issues"
},
"type": "module",
"dependencies": {
"bencode": "^2.0.1",
"bittorrent-peerid": "^1.3.3",
Expand Down Expand Up @@ -60,7 +61,10 @@
"wrtc": "0.4.7"
},
"engines": {
"node": ">=12"
"node": ">=12.20.0"
},
"exports": {
"import": "./index.js"
},
"keywords": [
"bittorrent",
Expand Down
Loading