UNPKG

@niur/nestjs-service-bus

Version:

NestJS Azure Service Bus Microservice Transport

82 lines 3.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AzureServiceBusServer = void 0; const microservices_1 = require("@nestjs/microservices"); const service_bus_1 = require("@azure/service-bus"); const azure_service_bus_context_1 = require("../azure-service-bus.context"); class AzureServiceBusServer extends microservices_1.Server { constructor(options) { super(); this.options = options; this.createMessageHandlers = (pattern) => ({ processMessage: async (receivedMessage) => await this.handleMessage(receivedMessage, pattern), processError: async (args) => { return new Promise(() => { console.error(`Error processing message: ${args.error}`); }); }, }); this.initializeSerializer(options); this.initializeDeserializer(options); } async listen(callback) { try { this.sbClient = this.createServiceBusClient(); await this.start(callback); } catch (err) { callback(err); } } async start(callback) { await this.bindEvents(); callback(); } async bindEvents() { const subscribe = async (pattern) => { const { metaOptions: { topic, subscription: name, subQueueType, skipParsingBodyAsJson, receiveMode, options, }, } = JSON.parse(pattern); const receiver = this.sbClient.createReceiver(topic, name, { receiveMode, subQueueType, skipParsingBodyAsJson, }); receiver.subscribe(this.createMessageHandlers(pattern), options); await receiver.close(); }; const registeredPatterns = [...this.messageHandlers.keys()]; await Promise.all(registeredPatterns.map(subscribe)); } async handleMessage(receivedMessage, pattern) { const partialPacket = { data: receivedMessage, pattern }; const packet = await this.deserializer.deserialize(partialPacket); if (!receivedMessage.replyTo) { const sbContext = new azure_service_bus_context_1.AzureServiceBusContext([]); return this.handleEvent(packet.pattern, packet, sbContext); } const publish = this.getPublisher(receivedMessage.replyTo, receivedMessage.messageId); const handler = this.getHandlerByPattern(pattern); const response$ = this.transformToObservable(await handler(receivedMessage)); response$ && this.send(response$, publish); } getPublisher(replyTo, correlationId) { return async (data) => { const sender = this.sbClient.createSender(replyTo); const responseMessage = { correlationId, body: data.response, }; await sender.sendMessages([responseMessage]); await sender.close(); }; } createServiceBusClient() { const { connectionString, options } = this.options; return new service_bus_1.ServiceBusClient(connectionString, options); } async close() { var _a; await ((_a = this.sbClient) === null || _a === void 0 ? void 0 : _a.close()); } } exports.AzureServiceBusServer = AzureServiceBusServer; //# sourceMappingURL=azure-service-bus.server.js.map