/// import { EventEmitter } from 'events'; import { ChainableCommander } from 'ioredis'; import { FlowJob, FlowQueuesOpts, FlowOpts, IoredisListener, QueueBaseOptions, RedisClient } from '../interfaces'; import { Job } from './job'; import { KeysMap, QueueKeys } from './queue-keys'; import { RedisConnection } from './redis-connection'; export interface AddNodeOpts { multi: ChainableCommander; node: FlowJob; parent?: { parentOpts: { id: string; queue: string; }; parentDependenciesKey: string; }; /** * Queues options that will be applied in each node depending on queue name presence. */ queuesOpts?: FlowQueuesOpts; } export interface AddChildrenOpts { multi: ChainableCommander; nodes: FlowJob[]; parent: { parentOpts: { id: string; queue: string; }; parentDependenciesKey: string; }; queuesOpts?: FlowQueuesOpts; } export interface NodeOpts { /** * Root job queue name. */ queueName: string; /** * Prefix included in job key. */ prefix?: string; /** * Root job id. */ id: string; /** * Maximum depth or levels to visit in the tree. */ depth?: number; /** * Maximum quantity of children per type (processed, unprocessed). */ maxChildren?: number; } export interface JobNode { job: Job; children?: JobNode[]; } export interface FlowProducerListener extends IoredisListener { /** * Listen to 'error' event. * * This event is triggered when an error is throw. */ error: (failedReason: Error) => void; } /** * This class allows to add jobs with dependencies between them in such * a way that it is possible to build complex flows. * Note: A flow is a tree-like structure of jobs that depend on each other. * Whenever the children of a given parent are completed, the parent * will be processed, being able to access the children's result data. * All Jobs can be in different queues, either children or parents, */ export declare class FlowProducer extends EventEmitter { opts: QueueBaseOptions; toKey: (name: string, type: string) => string; keys: KeysMap; closing: Promise | undefined; queueKeys: QueueKeys; protected connection: RedisConnection; constructor(opts?: QueueBaseOptions, Connection?: typeof RedisConnection); emit(event: U, ...args: Parameters): boolean; off(eventName: U, listener: FlowProducerListener[U]): this; on(event: U, listener: FlowProducerListener[U]): this; once(event: U, listener: FlowProducerListener[U]): this; /** * Returns a promise that resolves to a redis client. Normally used only by subclasses. */ get client(): Promise; /** * Helper to easily extend Job class calls. */ protected get Job(): typeof Job; waitUntilReady(): Promise; /** * Adds a flow. * * This call would be atomic, either it fails and no jobs will * be added to the queues, or it succeeds and all jobs will be added. * * @param flow - an object with a tree-like structure where children jobs * will be processed before their parents. * @param opts - options that will be applied to the flow object. */ add(flow: FlowJob, opts?: FlowOpts): Promise; /** * Get a flow. * * @param opts - an object with options for getting a JobNode. */ getFlow(opts: NodeOpts): Promise; /** * Adds multiple flows. * * A flow is a tree-like structure of jobs that depend on each other. * Whenever the children of a given parent are completed, the parent * will be processed, being able to access the children's result data. * * All Jobs can be in different queues, either children or parents, * however this call would be atomic, either it fails and no jobs will * be added to the queues, or it succeeds and all jobs will be added. * * @param flows - an array of objects with a tree-like structure where children jobs * will be processed before their parents. */ addBulk(flows: FlowJob[]): Promise; /** * Add a node (job) of a flow to the queue. This method will recursively * add all its children as well. Note that a given job can potentially be * a parent and a child job at the same time depending on where it is located * in the tree hierarchy. * * @param multi - ioredis ChainableCommander * @param node - the node representing a job to be added to some queue * @param parent - parent data sent to children to create the "links" to their parent * @returns */ protected addNode({ multi, node, parent, queuesOpts }: AddNodeOpts): JobNode; /** * Adds nodes (jobs) of multiple flows to the queue. This method will recursively * add all its children as well. Note that a given job can potentially be * a parent and a child job at the same time depending on where it is located * in the tree hierarchy. * * @param multi - ioredis ChainableCommander * @param nodes - the nodes representing jobs to be added to some queue * @returns */ protected addNodes(multi: ChainableCommander, nodes: FlowJob[]): JobNode[]; private getNode; private addChildren; private getChildren; /** * Helper factory method that creates a queue-like object * required to create jobs in any queue. * * @param node - * @param queueKeys - * @returns */ private queueFromNode; /** * * Closes the connection and returns a promise that resolves when the connection is closed. */ close(): Promise; /** * * Force disconnects a connection. */ disconnect(): Promise; }