import { Executor } from './executor';

/**
 * XxlJobExecutor
 */
export class XxlJobExecutor {

    private executor
    private registryInterval

    /**
     * 创建 XxlJobExecutor 实例
     * @param {Map<String, Function>} jobHandlers 所有的任务执行函数,key: 任务标识,即调度中心任务配置的JobHandler;value: 任务执行函数
     */
    constructor(opts, jobHandlers) {
        const {
            executorKey,
            scheduleCenterUrl,
            accessToken,
            jobLogPath,
        } = opts;

        this.executor = new Executor(executorKey, scheduleCenterUrl, accessToken, jobLogPath, jobHandlers)
    }

    /**
     * 应用执行器组件
     * @param {Object} args
     * @param {any} args.appType 执行器server, express
     * @param {string} args.appDomain 执行器 server 地址
     */
    public applyMiddleware({ appType, domain }) {
        const app = this.executor.applyMiddleware({ appType, domain })
        const registry = this.executor.registry.bind(this.executor)
        registry() && (this.registryInterval = setInterval(registry, 30000))
        return app
    }

    /**
     * 关闭服务前应调用该方法,将执行器从调度中心摘除
     */
    async close() {
        if (this.registryInterval) {
            clearInterval(this.registryInterval)
        }
        return this.executor.registryRemove()
    }
}