UNPKG

@chevre/domain

Version:

Chevre Domain Library for Node.js

114 lines (113 loc) 4.46 kB
"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); if (abortedTask === null) { return; } 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;