diff --git a/lib/decorators/activity.decorator.ts b/lib/decorators/activity.decorator.ts index 09d6239..16ea234 100644 --- a/lib/decorators/activity.decorator.ts +++ b/lib/decorators/activity.decorator.ts @@ -3,7 +3,7 @@ import { SetMetadata } from '@nestjs/common'; import { TEMPORAL_MODULE_ACTIVITY } from '../temporal.constants'; export interface ActivityOptions { - name?: string; + name?: string | ((instance: any) => string | Promise); } export function Activity(): MethodDecorator; diff --git a/lib/temporal.explorer.ts b/lib/temporal.explorer.ts index 9811209..2753c72 100644 --- a/lib/temporal.explorer.ts +++ b/lib/temporal.explorer.ts @@ -23,11 +23,11 @@ import { TEMPORAL_WORKER_CONFIG, } from './temporal.constants'; import { TemporalMetadataAccessor } from './temporal-metadata.accessors'; +import { ActivityOptions } from './decorators'; @Injectable() export class TemporalExplorer - implements OnModuleInit, OnModuleDestroy, OnApplicationBootstrap -{ + implements OnModuleInit, OnModuleDestroy, OnApplicationBootstrap { private readonly logger = new Logger(TemporalExplorer.name); private readonly injector = new Injector(); private worker: Worker; @@ -38,7 +38,7 @@ export class TemporalExplorer private readonly discoveryService: DiscoveryService, private readonly metadataAccessor: TemporalMetadataAccessor, private readonly metadataScanner: MetadataScanner, - ) {} + ) { } clearInterval() { this.timerId && clearInterval(this.timerId); @@ -128,7 +128,7 @@ export class TemporalExplorer ), ); - activities.forEach((wrapper: InstanceWrapper) => { + const activitiesLoader = activities.flatMap((wrapper: InstanceWrapper) => { const { instance, metatype } = wrapper; const isRequestScoped = !wrapper.isDependencyTreeStatic(); @@ -137,25 +137,39 @@ export class TemporalExplorer instance.constructor || metatype, ); - this.metadataScanner.scanFromPrototype( + return this.metadataScanner.scanFromPrototype( instance, Object.getPrototypeOf(instance), async (key: string) => { if (this.metadataAccessor.isActivity(instance[key])) { - const metadata = this.metadataAccessor.getActivity(instance[key]); - - const args: unknown[] = [metadata?.name]; + const metadata = this.metadataAccessor.getActivity(instance[key]) as ActivityOptions; + + let activityName = key; + if (metadata?.name) { + if (typeof metadata.name === 'string') { + activityName = metadata.name + } + else { + const activityNameResult = metadata.name(instance); + if (typeof activityNameResult === 'string') { + activityName = activityNameResult + } + else { + activityName = await activityNameResult; + } + } + } if (isRequestScoped) { // TODO: handle request scoped } else { - activitiesMethod[key] = instance[key].bind(instance); + activitiesMethod[activityName] = instance[key].bind(instance); } } }, ); }); - + await Promise.all(activitiesLoader); return activitiesMethod; } }