aboutsummaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-10-14 17:08:41 +0200
committerFlorian Dold <florian@dold.me>2021-10-14 17:08:41 +0200
commit90f4a4e655347fbb4ce83c765f3b1c8c48d5cd22 (patch)
treeb046a838b1bb92a86a1d115d541f65f628b590f4 /packages
parent773e025b6ce6bbce03d0d5be434cf601bed8dd43 (diff)
show reducer network errors
Diffstat (limited to 'packages')
-rw-r--r--packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts115
1 files changed, 88 insertions, 27 deletions
diff --git a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts
index 3acaaa361..110ec0166 100644
--- a/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts
+++ b/packages/anastasis-webui/src/hooks/use-anastasis-reducer.ts
@@ -1,3 +1,4 @@
+import { TalerErrorCode } from "@gnu-taler/taler-util";
import { useState } from "preact/hooks";
export type ReducerState =
@@ -138,13 +139,44 @@ export enum RecoveryStates {
const reducerBaseUrl = "http://localhost:5000/";
async function getBackupStartState(): Promise<ReducerState> {
- const resp = await fetch(new URL("start-backup", reducerBaseUrl).href);
- return await resp.json();
+ let resp: Response;
+
+ try {
+ resp = await fetch(new URL("start-backup", reducerBaseUrl).href);
+ } catch (e) {
+ return {
+ code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED,
+ message: `Network request to remote reducer ${reducerBaseUrl} failed`,
+ } as any;
+ }
+ try {
+ return await resp.json();
+ } catch (e) {
+ return {
+ code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED,
+ message: `Could not parse response from reducer`,
+ } as any;
+ }
}
async function getRecoveryStartState(): Promise<ReducerState> {
- const resp = await fetch(new URL("start-recovery", reducerBaseUrl).href);
- return await resp.json();
+ let resp: Response;
+ try {
+ resp = await fetch(new URL("start-recovery", reducerBaseUrl).href);
+ } catch (e) {
+ return {
+ code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED,
+ message: `Network request to remote reducer ${reducerBaseUrl} failed`,
+ } as any;
+ }
+ try {
+ return await resp.json();
+ } catch (e) {
+ return {
+ code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED,
+ message: `Could not parse response from reducer`,
+ } as any;
+ }
}
async function reduceState(
@@ -152,19 +184,34 @@ async function reduceState(
action: string,
args: any,
): Promise<ReducerState> {
- const resp = await fetch(new URL("action", reducerBaseUrl).href, {
- method: "POST",
- headers: {
- Accept: "application/json",
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- state,
- action,
- arguments: args,
- }),
- });
- return resp.json();
+ let resp: Response;
+ try {
+ resp = await fetch(new URL("action", reducerBaseUrl).href, {
+ method: "POST",
+ headers: {
+ Accept: "application/json",
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ state,
+ action,
+ arguments: args,
+ }),
+ });
+ } catch (e) {
+ return {
+ code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED,
+ message: `Network request to remote reducer ${reducerBaseUrl} failed`,
+ } as any;
+ }
+ try {
+ return await resp.json();
+ } catch (e) {
+ return {
+ code: TalerErrorCode.ANASTASIS_REDUCER_NETWORK_FAILED,
+ message: `Could not parse response from reducer`,
+ } as any;
+ }
}
export interface ReducerTransactionHandle {
@@ -244,19 +291,33 @@ export function useAnastasisReducer(): AnastasisReducerApi {
currentError: anastasisState.currentError,
async startBackup() {
const s = await getBackupStartState();
- setAnastasisState({
- ...anastasisState,
- currentError: undefined,
- reducerState: s,
- });
+ if (s.code !== undefined) {
+ setAnastasisState({
+ ...anastasisState,
+ currentError: s,
+ });
+ } else {
+ setAnastasisState({
+ ...anastasisState,
+ currentError: undefined,
+ reducerState: s,
+ });
+ }
},
async startRecover() {
const s = await getRecoveryStartState();
- setAnastasisState({
- ...anastasisState,
- currentError: undefined,
- reducerState: s,
- });
+ if (s.code !== undefined) {
+ setAnastasisState({
+ ...anastasisState,
+ currentError: s,
+ });
+ } else {
+ setAnastasisState({
+ ...anastasisState,
+ currentError: undefined,
+ reducerState: s,
+ });
+ }
},
transition(action: string, args: any) {
doTransition(action, args);