@nestjs/microservices
Version:
Nest - modern, fast, powerful node.js web framework (@microservices)
50 lines (49 loc) • 2.15 kB
JavaScript
import { CLIENT_CONFIGURATION_METADATA, CLIENT_METADATA, PATTERN_EXTRAS_METADATA, PATTERN_HANDLER_METADATA, PATTERN_METADATA, TRANSPORT_METADATA, } from './constants.js';
import { PatternHandler } from './enums/pattern-handler.enum.js';
import { isFunction, isUndefined, } from '@nestjs/common/internal';
export class ListenerMetadataExplorer {
metadataScanner;
constructor(metadataScanner) {
this.metadataScanner = metadataScanner;
}
explore(instance) {
const instancePrototype = Object.getPrototypeOf(instance);
return this.metadataScanner
.getAllMethodNames(instancePrototype)
.map(method => this.exploreMethodMetadata(instance, instancePrototype, method))
.filter(metadata => metadata);
}
exploreMethodMetadata(instance, instancePrototype, methodKey) {
const prototypeCallback = instancePrototype[methodKey];
const handlerType = Reflect.getMetadata(PATTERN_HANDLER_METADATA, prototypeCallback);
if (isUndefined(handlerType)) {
return;
}
const patterns = Reflect.getMetadata(PATTERN_METADATA, prototypeCallback);
const transport = Reflect.getMetadata(TRANSPORT_METADATA, prototypeCallback);
const extras = Reflect.getMetadata(PATTERN_EXTRAS_METADATA, prototypeCallback);
const targetCallback = instance[methodKey];
return {
methodKey,
targetCallback,
patterns,
transport,
extras,
isEventHandler: handlerType === PatternHandler.EVENT,
};
}
*scanForClientHooks(instance) {
for (const propertyKey in instance) {
if (isFunction(instance[propertyKey])) {
continue;
}
const property = String(propertyKey);
const isClient = Reflect.getMetadata(CLIENT_METADATA, instance, property);
if (isUndefined(isClient)) {
continue;
}
const metadata = Reflect.getMetadata(CLIENT_CONFIGURATION_METADATA, instance, property);
yield { property, metadata };
}
}
}