@haku-sci/utils
Version:
utils from haku-sci. Library only
93 lines • 4.77 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var TCPService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TCPService = void 0;
const microservices_1 = require("@nestjs/microservices");
const rxjs_1 = require("rxjs");
const utils = require("../utils");
const consul_1 = require("../microservice/consul");
const common_1 = require("@nestjs/common");
const exceptionFilter_1 = require("../microservice/exceptionFilter");
const constants_1 = require("@nestjs/microservices/constants");
const constants_2 = require("@nestjs/common/constants");
const nestjs_discovery_1 = require("@golevelup/nestjs-discovery");
let TCPService = TCPService_1 = class TCPService {
static async sendMessage(service, action, resource, payload) {
const client = await microservices_1.ClientProxyFactory.create({
transport: microservices_1.Transport.TCP,
options: await consul_1.Consul.getServiceURI(service),
});
try {
payload.sender = await utils.microServiceName();
let response$ = await client.send([resource, action].join("/"), payload).pipe((0, rxjs_1.catchError)(err => {
const status = err?.status || common_1.HttpStatus.BAD_REQUEST;
const payload = {
...(typeof err === 'object' ? err : { message: err }),
service,
};
return (0, rxjs_1.throwError)(() => new common_1.HttpException(payload, status));
}));
const watchdogTimeout = parseInt(process.env.WATCHDOG);
if (!isNaN(watchdogTimeout) && watchdogTimeout > 0)
response$ = response$.pipe((0, rxjs_1.timeout)({ first: watchdogTimeout }));
response$ = response$.pipe((0, rxjs_1.defaultIfEmpty)(null));
const result = await (0, rxjs_1.lastValueFrom)(response$);
if (result?.error)
(0, rxjs_1.throwError)(() => new Error(`[${service}] ${result.message}`));
return result;
}
finally {
try {
await client.close();
}
catch (closeError) {
console.error("Error closing client:", closeError.message);
}
}
}
static async registerHakuSciMessageHandlers(app, logger) {
const moduleRef = app.select(nestjs_discovery_1.DiscoveryModule);
const discoveryService = moduleRef.get(nestjs_discovery_1.DiscoveryService, { strict: false });
const controllers = await discoveryService.controllers(() => true);
for (const { instance } of controllers) {
const resource = Reflect.getMetadata(constants_2.PATH_METADATA, instance.constructor).replace("/", "");
const prototype = Object.getPrototypeOf(instance);
for (const propertyName of Object.getOwnPropertyNames(prototype)) {
const method = prototype[propertyName];
if (propertyName === 'constructor' || typeof method !== 'function')
continue;
const action = Reflect.getMetadata(constants_1.PATTERN_METADATA, method)?.[0];
if (action) {
const handler = TCPService_1.wrapHandler(instance, propertyName, logger);
app.serverInstance.addHandler([resource, action].join("/"), handler, false);
}
}
}
logger.log("HakuSci Message Handlers initialized");
}
static wrapHandler(instance, methodName, logger) {
return async function boundHandler(data, context) {
try {
return await instance[methodName].call(instance, data);
}
catch (err) {
const host = {
switchToRpc: () => ({ getContext: () => context }),
getArgByIndex: (i) => (i === 0 ? data : context),
};
return new exceptionFilter_1.AllExceptionsFilter(logger).catch(err, host);
}
};
}
};
exports.TCPService = TCPService;
exports.TCPService = TCPService = TCPService_1 = __decorate([
(0, common_1.Injectable)()
], TCPService);
//# sourceMappingURL=tcp.service.js.map