@ctrl/magnet-link 2.0.2 → 3.1.0

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.
@@ -0,0 +1,2 @@
1
+ export declare function composeRange(range: number[]): string[];
2
+ export declare function parseRange(range: string[]): number[];
@@ -0,0 +1,23 @@
1
+ /* eslint-disable @typescript-eslint/restrict-plus-operands */
2
+ export function composeRange(range) {
3
+ return range
4
+ .reduce((acc, cur, idx, arr) => {
5
+ // @ts-expect-error
6
+ if (idx === 0 || cur !== arr[idx - 1] + 1) {
7
+ acc.push([]);
8
+ }
9
+ // @ts-expect-error
10
+ acc[acc.length - 1].push(cur);
11
+ return acc;
12
+ }, [])
13
+ .map(cur => {
14
+ return cur.length > 1 ? `${cur[0]}-${cur[cur.length - 1]}` : `${cur[0]}`;
15
+ });
16
+ }
17
+ export function parseRange(range) {
18
+ const generateRange = (start, end = start) => Array.from({ length: end - start + 1 }, (_, idx) => idx + start);
19
+ return range.reduce((acc, cur) => {
20
+ const r = cur.split('-').map(cur => parseInt(cur, 10));
21
+ return acc.concat(generateRange(r[0], r[1]));
22
+ }, []);
23
+ }
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  export interface MagnetData {
2
3
  /**
3
4
  * Is the info-hash hex encoded, for a total of 40 characters. For compatability with existing links in the wild, clients should also support the 32 character base32 encoded info-hash.
@@ -7,11 +8,14 @@ export interface MagnetData {
7
8
  * Is the multihash formatted, hex encoded full infohash for torrents in the new metadata format. 'btmh' and 'btih' exact topics may exist in the same magnet if they describe the same hybrid torrent.
8
9
  * @link http://www.bittorrent.org/beps/bep_0009.html
9
10
  */
10
- xt: string | string[];
11
+ xt?: string | string[];
11
12
  /**
12
13
  * Parsed xt= parameter see xt
13
14
  */
14
15
  infoHash?: string;
16
+ infoHashBuffer?: Buffer;
17
+ infoHashV2?: string;
18
+ infoHashV2Buffer?: Buffer;
15
19
  /**
16
20
  * The display name that may be used by the client to display while waiting for metadata
17
21
  */
@@ -44,6 +48,8 @@ export interface MagnetData {
44
48
  * "keyword topic": a more general search, specifying search terms rather than a particular file
45
49
  */
46
50
  kt?: string[];
51
+ so?: string[] | number[];
52
+ 'x.pe'?: string | string[];
47
53
  /**
48
54
  * "keyword topic": a more general search, specifying search terms rather than a particular file
49
55
  */
@@ -60,6 +66,9 @@ export interface MagnetData {
60
66
  * Combined as= and ws= parameters if they exist
61
67
  */
62
68
  urlList?: string[];
69
+ peerAddresses?: string[];
70
+ publicKey?: string;
71
+ publicKeyBuffer?: Buffer;
63
72
  }
64
73
  export declare function magnetDecode(uri: string): MagnetData;
65
74
  export declare function magnetEncode(data: MagnetData): string;
@@ -1,4 +1,5 @@
1
1
  import { base32Decode } from '@ctrl/ts-base32';
2
+ import * as bep53Range from './bep53.js';
2
3
  const start = 'magnet:?';
3
4
  export function magnetDecode(uri) {
4
5
  // Support 'stream-magnet:' as well
@@ -23,9 +24,12 @@ export function magnetDecode(uri) {
23
24
  }
24
25
  // If there are repeated parameters, return an array of values
25
26
  if (r && Array.isArray(r)) {
26
- return r.push(val);
27
+ r.push(val);
28
+ return;
27
29
  }
28
30
  result[key] = [r, val];
31
+ // eslint-disable-next-line no-useless-return
32
+ return;
29
33
  });
30
34
  if (result.xt) {
31
35
  let m;
@@ -38,8 +42,30 @@ export function magnetDecode(uri) {
38
42
  const decodedStr = base32Decode(m[1]);
39
43
  result.infoHash = Buffer.from(decodedStr).toString('hex');
40
44
  }
45
+ else if ((m = xt.match(/^urn:btmh:1220(.{64})/))) {
46
+ result.infoHashV2 = m[1].toLowerCase();
47
+ }
41
48
  });
