trufflesuite/truffle

View on GitHub
packages/decoder/lib/fetch-signatures.ts

Summary

Maintainability
A
0 mins
Test Coverage
import debugModule from "debug";
const debug = debugModule("decoder:fetch-signatures");

import axios from "axios";
import retry from "async-retry";

import { Conversion } from "@truffle/codec";

interface DirectoryResponse {
  next: string | null;
  previous: string | null;
  count: number;
  results: DirectoryEntry[];
}

interface DirectoryEntry {
  id: number;
  created_at: string;
  text_signature: string;
  hex_signature: string; //the only part we care about!
  bytes_signature: string;
}

export async function fetchSignatures(
  selector: Uint8Array, //note: input should be 4 bytes long
  url: string
): Promise<string[]> {
  const selectorString = Conversion.toHexString(selector);
  let page: number = 1;
  let signatures: string[] = [];
  while (true) {
    const response = await getSuccessfulResponse(selectorString, url, page);
    signatures = signatures.concat(
      response.results.map(({ text_signature }) => text_signature)
    ); //append new signatures
    if (response.next === null) {
      break;
    }
    page++; //ideally we'd use the actual value of response.next, but this is easier
  }
  return signatures;
}

async function getSuccessfulResponse(
  selector: string,
  url: string,
  page: number
): Promise<DirectoryResponse> {
  return await retry(
    async () =>
      (
        await axios.get(`${url}/v1/signatures/`, {
          params: {
            hex_signature: selector,
            page
          },
          responseType: "json",
          maxRedirects: 50
        })
      ).data,
    { retries: 3 } //we'll leave minTimeout as the default 1000
  );
}