Skip to content

Commit

Permalink
perf: drop buffer (#64)
Browse files Browse the repository at this point in the history
  • Loading branch information
ThaUnknown committed Jan 26, 2023
1 parent 8144424 commit cf98664
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 19 deletions.
15 changes: 8 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*! magnet-uri. MIT License. WebTorrent LLC <https://webtorrent.io/opensource> */
import base32 from 'thirty-two'
import { parse, compose } from 'bep53-range'
import { hex2arr, arr2hex, bin2hex } from 'uint8-util'

/**
* Parse a magnet URI and return an object of keys/values
Expand Down Expand Up @@ -66,7 +67,7 @@ function magnetURIDecode (uri) {
result.infoHash = m[1].toLowerCase()
} else if ((m = xt.match(/^urn:btih:(.{32})/))) {
const decodedStr = base32.decode(m[1])
result.infoHash = Buffer.from(decodedStr, 'binary').toString('hex')
result.infoHash = bin2hex(decodedStr)
} else if ((m = xt.match(/^urn:btmh:1220(.{64})/))) {
result.infoHashV2 = m[1].toLowerCase()
}
Expand All @@ -82,9 +83,9 @@ function magnetURIDecode (uri) {
})
}

if (result.infoHash) result.infoHashBuffer = Buffer.from(result.infoHash, 'hex')
if (result.infoHashV2) result.infoHashV2Buffer = Buffer.from(result.infoHashV2, 'hex')
if (result.publicKey) result.publicKeyBuffer = Buffer.from(result.publicKey, 'hex')
if (result.infoHash) result.infoHashBuffer = hex2arr(result.infoHash)
if (result.infoHashV2) result.infoHashV2Buffer = hex2arr(result.infoHashV2)
if (result.publicKey) result.publicKeyBuffer = hex2arr(result.publicKey)

if (result.dn) result.name = result.dn
if (result.kt) result.keywords = result.kt
Expand Down Expand Up @@ -125,15 +126,15 @@ function magnetURIEncode (obj) {
let xts = new Set()
if (obj.xt && typeof obj.xt === 'string') xts.add(obj.xt)
if (obj.xt && Array.isArray(obj.xt)) xts = new Set(obj.xt)
if (obj.infoHashBuffer) xts.add(`urn:btih:${obj.infoHashBuffer.toString('hex')}`)
if (obj.infoHashBuffer) xts.add(`urn:btih:${arr2hex(obj.infoHashBuffer)}`)
if (obj.infoHash) xts.add(`urn:btih:${obj.infoHash}`)
if (obj.infoHashV2Buffer) xts.add(obj.xt = `urn:btmh:1220${obj.infoHashV2Buffer.toString('hex')}`)
if (obj.infoHashV2Buffer) xts.add(obj.xt = `urn:btmh:1220${arr2hex(obj.infoHashV2Buffer)}`)
if (obj.infoHashV2) xts.add(`urn:btmh:1220${obj.infoHashV2}`)
const xtsDeduped = Array.from(xts)
if (xtsDeduped.length === 1) obj.xt = xtsDeduped[0]
if (xtsDeduped.length > 1) obj.xt = xtsDeduped

if (obj.publicKeyBuffer) obj.xs = `urn:btpk:${obj.publicKeyBuffer.toString('hex')}`
if (obj.publicKeyBuffer) obj.xs = `urn:btpk:${arr2hex(obj.publicKeyBuffer)}`
if (obj.publicKey) obj.xs = `urn:btpk:${obj.publicKey}`
if (obj.name) obj.dn = obj.name
if (obj.keywords) obj.kt = obj.keywords
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@
"type": "module",
"dependencies": {
"bep53-range": "^2.0.0",
"thirty-two": "^1.0.2"
"thirty-two": "^1.0.2",
"uint8-util": "^2.1.6"
},
"devDependencies": {
"@webtorrent/semantic-release-config": "1.0.8",
Expand Down
2 changes: 1 addition & 1 deletion test/decode.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ test('decode: Extracts public key from xs', t => {
const key = '9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0'
const result = magnet(`magnet:?xs=urn:btpk:${key}`)
t.equal(result.publicKey, key)
t.deepEqual(result.publicKeyBuffer, Buffer.from(key, 'hex'))
t.deepEqual(result.publicKeyBuffer, new Uint8Array(Buffer.from(key, 'hex')))
t.end()
})

Expand Down
20 changes: 10 additions & 10 deletions test/encode.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ test('encode: simple magnet uri using convenience names', t => {
dn: 'Leaves of Grass by Walt Whitman.epub',
name: 'Leaves of Grass by Walt Whitman.epub',
infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
infoHashBuffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex'),
infoHashBuffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex')),
infoHashV2: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b',
infoHashV2Buffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 'hex'),
infoHashV2Buffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 'hex')),
tr: [
'udp://tracker.example1.com:1337',
'udp://tracker.example2.com:80',
Expand Down Expand Up @@ -70,12 +70,12 @@ test('encode: simple magnet uri using convenience names', t => {

test('encode: using infoHashBuffer', t => {
const obj = {
infoHashBuffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex')
infoHashBuffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex'))
}
const result = encode(obj)
t.equal(result, 'magnet:?xt=urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36')
t.deepEqual(decode(result), {
infoHashBuffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex'),
infoHashBuffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex')),
infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
urlList: [],
Expand All @@ -87,13 +87,13 @@ test('encode: using infoHashBuffer', t => {

test('encode: using infoHashV2Buffer', t => {
const obj = {
infoHashV2Buffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 'hex')
infoHashV2Buffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 'hex'))
}
const result = encode(obj)
t.equal(result, 'magnet:?xt=urn:btmh:1220d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b')
t.deepEqual(decode(result), {
infoHashV2: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b',
infoHashV2Buffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 'hex'),
infoHashV2Buffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b', 'hex')),
xt: 'urn:btmh:1220d2474e86c95b19b8bcfdb92bc12c9d44667cfa36d2474e86c95b19b8bcfdb92b',
urlList: [],
announce: [],
Expand All @@ -113,7 +113,7 @@ test('encode: select-only', t => {
t.deepEqual(decode(result), {
xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
infoHashBuffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex'),
infoHashBuffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex')),
urlList: [],
announce: [],
peerAddresses: [],
Expand All @@ -134,7 +134,7 @@ test('encode: peer-address single value', t => {
xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
'x.pe': '123.213.32.10:47450',
infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
infoHashBuffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex'),
infoHashBuffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex')),
urlList: [],
announce: [],
peerAddresses: ['123.213.32.10:47450']
Expand All @@ -153,7 +153,7 @@ test('encode: peer-address multiple values', t => {
xt: 'urn:btih:d2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
'x.pe': ['123.213.32.10:47450', '[2001:db8::2]:55013'],
infoHash: 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36',
infoHashBuffer: Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex'),
infoHashBuffer: new Uint8Array(Buffer.from('d2474e86c95b19b8bcfdb92bc12c9d44667cfa36', 'hex')),
urlList: [],
announce: [],
peerAddresses: ['123.213.32.10:47450', '[2001:db8::2]:55013']
Expand All @@ -172,7 +172,7 @@ test('encode: using publicKey', t => {
})

test('encode: using publicKeyBuffer', t => {
const publicKeyBuffer = Buffer.from('9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0', 'hex')
const publicKeyBuffer = new Uint8Array(Buffer.from('9a36edf0988ddc1a0fc02d4e8652cce87a71aaac71fce936e650a597c0fb72e0', 'hex'))
const obj = {
publicKeyBuffer
}
Expand Down

0 comments on commit cf98664

Please sign in to comment.