42
49
  }
50
+ if (result.xs) {
51
+ let m;
52
+ const xss = Array.isArray(result.xs) ? result.xs : [result.xs];
53
+ xss.forEach(xs => {
54
+ var _a;
55
+ if ((m = /^urn:btpk:(.{64})/.exec(xs))) {
56
+ result.publicKey = (_a = m[1]) === null || _a === void 0 ? void 0 : _a.toLowerCase();
57
+ }
58
+ });
59
+ }
60
+ if (result.infoHash) {
61
+ result.infoHashBuffer = Buffer.from(result.infoHash, 'hex');
62
+ }
63
+ if (result.infoHashV2) {
64
+ result.infoHashV2Buffer = Buffer.from(result.infoHashV2, 'hex');
65
+ }
66
+ if (result.publicKey) {
67
+ result.publicKeyBuffer = Buffer.from(result.publicKey, 'hex');
68
+ }
43
69
  if (result.dn) {
44
70
  result.name = result.dn;
45
71
  }
@@ -62,8 +88,13 @@ export function magnetDecode(uri) {
62
88
  if (typeof result.ws === 'string' || Array.isArray(result.ws)) {
63
89
  result.urlList = result.urlList.concat(result.ws);
64
90
  }
91
+ result.peerAddresses = [];
92
+ if (typeof result['x.pe'] === 'string' || Array.isArray(result['x.pe'])) {
93
+ result.peerAddresses = result.peerAddresses.concat(result['x.pe']);
94
+ }
65
95
  result.announce = [...new Set(result.announce)].sort((a, b) => a.localeCompare(b));
66
96
  result.urlList = [...new Set(result.urlList)].sort((a, b) => a.localeCompare(b));
97
+ result.peerAddresses = [...new Set(result.peerAddresses)];
67
98
  return result;
68
99
  }
