|
1 | 1 | import { randomUUID } from "crypto"; |
2 | 2 | import { env as stdEnv } from "std-env"; |
3 | 3 | import { z } from "zod"; |
| 4 | +import { WeightedWorkerQueueSubscriptions } from "@trigger.dev/core/v3/runEngineWorker"; |
4 | 5 | import { |
5 | 6 | AdditionalEnvVars, |
6 | 7 | BoolEnv, |
@@ -56,7 +57,23 @@ export const Env = z |
56 | 57 | // Which worker-queue class this supervisor fleet serves. "default" pulls the |
57 | 58 | // region queue (standard/agent runs); "scheduled" pulls the dedicated |
58 | 59 | // scheduled-lineage queue. Run a separate fleet per class for isolation. |
59 | | - TRIGGER_WORKER_QUEUE_CLASS: z.enum(["default", "scheduled"]).default("default"), |
| 60 | + TRIGGER_WORKER_QUEUE_CLASS: z.enum(["default", "scheduled"]).optional(), |
| 61 | + // JSON array of weighted v2 subscriptions; omit to retain legacy queue selection. |
| 62 | + TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS: z |
| 63 | + .string() |
| 64 | + .transform((value, ctx) => { |
| 65 | + try { |
| 66 | + return JSON.parse(value) as unknown; |
| 67 | + } catch { |
| 68 | + ctx.addIssue({ |
| 69 | + code: z.ZodIssueCode.custom, |
| 70 | + message: "Worker queue subscriptions must be valid JSON", |
| 71 | + }); |
| 72 | + return z.NEVER; |
| 73 | + } |
| 74 | + }) |
| 75 | + .pipe(WeightedWorkerQueueSubscriptions) |
| 76 | + .optional(), |
60 | 77 | TRIGGER_DEQUEUE_INTERVAL_MS: z.coerce.number().int().default(250), |
61 | 78 | TRIGGER_DEQUEUE_IDLE_INTERVAL_MS: z.coerce.number().int().default(1000), |
62 | 79 | TRIGGER_DEQUEUE_MAX_RUN_COUNT: z.coerce.number().int().default(1), |
@@ -326,6 +343,44 @@ export const Env = z |
326 | 343 | TRIGGER_WIDE_EVENTS_NOISY_ROUTES: BoolEnv.default(false), |
327 | 344 | }) |
328 | 345 | .superRefine((data, ctx) => { |
| 346 | + if (data.TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS) { |
| 347 | + if (data.TRIGGER_WORKER_QUEUE_CLASS !== undefined) { |
| 348 | + ctx.addIssue({ |
| 349 | + code: z.ZodIssueCode.custom, |
| 350 | + message: |
| 351 | + "TRIGGER_WORKER_QUEUE_CLASS and TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS are mutually exclusive", |
| 352 | + path: ["TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS"], |
| 353 | + }); |
| 354 | + } |
| 355 | + |
| 356 | + const compatibility = |
| 357 | + data.COMPUTE_GATEWAY_URL || |
| 358 | + (data.KUBERNETES_FORCE_ENABLED && |
| 359 | + data.KUBERNETES_RUN_CRD_ENABLED && |
| 360 | + data.KUBERNETES_RUNNER_RUNTIME === "microvm") |
| 361 | + ? "compute" |
| 362 | + : "container"; |
| 363 | + |
| 364 | + for (const [index, subscription] of data.TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS.entries()) { |
| 365 | + if (subscription.compat !== "any" && subscription.compat !== compatibility) { |
| 366 | + ctx.addIssue({ |
| 367 | + code: z.ZodIssueCode.custom, |
| 368 | + message: `Subscription compatibility must be any or ${compatibility} for this backend`, |
| 369 | + path: ["TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS", index, "compat"], |
| 370 | + }); |
| 371 | + } else if ( |
| 372 | + subscription.phase === "restore" && |
| 373 | + !(compatibility === "compute" ? data.COMPUTE_GATEWAY_URL : data.TRIGGER_CHECKPOINT_URL) |
| 374 | + ) { |
| 375 | + ctx.addIssue({ |
| 376 | + code: z.ZodIssueCode.custom, |
| 377 | + message: `Restore subscriptions require ${compatibility === "compute" ? "COMPUTE_GATEWAY_URL" : "TRIGGER_CHECKPOINT_URL"}`, |
| 378 | + path: ["TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS", index], |
| 379 | + }); |
| 380 | + } |
| 381 | + } |
| 382 | + } |
| 383 | + |
329 | 384 | if ( |
330 | 385 | data.TRIGGER_DEQUEUE_BACKPRESSURE_POD_COUNT_ENABLED && |
331 | 386 | data.TRIGGER_DEQUEUE_BACKPRESSURE_POD_COUNT_RELEASE >= |
@@ -404,6 +459,9 @@ export const Env = z |
404 | 459 | }) |
405 | 460 | .transform((data) => ({ |
406 | 461 | ...data, |
| 462 | + TRIGGER_WORKER_QUEUE_CLASS: |
| 463 | + data.TRIGGER_WORKER_QUEUE_CLASS ?? |
| 464 | + (data.TRIGGER_WORKER_QUEUE_SUBSCRIPTIONS === undefined ? "default" : undefined), |
407 | 465 | COMPUTE_TRACE_OTLP_ENDPOINT: data.COMPUTE_TRACE_OTLP_ENDPOINT ?? `${data.TRIGGER_API_URL}/otel`, |
408 | 466 | })); |
409 | 467 |
|
|
0 commit comments