//#region src/jobs/jobs.types.d.ts
type JsonSerializable = string | number | boolean | null | undefined | JsonSerializable[] | {
  [key: string]: JsonSerializable;
};
type JobData = JsonSerializable;
type JobResult = JsonSerializable;
type JobStatus = 'pending' | 'processing' | 'completed' | 'failed';
type Job = {
  id: string;
  taskName: string;
  status: JobStatus;
  error?: string;
  startedAt?: Date;
  completedAt?: Date;
  maxRetries?: number;
  data?: JobData;
  result?: JobResult;
  scheduleAt: Date;
};
type JobRepositoryDriver = {
  saveJob: (arg: {
    job: Job;
    now?: Date;
  }) => Promise<void>;
  fetchNextJob: (arg: {
    processingTimeoutMs: number;
  }) => Promise<{
    job: Job;
  }>;
  markJobAsCompleted: (arg: {
    jobId: string;
    now?: Date;
    result?: JobResult;
  }) => Promise<void>;
  markJobAsFailed: (arg: {
    jobId: string;
    now?: Date;
    error: string;
  }) => Promise<void>;
};
//#endregion
//#region src/tasks/tasks.types.d.ts
type TaskOptions = {
  maxRetries?: number;
  retryBackoff?: 'linear' | 'exponential' | ((args: {
    attempt: number;
  }) => number);
};
type TaskDefinition<TData = JobData, TResult = JobResult> = {
  name: string;
  options?: TaskOptions;
  handler: (args: {
    data: TData;
    context: TaskContext;
  }) => Promise<TResult | undefined | void>;
};
type TaskContext = {
  workerId: string;
};
//# sourceMappingURL=tasks.types.d.ts.map
//#endregion
//#region src/queue.d.ts
declare function createQueue({
  driver,
  processingTimeoutMs,
  generateJobId
}: {
  driver: JobRepositoryDriver;
  processingTimeoutMs?: number;
  generateJobId?: () => string;
}): {
  registerTask: (taskDefinition: TaskDefinition) => void;
  scheduleJob({
    taskName,
    data,
    now,
    scheduleAt,
    maxRetries
  }: {
    taskName: string;
    data: JobData;
    scheduleAt?: Date;
    now?: Date;
    maxRetries?: number;
  }): Promise<void>;
  startWorker({
    workerId: _
  }: {
    workerId: string;
  }): void;
  stopWorker(): Promise<void>;
};
//# sourceMappingURL=queue.d.ts.map

//#endregion
export { Job, JobData, JobRepositoryDriver, JobStatus, createQueue };
//# sourceMappingURL=index.d.ts.map