nestjs-temporal-core
Version:
Complete NestJS integration for Temporal.io with auto-discovery, declarative scheduling, enhanced monitoring, and enterprise-ready features
110 lines • 5.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActivityMethod = exports.Activity = void 0;
const constants_1 = require("../constants");
const logger_1 = require("../utils/logger");
const logger = (0, logger_1.createLogger)('ActivityDecorators');
const Activity = (options) => {
return (target) => {
const targetClass = target;
const activityName = options?.name || targetClass.name;
logger.debug(`@Activity decorator applied to class: ${targetClass.name}`);
logger.debug(`Activity name: ${activityName}`);
logger.debug(`Activity options: ${JSON.stringify(options)}`);
const metadata = {
name: activityName,
className: targetClass.name,
...options,
};
logger.debug(`Storing activity metadata for ${targetClass.name}: ${JSON.stringify(metadata)}`);
try {
Reflect.defineMetadata(constants_1.TEMPORAL_ACTIVITY, metadata, targetClass);
logger.debug(`Stored activity metadata on class constructor: ${targetClass.name}`);
Reflect.defineMetadata(constants_1.TEMPORAL_ACTIVITY, metadata, targetClass.prototype);
logger.debug(`Stored activity metadata on class prototype: ${targetClass.name}`);
logger.debug(`@Activity decorator successfully applied to ${targetClass.name}`);
}
catch (error) {
logger.error(`Failed to apply @Activity decorator to ${targetClass.name}:`, error);
throw error;
}
return target;
};
};
exports.Activity = Activity;
const ActivityMethod = (nameOrOptions) => {
return (target, propertyKey, descriptor) => {
const className = target.constructor.name;
const methodName = propertyKey.toString();
logger.debug(`@ActivityMethod decorator applied to method: ${className}.${methodName}`);
logger.debug(`ActivityMethod nameOrOptions: ${JSON.stringify(nameOrOptions)}`);
let activityName;
let methodOptions = {};
if (typeof nameOrOptions === 'string') {
activityName = nameOrOptions;
methodOptions = { name: activityName };
logger.debug(`Using provided string name: ${activityName}`);
}
else if (nameOrOptions &&
typeof nameOrOptions.name === 'string' &&
nameOrOptions.name.trim().length > 0) {
activityName = nameOrOptions.name;
methodOptions = { ...nameOrOptions };
logger.debug(`Using name from options object: ${activityName}`);
}
else if (nameOrOptions && nameOrOptions.name === '') {
activityName = '';
methodOptions = { ...nameOrOptions };
logger.debug(`Explicit empty name provided`);
}
else if (nameOrOptions && !nameOrOptions.name) {
activityName = methodName;
methodOptions = { name: activityName, ...nameOrOptions };
logger.debug(`Using method name as activity name: ${activityName}`);
}
else {
activityName = methodName;
methodOptions = { name: activityName };
logger.debug(`Auto-generated activity name from method name: ${activityName}`);
}
if (!activityName || activityName.trim().length === 0) {
const error = 'Activity name cannot be empty';
logger.error(`@ActivityMethod validation failed for ${className}.${methodName}: ${error}`);
throw new Error(error);
}
logger.verbose(`Activity name resolved to: "${activityName}" for method ${className}.${methodName}`);
const metadata = {
name: activityName,
methodName,
className,
...methodOptions,
};
logger.debug(`Final activity metadata for ${className}.${methodName}: ${JSON.stringify(metadata)}`);
try {
if (descriptor?.value && typeof descriptor.value === 'function') {
logger.debug(`Storing @ActivityMethod metadata on method function: ${className}.${methodName}`);
Reflect.defineMetadata(constants_1.TEMPORAL_ACTIVITY_METHOD, metadata, descriptor.value);
logger.debug(`Stored activity method metadata on method function: ${className}.${methodName}`);
const activityMethods = Reflect.getMetadata(constants_1.TEMPORAL_ACTIVITY_METHOD, target.constructor.prototype) ||
{};
activityMethods[methodName] = metadata;
Reflect.defineMetadata(constants_1.TEMPORAL_ACTIVITY_METHOD, activityMethods, target.constructor.prototype);
logger.debug(`Stored activity method metadata on class prototype: ${className}`);
logger.debug(`Total activity methods on ${className}: ${Object.keys(activityMethods).length}`);
logger.debug(`@ActivityMethod decorator successfully applied to ${className}.${methodName}`);
return descriptor;
}
else {
logger.debug(`Handling property-style decorator for ${className}.${methodName}`);
Reflect.defineMetadata(constants_1.TEMPORAL_ACTIVITY_METHOD, metadata, target, propertyKey);
logger.debug(`Stored activity method metadata on property: ${className}.${methodName}`);
}
}
catch (error) {
logger.error(`Failed to apply @ActivityMethod decorator to ${className}.${methodName}:`, error);
throw error;
}
};
};
exports.ActivityMethod = ActivityMethod;
//# sourceMappingURL=activity.decorator.js.map