Skip to content

Commit

Permalink
Improve the ResponseParseError description
Browse files Browse the repository at this point in the history
In case of a `ResponseParseError` instead of comparing the versions of
httpd and the web client strictly, we should make sure to check if httpd
fulfills the web clients version requirement (to be the same major
version) and else fallback to a more verbose error about the different
versions.
  • Loading branch information
sebastinez committed Dec 2, 2024
1 parent 2075c32 commit 4e1c0a3
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 17 deletions.
2 changes: 1 addition & 1 deletion config/default.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"nodes": {
"fallbackPublicExplorer": "https://app.radicle.xyz/nodes/$host/$rid$path",
"apiVersion": "6.0.0",
"apiVersionRequirement": "^6.0.0",
"defaultHttpdPort": 443,
"defaultHttpdScheme": "https"
},
Expand Down
23 changes: 8 additions & 15 deletions http-client/lib/fetcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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 =
Expand Down Expand Up @@ -122,7 +115,7 @@ export class Fetcher {
): Promise<TypeOf<T>> {
const response = await this.fetch({
...params,
query: { ...params.query, v: config.nodes.apiVersion },
query: { ...params.query, v: config.nodes.requiredApiVersion },
});

if (!response.ok) {
Expand Down
2 changes: 1 addition & 1 deletion module.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
declare module "virtual:*" {
const config: {
nodes: {
apiVersion: string;
requiredApiVersion: string;
fallbackPublicExplorer: string;
defaultHttpdPort: number;
defaultLocalHttpdPort: number;
Expand Down

0 comments on commit 4e1c0a3

Please sign in to comment.