private async setup(initialIndicators: IndicatorSnapshot[]): Promise<void> {
this.restoringInitialIndicators = true;
try {
for (const indicator of initialIndicators) {
const config = indicator.config;
if (indicator.indicatorType !== undefined || !config?.symbolInfo) {
continue;
}
const symbolInfo = normalizeSymbolInfo(config.symbolInfo);
if (!symbolInfo) {
continue;
}
const series = config.series[0];
const compareMode =
series.seriesOptions?.priceScaleId === Direction.Left
? CompareMode.NewScale
: config.newPane
? CompareMode.NewPane
: CompareMode.Percentage;
// eslint-disable-next-line no-await-in-loop
await this.setSymbolMode(series.name, symbolInfo, compareMode, indicator.paneId);
}
} finally {
this.restoringInitialIndicators = false;
}
}
private publish(): void {
const entries = Array.from(this.entries.values());
this.itemsSubject.next(
entries.map(({ symbolId, symbol, symbolName, mode }) => ({
symbolId,
symbol,
symbolName,
mode,
})),
);
this.entitiesSubject.next(entries.map(({ entity }) => entity));
}
const addedSymbolIds: string[] = [];
for (let index = 0; index < symbolIds.length; index += 1) {
const symbolId = symbolIds[index];
if (!symbolId) continue;
if (previousSymbolIdsSet.has(symbolId)) {
continue;
}
addedSymbolIds.push(symbolId);
}
this.subscriptions.add(
symbolIds$.subscribe((symbolIds) => {
const previousSymbolIds = new Set(this.activeSymbolIds);
this.activeSymbolIds = symbolIds;
this.dataSource.setSymbols(symbolIds);
const addedSymbolIds = symbolIds.filter((symbolId) => !previousSymbolIds.has(symbolId));
if (addedSymbolIds.length) {
warmupSymbolIds(addedSymbolIds);
}
}),
);
const warmupSymbolIds = (symbolIds: string[]): void => {
const from = getWarmupFrom();
if (!from) return;
Promise.all(symbolIds.map((symbolId) => this.dataSource.loadTill(symbolId, from))).catch((error) => {
console.error('[Chart] Ошибка при прогреве символов:', error);
});
};