69
100
  /**
@@ -83,6 +114,10 @@ function parseQueryParamValue(key, val) {
83
114
  if (key === 'kt') {
84
115
  return decodeURIComponent(val).split('+');
85
116
  }
117
+ // bep53
118
+ if (key === 'so') {
119
+ return bep53Range.parseRange(decodeURIComponent(val).split(','));
120
+ }
86
121
  // Cast file index (ix) to a number
87
122
  if (key === 'ix') {
88
123
  return Number(val);
@@ -91,11 +126,44 @@ function parseQueryParamValue(key, val) {
91
126
  }
92
127
  export function magnetEncode(data) {
93
128
  const obj = { ...data }; // Shallow clone object
129
+ // Deduplicate xt by using a set
130
+ let xts = new Set();
131
+ if (obj.xt && typeof obj.xt === 'string') {
132
+ xts.add(obj.xt);
133
+ }
134
+ if (obj.xt && Array.isArray(obj.xt)) {
135
+ xts = new Set(obj.xt);
136
+ }
137
+ if (obj.infoHashBuffer) {
138
+ xts.add(`urn:btih:${obj.infoHashBuffer.toString('hex')}`);
139
+ }
140
+ if (obj.infoHash) {
141
+ xts.add(`urn:btih:${obj.infoHash}`);
142
+ }
143
+ if (obj.infoHashV2Buffer) {
144
+ xts.add((obj.xt = `urn:btmh:1220${obj.infoHashV2Buffer.toString('hex')}`));
145
+ }
146
+ if (obj.infoHashV2) {
147
+ xts.add(`urn:btmh:1220${obj.infoHashV2}`);
148
+ }
149
+ const xtsDeduped = Array.from(xts);
150
+ if (xtsDeduped.length === 1) {
151
+ obj.xt = xtsDeduped[0];
152
+ }
153
+ if (xtsDeduped.length > 1) {
154
+ obj.xt = xtsDeduped;
155
+ }
94
156
  // Support using convenience names, in addition to spec names
95
157
  // (example: `infoHash` for `xt`, `name` for `dn`)
96
158
  if (obj.infoHash) {
97
159
  obj.xt = `urn:btih:${obj.infoHash}`;
98
160
  }
161
+ if (obj.publicKeyBuffer) {
162
+ obj.xs = `urn:btpk:${obj.publicKeyBuffer.toString('hex')}`;
163
+ }
164
+ if (obj.publicKey) {
165
+ obj.xs = `urn:btpk:${obj.publicKey}`;
166
+ }
99
167
  if (obj.name) {
100
168
  obj.dn = obj.name;
101
169
  }
@@ -109,33 +177,44 @@ export function magnetEncode(data) {
109
177
  obj.ws = obj.urlList;
110
178
  delete obj.as;
111
179
  }
180
+ if (obj.peerAddresses) {
181
+ obj['x.pe'] = obj.peerAddresses;
182
+ }
112
183
  return Object.keys(obj)
113
- .filter(key => key.length === 2)
184
+ .filter(key => key.length === 2 || key === 'x.pe')
114
185
  .reduce((prev, key, i) => {
115
186
  let acc = prev;
116
187
  const values = Array.isArray(obj[key]) ? obj[key] : [obj[key]];
117
188
  values.forEach((val, j) => {
118
- if ((i > 0 || j > 0) && (key !== 'kt' || j === 0)) {
119
- acc = `${acc}&`;
189
+ if ((i > 0 || j > 0) && ((key !== 'kt' && key !== 'so') || j === 0)) {
190
+ acc += '&';
120
191
  }
121
- let res = val;
122
192
  if (key === 'dn') {
123
- res = encodeURIComponent(val).replace(/%20/g, '+');
193
+ val = encodeURIComponent(val).replace(/%20/g, '+');
124
194
  }
125
- if (key === 'tr' || key === 'xs' || key === 'as' || key === 'ws') {
126
- res = encodeURIComponent(val);
195
+ if (key === 'tr' || key === 'as' || key === 'ws') {
196
+ val = encodeURIComponent(val);
197
+ }
198
+ // Don't URI encode BEP46 keys
199
+ if (key === 'xs' && !val.startsWith('urn:btpk:')) {
200
+ val = encodeURIComponent(val);
127
201
  }
128
202
  if (key === 'kt') {
129
- res = encodeURIComponent(val);
203
+ val = encodeURIComponent(val);
204
+ }
205
+ if (key === 'so') {
206
+ return;
130
207
  }
131
208
  if (key === 'kt' && j > 0) {
132
- acc = `${acc}+${res}`;
209
+ acc += `+${val}`;
133
210
  }
134
211
  else {
135
- acc = `${acc}${key}=${res}`;
212
+ acc += `${key}=${val}`;
136
213
  }
137
214
  });
215
+ if (key === 'so') {
216
+ acc += `${key}=${bep53Range.composeRange(values)}`;
217
+ }
138
218
  return acc;
139
219
  }, `${start}`);
140
220
  }
141
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ctrl/magnet-link",
3
- "version": "2.0.2",
3
+ "version": "3.1.0",
4
4
  "description": "Parse a magnet URI into an object",
5
5
  "author": "Scott Cooper <scttcper@gmail.com>",
6
6
  "homepage": "https://magnet-link.vercel.app",
@@ -12,55 +12,58 @@
12
12
  "link",
13
13
  "magnet-uri"
14
14
  ],
15
- "main": "./dist/index.js",
16
- "module": "./dist/module/index.js",
17
- "typings": "./dist/index.d.ts",
15
+ "type": "module",
16
+ "exports": "./dist/src/index.js",
17
+ "types": "./dist/src/index.d.ts",
18
18
  "files": [
19
- "dist"
19
+ "dist/src"
20
20
  ],
21
21
  "sideEffects": false,
22
- "publishConfig": {
23
- "access": "public"
24
- },
25
22
  "scripts": {
26
- "build:demo": "rollup -c rollup.demo.js",
27
- "watch:demo": "rollup -c rollup.demo.js -w",
28
- "lint": "eslint --ext .js,.ts, .",
29
- "lint:fix": "eslint --fix --ext .js,.ts, .",
23
+ "demo:build": "npm run build --workspace=demo",
24
+ "demo:watch": "npm run dev --workspace=demo",
25
+ "lint": "eslint --ext .ts .",
26
+ "lint:fix": "eslint --fix --ext .ts .",
30
27
  "prepare": "npm run build",
31
- "build": "tsc -p tsconfig.build.json && tsc -p tsconfig.module.json",
32
- "test": "jest",
33
- "test:watch": "jest --watch",
34
- "test:ci": "jest --coverage --no-cache"
28
+ "build": "tsc",
29
+ "test": "ava",
30
+ "test:watch": "ava --watch",
31
+ "test:ci": "c8 --reporter=text --reporter=lcov ava"
35
32
  },
36
33
  "dependencies": {
37
- "@ctrl/ts-base32": "^1.2.2"
34
+ "@ctrl/ts-base32": "^2.1.1"
38
35
  },
39
36
  "devDependencies": {
40
- "@ctrl/eslint-config": "1.0.2",
41
- "@jest/globals": "26.1.0",
42
- "@rollup/plugin-node-resolve": "8.1.0",
43
- "@types/node": "14.0.14",
44
- "buffer": "5.6.0",
45
- "jest": "26.1.0",
46
- "rollup-plugin-livereload": "1.3.0",
47
- "rollup-plugin-node-builtins": "2.1.2",
48
- "rollup-plugin-node-globals": "1.4.0",
49
- "rollup-plugin-serve": "1.0.1",
50
- "rollup-plugin-terser": "6.1.0",
51
- "rollup-plugin-typescript2": "0.27.1",
52
- "rollup": "2.19.0",
53
- "ts-jest": "26.1.1",
54
- "typescript": "3.9.6"
37
+ "@ctrl/eslint-config": "3.3.1",
38
+ "@sindresorhus/tsconfig": "2.0.0",
39
+ "@types/node": "17.0.9",
40
+ "ava": "4.0.1",
41
+ "buffer": "6.0.3",
42
+ "c8": "7.11.0",
43
+ "ts-node": "10.4.0",
44
+ "typescript": "4.5.4"
45
+ },
46
+ "ava": {
47
+ "files": [
48
+ "test/**/*.spec.ts"
49
+ ],
50
+ "extensions": {
51
+ "ts": "module"
52
+ },
53
+ "nodeArguments": [
54
+ "--loader=ts-node/esm"
55
+ ]
56
+ },
57
+ "workspaces": [
58
+ "demo"
59
+ ],
60
+ "publishConfig": {
61
+ "access": "public"
55
62
  },
