UNPKG

@just-in/core

Version:

A TypeScript-first framework for building adaptive digital health interventions.

89 lines 4.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getDecisionRuleByName = exports.registerDecisionRule = void 0; exports.executeDecisionRule = executeDecisionRule; const handler_type_1 = require("./handler.type"); const logger_manager_1 = require("../logger/logger-manager"); const steps_helpers_1 = require("./steps.helpers"); const result_recorder_1 = require("./result-recorder"); const decisionRules = new Map(); /** * Registers a DecisionRule by adding it to the `decisionRules` map. * Sets the `type` property to `DECISION_RULE`. * * @param {DecisionRuleRegistration} rule - The decision rule to register. * @returns {void} * * @example * registerDecisionRule({ name: "checkWeather", shouldDecide: ..., decide: ..., doAction: ... }); * // Logs: "Decision rule 'checkWeather' registered successfully." */ const registerDecisionRule = (rule) => { decisionRules.set(rule.name, { ...rule, type: handler_type_1.HandlerType.DECISION_RULE }); logger_manager_1.Log.info(`Decision rule "${rule.name}" registered successfully.`); }; exports.registerDecisionRule = registerDecisionRule; /** * Retrieves a DecisionRule by its name from the internal `decisionRules` map. * * @param {string} name - The name of the DecisionRule to retrieve. * @returns {DecisionRule | undefined} - The DecisionRule object if found, otherwise `undefined`. */ const getDecisionRuleByName = (name) => { return decisionRules.get(name); }; exports.getDecisionRuleByName = getDecisionRuleByName; /** * Executes a full DecisionRule workflow, including `shouldDecide`, `decide`, and `doAction` steps. * This ensures a complete decision-making process and records results for each step. * * @param {DecisionRule} rule - The decision rule to execute. * @param {JEvent} event - The event triggering the decision rule. * @param {JUser} user - The user for whom the decision rule is processed. * @returns {Promise<void>} - Resolves when all steps are complete. * * @example * const rule = getDecisionRuleByName("checkWeather"); * if (rule) await executeDecisionRule(rule, event, user); */ async function executeDecisionRule(rule, event, user) { const results = []; let decisionRuleExecutionStatus = "not activated"; try { logger_manager_1.Log.dev(`Starting decision rule "${rule.name}" for user "${user.id}" in event "${event.eventType}" with ID: ${event.id}.`); const shouldActivateResult = await (0, steps_helpers_1.executeStep)(handler_type_1.DecisionRuleStep.SHOULD_ACTIVATE, async () => Promise.resolve(rule.shouldActivate(user, event))); if (shouldActivateResult.result.status === 'success') { decisionRuleExecutionStatus = "activated"; results.push(shouldActivateResult); const selectionActionResult = await (0, steps_helpers_1.executeStep)(handler_type_1.DecisionRuleStep.SELECT_ACTION, async () => Promise.resolve(rule.selectAction(user, event, shouldActivateResult.result))); results.push(selectionActionResult); if (selectionActionResult.result.status === 'success') { const actionResult = await (0, steps_helpers_1.executeStep)(handler_type_1.DecisionRuleStep.DO_ACTION, async () => Promise.resolve(rule.doAction(user, event, selectionActionResult.result))); results.push(actionResult); } decisionRuleExecutionStatus = "finished"; } else { logger_manager_1.Log.dev(`Decision rule "${rule.name}" for user "${user.id}" in event "${event.eventType}" did not activate.`); } } catch (error) { decisionRuleExecutionStatus = "error"; logger_manager_1.Log.error(`Error processing decision rule "${rule.name}" for user "${user.id}" in event "${event.eventType}": ${error}`); results.push({ step: 'unknown', result: { status: 'error', error }, timestamp: new Date(), }); } finally { (0, result_recorder_1.handleDecisionRuleResult)({ event, name: rule.name, steps: results, user, }); logger_manager_1.Log.info(`Decision rule "${rule.name}" completed for user "${user.uniqueIdentifier}" in event "${event.eventType}": ${decisionRuleExecutionStatus}.`); } } //# sourceMappingURL=decision-rule.manager.js.map