import { inject, injectable } from "@codemation/core"; import type { CallerContext, CredentialMaterialProvider, CredentialMaterialRef, MaterialBundle, } from "@codemation/core"; import { ManagedCredentialMaterialWriteError } from "@codemation/core"; import { LocalCredentialMaterialProvider } from "./LocalCredentialMaterialProvider"; import { ControlPlaneCredentialMaterialProvider } from "./ControlPlaneCredentialMaterialProvider"; @injectable() export class CompositeCredentialMaterialProvider implements CredentialMaterialProvider { constructor( @inject(LocalCredentialMaterialProvider) private readonly local: LocalCredentialMaterialProvider, @inject(ControlPlaneCredentialMaterialProvider) private readonly controlPlane: ControlPlaneCredentialMaterialProvider, ) {} async getMaterial(ref: CredentialMaterialRef, context: CallerContext): Promise { return this.pick(ref).getMaterial(ref, context); } async setMaterial(ref: CredentialMaterialRef, material: MaterialBundle): Promise { if (ref.source === "control-plane") { throw new ManagedCredentialMaterialWriteError(); } return this.pick(ref).setMaterial(ref, material); } private pick(ref: CredentialMaterialRef): CredentialMaterialProvider { return ref.source === "control-plane" ? this.controlPlane : this.local; } }