{"version":3,"file":"proxy.cjs","sources":["../../../../src/internal/openFeature/proxy.ts"],"sourcesContent":["import {\n  ClientProviderEvents,\n  OpenFeatureEventEmitter,\n  type EvaluationContext,\n  type EventHandler,\n  type JsonValue,\n  type Logger,\n  type Provider,\n  type ProviderEmittableEvents,\n  type ResolutionDetails,\n} from '@openfeature/web-sdk';\n\n/**\n * A proxy provider that provides a read-only view of an underlying provider.\n *\n * This is useful for plugins that want to use the same provider as Grafana without being able to modify its state or context.\n */\nexport class ProxyProvider implements Provider {\n  readonly runsOn = 'client';\n  readonly events = new OpenFeatureEventEmitter();\n\n  private readonly provider: Provider;\n  private readonly cleanup: Array<() => void> = [];\n\n  constructor(provider: Provider) {\n    this.provider = provider;\n    this.registerEventForwarding();\n  }\n\n  get metadata() {\n    return {\n      name: `Proxy(${this.provider.metadata.name})`,\n    };\n  }\n\n  // Should this wait for the underlying provider to initialize? For now, we don't do anything.\n  // In the context of Grafana, this should be fine, as Grafana blocks loading on initializing OpenFeature.\n  // Once https://github.com/open-feature/spec/pull/385 lands, there will be an event that we can forward.\n\n  resolveBooleanEvaluation(\n    flagKey: string,\n    defaultValue: boolean,\n    context: EvaluationContext,\n    logger: Logger\n  ): ResolutionDetails<boolean> {\n    return this.provider.resolveBooleanEvaluation(flagKey, defaultValue, context, logger);\n  }\n\n  resolveStringEvaluation(\n    flagKey: string,\n    defaultValue: string,\n    context: EvaluationContext,\n    logger: Logger\n  ): ResolutionDetails<string> {\n    return this.provider.resolveStringEvaluation(flagKey, defaultValue, context, logger);\n  }\n\n  resolveNumberEvaluation(\n    flagKey: string,\n    defaultValue: number,\n    context: EvaluationContext,\n    logger: Logger\n  ): ResolutionDetails<number> {\n    return this.provider.resolveNumberEvaluation(flagKey, defaultValue, context, logger);\n  }\n\n  resolveObjectEvaluation<T extends JsonValue>(\n    flagKey: string,\n    defaultValue: T,\n    context: EvaluationContext,\n    logger: Logger\n  ): ResolutionDetails<T> {\n    return this.provider.resolveObjectEvaluation(flagKey, defaultValue, context, logger);\n  }\n\n  onClose(): Promise<void> {\n    this.unregisterEventForwarding();\n    return Promise.resolve();\n  }\n\n  private registerEventForwarding() {\n    const events = [\n      ClientProviderEvents.Ready,\n      ClientProviderEvents.Error,\n      ClientProviderEvents.Stale,\n      ClientProviderEvents.ConfigurationChanged,\n      ClientProviderEvents.Reconciling,\n    ] as const satisfies ProviderEmittableEvents[];\n\n    // Do a compile-time check that we've got all the expected events\n    type Missing = Exclude<ProviderEmittableEvents, (typeof events)[number]>;\n    const missing: Missing extends never ? null : Missing = null;\n    void missing;\n\n    events.forEach((event) => {\n      const handler: EventHandler = (...args) => this.events.emit(event, ...args);\n      this.provider.events?.addHandler(event, handler);\n      this.cleanup.push(() => this.provider.events?.removeHandler(event, handler));\n    });\n  }\n\n  private unregisterEventForwarding() {\n    this.cleanup.forEach((fn) => fn());\n    this.cleanup.length = 0;\n  }\n}\n"],"names":["OpenFeatureEventEmitter","ClientProviderEvents","_a"],"mappings":"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"}