{"version":3,"file":"dataSource.mjs","sources":["../../../../src/services/dataSource/dataSource.ts"],"sourcesContent":["import { DataSourceApi, type DataSourceInstanceSettings, type DataSourceRef, type ScopedVars } from '@grafana/data';\n\nimport { isExpressionReference } from '../../utils/DataSourceWithBackend';\nimport { UserStorage } from '../../utils/userStorage';\nimport { type RuntimeDataSourceRegistration } from '../dataSourceSrv';\n\nimport { getExpressionDataSourceInstance } from './expressionDs';\nimport { logDataSourceInstanceError } from './logging';\nimport { getCachedPlugin, setCachedPlugin, setRuntimePlugin } from './pluginCache';\nimport { getDataSourceInstanceSettings, upsertRuntimeDataSourceInstanceSettings } from './settings';\nimport { type ImportDataSourcePluginFn } from './types';\n\nlet importDataSourcePlugin: ImportDataSourcePluginFn | undefined;\nconst inflightLoads = new Map<string, Promise<DataSourceApi>>();\n\n/**\n * Register the data source plugin importer. Called once from application boot.\n * The runtime package cannot depend on `public/app/features/plugins`, so the\n * concrete import function is injected here at startup.\n *\n * @internal\n */\nexport function setDataSourcePluginImporter(fn: ImportDataSourcePluginFn): void {\n  importDataSourcePlugin = fn;\n}\n\n/**\n * Load and return a data source plugin instance. Resolves the data source by\n * name, uid, or {@link DataSourceRef}, caches the constructed instance, and\n * reuses it on subsequent calls. Concurrent callers for the same uid share\n * a single in-flight load.\n *\n * @public\n */\nexport async function getDataSourceInstance(\n  ref?: DataSourceRef | string | null,\n  scopedVars?: ScopedVars\n): Promise<DataSourceApi> {\n  if (isExpressionReference(ref)) {\n    const expressionDs = getExpressionDataSourceInstance();\n    if (!expressionDs) {\n      throw new Error(\n        'Expression datasource has not been initialised. Call setExpressionDataSourceInstance during application boot.'\n      );\n    }\n    return expressionDs;\n  }\n\n  const settings = await getDataSourceInstanceSettings(ref, scopedVars);\n  if (!settings) {\n    throw new Error(`Datasource ${describeRef(ref)} was not found`);\n  }\n\n  // When ref is a template variable, settings.uid is the raw variable string\n  // (e.g. \"${datasource}\"). Use the resolved uid as the cache key so repeated\n  // calls for the same variable don't create duplicate instances.\n  const cacheUid = settings.rawRef?.uid ?? settings.uid;\n\n  const cached = getCachedPlugin(cacheUid);\n  if (cached) {\n    return cached;\n  }\n\n  const inflight = inflightLoads.get(cacheUid);\n  if (inflight) {\n    return inflight;\n  }\n\n  const promise = loadDataSourceInstance(cacheUid, settings);\n  inflightLoads.set(cacheUid, promise);\n\n  try {\n    return await promise;\n  } finally {\n    inflightLoads.delete(cacheUid);\n  }\n}\n\nasync function loadDataSourceInstance(cacheUid: string, settings: DataSourceInstanceSettings): Promise<DataSourceApi> {\n  if (!importDataSourcePlugin) {\n    throw new Error('Data source importer has not been set. Call setDataSourcePluginImporter during application boot.');\n  }\n\n  let dsPlugin;\n  try {\n    dsPlugin = await importDataSourcePlugin(settings.meta);\n  } catch (error) {\n    logDataSourceInstanceError(`Failed to import datasource plugin ${settings.name} (${settings.uid})`, error, {\n      pluginId: settings.meta.id,\n      uid: settings.uid,\n      name: settings.name,\n    });\n    throw error;\n  }\n\n  const racedCache = getCachedPlugin(cacheUid);\n  if (racedCache) {\n    return racedCache;\n  }\n\n  const instance = new dsPlugin.DataSourceClass(settings);\n  instance.components = dsPlugin.components;\n\n  if (!instance.userStorage) {\n    instance.userStorage = new UserStorage(settings.type);\n  }\n\n  if (!(instance instanceof DataSourceApi)) {\n    const anyInstance: { [key: string]: unknown } = instance;\n    anyInstance.name = settings.name;\n    anyInstance.id = settings.id;\n    anyInstance.type = settings.type;\n    anyInstance.meta = settings.meta;\n    anyInstance.uid = settings.uid;\n    anyInstance.getRef = DataSourceApi.prototype.getRef;\n  }\n\n  setCachedPlugin(cacheUid, instance);\n  return instance;\n}\n\n/**\n * Register a runtime data source. Writes to both the instance-settings cache\n * and the plugin-instance cache so the data source is available to\n * {@link getDataSourceInstanceSettings} and {@link getDataSourceInstance}.\n *\n * Runtime data sources are intentionally excluded from {@link getDataSourceInstanceSettingsList}\n * results, matching the behaviour of the legacy `DatasourceSrv.registerRuntimeDataSourceInstance`.\n *\n * @public\n */\nexport function registerRuntimeDataSourceInstance(entry: RuntimeDataSourceRegistration): void {\n  const { dataSource } = entry;\n\n  if (getCachedPlugin(dataSource.uid)) {\n    throw new Error(`A runtime data source with uid ${dataSource.uid} has already been registered`);\n  }\n\n  upsertRuntimeDataSourceInstanceSettings(dataSource.instanceSettings);\n  setRuntimePlugin(dataSource.uid, dataSource);\n}\n\nfunction describeRef(ref: DataSourceRef | string | null | undefined): string {\n  if (ref == null) {\n    return 'default';\n  }\n  if (typeof ref === 'string') {\n    return ref;\n  }\n  return ref.uid ?? ref.type ?? 'unknown';\n}\n\n/**\n * Test helper — resets module-local state. Should only be called from tests.\n *\n * @internal\n */\nexport function _resetForTests(): void {\n  if (process.env.NODE_ENV !== 'test') {\n    throw new Error('_resetForTests must only be called from tests');\n  }\n  importDataSourcePlugin = undefined;\n  inflightLoads.clear();\n}\n"],"names":[],"mappings":"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"}