diff --git a/src/platform/plugins/shared/embeddable/server/embeddable_transforms/registry.ts b/src/platform/plugins/shared/embeddable/server/embeddable_transforms/registry.ts index c6fd8f77a7ff6..d757dc5ea42f1 100644 --- a/src/platform/plugins/shared/embeddable/server/embeddable_transforms/registry.ts +++ b/src/platform/plugins/shared/embeddable/server/embeddable_transforms/registry.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { ObjectType } from '@kbn/config-schema'; +import type { ObjectType, Type } from '@kbn/config-schema'; import type { getDrilldownRegistry } from '../drilldowns/registry'; import type { EmbeddableServerDefinition } from './types'; @@ -15,6 +15,18 @@ export function getEmbeddableServerRegistry( drilldownRegistry: ReturnType ) { const registry: { [key: string]: EmbeddableServerDefinition } = {}; + const schemaCache: Record | undefined> = {}; + + function getCachedSchema(type: string) { + if (schemaCache[type]) { + return schemaCache[type]; + } + + const { getSchema } = registry[type] ?? {}; + const schema = getSchema?.(drilldownRegistry.getSchema); + schemaCache[type] = schema; + return schema; + } return { registerEmbeddableServerDefinition: ( @@ -30,7 +42,7 @@ export function getEmbeddableServerRegistry( getAllEmbeddableSchemas: () => { const schemas: { [key: string]: { schema: ObjectType; title: string } } = {}; Object.entries(registry).forEach(([type, definition]) => { - const schema = definition?.getSchema?.(drilldownRegistry.getSchema); + const schema = getCachedSchema(type); if (schema) { schemas[type] = { schema: schema as ObjectType, @@ -41,10 +53,11 @@ export function getEmbeddableServerRegistry( return schemas; }, getEmbeddableTransforms: (type: string) => { - const { getTransforms, getSchema, throwOnUnmappedPanel } = registry[type] ?? {}; + const { getTransforms, throwOnUnmappedPanel } = registry[type] ?? {}; + const schema = getCachedSchema(type); return { ...getTransforms?.(drilldownRegistry.transforms), - ...(getSchema ? { schema: getSchema(drilldownRegistry.getSchema) } : {}), + ...(schema ? { schema } : {}), ...(typeof throwOnUnmappedPanel === 'boolean' ? { throwOnUnmappedPanel } : {}), }; },