diff --git a/config/default.json b/config/default.json index 93b02c342..3a4e2aa43 100644 --- a/config/default.json +++ b/config/default.json @@ -1,7 +1,7 @@ { "nodes": { "fallbackPublicExplorer": "https://app.radicle.xyz/nodes/$host/$rid$path", - "apiVersion": "6.0.0", + "requiredApiVersion": "^6.0.0", "defaultHttpdPort": 443, "defaultHttpdScheme": "https" }, diff --git a/http-client/lib/fetcher.ts b/http-client/lib/fetcher.ts index 9ca1c5ccc..14e08b8d7 100644 --- a/http-client/lib/fetcher.ts +++ b/http-client/lib/fetcher.ts @@ -4,7 +4,7 @@ import type { ZodIssue, ZodType, TypeOf } from "zod"; import config from "virtual:config"; -import { compare } from "compare-versions"; +import { satisfies } from "compare-versions"; export interface BaseUrl { hostname: string; @@ -52,26 +52,19 @@ export class ResponseParseError extends Error { public constructor( method: string, body: unknown, - apiVersion: string | undefined, + apiVersion: string, zodIssues: ZodIssue[], path?: string, ) { super("Failed to parse response body"); + const explorerRequiredApiVersion = config.nodes.requiredApiVersion; + const nodeApiVersion = apiVersion; let description: string; - if ( - apiVersion === undefined || - compare(apiVersion, config.nodes.apiVersion, "<") - ) { - description = `The node you are fetching from seems to be outdated, make sure the httpd API version is at least ${config.nodes.apiVersion} currently ${apiVersion ?? "unknown"}.`; - } else if ( - config.nodes.apiVersion === undefined || - compare(apiVersion, config.nodes.apiVersion, ">") - ) { - description = `The web client you are using is outdated, make sure it supports at least ${apiVersion} to interact with this node currently ${config.nodes.apiVersion ?? "unknown"}.`; + if (!satisfies(nodeApiVersion, explorerRequiredApiVersion)) { + description = `The node you are fetching from (v${nodeApiVersion}) doesn't match the version requirements of the web client ${explorerRequiredApiVersion}.`; } else { - description = - "This is usually due to a version mismatch between the seed and the web interface."; + description = `The node (v${nodeApiVersion}) matches the version requirement of the web client (${explorerRequiredApiVersion}), but the web client isn't able to parse the response.`; } this.apiVersion = apiVersion; this.description = @@ -122,7 +115,7 @@ export class Fetcher { ): Promise> { const response = await this.fetch({ ...params, - query: { ...params.query, v: config.nodes.apiVersion }, + query: { ...params.query, v: config.nodes.requiredApiVersion }, }); if (!response.ok) { diff --git a/module.d.ts b/module.d.ts index b1f4abcb6..e5798d2b9 100644 --- a/module.d.ts +++ b/module.d.ts @@ -1,7 +1,7 @@ declare module "virtual:*" { const config: { nodes: { - apiVersion: string; + requiredApiVersion: string; fallbackPublicExplorer: string; defaultHttpdPort: number; defaultLocalHttpdPort: number;