earningscall
Version:
The EarningsCall JavaScript library provides convenient access to the EarningsCall API. It includes a pre-defined set of classes for API resources that initialize themselves dynamically from API responses.
141 lines • 11.2 kB
JavaScript
import fs from 'fs';
import { LIB_VERSION } from './version';
import { BadRequestError, InsufficientApiAccessError, InternalServerError, NotFoundError, TooManyRequestsError, UnauthorizedError, UnexpectedError, } from './errors';
import os from 'os';
const DOMAIN = 'earningscall.biz';
const API_BASE = `https://v2.api.${DOMAIN}`;
let _apiKey;
export function setApiKey(apiKey) {
_apiKey = apiKey;
}
export function getApiKey() {
if (_apiKey !== undefined) {
return _apiKey;
}
return (process.env.ECALL_API_KEY || process.env.EARNINGSCALL_API_KEY || 'demo');
}
export function apiKeyParam() {
return { apikey: getApiKey() };
}
export function isDemoAccount() {
return getApiKey() === 'demo';
}
function getUserAgent() {
const osType = os.type();
const osRelease = os.release();
const platform = os.platform();
const arch = os.arch();
const nodeVersion = process.version;
const earningsCallVersion = LIB_VERSION;
return `EarningsCallJavaScript/${earningsCallVersion} (${platform} ${osType}/${osRelease}; ${arch}) Node.js/${nodeVersion.slice(1)}`;
}
function getHeaders() {
return {
'User-Agent': getUserAgent(),
'X-EarningsCall-Version': LIB_VERSION,
};
}
export function handleErrorStatusCodes(response) {
if (response.status === 401) {
throw new UnauthorizedError(response);
}
if (response.status === 404) {
throw new NotFoundError(response);
}
if (response.status === 403) {
throw new InsufficientApiAccessError('Insufficient API access rights', response);
}
if (response.status === 429) {
throw new TooManyRequestsError(response);
}
if (response.status === 400) {
throw new BadRequestError(response);
}
if (response.status === 500) {
throw new InternalServerError(response);
}
if (response.status !== 200) {
throw new UnexpectedError(`HTTP error status: ${response.status}`, response);
}
}
export async function doGet(path, params) {
const finalParams = {
...apiKeyParam(),
...params,
};
const url = new URL(`${API_BASE}/${path}`);
Object.entries(finalParams).forEach(([key, value]) => {
url.searchParams.set(key, value);
});
const response = await fetch(url, {
method: 'GET',
headers: getHeaders(),
});
handleErrorStatusCodes(response);
return response;
}
export async function getEvents(exchange, symbol) {
const params = {
exchange,
symbol,
};
const response = await doGet('events', params);
return response.json();
}
export async function getTranscript(exchange, symbol, year, quarter, level) {
const params = {
...apiKeyParam(),
exchange,
symbol,
year: year.toString(),
quarter: quarter.toString(),
level: (level || 1).toString(),
};
const response = await doGet('transcript', params);
return response.json();
}
export async function getSymbolsV2() {
const response = await doGet('symbols-v2.txt', {});
return response;
}
export async function getSp500CompaniesTxtFile() {
const response = await doGet('symbols/sp500.txt', {});
return response.text();
}
export async function downloadAudioFile(exchange, symbol, year, quarter, outputFilePath) {
const params = {
...apiKeyParam(),
exchange,
symbol,
year: year.toString(),
quarter: quarter.toString(),
};
const localFilename = outputFilePath || `${exchange}_${symbol}_${year}_${quarter}.mp3`;
const url = new URL(`${API_BASE}/audio`);
Object.entries(params).forEach(([key, value]) => {
url.searchParams.set(key, value);
});
const response = await fetch(url, {
headers: getHeaders(),
});
handleErrorStatusCodes(response);
const responseHeaders = response.headers;
const contentLength = Number(responseHeaders.get('Content-Length'));
const contentType = responseHeaders.get('Content-Type');
const lastModified = new Date(responseHeaders.get('Last-Modified') || '');
const writer = fs.createWriteStream(localFilename);
const buffer = await response.arrayBuffer();
const uint8Array = new Uint8Array(buffer);
writer.write(uint8Array);
const result = {
outputFilePath: localFilename,
contentLength,
contentType: contentType || undefined,
lastModified,
};
return new Promise((resolve, reject) => {
writer.end(() => resolve(result));
writer.on('error', reject);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUNMLGVBQWUsRUFDZiwwQkFBMEIsRUFDMUIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBCLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDO0FBQ2xDLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixNQUFNLEVBQUUsQ0FBQztBQUU1QyxJQUFJLE9BQTJCLENBQUM7QUFFaEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUEwQjtJQUNsRCxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUztJQUN2QixJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ0QsT0FBTyxDQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksTUFBTSxDQUN4RSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWE7SUFDM0IsT0FBTyxTQUFTLEVBQUUsS0FBSyxNQUFNLENBQUM7QUFDaEMsQ0FBQztBQUVELFNBQVMsWUFBWTtJQUNuQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDekIsTUFBTSxTQUFT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