@knawat/advanced-client-module
TypeScript icon, indicating that this package has built-in type declarations

1.0.5 • Public • Published

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,
  ) {}

Readme

Keywords

none

Package Sidebar

Install

npm i @knawat/advanced-client-module

Weekly Downloads

3

Version

1.0.5

License

MIT

Unpacked Size

32.3 kB

Total Files

47

Last publish

Collaborators

  • hazemkhaled
  • abdelrahman3d
  • greetly