diff --git a/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-fns.ts b/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-fns.ts index fa0d71d5c..bde0d2cdf 100644 --- a/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-fns.ts +++ b/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-fns.ts @@ -1,4 +1,6 @@ import { request } from "@app/lib/config/request"; +import { applyJitter } from "@app/lib/dates"; +import { delay as delayMs } from "@app/lib/delay"; import { IntegrationUrls } from "@app/services/integration-auth/integration-list"; import { matchesSchema } from "@app/services/secret-sync/secret-sync-fns"; import { TSecretMap } from "@app/services/secret-sync/secret-sync-types"; @@ -6,9 +8,7 @@ import { TSecretMap } from "@app/services/secret-sync/secret-sync-types"; import { SECRET_SYNC_NAME_MAP } from "../secret-sync-maps"; import { TCloudflareWorkersSyncWithCredentials } from "./cloudflare-workers-types"; -const getProjectEnvironmentSecretNames = async ( - secretSync: TCloudflareWorkersSyncWithCredentials -): Promise => { +const getSecretKeys = async (secretSync: TCloudflareWorkersSyncWithCredentials): Promise => { const { destinationConfig, connection: { @@ -40,10 +40,11 @@ export const CloudflareWorkersSyncFns = { destinationConfig: { scriptId } } = secretSync; - const existingSecretNames = await getProjectEnvironmentSecretNames(secretSync); + const existingSecretNames = await getSecretKeys(secretSync); const secretMapKeys = new Set(Object.keys(secretMap)); const secretsToCreateOrUpdatePromises = Object.entries(secretMap).map(async ([key, val]) => { + await delayMs(Math.max(0, applyJitter(100, 200))); await request.put( `${IntegrationUrls.CLOUDFLARE_WORKERS_API_URL}/client/v4/accounts/${accountId}/workers/scripts/${scriptId}/secrets`, { name: key, text: val.value, type: "secret_text" }, @@ -69,6 +70,7 @@ export const CloudflareWorkersSyncFns = { return !isInNewSecretMap && isManagedBySchema; }) .map(async (key) => { + await delayMs(Math.max(0, applyJitter(100, 200))); await request.delete( `${IntegrationUrls.CLOUDFLARE_WORKERS_API_URL}/client/v4/accounts/${accountId}/workers/scripts/${scriptId}/secrets/${key}`, { @@ -94,7 +96,7 @@ export const CloudflareWorkersSyncFns = { destinationConfig: { scriptId } } = secretSync; - const existingSecretNames = await getProjectEnvironmentSecretNames(secretSync); + const existingSecretNames = await getSecretKeys(secretSync); const secretMapToRemoveKeys = new Set(Object.keys(secretMap)); const deletePromises = existingSecretNames.map(async (existingKey) => { @@ -106,6 +108,7 @@ export const CloudflareWorkersSyncFns = { const isInSecretMapToRemove = secretMapToRemoveKeys.has(existingKey); if (isInSecretMapToRemove && isManagedBySchema) { + await delayMs(Math.max(0, applyJitter(100, 200))); await request.delete( `${IntegrationUrls.CLOUDFLARE_WORKERS_API_URL}/client/v4/accounts/${accountId}/workers/scripts/${scriptId}/secrets/${existingKey}`, { diff --git a/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-schemas.ts b/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-schemas.ts index c03748eb3..b5698867a 100644 --- a/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-schemas.ts +++ b/backend/src/services/secret-sync/cloudflare-workers/cloudflare-workers-schemas.ts @@ -16,7 +16,10 @@ const CloudflareWorkersSyncDestinationConfigSchema = z.object({ .string() .min(1, "Script ID is required") .max(64) - .regex(new RE2(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/), "Invalid script ID format") + .refine((val) => { + const re2 = new RE2(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/); + return re2.test(val); + }, "Invalid script ID format") .describe(SecretSyncs.DESTINATION_CONFIG.CLOUDFLARE_WORKERS.scriptId) }); diff --git a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-destination.png b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-destination.png index dae054651..c7ccac175 100644 Binary files a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-destination.png and b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-destination.png differ diff --git a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-details.png b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-details.png index b02555bc6..235b6f147 100644 Binary files a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-details.png and b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-details.png differ diff --git a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-options.png b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-options.png index d3e9f4c22..aec833bf4 100644 Binary files a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-options.png and b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-options.png differ diff --git a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-review.png b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-review.png index 64769357e..c32b164c5 100644 Binary files a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-review.png and b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-review.png differ diff --git a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-source.png b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-source.png index ea1de6824..3044dbac9 100644 Binary files a/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-source.png and b/docs/images/secret-syncs/cloudflare-workers/cloudflare-workers-sync-source.png differ diff --git a/docs/images/secret-syncs/cloudflare-workers/select-cloudflare-workers-option.png b/docs/images/secret-syncs/cloudflare-workers/select-cloudflare-workers-option.png index 9a3681f4e..a7462a3bd 100644 Binary files a/docs/images/secret-syncs/cloudflare-workers/select-cloudflare-workers-option.png and b/docs/images/secret-syncs/cloudflare-workers/select-cloudflare-workers-option.png differ