Skip to content

Commit

Permalink
refactor: create ProviderError and convert blockfrostProvider errors …
Browse files Browse the repository at this point in the history
…to it
  • Loading branch information
mkazlauskas committed Oct 12, 2021
1 parent 8107f55 commit 074943b
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 5 deletions.
58 changes: 53 additions & 5 deletions packages/blockfrost/src/blockfrostProvider.ts
@@ -1,15 +1,58 @@
import { CardanoProvider } from '@cardano-sdk/core';
import { BlockFrostAPI } from '@blockfrost/blockfrost-js';
/* eslint-disable @typescript-eslint/no-explicit-any */
import { CardanoProvider, ProviderError, ProviderFailure } from '@cardano-sdk/core';
import { BlockFrostAPI, Error as BlockfrostError } from '@blockfrost/blockfrost-js';
import { Options } from '@blockfrost/blockfrost-js/lib/types';
import { BlockfrostToOgmios } from './BlockfrostToOgmios';

const formatBlockfrostError = (error: unknown) => {
const blockfrostError = error as BlockfrostError;
if (typeof blockfrostError === 'string') {
throw new ProviderError(ProviderFailure.Unknown, error, blockfrostError);
}
if (typeof blockfrostError !== 'object') {
throw new ProviderError(ProviderFailure.Unknown, error, 'failed to parse error (response type)');
}
const errorAsType1 = blockfrostError as {
status_code: number;
message: string;
error: string;
};
if (errorAsType1.status_code) {
return errorAsType1;
}
const errorAsType2 = blockfrostError as {
errno: number;
message: string;
code: string;
};
if (errorAsType2.code) {
const status_code = Number.parseInt(errorAsType2.code);
if (!status_code) {
throw new ProviderError(ProviderFailure.Unknown, error, 'failed to parse error (status code)');
}
return {
status_code,
message: errorAsType1.message,
error: errorAsType2.errno.toString()
};
}
throw new ProviderError(ProviderFailure.Unknown, error, 'failed to parse error (response json)');
};

const toProviderError = (error: unknown) => {
const { status_code } = formatBlockfrostError(error);
if (status_code === 404) {
throw new ProviderError(ProviderFailure.NotFound);
}
throw new ProviderError(ProviderFailure.Unknown, error, `status_code: ${status_code}`);
};

/**
* Connect to the [Blockfrost service](https://docs.blockfrost.io/)
*
* @param {Options} options BlockFrostAPI options
* @returns {CardanoProvider} CardanoProvider
*/

export const blockfrostProvider = (options: Options): CardanoProvider => {
const blockfrost = new BlockFrostAPI(options);

Expand Down Expand Up @@ -116,7 +159,7 @@ export const blockfrostProvider = (options: Options): CardanoProvider => {
return BlockfrostToOgmios.currentWalletProtocolParameters(response.data);
};

return {
const providerFunctions = {
ledgerTip,
networkInfo,
stakePoolStats,
Expand All @@ -125,5 +168,10 @@ export const blockfrostProvider = (options: Options): CardanoProvider => {
queryTransactionsByAddresses,
queryTransactionsByHashes,
currentWalletProtocolParameters
};
} as any;

return Object.keys(providerFunctions).reduce((provider, key) => {
provider[key] = (...args: any[]) => providerFunctions[key](...args).catch(toProviderError);
return provider;
}, {} as any) as CardanoProvider;
};
12 changes: 12 additions & 0 deletions packages/core/src/Provider/errors.ts
@@ -0,0 +1,12 @@
import { CustomError } from 'ts-custom-error';

export enum ProviderFailure {
NotFound = 'NOT_FOUND',
Unknown = 'UNKNOWN'
}

export class ProviderError extends CustomError {
constructor(public reason: ProviderFailure, public innerError?: unknown, public detail?: string) {
super(reason + (detail ? ` (${detail})` : ''));
}
}
1 change: 1 addition & 0 deletions packages/core/src/Provider/index.ts
@@ -1 +1,2 @@
export * from './types';
export * from './errors';

0 comments on commit 074943b

Please sign in to comment.