1.0.5 • Published 2 years ago

@knawat/advanced-client-module v1.0.5

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Advanced NestJS Client Proxy Module

Sample usages

First import the package:

import { AdvancedClientModule } from "@knawat/advanced-client-module";

Registration:

    AdvancedClientModule.register({
        transport: 'TCP',
        options: {
          url: 'http://localhost:8080',
        },
    }),

Replace all MessagePattern with MessagePatternExtended and EventPattern with EventPatternExtended decorators to add NAMESPACE in calls.

Now for replacing the new Extended decorators with valid replacement and because we can not alter Reflect.metaData over the Controller class from the npm package we have to do it manually.

First you need to create a service to process decorators like this:

import { Injectable } from '@nestjs/common';
import { EventPattern, MessagePattern } from '@nestjs/microservices';
import {
  EVENT_PATTERN_EXTENDED,
  MESSAGE_PATTERN_EXTENDED,
} from '@knawat/advanced-client-module';

@Injectable()
export class AdvancedClientDecoratorProcessorService {
  processCustomDecorators(namespace: string, types: any[]) {
    for (const type of types) {
      const propNames = Object.getOwnPropertyNames(type.prototype);
      for (const prop of propNames) {
        const propValue = Reflect.getMetadata(
          MESSAGE_PATTERN_EXTENDED,
          Reflect.get(type.prototype, prop),
        );
        if (propValue) {
          propValue.cmd = `${namespace}-${propValue.cmd}`;
          propValue.role = `${namespace}-${propValue.role}`;
          Reflect.decorate(
            [MessagePattern(propValue)],
            type.prototype,
            prop,
            Reflect.getOwnPropertyDescriptor(type.prototype, prop),
          );
        }
        let eventValue = Reflect.getMetadata(
          EVENT_PATTERN_EXTENDED,
          Reflect.get(type.prototype, prop),
        );
        if (eventValue) {
          eventValue = `${namespace}-${eventValue}`;
          Reflect.decorate(
            [EventPattern(eventValue)],
            type.prototype,
            prop,
            Reflect.getOwnPropertyDescriptor(type.prototype, prop),
          );
        }
      }
    }
  }
}

Now add the processor to the main.ts as below:

  app
    .get(AdvancedClientDecoratorProcessorService)
    .processCustomDecorators(process.env.NAMESPACE, [...CONTROLLERS-WITH-EXTENDED-DECORATORS]);

In order to use microservice client you need to inject the SERVICE_CLIENT class:

  constructor(
    @Inject(SERVICE_CLIENT)
    private readonly client: ClientProxy,
  ) {}