import { EventEmitter } from 'events';
import type { Connection } from 'mongoose';
import type { RedisClientType } from 'redis';
import * as factory from '../factory';
interface IExecuteSettings {
    /**
     * MongoDBコネクション
     */
    connection: Connection;
    /**
     * Redisクライアント
     */
    redisClient?: RedisClientType;
}
type IOperationExecute<T> = (settings: IExecuteSettings) => Promise<T>;
type INextFunction = (task: Pick<factory.task.ITask<factory.taskName>, 'id'>) => IOperationExecute<void>;
interface IReadyTask {
    id: string;
    name?: factory.taskName;
    status: factory.taskStatus.Ready;
    expires?: Date;
    executionResult?: never;
}
interface IRunningTask {
    id: string;
    status: factory.taskStatus.Running;
    name?: never;
    expires?: never;
    executionResult?: never;
}
interface IExecutedTask {
    id: string;
    status: factory.taskStatus;
    executionResult: factory.task.IExecutionResult;
    name?: never;
    expires?: never;
}
type IChangedTask = IReadyTask | IRunningTask | IExecutedTask;
type IOnTaskStatusChangedListener = (task: IChangedTask, next?: INextFunction) => void;
/**
 * タスクイベントエミッター
 */
declare class TaskEventEmitter extends EventEmitter {
    onTaskStatusChanged(listener: IOnTaskStatusChangedListener): void;
    emitTaskStatusChanged(task: IChangedTask, next?: INextFunction): void;
}
declare const taskEventEmitter: TaskEventEmitter;
export { IChangedTask, IReadyTask, IRunningTask, IExecutedTask, IExecuteSettings, INextFunction, IOnTaskStatusChangedListener, taskEventEmitter };
