@@ -8,16 +8,17 @@ import type {
88 DefineFlowOptions ,
99 DefineJobOptions ,
1010 Flow ,
11+ FlowAccessor ,
1112 FlowStep ,
1213 Job ,
14+ JobAccessor ,
1315 JobDefinitionsObject ,
14- QueueFlowProxyAccessor ,
15- QueueJobProxy ,
16- QueueJobProxyAccessor ,
16+ Jobs ,
1717 WorkerOptions ,
1818} from './types'
1919import { Queue as BullQueue , Worker as BullWorker , FlowProducer } from 'bullmq'
2020import IORedis from 'ioredis'
21+ import { mapValues } from 'remeda'
2122import { FlowBuilder , flowSymbol , jobSymbol , StandardSchemaV1Error } from './types'
2223
2324export function defineJob < Schema extends StandardSchemaV1 , Output > (
@@ -121,7 +122,7 @@ export function defineFlow<Schema extends StandardSchemaV1, Output>(
121122 }
122123}
123124
124- export function defineQueues < J extends JobDefinitionsObject > ( jobs : J , opts ?: BullQueueOptions ) {
125+ export function defineJobs < J extends JobDefinitionsObject > ( jobs : J , opts ?: BullQueueOptions ) {
125126 const connection =
126127 opts ?. connection ??
127128 new IORedis ( {
@@ -162,49 +163,40 @@ export function defineQueues<J extends JobDefinitionsObject>(jobs: J, opts?: Bul
162163 return flowProducer
163164 }
164165
165- function createProxy ( obj : JobDefinitionsObject , path : string [ ] ) {
166- return new Proxy ( obj , {
167- get ( target , p , receiver ) {
168- if ( typeof p !== 'string' ) return
166+ function traverse ( obj : JobDefinitionsObject , path : string [ ] ) : Jobs < any > {
167+ return mapValues ( obj , ( jobOrJobs , p ) => {
168+ if ( typeof jobOrJobs !== 'object' ) throw new Error ( 'Job definition must be an object' )
169169
170- const jobOrJobs = Reflect . get ( target , p , receiver )
171- if ( typeof jobOrJobs !== 'object' ) return
170+ const fullPath = [ ...path , p ]
172171
173- const fullPath = [ ...path , p ]
174-
175- if ( jobSymbol in jobOrJobs ) {
176- const jobName = fullPath . join ( '-' )
172+ if ( jobSymbol in jobOrJobs ) {
173+ const jobName = fullPath . join ( '-' )
177174
178- return {
179- queue : async ( payload : unknown ) => {
180- return jobOrJobs [ jobSymbol ] . addToQueue ( await getQueue ( jobName ) , payload )
181- } ,
182- queueBulk : async ( payloads : unknown [ ] ) => {
183- return jobOrJobs [ jobSymbol ] . addToQueueBulk ( await getQueue ( jobName ) , payloads )
184- } ,
185- } satisfies QueueJobProxyAccessor < any , any >
186- } else if ( flowSymbol in jobOrJobs ) {
187- const flowName = fullPath . join ( '-' )
175+ return {
176+ queue : async ( payload : unknown ) => {
177+ return jobOrJobs [ jobSymbol ] . addToQueue ( await getQueue ( jobName ) , payload )
178+ } ,
179+ queueBulk : async ( payloads : unknown [ ] ) => {
180+ return jobOrJobs [ jobSymbol ] . addToQueueBulk ( await getQueue ( jobName ) , payloads )
181+ } ,
182+ } satisfies JobAccessor < any , any >
183+ } else if ( flowSymbol in jobOrJobs ) {
184+ const flowName = fullPath . join ( '-' )
188185
189- return {
190- queue : async ( payload : unknown ) => {
191- return jobOrJobs [ flowSymbol ] . addToQueue ( flowName , await getFlowProducer ( ) , payload )
192- } ,
193- queueBulk : async ( payloads : unknown [ ] ) => {
194- return jobOrJobs [ flowSymbol ] . addToQueueBulk (
195- flowName ,
196- await getFlowProducer ( ) ,
197- payloads ,
198- )
199- } ,
200- } satisfies QueueFlowProxyAccessor < any >
201- }
186+ return {
187+ queue : async ( payload : unknown ) => {
188+ return jobOrJobs [ flowSymbol ] . addToQueue ( flowName , await getFlowProducer ( ) , payload )
189+ } ,
190+ queueBulk : async ( payloads : unknown [ ] ) => {
191+ return jobOrJobs [ flowSymbol ] . addToQueueBulk ( flowName , await getFlowProducer ( ) , payloads )
192+ } ,
193+ } satisfies FlowAccessor < any >
194+ }
202195
203- return createProxy ( jobOrJobs , fullPath )
204- } ,
196+ return traverse ( jobOrJobs , fullPath )
205197 } )
206198 }
207- return createProxy ( jobs , [ ] ) as unknown as QueueJobProxy < J >
199+ return traverse ( jobs , [ ] ) as Jobs < J >
208200}
209201
210202export async function startWorkers < J extends JobDefinitionsObject > (
0 commit comments