Files
simstudioai--sim/apps/sim/app/api/tools/appconfig/utils.ts
T
wehub-resource-sync d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

682 lines
19 KiB
TypeScript

import {
AppConfigClient,
CreateApplicationCommand,
CreateConfigurationProfileCommand,
CreateEnvironmentCommand,
CreateHostedConfigurationVersionCommand,
DeleteApplicationCommand,
DeleteConfigurationProfileCommand,
DeleteEnvironmentCommand,
DeleteHostedConfigurationVersionCommand,
GetApplicationCommand,
GetConfigurationProfileCommand,
GetDeploymentCommand,
GetEnvironmentCommand,
GetHostedConfigurationVersionCommand,
ListApplicationsCommand,
ListConfigurationProfilesCommand,
ListDeploymentStrategiesCommand,
ListDeploymentsCommand,
ListEnvironmentsCommand,
ListHostedConfigurationVersionsCommand,
StartDeploymentCommand,
StopDeploymentCommand,
UpdateApplicationCommand,
UpdateConfigurationProfileCommand,
UpdateEnvironmentCommand,
} from '@aws-sdk/client-appconfig'
import {
AppConfigDataClient,
GetLatestConfigurationCommand,
StartConfigurationSessionCommand,
} from '@aws-sdk/client-appconfigdata'
import type { AppConfigConnectionConfig } from '@/tools/appconfig/types'
export function createAppConfigClient(config: AppConfigConnectionConfig): AppConfigClient {
return new AppConfigClient({
region: config.region,
credentials: {
accessKeyId: config.accessKeyId,
secretAccessKey: config.secretAccessKey,
},
})
}
export function createAppConfigDataClient(config: AppConfigConnectionConfig): AppConfigDataClient {
return new AppConfigDataClient({
region: config.region,
credentials: {
accessKeyId: config.accessKeyId,
secretAccessKey: config.secretAccessKey,
},
})
}
const textDecoder = new TextDecoder()
function decodeContent(content?: Uint8Array): string {
if (!content || content.length === 0) return ''
return textDecoder.decode(content)
}
export async function listApplications(
client: AppConfigClient,
maxResults?: number | null,
nextToken?: string | null
) {
const response = await client.send(
new ListApplicationsCommand({
...(maxResults ? { MaxResults: maxResults } : {}),
...(nextToken ? { NextToken: nextToken } : {}),
})
)
const applications = (response.Items ?? []).map((item) => ({
id: item.Id ?? '',
name: item.Name ?? '',
description: item.Description ?? null,
}))
return {
applications,
nextToken: response.NextToken ?? null,
count: applications.length,
}
}
export async function createApplication(
client: AppConfigClient,
name: string,
description?: string | null
) {
const response = await client.send(
new CreateApplicationCommand({
Name: name,
...(description ? { Description: description } : {}),
})
)
return {
message: `Application "${response.Name ?? name}" created`,
id: response.Id ?? '',
name: response.Name ?? '',
description: response.Description ?? null,
}
}
export async function listEnvironments(
client: AppConfigClient,
applicationId: string,
maxResults?: number | null,
nextToken?: string | null
) {
const response = await client.send(
new ListEnvironmentsCommand({
ApplicationId: applicationId,
...(maxResults ? { MaxResults: maxResults } : {}),
...(nextToken ? { NextToken: nextToken } : {}),
})
)
const environments = (response.Items ?? []).map((item) => ({
applicationId: item.ApplicationId ?? '',
id: item.Id ?? '',
name: item.Name ?? '',
description: item.Description ?? null,
state: item.State ?? null,
}))
return {
environments,
nextToken: response.NextToken ?? null,
count: environments.length,
}
}
export async function createEnvironment(
client: AppConfigClient,
applicationId: string,
name: string,
description?: string | null
) {
const response = await client.send(
new CreateEnvironmentCommand({
ApplicationId: applicationId,
Name: name,
...(description ? { Description: description } : {}),
})
)
return {
message: `Environment "${response.Name ?? name}" created`,
applicationId: response.ApplicationId ?? applicationId,
id: response.Id ?? '',
name: response.Name ?? '',
state: response.State ?? null,
}
}
export async function listConfigurationProfiles(
client: AppConfigClient,
applicationId: string,
maxResults?: number | null,
nextToken?: string | null
) {
const response = await client.send(
new ListConfigurationProfilesCommand({
ApplicationId: applicationId,
...(maxResults ? { MaxResults: maxResults } : {}),
...(nextToken ? { NextToken: nextToken } : {}),
})
)
const configurationProfiles = (response.Items ?? []).map((item) => ({
applicationId: item.ApplicationId ?? '',
id: item.Id ?? '',
name: item.Name ?? '',
description: null,
locationUri: item.LocationUri ?? null,
retrievalRoleArn: null,
type: item.Type ?? null,
validatorTypes: item.ValidatorTypes ?? [],
}))
return {
configurationProfiles,
nextToken: response.NextToken ?? null,
count: configurationProfiles.length,
}
}
export async function createConfigurationProfile(
client: AppConfigClient,
applicationId: string,
name: string,
locationUri: string,
description?: string | null,
retrievalRoleArn?: string | null,
type?: string | null
) {
const response = await client.send(
new CreateConfigurationProfileCommand({
ApplicationId: applicationId,
Name: name,
LocationUri: locationUri,
...(description ? { Description: description } : {}),
...(retrievalRoleArn ? { RetrievalRoleArn: retrievalRoleArn } : {}),
...(type ? { Type: type } : {}),
})
)
return {
message: `Configuration profile "${response.Name ?? name}" created`,
applicationId: response.ApplicationId ?? applicationId,
id: response.Id ?? '',
name: response.Name ?? '',
locationUri: response.LocationUri ?? null,
type: response.Type ?? null,
}
}
export async function createHostedConfigurationVersion(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string,
content: string,
contentType: string,
description?: string | null,
latestVersionNumber?: number | null,
versionLabel?: string | null
) {
const response = await client.send(
new CreateHostedConfigurationVersionCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
Content: new TextEncoder().encode(content),
ContentType: contentType,
...(description ? { Description: description } : {}),
...(latestVersionNumber != null ? { LatestVersionNumber: latestVersionNumber } : {}),
...(versionLabel ? { VersionLabel: versionLabel } : {}),
})
)
return {
message: `Hosted configuration version ${response.VersionNumber ?? ''} created`,
applicationId: response.ApplicationId ?? applicationId,
configurationProfileId: response.ConfigurationProfileId ?? configurationProfileId,
versionNumber: response.VersionNumber ?? null,
contentType: response.ContentType ?? null,
versionLabel: response.VersionLabel ?? null,
}
}
export async function getHostedConfigurationVersion(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string,
versionNumber: number
) {
const response = await client.send(
new GetHostedConfigurationVersionCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
VersionNumber: versionNumber,
})
)
return {
applicationId: response.ApplicationId ?? applicationId,
configurationProfileId: response.ConfigurationProfileId ?? configurationProfileId,
versionNumber: response.VersionNumber ?? null,
description: response.Description ?? null,
content: decodeContent(response.Content),
contentType: response.ContentType ?? null,
versionLabel: response.VersionLabel ?? null,
}
}
export async function listHostedConfigurationVersions(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string,
maxResults?: number | null,
nextToken?: string | null
) {
const response = await client.send(
new ListHostedConfigurationVersionsCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
...(maxResults ? { MaxResults: maxResults } : {}),
...(nextToken ? { NextToken: nextToken } : {}),
})
)
const versions = (response.Items ?? []).map((item) => ({
applicationId: item.ApplicationId ?? null,
configurationProfileId: item.ConfigurationProfileId ?? null,
versionNumber: item.VersionNumber ?? null,
description: item.Description ?? null,
contentType: item.ContentType ?? null,
versionLabel: item.VersionLabel ?? null,
}))
return {
versions,
nextToken: response.NextToken ?? null,
count: versions.length,
}
}
export async function listDeploymentStrategies(
client: AppConfigClient,
maxResults?: number | null,
nextToken?: string | null
) {
const response = await client.send(
new ListDeploymentStrategiesCommand({
...(maxResults ? { MaxResults: maxResults } : {}),
...(nextToken ? { NextToken: nextToken } : {}),
})
)
const deploymentStrategies = (response.Items ?? []).map((item) => ({
id: item.Id ?? '',
name: item.Name ?? '',
description: item.Description ?? null,
deploymentDurationInMinutes: item.DeploymentDurationInMinutes ?? null,
growthType: item.GrowthType ?? null,
growthFactor: item.GrowthFactor ?? null,
finalBakeTimeInMinutes: item.FinalBakeTimeInMinutes ?? null,
replicateTo: item.ReplicateTo ?? null,
}))
return {
deploymentStrategies,
nextToken: response.NextToken ?? null,
count: deploymentStrategies.length,
}
}
export async function startDeployment(
client: AppConfigClient,
applicationId: string,
environmentId: string,
deploymentStrategyId: string,
configurationProfileId: string,
configurationVersion: string,
description?: string | null
) {
const response = await client.send(
new StartDeploymentCommand({
ApplicationId: applicationId,
EnvironmentId: environmentId,
DeploymentStrategyId: deploymentStrategyId,
ConfigurationProfileId: configurationProfileId,
ConfigurationVersion: configurationVersion,
...(description ? { Description: description } : {}),
})
)
return {
message: `Deployment ${response.DeploymentNumber ?? ''} started`,
deploymentNumber: response.DeploymentNumber ?? null,
state: response.State ?? null,
percentageComplete: response.PercentageComplete ?? null,
}
}
export async function getDeployment(
client: AppConfigClient,
applicationId: string,
environmentId: string,
deploymentNumber: number
) {
const response = await client.send(
new GetDeploymentCommand({
ApplicationId: applicationId,
EnvironmentId: environmentId,
DeploymentNumber: deploymentNumber,
})
)
return {
applicationId: response.ApplicationId ?? applicationId,
environmentId: response.EnvironmentId ?? environmentId,
deploymentStrategyId: response.DeploymentStrategyId ?? '',
configurationProfileId: response.ConfigurationProfileId ?? '',
deploymentNumber: response.DeploymentNumber ?? null,
configurationName: response.ConfigurationName ?? null,
configurationVersion: response.ConfigurationVersion ?? null,
description: response.Description ?? null,
state: response.State ?? null,
percentageComplete: response.PercentageComplete ?? null,
startedAt: response.StartedAt?.toISOString() ?? null,
completedAt: response.CompletedAt?.toISOString() ?? null,
}
}
export async function listDeployments(
client: AppConfigClient,
applicationId: string,
environmentId: string,
maxResults?: number | null,
nextToken?: string | null
) {
const response = await client.send(
new ListDeploymentsCommand({
ApplicationId: applicationId,
EnvironmentId: environmentId,
...(maxResults ? { MaxResults: maxResults } : {}),
...(nextToken ? { NextToken: nextToken } : {}),
})
)
const deployments = (response.Items ?? []).map((item) => ({
deploymentNumber: item.DeploymentNumber ?? null,
configurationName: item.ConfigurationName ?? null,
configurationVersion: item.ConfigurationVersion ?? null,
deploymentDurationInMinutes: item.DeploymentDurationInMinutes ?? null,
growthType: item.GrowthType ?? null,
growthFactor: item.GrowthFactor ?? null,
finalBakeTimeInMinutes: item.FinalBakeTimeInMinutes ?? null,
state: item.State ?? null,
percentageComplete: item.PercentageComplete ?? null,
startedAt: item.StartedAt?.toISOString() ?? null,
completedAt: item.CompletedAt?.toISOString() ?? null,
versionLabel: item.VersionLabel ?? null,
}))
return {
deployments,
nextToken: response.NextToken ?? null,
count: deployments.length,
}
}
export async function stopDeployment(
client: AppConfigClient,
applicationId: string,
environmentId: string,
deploymentNumber: number
) {
const response = await client.send(
new StopDeploymentCommand({
ApplicationId: applicationId,
EnvironmentId: environmentId,
DeploymentNumber: deploymentNumber,
})
)
return {
message: `Deployment ${response.DeploymentNumber ?? deploymentNumber} stopped`,
deploymentNumber: response.DeploymentNumber ?? null,
state: response.State ?? null,
}
}
export async function getConfiguration(
client: AppConfigDataClient,
applicationId: string,
environmentId: string,
configurationProfileId: string
) {
const session = await client.send(
new StartConfigurationSessionCommand({
ApplicationIdentifier: applicationId,
EnvironmentIdentifier: environmentId,
ConfigurationProfileIdentifier: configurationProfileId,
})
)
const response = await client.send(
new GetLatestConfigurationCommand({
ConfigurationToken: session.InitialConfigurationToken,
})
)
return {
configuration: decodeContent(response.Configuration),
contentType: response.ContentType ?? null,
versionLabel: response.VersionLabel ?? null,
}
}
export async function getApplication(client: AppConfigClient, applicationId: string) {
const response = await client.send(new GetApplicationCommand({ ApplicationId: applicationId }))
return {
id: response.Id ?? '',
name: response.Name ?? '',
description: response.Description ?? null,
}
}
export async function updateApplication(
client: AppConfigClient,
applicationId: string,
name?: string | null,
description?: string | null
) {
const response = await client.send(
new UpdateApplicationCommand({
ApplicationId: applicationId,
...(name ? { Name: name } : {}),
...(description != null ? { Description: description } : {}),
})
)
return {
message: `Application "${response.Name ?? applicationId}" updated`,
id: response.Id ?? '',
name: response.Name ?? '',
description: response.Description ?? null,
}
}
export async function deleteApplication(client: AppConfigClient, applicationId: string) {
await client.send(new DeleteApplicationCommand({ ApplicationId: applicationId }))
return {
message: `Application ${applicationId} deleted`,
id: applicationId,
}
}
export async function getEnvironment(
client: AppConfigClient,
applicationId: string,
environmentId: string
) {
const response = await client.send(
new GetEnvironmentCommand({ ApplicationId: applicationId, EnvironmentId: environmentId })
)
return {
applicationId: response.ApplicationId ?? applicationId,
id: response.Id ?? '',
name: response.Name ?? '',
description: response.Description ?? null,
state: response.State ?? null,
monitors: (response.Monitors ?? []).map((monitor) => ({
alarmArn: monitor.AlarmArn ?? '',
alarmRoleArn: monitor.AlarmRoleArn ?? null,
})),
}
}
export async function updateEnvironment(
client: AppConfigClient,
applicationId: string,
environmentId: string,
name?: string | null,
description?: string | null
) {
const response = await client.send(
new UpdateEnvironmentCommand({
ApplicationId: applicationId,
EnvironmentId: environmentId,
...(name ? { Name: name } : {}),
...(description != null ? { Description: description } : {}),
})
)
return {
message: `Environment "${response.Name ?? environmentId}" updated`,
applicationId: response.ApplicationId ?? applicationId,
id: response.Id ?? '',
name: response.Name ?? '',
state: response.State ?? null,
}
}
export async function deleteEnvironment(
client: AppConfigClient,
applicationId: string,
environmentId: string
) {
await client.send(
new DeleteEnvironmentCommand({ ApplicationId: applicationId, EnvironmentId: environmentId })
)
return {
message: `Environment ${environmentId} deleted`,
applicationId,
id: environmentId,
}
}
export async function getConfigurationProfile(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string
) {
const response = await client.send(
new GetConfigurationProfileCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
})
)
return {
applicationId: response.ApplicationId ?? applicationId,
id: response.Id ?? '',
name: response.Name ?? '',
description: response.Description ?? null,
locationUri: response.LocationUri ?? null,
retrievalRoleArn: response.RetrievalRoleArn ?? null,
type: response.Type ?? null,
validators: (response.Validators ?? []).map((validator) => ({
type: validator.Type ?? '',
})),
}
}
export async function updateConfigurationProfile(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string,
name?: string | null,
description?: string | null,
retrievalRoleArn?: string | null
) {
const response = await client.send(
new UpdateConfigurationProfileCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
...(name ? { Name: name } : {}),
...(description != null ? { Description: description } : {}),
...(retrievalRoleArn != null ? { RetrievalRoleArn: retrievalRoleArn } : {}),
})
)
return {
message: `Configuration profile "${response.Name ?? configurationProfileId}" updated`,
applicationId: response.ApplicationId ?? applicationId,
id: response.Id ?? '',
name: response.Name ?? '',
description: response.Description ?? null,
type: response.Type ?? null,
}
}
export async function deleteConfigurationProfile(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string
) {
await client.send(
new DeleteConfigurationProfileCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
})
)
return {
message: `Configuration profile ${configurationProfileId} deleted`,
applicationId,
id: configurationProfileId,
}
}
export async function deleteHostedConfigurationVersion(
client: AppConfigClient,
applicationId: string,
configurationProfileId: string,
versionNumber: number
) {
await client.send(
new DeleteHostedConfigurationVersionCommand({
ApplicationId: applicationId,
ConfigurationProfileId: configurationProfileId,
VersionNumber: versionNumber,
})
)
return {
message: `Hosted configuration version ${versionNumber} deleted`,
applicationId,
configurationProfileId,
versionNumber,
}
}