Source: service/task.js

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * タスクサービス
 */
const createDebug = require("debug");
const factory = require("../factory");
const debug = createDebug('chevre-domain:service');
exports.ABORT_REPORT_SUBJECT = 'Task aborted !!!';
/**
 * execute a task by taskName
 * タスク名でタスクをひとつ実行する
 * @param taskName タスク名
 */
function executeByName(taskName) {
    return (settings) => __awaiter(this, void 0, void 0, function* () {
        // 未実行のタスクを取得
        let task = null;
        try {
            task = yield settings.taskRepo.executeOneByName(taskName);
            debug('task found', task);
        }
        catch (error) {
            debug('executeByName error:', error);
        }
        // タスクがなければ終了
        if (task !== null) {
            yield execute(task)(settings);
        }
    });
}
exports.executeByName = executeByName;
/**
 * execute a task
 * タスクを実行する
 * @param task タスクオブジェクト
 */
function execute(task) {
    debug('executing a task...', task);
    const now = new Date();
    return (settings) => __awaiter(this, void 0, void 0, function* () {
        try {
            // タスク名の関数が定義されていなければ、TypeErrorとなる
            const { call } = yield Promise.resolve().then(() => require(`./task/${task.name}`));
            yield call(task.data)(settings);
            const result = {
                executedAt: now,
                error: ''
            };
            yield settings.taskRepo.pushExecutionResultById(task.id, factory.taskStatus.Executed, result);
        }
        catch (error) {
            // 実行結果追加
            const result = {
                executedAt: now,
                error: error.stack
            };
            // 失敗してもここではステータスを戻さない(Runningのまま待機)
            yield settings.taskRepo.pushExecutionResultById(task.id, task.status, result);
        }
    });
}
exports.execute = execute;
/**
 * retry tasks in running status
 * 実行中ステータスのままになっているタスクをリトライする
 * @param intervalInMinutes 最終トライ日時から何分経過したタスクをリトライするか
 */
function retry(intervalInMinutes) {
    return (repos) => __awaiter(this, void 0, void 0, function* () {
        yield repos.task.retry(intervalInMinutes);
    });
}
exports.retry = retry;
/**
 * abort a task
 * トライ可能回数が0に達したタスクを実行中止する
 * @param intervalInMinutes 最終トライ日時から何分経過したタスクを中止するか
 */
function abort(intervalInMinutes) {
    return (repos) => __awaiter(this, void 0, void 0, function* () {
        const abortedTask = yield repos.task.abortOne(intervalInMinutes);
        debug('abortedTask found', abortedTask);
        // 開発者へ報告
        const lastResult = (abortedTask.executionResults.length > 0) ?
            abortedTask.executionResults[abortedTask.executionResults.length - 1].error :
            // tslint:disable-next-line:no-single-line-block-comment
            /* istanbul ignore next */
            '';
        debug('reporting...', lastResult);
        //         await NotificationService.report2developers(
        //             ABORT_REPORT_SUBJECT,
        //             `id:${abortedTask.id}
        // name:${abortedTask.name}
        // runsAt:${moment(abortedTask.runsAt).toISOString()}
        // lastTriedAt:${moment(<Date>abortedTask.lastTriedAt).toISOString()}
        // numberOfTried:${abortedTask.numberOfTried}
        // lastResult:${lastResult}`
        //         )();
    });
}
exports.abort = abort;