@@ -16,6 +16,35 @@ import { env } from "~/env.server";
1616import { tryCatch } from "@trigger.dev/core/v3" ;
1717import { ServiceValidationError } from "~/v3/services/common.server" ;
1818
19+ /**
20+ * Extract the queue name from a queue option that may be:
21+ * - An object with a string `name` property: { name: "queue-name" }
22+ * - A double-wrapped object (bug case): { name: { name: "queue-name", ... } }
23+ *
24+ * This handles the case where the SDK accidentally double-wraps the queue
25+ * option when it's already an object with a name property.
26+ */
27+ function extractQueueName ( queue : { name ?: unknown } | undefined ) : string | undefined {
28+ if ( ! queue ?. name ) {
29+ return undefined ;
30+ }
31+
32+ // Normal case: queue.name is a string
33+ if ( typeof queue . name === "string" ) {
34+ return queue . name ;
35+ }
36+
37+ // Double-wrapped case: queue.name is an object with its own name property
38+ if ( typeof queue . name === "object" && queue . name !== null && "name" in queue . name ) {
39+ const innerName = ( queue . name as { name : unknown } ) . name ;
40+ if ( typeof innerName === "string" ) {
41+ return innerName ;
42+ }
43+ }
44+
45+ return undefined ;
46+ }
47+
1948export class DefaultQueueManager implements QueueManager {
2049 constructor (
2150 private readonly prisma : PrismaClientOrTransaction ,
@@ -32,8 +61,8 @@ export class DefaultQueueManager implements QueueManager {
3261 // Determine queue name based on lockToVersion and provided options
3362 if ( lockedBackgroundWorker ) {
3463 // Task is locked to a specific worker version
35- if ( request . body . options ?. queue ?. name ) {
36- const specifiedQueueName = request . body . options . queue . name ;
64+ const specifiedQueueName = extractQueueName ( request . body . options ?. queue ) ;
65+ if ( specifiedQueueName ) {
3766 // A specific queue name is provided
3867 const specifiedQueue = await this . prisma . taskQueue . findFirst ( {
3968 // Validate it exists for the locked worker
@@ -126,8 +155,10 @@ export class DefaultQueueManager implements QueueManager {
126155 const { taskId, environment, body } = request ;
127156 const { queue } = body . options ?? { } ;
128157
129- if ( queue ?. name ) {
130- return queue . name ;
158+ // Use extractQueueName to handle double-wrapped queue objects
159+ const queueName = extractQueueName ( queue ) ;
160+ if ( queueName ) {
161+ return queueName ;
131162 }
132163
133164 const defaultQueueName = `task/${ taskId } ` ;
0 commit comments