@knawat/advanced-client-module
v1.0.5
Published
This is a Client Proxy providing module.
Downloads
6
Readme
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,
) {}