@just-in/core
Version:
A TypeScript-first framework for building adaptive digital health interventions.
89 lines • 4.39 kB
JavaScript
;
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