All files / src/util/BlockfrostProvider BlockfrostClientFactory.ts

21.05% Statements 4/19
0% Branches 0/5
0% Functions 0/2
20% Lines 3/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 5243x           43x                 43x                                                                        
import {
  BlockfrostClient,
  DEFAULT_BLOCKFROST_API_VERSION,
  DEFAULT_BLOCKFROST_RATE_LIMIT_CONFIG,
  DEFAULT_BLOCKFROST_URLS
} from '@cardano-sdk/cardano-services-client';
import Bottleneck from 'bottleneck';
 
let blockfrostClient: BlockfrostClient | undefined;
 
/**
 * Gets the singleton blockfrost API instance.
 *
 * @returns The blockfrost API instance, this function always returns the same instance.
 */
export const getBlockfrostClient = (): BlockfrostClient => {
  Iif (blockfrostClient !== undefined) return blockfrostClient;
 
  // custom hosted instance
  Iif (process.env.BLOCKFROST_CUSTOM_BACKEND_URL) {
    blockfrostClient = new BlockfrostClient(
      { apiVersion: DEFAULT_BLOCKFROST_API_VERSION, baseUrl: process.env.BLOCKFROST_CUSTOM_BACKEND_URL },
      { rateLimiter: { schedule: (task) => task() } }
    );
 
    return blockfrostClient;
  }
 
  // instance hosted by Blockfrost
  Iif (!process.env.BLOCKFROST_API_KEY)
    throw new Error('BLOCKFROST_API_KEY or BLOCKFROST_CUSTOM_BACKEND_URL environment variable is required');
 
  Iif (!process.env.NETWORK) throw new Error('NETWORK environment variable is required');
  const baseUrl = DEFAULT_BLOCKFROST_URLS[process.env.NETWORK as keyof typeof DEFAULT_BLOCKFROST_URLS];
  Iif (!baseUrl) throw new Error(`Unsupported NETWORK for blockfrost: ${process.env.NETWORK}`);
 
  // network is not mandatory, we keep it for safety.
  blockfrostClient = new BlockfrostClient(
    { apiVersion: DEFAULT_BLOCKFROST_API_VERSION, baseUrl, projectId: process.env.BLOCKFROST_API_KEY },
    {
      rateLimiter: new Bottleneck({
        reservoir: DEFAULT_BLOCKFROST_RATE_LIMIT_CONFIG.size,
        reservoirIncreaseAmount: DEFAULT_BLOCKFROST_RATE_LIMIT_CONFIG.increaseAmount,
        reservoirIncreaseInterval: DEFAULT_BLOCKFROST_RATE_LIMIT_CONFIG.increaseInterval,
        reservoirIncreaseMaximum: DEFAULT_BLOCKFROST_RATE_LIMIT_CONFIG.size
      })
    }
  );
 
  return blockfrostClient;
};