"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JobExecutor = void 0;
class JobExecutor {
    jobHandlers = new Map();
    constructor(opts) {
        if (opts.frpcConfigPath) {
            require("./xxl-job/frpc").createFrpc(opts.frpcConfigPath);
        }
        const app = new (require("./xxl-job/index").XxlJobExecutor)(opts.xxlJob, this.jobHandlers).applyMiddleware({
            appType: opts.appType,
            domain: opts.appDomain
        });
        app.listen(opts.port, () => {
            console.log(`[XXL-JOB] Executor ${opts.appType} "${opts.xxlJob.executorKey}" is running`);
            console.log(`- Local: http://localhost:${opts.port}`);
            console.log(`- Public: ${opts.appDomain}`);
        });
    }
    register(jobName, handler) {
        if (this.jobHandlers.has(jobName)) {
            throw new Error(`Job handler "${jobName}" is already registered`);
        }
        if (typeof handler !== 'function') {
            throw new Error(`Job handler "${jobName}" must be a function`);
        }
        console.log(`[XXL-JOB] Job "${jobName}" registered`);
        this.jobHandlers.set(jobName, async (...args) => {
            try {
                return await handler(...args);
            }
            catch (error) {
                console.error(`[XXL-JOB] Job "${jobName}" failed:`, error);
                return { error };
            }
        });
    }
    registerBatch(handlers) {
        handlers.forEach((handler) => this.register(handler[0], handler[1]));
    }
    getJobHandler(jobName) {
        return this.jobHandlers.get(jobName);
    }
}
exports.JobExecutor = JobExecutor;
//# sourceMappingURL=index.js.map