UNPKG

@yoroi/portfolio

Version:

The Portfolio package of Yoroi SDK

265 lines (262 loc) 9.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.portfolioApiMaker = exports.apiConfig = void 0; var _common = require("@yoroi/common"); var _types = require("@yoroi/types"); var _immer = require("immer"); var _transformers = require("./transformers"); var _tokenDiscovery = require("../../validators/token-discovery"); var _tokenTraits = require("../../validators/token-traits"); var _tokenInfo = require("../../validators/token-info"); const portfolioApiMaker = _ref => { let { network, maxIdsPerRequest, maxConcurrentRequests, request = _common.fetchData } = _ref; const config = apiConfig[network]; return (0, _immer.freeze)({ async tokenDiscovery(id) { const response = await request({ method: 'get', url: `${config.tokenDiscovery}/${id}`, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); if ((0, _common.isRight)(response)) { const discovery = (0, _tokenDiscovery.parseTokenDiscovery)(response.value.data); if (!discovery) { return (0, _immer.freeze)({ tag: 'left', error: { status: -3, message: 'Failed to transform token discovery response', responseData: response.value.data } }, true); } return (0, _immer.freeze)({ tag: 'right', value: { status: response.value.status, data: discovery } }, true); } return response; }, async tokenInfos(idsWithCache) { const chunks = []; for (let i = 0; i < idsWithCache.length; i += maxIdsPerRequest) chunks.push(idsWithCache.slice(i, i + maxIdsPerRequest)); const tasks = chunks.map(ids => () => request({ method: 'post', url: config.tokenInfos, data: (0, _transformers.toDullahanRequest)(ids), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } })); const responses = await (0, _common.PromiseAllLimited)(tasks, maxConcurrentRequests); const infos = responses.filter(_common.isRight).reduce((acc, _ref2) => { let { value: { data } } = _ref2; return Object.assign(acc, data); }, {}); // return with the first error only if none of responses were successful const firstError = responses.find(_common.isLeft); if (Object.keys(infos).length === 0 && firstError) return firstError; const transformedResponseData = (0, _transformers.toSecondaryTokenInfos)(infos); const transformedResponse = (0, _immer.freeze)({ tag: 'right', value: { status: _types.Api.HttpStatusCode.Ok, data: transformedResponseData } }, true); return transformedResponse; }, async tokenInfo(id) { const response = await request({ method: 'get', url: `${config.tokenInfo}/${id}`, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); if ((0, _common.isRight)(response)) { const tokenInfo = (0, _tokenInfo.parseTokenInfo)(response.value.data); if (!tokenInfo) { return (0, _immer.freeze)({ tag: 'left', error: { status: -3, message: 'Failed to transform token info response', responseData: response.value.data } }, true); } return (0, _immer.freeze)({ tag: 'right', value: { status: response.value.status, data: tokenInfo } }, true); } return response; }, async tokenTraits(id) { const response = await request({ method: 'get', url: `${config.tokenTraits}/${id}`, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); if ((0, _common.isRight)(response)) { const traits = (0, _tokenTraits.parseTokenTraits)(response.value.data); if (!traits) { return (0, _immer.freeze)({ tag: 'left', error: { status: -3, message: 'Failed to transform token traits response', responseData: response.value.data } }, true); } return (0, _immer.freeze)({ tag: 'right', value: { status: response.value.status, data: traits } }, true); } return response; }, async tokenActivity(requestedIds, window) { const chunks = []; for (let i = 0; i < requestedIds.length; i += maxIdsPerRequest) chunks.push(requestedIds.slice(i, i + maxIdsPerRequest)); const tasks = chunks.map(ids => () => request({ method: 'post', url: `${config.tokenActivity}/${window}`, data: ids, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } })); const responses = await (0, _common.PromiseAllLimited)(tasks, maxConcurrentRequests); const activities = responses.filter(_common.isRight).reduce((acc, _ref3) => { let { value: { data } } = _ref3; return Object.assign(acc, data); }, {}); // return with the first error only if none of responses were successful const firstError = responses.find(_common.isLeft); if (Object.keys(activities).length === 0 && firstError) return firstError; const transformedResponseData = (0, _transformers.toTokenActivity)(activities); const transformedResponse = (0, _immer.freeze)({ tag: 'right', value: { status: _types.Api.HttpStatusCode.Ok, data: transformedResponseData } }, true); return transformedResponse; }, async tokenHistory(tokenId, period) { const response = await request({ method: 'post', url: config.tokenHistory, data: { tokenId, period }, headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } }); if ((0, _common.isRight)(response)) { const history = (0, _transformers.toTokenHistory)(response.value.data); if (!history) { return (0, _immer.freeze)({ tag: 'left', error: { status: -3, message: 'Failed to transform token history response', responseData: response.value.data } }, true); } return (0, _immer.freeze)({ tag: 'right', value: { status: response.value.status, data: history } }, true); } return response; }, async tokenImageInvalidate(ids) { const tasks = ids.map(id => () => request({ method: 'post', url: config.tokenImageInvalidate, data: (0, _transformers.toProcessedMediaRequest)(id), headers: { 'Content-Type': 'application/json' } })); await (0, _common.PromiseAllLimited)(tasks, maxConcurrentRequests); } }, true); }; exports.portfolioApiMaker = portfolioApiMaker; const apiConfig = (0, _immer.freeze)({ [_types.Chain.Network.Mainnet]: { tokenDiscovery: 'https://zero.yoroiwallet.com/tokens/discovery', tokenInfo: 'https://zero.yoroiwallet.com/tokens/info', tokenInfos: 'https://zero.yoroiwallet.com/tokens/info/multi', tokenTraits: 'https://zero.yoroiwallet.com/tokens/nft/traits', tokenActivity: 'https://zero.yoroiwallet.com/tokens/activity/multi', tokenHistory: 'https://zero.yoroiwallet.com/tokens/history/price', tokenImageInvalidate: 'https://mainnet.processed-media.yoroiwallet.com/invalidate' }, [_types.Chain.Network.Preprod]: { tokenDiscovery: 'https://yoroi-backend-zero-preprod.emurgornd.com/tokens/discovery', tokenInfo: 'https://yoroi-backend-zero-preprod.emurgornd.com/tokens/info', tokenInfos: 'https://yoroi-backend-zero-preprod.emurgornd.com/tokens/info/multi', tokenTraits: 'https://yoroi-backend-zero-preprod.emurgornd.com/tokens/nft/traits', tokenActivity: 'https://yoroi-backend-zero-preprod.emurgornd.com/tokens/activity/multi', tokenHistory: 'https://yoroi-backend-zero-preprod.emurgornd.com/tokens/history/price', tokenImageInvalidate: 'https://preprod.processed-media.yoroiwallet.com/invalidate' }, [_types.Chain.Network.Preview]: { tokenDiscovery: 'https://yoroi-backend-zero-preview.emurgornd.com/tokens/discovery', tokenInfo: 'https://yoroi-backend-zero-preview.emurgornd.com/tokens/info', tokenInfos: 'https://yoroi-backend-zero-preview.emurgornd.com/tokens/info/multi', tokenTraits: 'https://yoroi-backend-zero-preview.emurgornd.com/tokens/nft/traits', tokenActivity: 'https://yoroi-backend-zero-preview.emurgornd.com/tokens/activity/multi', tokenHistory: 'https://yoroi-backend-zero-preview.emurgornd.com/tokens/history/price', tokenImageInvalidate: 'https://preview.processed-media.yoroiwallet.com/invalidate' } }, true); exports.apiConfig = apiConfig; //# sourceMappingURL=api-maker.js.map