diff --git a/src/whatwg-fetch-service.ts b/src/whatwg-fetch-service.ts index bfc75e4..6d7030c 100644 --- a/src/whatwg-fetch-service.ts +++ b/src/whatwg-fetch-service.ts @@ -123,6 +123,9 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { const peerWithoutHTTPPath = ma.decapsulateCode(protocols('http-path').code) if (this.isHTTPTransportMultiaddr(peerWithoutHTTPPath)) { + if (peerWithoutHTTPPath.getPeerId() !== null) { + throw new Error('HTTP Transport does not yet support peer IDs. Use a stream based transport instead.') + } const [, httpPathVal] = ma.stringTuples().find(([code]) => code === protocols('http-path').code ) ?? ['', ''] @@ -166,7 +169,13 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { throw new Error('peer multiaddr must have at least one part') } - return parts[parts.length - 1].name === 'http' || parts[parts.length - 1].name === 'https' + // Reverse order for faster common case (/http is near the end) + for (let i = parts.length - 1; i >= 0; i--) { + if (parts[i].name === 'http' || parts[i].name === 'https') { + return true + } + } + return false } // Register a protocol with a path and remember it so we can tell our peers @@ -209,18 +218,8 @@ export class WHATWGFetch implements Startable, WHATWGFetchInterface { return cached } - let fetch - let reqUrl = '' - if (this.isHTTPTransportMultiaddr(peerAddr)) { - fetch = this._fetch - reqUrl = `${multiaddrToUri(peerAddr)}${WELL_KNOWN_PROTOCOLS}` - } else { - const conn = await this.components.connectionManager.openConnection(peerAddr) - const s = await conn.newStream(PROTOCOL_NAME) - fetch = fetchViaDuplex(s) - reqUrl = multiaddrURIPrefix + peerAddr.encapsulate(`/http-path/${encodeURIComponent(WELL_KNOWN_PROTOCOLS)}`).toString() - } - const resp = await fetch(new Request(reqUrl, { + const reqUrl = multiaddrURIPrefix + peerAddr.encapsulate(`/http-path/${encodeURIComponent(WELL_KNOWN_PROTOCOLS)}`).toString() + const resp = await this.fetch(new Request(reqUrl, { method: 'GET', headers: { Accept: 'application/json' diff --git a/test/index.spec.ts b/test/index.spec.ts index fd9b71a..11027a8 100644 --- a/test/index.spec.ts +++ b/test/index.spec.ts @@ -5,6 +5,7 @@ import { streamPair } from '@libp2p/interface-compliance-tests/mocks' import { defaultLogger } from '@libp2p/logger' import { peerIdFromString } from '@libp2p/peer-id' import { multiaddr, type Multiaddr, type Protocol } from '@multiformats/multiaddr' +import { expect } from 'aegir/chai' import { duplexPair } from 'it-pair/duplex' import { type Libp2p } from 'libp2p' import pDefer from 'p-defer' @@ -95,4 +96,10 @@ describe('whatwg-fetch', () => { await ping.sendPing(clientNode, serverPeerID) }) + + it('Throws an error if using an http transport with a peer id component', async () => { + const clientNode = stubInterface>({ services: { http: client } }) + + await expect(ping.sendPing(clientNode, multiaddr('/ip4/127.0.0.1/http/p2p/' + serverPeerID.toString()))).to.be.rejectedWith('HTTP Transport does not yet support peer IDs') + }) })