@zerosuxx/opentelemetry-nestjs
Version:
OpenTelemetry module for Nestjs with auto instrumentation and resource detection. Initially forked from https://github.com/overbit/opentelemetry-nestjs.git
119 lines (96 loc) • 2.81 kB
text/typescript
import { Injectable } from '@nestjs/common/interfaces';
import {
isConstructor,
isFunction,
isNil,
} from '@nestjs/common/utils/shared.utils';
export class MetadataScanner {
private readonly cachedScannedPrototypes: Map<object, string[]> = new Map();
/**
* @deprecated
* @see {@link getAllMethodNames}
* @see getAllMethodNames
*/
public scanFromPrototype<T extends Injectable, R = any>(
instance: T,
prototype: object,
callback: (name: string) => R,
): R[] {
if (!prototype) {
return [];
}
const visitedNames = new Map<string, boolean>();
const result: R[] = [];
do {
for (const property of Object.getOwnPropertyNames(prototype)) {
if (visitedNames.has(property)) {
continue;
}
visitedNames.set(property, true);
// reason: https://github.com/nestjs/nest/pull/10821#issuecomment-1411916533
const descriptor = Object.getOwnPropertyDescriptor(prototype, property);
if (
descriptor.set ||
descriptor.get ||
isConstructor(property) ||
!isFunction(prototype[property])
) {
continue;
}
const value = callback(property);
if (isNil(value)) {
continue;
}
result.push(value);
}
} while (
(prototype = Reflect.getPrototypeOf(prototype)) &&
prototype !== Object.prototype
);
return result;
}
/**
* @deprecated
* @see {@link getAllMethodNames}
* @see getAllMethodNames
*/
public *getAllFilteredMethodNames(
prototype: object,
): IterableIterator<string> {
yield* this.getAllMethodNames(prototype);
}
public getAllMethodNames(prototype: object | null): string[] {
if (!prototype) {
return [];
}
if (this.cachedScannedPrototypes.has(prototype)) {
return this.cachedScannedPrototypes.get(prototype);
}
const visitedNames = new Map<string, boolean>();
const result: string[] = [];
this.cachedScannedPrototypes.set(prototype, result);
do {
for (const property of Object.getOwnPropertyNames(prototype)) {
if (visitedNames.has(property)) {
continue;
}
visitedNames.set(property, true);
// reason: https://github.com/nestjs/nest/pull/10821#issuecomment-1411916533
const descriptor = Object.getOwnPropertyDescriptor(prototype, property);
if (
descriptor.set ||
descriptor.get ||
isConstructor(property) ||
!isFunction(prototype[property])
) {
continue;
}
result.push(property);
}
} while (
(prototype = Reflect.getPrototypeOf(prototype)) &&
prototype !== Object.prototype
);
return result;
}
}