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.
111 lines • 8.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Symbols = exports.EXCHANGES_IN_ORDER = void 0;
exports.indexToExchange = indexToExchange;
exports.loadSymbols = loadSymbols;
exports.getSymbols = getSymbols;
exports.clearSymbols = clearSymbols;
const api_1 = require("./api");
const sectors_1 = require("./sectors");
// WARNING: Add new indexes to the *END* of this list
exports.EXCHANGES_IN_ORDER = [
'NYSE',
'NASDAQ',
'AMEX',
'TSX',
'TSXV',
'OTC',
'LSE',
'CBOE',
'STO',
];
function indexToExchange(index) {
if (index < 0 || index >= exports.EXCHANGES_IN_ORDER.length) {
return 'UNKNOWN';
}
return exports.EXCHANGES_IN_ORDER[index];
}
class Symbols {
expiresDate = null;
lastModified = null;
cacheControlExpires = null;
exchanges = new Set();
byName = new Map();
byExchangeAndSym = new Map();
add = (companyInfo) => {
this.exchanges.add(companyInfo.exchange || '');
const exchangeSymbol = `${companyInfo.exchange}_${companyInfo.symbol}`;
this.byExchangeAndSym.set(exchangeSymbol, companyInfo);
this.byName.set(companyInfo.name || '', companyInfo);
};
getExchangeSymbol = (exchangeSymbol) => {
const symbol = this.byExchangeAndSym.get(exchangeSymbol.toUpperCase());
// if (!symbol) throw new Error(`Symbol not found: ${exchangeSymbol}`);
return symbol;
};
get = (exchange, symbol) => this.getExchangeSymbol(`${exchange}_${symbol}`);
getAll = function* () {
yield* this.byExchangeAndSym.values();
};
}
exports.Symbols = Symbols;
let symbols = null;
/**
* Loads the symbols from the API and returns a Symbols object.
*
* @returns {Promise<Symbols>} The Symbols object.
*/
async function loadSymbols() {
const symbolsV2Response = await (0, api_1.getSymbolsV2)();
const responseHeaders = symbolsV2Response.headers;
const lastModified = new Date(responseHeaders.get('Last-Modified') || '');
const cacheControl = responseHeaders.get('Cache-Control');
const cacheControlMaxAge = cacheControl?.match(/max-age=(\d+)/)?.[1];
const cacheControlExpires = cacheControl?.match(/expires=(\d+)/)?.[1];
// By default, we cache the symbols for 1 day
// Otherwise, we use the Cache-Control header to determine the expiration date (max-age)
const expiresDate = new Date(Date.now() + parseInt(cacheControlMaxAge || '86400') * 1000);
const symbolsV2Text = await symbolsV2Response.text();
const symbols = new Symbols();
symbols.expiresDate = expiresDate;
symbols.lastModified = lastModified;
symbols.cacheControlExpires = cacheControlExpires || null;
symbolsV2Text
.split('\n')
.filter((line) => line.trim())
.forEach((line) => {
const [exchangeIndex, symbol, name, sectorIndex, industryIndex] = line.split('\t');
const companyInfo = {
exchange: indexToExchange(parseInt(exchangeIndex)),
symbol,
name,
sector: (0, sectors_1.indexToSector)(parseInt(sectorIndex)),
industry: (0, sectors_1.indexToIndustry)(parseInt(industryIndex)),
};
symbols.add(companyInfo);
});
return symbols;
}
/**
* Returns the symbols object. If the symbols object is not loaded, it will load it.
*
* @returns {Promise<Symbols>} The Symbols object.
*/
async function getSymbols() {
if (!symbols) {
symbols = await loadSymbols();
}
if (symbols.expiresDate && symbols.expiresDate < new Date()) {
symbols = await loadSymbols();
}
return symbols;
}
/**
* Clears the symbols object.
*
* Forces a reload of the symbols from the API next time getSymbols is called.
*/
function clearSymbols() {
symbols = null;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ltYm9scy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvc3ltYm9scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpQkEsMENBS0M7QUF1Q0Qsa0NBaUNDO0FBT0QsZ0NBUUM7QUFPRCxvQ0FFQztBQXJIRCwrQkFBcUM7QUFDckMsdUNBQTJEO0FBRTNELHFEQUFxRDtBQUN4QyxRQUFBLGtCQUFrQixHQUFHO0lBQ2hDLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztJQUNMLEtBQUs7SUFDTCxNQUFNO0lBQ04sS0FBSztDQUNOLENBQUM7QUFFRixTQUFnQixlQUFlLENBQUMsS0FBYTtJQUMzQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLDBCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLDBCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFhLE9BQU87SUFDbEIsV0FBVyxHQUFnQixJQUFJLENBQUM7SUFDaEMsWUFBWSxHQUFnQixJQUFJLENBQUM7SUFDakMsbUJBQW1CLEdBQWtCLElBQUksQ0FBQztJQUVsQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDeEMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFFMUQsR0FBRyxHQUFHLENBQUMsV0FBd0IsRUFBRSxFQUFFO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxjQUFjLEdBQUcsR0FBRyxXQUFXLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2RSxJQUFJ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