Open History to see the last commit
1import {
2 CLOUD_SPEECH_LABELS,
3 CloudSpeechProvider,
4 EasDeviceHostConfig,
5 isSecretReference,
6 secretReferencesInSettings,
7 type ServerSettings,
8 SimlockDeviceHostConfig,
9 TextGeneratorConfig,
10 UsageLimitSourceConfig,
11} from "@t3tools/contracts";
12import { getProviderClient } from "@t3tools/client-runtime/provider-clients";
13import { sourceControlClients } from "@t3tools/client-runtime/source-control-clients";
14
15import { deriveProviderSettingsFields, type SettingsFormDefinition } from "./ProviderSettingsForm";
16
17type SecretUseSettings = Pick<
18 ServerSettings,
19 | "providerInstances"
20 | "sourceControlHosts"
21 | "usageLimitSources"
22 | "textGenerators"
23 | "easDeviceHosts"
24 | "simlockDeviceHosts"
25 | "cloudSpeechCredentials"
26>;
27
28interface SecretProviderUse {
29 readonly id: string;
30 readonly label: string;
31}
32
33/** What reads from secret provider `providerId`, one readable name per field, in settings order. */
34export function secretProviderUses(
35 settings: SecretUseSettings,
36 providerId: string,
37): ReadonlyArray<SecretProviderUse> {
38 const uses = (
39 definition: SettingsFormDefinition,
40 ownerId: string,
41 owner: string,
42 value: unknown,
43 ): ReadonlyArray<SecretProviderUse> => {
44 const labels = new Map(
45 deriveProviderSettingsFields(definition).map((field) => [field.key, field.label] as const),
46 );
47 return secretReferencesInSettings(definition.settingsSchema, value).flatMap(
48 ({ field, key, reference }) =>
49 reference.provider === providerId
50 ? [
51 {
52 id: `${ownerId}:${field}:${key ?? ""}`,
53 label: `${owner} · ${key ?? labels.get(field) ?? field}`,
54 },
55 ]
56 : [],
57 );
58 };
59
60 return [
61 ...Object.entries(settings.providerInstances).flatMap(([instanceId, instance]) => {
62 const client = getProviderClient(instance.driver);
63 const owner = instance.displayName ?? client?.label ?? instanceId;
64 return [
65 ...(client ? uses(client, `provider:${instanceId}`, owner, instance.config) : []),
66 ...(instance.environment ?? []).flatMap((variable) =>
67 isSecretReference(variable.value) && variable.value.provider === providerId
68 ? [
69 {
70 id: `provider:${instanceId}:env:${variable.name}`,
71 label: `${owner} · ${variable.name}`,
72 },
73 ]
74 : [],
75 ),
76 ];
77 }),
78 ...sourceControlClients.definitions.flatMap((definition) =>
79 definition.settings
80 ? uses(
81 { settingsSchema: definition.settings },
82 `source-control:${definition.kind}`,
83 definition.label,
84 settings.sourceControlHosts[definition.kind],
85 )
86 : [],
87 ),
88 ...Object.entries(settings.usageLimitSources).flatMap(([id, source]) =>
89 uses(
90 { settingsSchema: UsageLimitSourceConfig },
91 `usage-limit:${id}`,
92 source.label ?? source.url,
93 source,
94 ),
95 ),
96 ...Object.entries(settings.textGenerators).flatMap(([id, generator]) =>
97 uses(
98 { settingsSchema: TextGeneratorConfig },
99 `text-generator:${id}`,
100 generator.label ?? generator.baseUrl,
101 generator,
102 ),
103 ),
104 ...settings.easDeviceHosts.flatMap((host) =>
105 uses({ settingsSchema: EasDeviceHostConfig }, `eas:${host.id}`, host.label, host),
106 ),
107 ...settings.simlockDeviceHosts.flatMap((host) =>
108 uses({ settingsSchema: SimlockDeviceHostConfig }, `simlock:${host.id}`, host.label, host),
109 ),
110 ...CloudSpeechProvider.literals.flatMap((provider) => {
111 const credential = settings.cloudSpeechCredentials[provider];
112 return isSecretReference(credential) && credential.provider === providerId
113 ? [{ id: `voice:${provider}`, label: `Voice · ${CLOUD_SPEECH_LABELS[provider]}` }]
114 : [];
115 }),
116 ];
117}