123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 'use strict';
- const path = require('path');
- const assert = require('assert');
- const is = require('is-type-of');
- module.exports = app => {
- const dirs = app.loader.getLoadUnits().map(unit => path.join(unit.path, 'app/schedule'));
- dirs.push(...app.config.schedule.directory);
- const Loader = getScheduleLoader(app);
- const schedules = app.schedules = {};
- new Loader({
- directory: dirs,
- target: schedules,
- inject: app,
- }).load();
- return schedules;
- };
- function getScheduleLoader(app) {
- return class ScheduleLoader extends app.loader.FileLoader {
- load() {
- const target = this.options.target;
- const items = this.parse();
- for (const item of items) {
- const schedule = item.exports;
- const fullpath = item.fullpath;
- assert(schedule.schedule, `schedule(${fullpath}): must have schedule and task properties`);
- assert(is.class(schedule) || is.function(schedule.task), `schedule(${fullpath}: schedule.task should be function or schedule should be class`);
- let task;
- if (is.class(schedule)) {
- task = async (ctx, data) => {
- const s = new schedule(ctx);
- s.subscribe = app.toAsyncFunction(s.subscribe);
- return s.subscribe(data);
- };
- } else {
- task = app.toAsyncFunction(schedule.task);
- }
- const env = app.config.env;
- const envList = schedule.schedule.env;
- if (is.array(envList) && !envList.includes(env)) {
- app.coreLogger.info(`[egg-schedule]: ignore schedule ${fullpath} due to \`schedule.env\` not match`);
- continue;
- }
- // handle symlink case
- const realFullpath = require.resolve(fullpath);
- target[realFullpath] = {
- schedule: schedule.schedule,
- task,
- key: realFullpath,
- };
- }
- }
- };
- }
|