import { injectable } from 'inversify'; import EventEmitter from '@antv/event-emitter'; import { generateUuid } from '../utils'; import { DATASET_MANAGER_EVENT } from './constants'; import { DatasetManagerConfig, DatasetConfig, DatasetMap } from './types'; @injectable() export class DatasetManager extends EventEmitter { configs: DatasetManagerConfig; datasetMap: DatasetMap = {}; init(configs: DatasetManagerConfig) { this.configs = configs; configs.forEach((datasetConfig: DatasetConfig) => { this.datasetMap[datasetConfig.id] = { config: datasetConfig, }; }); } private async _queryDataset(url: DatasetConfig['url']): Promise { const response = await fetch(url); const dataset = await response.json(); return dataset; } async getDatasetById(id: DatasetConfig['id']): Promise { if (this.datasetMap[id].dataset) return this.datasetMap[id].dataset; const dataset = await this._queryDataset(this.datasetMap[id].config.url); this.datasetMap[id].dataset = dataset; return dataset; } addDataset(url: DatasetConfig['url'], name: DatasetConfig['name']): DatasetConfig['id'] { const config: DatasetConfig = { id: generateUuid('dataset'), name, url, }; this.configs.push(config); this.datasetMap[config.id] = { config, }; this.emit(DATASET_MANAGER_EVENT.AddDataset); return config.id; } }