@niur/nestjs-service-bus
Version:
NestJS Azure Service Bus Microservice Transport
82 lines • 3.37 kB
JavaScript
;
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