56
63
  "release": {
57
64
  "branch": "master"
58
65
  },
59
- "jest": {
60
- "preset": "ts-jest",
61
- "testEnvironment": "node"
62
- },
63
66
  "engines": {
64
- "node": ">=10.19.0"
67
+ "node": ">=14.16"
65
68
  }
66
69
  }
package/dist/index.js DELETED
@@ -1,146 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.magnetEncode = exports.magnetDecode = void 0;
4
- const ts_base32_1 = require("@ctrl/ts-base32");
5
- const start = 'magnet:?';
6
- function magnetDecode(uri) {
7
- // Support 'stream-magnet:' as well
8
- const data = uri.substr(uri.indexOf(start) + start.length);
9
- const params = data && data.length >= 0 ? data.split('&') : [];
10
- const result = {};
11
- params.forEach(param => {
12
- const keyval = param.split('=');
13
- // This keyval is invalid, skip it
14
- if (keyval.length !== 2) {
15
- return;
16
- }
17
- const key = keyval[0];
18
- const val = parseQueryParamValue(key, keyval[1]);
19
- if (val === undefined) {
20
- return;
21
- }
22
- const r = result[key];
23
- if (!r) {
24
- result[key] = val;
25
- return result;
26
- }
27
- // If there are repeated parameters, return an array of values
28
- if (r && Array.isArray(r)) {
29
- return r.push(val);
30
- }
31
- result[key] = [r, val];
32
- });
33
- if (result.xt) {
34
- let m;
35
- const xts = Array.isArray(result.xt) ? result.xt : [result.xt];
36
- xts.forEach((xt) => {
37
- if ((m = xt.match(/^urn:btih:(.{40})/))) {
38
- result.infoHash = m[1].toLowerCase();
39
- }
40
- else if ((m = xt.match(/^urn:btih:(.{32})/))) {
41
- const decodedStr = ts_base32_1.base32Decode(m[1]);
42
- result.infoHash = Buffer.from(decodedStr).toString('hex');
43
- }
44
- });
45
- }
46
- if (result.dn) {
47
- result.name = result.dn;
48
- }
49
- if (result.kt) {
50
- result.keywords = result.kt;
51
- }
52
- if (typeof result.tr === 'string') {
53
- result.announce = [result.tr];
54
- }
55
- else if (Array.isArray(result.tr)) {
56
- result.announce = result.tr;
57
- }
58
- else {
59
- result.announce = [];
60
- }
61
- result.urlList = [];
62
- if (typeof result.as === 'string' || Array.isArray(result.as)) {
63
- result.urlList = result.urlList.concat(result.as);
64
- }
65
- if (typeof result.ws === 'string' || Array.isArray(result.ws)) {
66
- result.urlList = result.urlList.concat(result.ws);
67
- }
68
- result.announce = [...new Set(result.announce)].sort((a, b) => a.localeCompare(b));
69
- result.urlList = [...new Set(result.urlList)].sort((a, b) => a.localeCompare(b));
70
- return result;
71
- }
72
- exports.magnetDecode = magnetDecode;
73
- /**
74
- * Specific query parameters have expected formats, this attempts to parse them in the correct way
75
- */
76
- function parseQueryParamValue(key, val) {
77
- // Clean up torrent name
78
- if (key === 'dn') {
79
- return decodeURIComponent(val).replace(/\+/g, ' ');
80
- }
81
- // Address tracker (tr), exact source (xs), and acceptable source (as) are encoded
82
- // URIs, so decode them
83
- if (key === 'tr' || key === 'xs' || key === 'as' || key === 'ws') {
84
- return decodeURIComponent(val);
85
- }
86
- // Return keywords as an array
87
- if (key === 'kt') {
88
- return decodeURIComponent(val).split('+');
89
- }
90
- // Cast file index (ix) to a number
91
- if (key === 'ix') {
92
- return Number(val);
93
- }
94
- return val;
95
- }
96
- function magnetEncode(data) {
97
- const obj = { ...data }; // Shallow clone object
98
- // Support using convenience names, in addition to spec names
99
- // (example: `infoHash` for `xt`, `name` for `dn`)
100
- if (obj.infoHash) {
101
- obj.xt = `urn:btih:${obj.infoHash}`;
102
- }
103
- if (obj.name) {
104
- obj.dn = obj.name;
105
- }
106
- if (obj.keywords) {
107
- obj.kt = obj.keywords;
108
- }
109
- if (obj.announce) {
110
- obj.tr = obj.announce;
111
- }
112
- if (obj.urlList) {
113
- obj.ws = obj.urlList;
114
- delete obj.as;
115
- }
116
- return Object.keys(obj)
117
- .filter(key => key.length === 2)
118
- .reduce((prev, key, i) => {
119
- let acc = prev;
120
- const values = Array.isArray(obj[key]) ? obj[key] : [obj[key]];
121
- values.forEach((val, j) => {
122
- if ((i > 0 || j > 0) && (key !== 'kt' || j === 0)) {
123
- acc = `${acc}&`;
124
- }
125
- let res = val;
126
- if (key === 'dn') {
127
- res = encodeURIComponent(val).replace(/%20/g, '+');
128
- }
129
- if (key === 'tr' || key === 'xs' || key === 'as' || key === 'ws') {
130
- res = encodeURIComponent(val);
131
- }
132
- if (key === 'kt') {
133
- res = encodeURIComponent(val);
134
- }
135
- if (key === 'kt' && j > 0) {
136
- acc = `${acc}+${res}`;
137
- }
138
- else {
139
- acc = `${acc}${key}=${res}`;
140
- }
141
- });
142
- return acc;
143
- }, `${start}`);
144
- }
145
- exports.magnetEncode = magnetEncode;
146
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}