Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"test:browser": "playwright-test --runner mocha 'test/**/!(*.node).test.js'"
},
"dependencies": {
"@multiformats/multiaddr": "^12.4.0",
"@vascosantos/multiaddr": "^12.4.2",
"multiformats": "^13.3.6"
},
"devDependencies": {
Expand Down
30 changes: 15 additions & 15 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion src/api.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { CID } from 'multiformats/cid'
import { Multiaddr } from '@multiformats/multiaddr'
import { Multiaddr } from '@vascosantos/multiaddr'

export interface ProviderHint {
multiaddr: Multiaddr
tags?: string[]
}

export type { CID, Multiaddr }
26 changes: 23 additions & 3 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as API from './api.js'

import { multiaddr, isMultiaddr } from '@multiformats/multiaddr'
import { multiaddr, isMultiaddr } from '@vascosantos/multiaddr'
import { CID } from 'multiformats/cid'

/**
Expand Down Expand Up @@ -36,6 +36,10 @@ export function createUri({ base, path, providers = [] }) {
const baseParts = provider.multiaddr.toString().split('/')
const hintParts = [...baseParts]

for (const tag of provider.tags || []) {
if (tag) hintParts.push('tag', tag)
}

const hint = '/' + hintParts.filter(Boolean).join('/')
url.searchParams.append('provider', hint)
}
Expand All @@ -45,7 +49,7 @@ export function createUri({ base, path, providers = [] }) {

/**
* Parse a provider-hinted URI into a CID and structured provider hints,
* preserving the full multiaddr including `/retrieval/<proto>` segments.
* preserving the full multiaddr including `/tag/<tag-name>` segments.
*
* @param {string} uri
* @returns {{ cid: API.CID, providers: API.ProviderHint[], path: string, protocol: string }}
Expand Down Expand Up @@ -79,9 +83,25 @@ export function parseQueryString(query) {
for (const val of searchParams.getAll('provider')) {
if (!val.startsWith('/')) continue

const protoParts = val.split('/').filter(Boolean)
/** @type {string[]} */
const tags = []

for (let i = 0; i < protoParts.length; ) {
if (protoParts[i] === 'tag') {
i++
if (i < protoParts.length) {
tags.push(protoParts[i])
i++
}
} else {
i++
}
}

try {
const m = multiaddr(val)
providers.push({ multiaddr: m })
providers.push({ multiaddr: m, tags })
} catch {
// Skip malformed multiaddrs
continue
Expand Down
Loading