30 lines
1.2 KiB
JavaScript
30 lines
1.2 KiB
JavaScript
// Generated, do not edit. sha256:7227a0859017790e220d3094fb16cfe6c1e290c2297569d78de93f970684ea0d
|
|||
|
|
import { intradaySeries } from '../data/market.js';
|
||
|
|
import { currentRate } from './providers.js';
|
||
|
|
import { t } from '../i18n/index.js';
|
||
|
|
|
||
|
|
const FRESH_MS = 60_000;
|
||
|
|
const memo = new Map();
|
||
|
|
const NONE = Object.freeze({ points: null });
|
||
|
|
|
||
|
|
async function toBase(r) {
|
||
|
|
if (r.status !== 'ok') return NONE;
|
||
|
|
const rate = await currentRate(r.currency);
|
||
|
|
if (rate == null) return NONE;
|
||
|
|
const named = src => t('marketService.sourceLive', { source: src });
|
||
|
|
const src = r.sourceLabel || r.source;
|
||
|
|
const source = src ? named(src) : t('connections.kindMarket');
|
||
|
|
const sources = new Map();
|
||
|
|
for (const [ms, , own] of r.points) if (own) sources.set(ms, named(own));
|
||
|
|
return { points: r.points.map(([ms, p]) => [ms, p * rate]), source, sources };
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function loadIntraday(assetId, sinceMs) {
|
||
|
|
const hit = memo.get(assetId);
|
||
|
|
if (hit && hit.since === sinceMs && Date.now() - hit.at < FRESH_MS) return hit.result;
|
||
|
|
let result;
|
||
|
|
try { result = await toBase(await intradaySeries(assetId, sinceMs)); }
|
||
|
|
catch { result = NONE; }
|
||
|
|
memo.set(assetId, { at: Date.now(), since: sinceMs, result });
|
||
|
|
return result;
|
||
|
|
}
|