diff --git a/packages/block-brokers/src/trustless-gateway/broker.ts b/packages/block-brokers/src/trustless-gateway/broker.ts index 7e42075ef..2fdace1b6 100644 --- a/packages/block-brokers/src/trustless-gateway/broker.ts +++ b/packages/block-brokers/src/trustless-gateway/broker.ts @@ -20,12 +20,12 @@ ProgressOptions this.log = components.logger.forComponent('helia:trustless-gateway-block-broker') this.gateways = (init.gateways ?? DEFAULT_TRUSTLESS_GATEWAYS) .map((gw) => { - if(typeof gw === 'string' || gw instanceof URL) { + if (typeof gw === 'string' || gw instanceof URL) { // backward compatibility defaults to path gateway return new TrustlessGateway(gw, false) } - return new TrustlessGateway(gw.url, gw.isSubdomain) + return new TrustlessGateway(gw.url, gw.supportsSubdomains) }) } diff --git a/packages/block-brokers/src/trustless-gateway/index.ts b/packages/block-brokers/src/trustless-gateway/index.ts index ec03b81cd..25c0d9137 100644 --- a/packages/block-brokers/src/trustless-gateway/index.ts +++ b/packages/block-brokers/src/trustless-gateway/index.ts @@ -5,18 +5,18 @@ import type { ProgressEvent } from 'progress-events' export const DEFAULT_TRUSTLESS_GATEWAYS: TrustlessGatewayUrl[] = [ // 2024-02-20: IPNS and Block/CAR support from https://ipfs.github.io/public-gateway-checker/ - { url: 'https://trustless-gateway.link', isSubdomain: false }, + { url: 'https://trustless-gateway.link', supportsSubdomains: false }, // 2024-02-20: IPNS and Block/CAR support from https://ipfs.github.io/public-gateway-checker/ - { url: 'https://cloudflare-ipfs.com', isSubdomain: false }, + { url: 'https://cloudflare-ipfs.com', supportsSubdomains: false }, // 2024-02-20: IPNS, Origin, and Block/CAR support from https://ipfs.github.io/public-gateway-checker/ - { url: 'https://4everland.io', isSubdomain: true }, + { url: 'https://4everland.io', supportsSubdomains: true } ] interface TrustlessGatewayUrl { url: string | URL - isSubdomain: boolean + supportsSubdomains: boolean } export type TrustlessGatewayGetBlockProgressEvents = diff --git a/packages/block-brokers/src/trustless-gateway/trustless-gateway.ts b/packages/block-brokers/src/trustless-gateway/trustless-gateway.ts index c6a56947f..92a3ab4f9 100644 --- a/packages/block-brokers/src/trustless-gateway/trustless-gateway.ts +++ b/packages/block-brokers/src/trustless-gateway/trustless-gateway.ts @@ -1,5 +1,5 @@ -import type { CID } from 'multiformats/cid' import { base32 } from 'multiformats/bases/base32' +import type { CID } from 'multiformats/cid' /** * A `TrustlessGateway` keeps track of the number of attempts, errors, and @@ -13,7 +13,7 @@ export class TrustlessGateway { /** * Whether this gateway is a subdomain resolution style gateway */ - public isSubdomain: boolean + public supportsSubdomains: boolean /** * The number of times this gateway has been attempted to be used to fetch a @@ -43,16 +43,16 @@ export class TrustlessGateway { */ #successes = 0 - constructor(url: URL | string, isSubdomain: boolean = false) { + constructor (url: URL | string, supportsSubdomains: boolean = false) { this.url = url instanceof URL ? url : new URL(url) - this.isSubdomain = isSubdomain + this.supportsSubdomains = supportsSubdomains } /** * Fetch a raw block from `this.url` following the specification defined at * https://specs.ipfs.tech/http-gateways/trustless-gateway/ */ - async getRawBlock(cid: CID, signal?: AbortSignal): Promise { + async getRawBlock (cid: CID, signal?: AbortSignal): Promise { const gwUrl = this.getGwUrl(cid) // necessary as not every gateway supports dag-cbor, but every should support @@ -60,9 +60,7 @@ export class TrustlessGateway { gwUrl.search = '?format=raw' if (signal?.aborted === true) { - throw new Error( - `Signal to fetch raw block for CID ${cid} from gateway ${this.url} was aborted prior to fetch`, - ) + throw new Error(`Signal to fetch raw block for CID ${cid} from gateway ${this.url} was aborted prior to fetch`) } try { @@ -72,7 +70,7 @@ export class TrustlessGateway { headers: { // also set header, just in case ?format= is filtered out by some // reverse proxy - Accept: 'application/vnd.ipld.raw', + Accept: 'application/vnd.ipld.raw' }, cache: 'force-cache' }) @@ -96,10 +94,10 @@ export class TrustlessGateway { /** * Construct the Gateway URL for a CID */ - getGwUrl(cid: CID): URL { + getGwUrl (cid: CID): URL { const gwUrl = new URL(this.url) - if (this.isSubdomain) { + if (this.supportsSubdomains) { gwUrl.hostname = `${cid.toString(base32)}.ipfs.${gwUrl.hostname}` } else { gwUrl.pathname = `/ipfs/${cid.toString()}` @@ -137,7 +135,7 @@ export class TrustlessGateway { * * Play around with the below reliability function at https://www.desmos.com/calculator/d6hfhf5ukm */ - return this.#successes / (this.#attempts + (this.#errors * 3)) + return this.#successes / (this.#attempts + this.#errors * 3) } /** diff --git a/packages/block-brokers/test/trustless-gateway.spec.ts b/packages/block-brokers/test/trustless-gateway.spec.ts index 6590393f8..cc67d513d 100644 --- a/packages/block-brokers/test/trustless-gateway.spec.ts +++ b/packages/block-brokers/test/trustless-gateway.spec.ts @@ -155,12 +155,12 @@ describe('trustless-gateway-block-broker', () => { const pathGw = new TrustlessGateway('http://localhost:8080') const subdomainGw = new TrustlessGateway('https://dweb.link', true) - expect(pathGw.getGwUrl(blocks[0].cid).hostname).to.equal(`localhost`) - expect(pathGw.getGwUrl(blocks[0].cid).toString()).to.equal(`http://localhost:8080/ipfs/bafkreiefnkxuhnq3536qo2i2w3tazvifek4mbbzb6zlq3ouhprjce5c3aq`) + expect(pathGw.getGwUrl(blocks[0].cid).hostname).to.equal('localhost') + expect(pathGw.getGwUrl(blocks[0].cid).toString()).to.equal('http://localhost:8080/ipfs/bafkreiefnkxuhnq3536qo2i2w3tazvifek4mbbzb6zlq3ouhprjce5c3aq') expect(pathGw.getGwUrl(blocks[1].cid).toString()).to.equal(`http://localhost:8080/ipfs/${blocks[1].cid.toString()}`) - expect(subdomainGw.getGwUrl(blocks[0].cid).hostname).to.equal(`bafkreiefnkxuhnq3536qo2i2w3tazvifek4mbbzb6zlq3ouhprjce5c3aq.ipfs.dweb.link`) - expect(subdomainGw.getGwUrl(blocks[0].cid).toString()).to.equal(`https://bafkreiefnkxuhnq3536qo2i2w3tazvifek4mbbzb6zlq3ouhprjce5c3aq.ipfs.dweb.link/`) + expect(subdomainGw.getGwUrl(blocks[0].cid).hostname).to.equal('bafkreiefnkxuhnq3536qo2i2w3tazvifek4mbbzb6zlq3ouhprjce5c3aq.ipfs.dweb.link') + expect(subdomainGw.getGwUrl(blocks[0].cid).toString()).to.equal('https://bafkreiefnkxuhnq3536qo2i2w3tazvifek4mbbzb6zlq3ouhprjce5c3aq.ipfs.dweb.link/') expect(subdomainGw.getGwUrl(blocks[1].cid).toString()).to.equal(`https://${blocks[1].cid.toString()}.ipfs.dweb.link/`) }) })