@russ-b/nestjs-common-tools
Version:
NestJS utility tools
73 lines • 3.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseClientGrpcProxy = void 0;
const microservices_1 = require("@nestjs/microservices");
const rxjs_1 = require("rxjs");
const transformers_1 = require("../transformers");
class BaseClientGrpcProxy extends microservices_1.ClientGrpcProxy {
getService(name) {
const service = super.getService(name);
const packageDefinition = this.getClient(name);
const methodFields = packageDefinition[name];
return new Proxy(service, {
get: (target, prop) => {
if (typeof target[prop] !== 'function') {
return target[prop];
}
return (...args) => {
const methodName = this.getMethodName(target, prop);
const fields = this.getMethodFields(methodFields, methodName);
if (args.length > 0 && args[0] && typeof args[0] === 'object') {
const dto = args[0];
const structFields = Reflect.getMetadata('IS_GRPC_STRUCT_KEY', dto.constructor?.prototype) || [];
if (structFields.length) {
const modified = { ...dto };
structFields.forEach((field) => {
if (modified[field]) {
modified[field] = transformers_1.StructTransformer.toObject(modified[field]);
}
});
args[0] = modified;
}
}
return target[prop].apply(target, args).pipe((0, rxjs_1.map)((response) => {
const structFields = fields.response
.filter((field) => field.typeName === 'google.protobuf.Struct')
.map((f) => f.name) || [];
if (structFields.length) {
structFields.forEach((field) => {
response[field] = transformers_1.StructTransformer.toObject(response[field]);
});
}
return response;
}));
};
},
});
}
getMethodName(target, prop) {
const methodName = Object.keys(target).find((key) => key.toLowerCase() === prop.toLowerCase() && key !== prop);
if (!methodName) {
throw new Error(`Undefined methodName ${prop}`);
}
return methodName;
}
getMethodFields(service, methodName) {
const method = service?.[methodName];
return {
request: method.requestType.type?.field,
response: method.responseType.type?.field,
};
}
serializeError(err) {
if (typeof err === 'string') {
return new microservices_1.RpcException(err);
}
if (err && typeof err === 'object') {
return new microservices_1.RpcException(err);
}
return new microservices_1.RpcException('Unknown error occurred');
}
}
exports.BaseClientGrpcProxy = BaseClientGrpcProxy;
//# sourceMappingURL=base-client-grpc.proxy.js.map