UNPKG

n8n

Version:

n8n Workflow Automation Tool

172 lines 8.08 kB
"use strict"; 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 __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.LogStreamingDestinationService = void 0; const backend_common_1 = require("@n8n/backend-common"); const decorators_1 = require("@n8n/decorators"); const di_1 = require("@n8n/di"); const event_message_generic_1 = require("../../eventbus/event-message-classes/event-message-generic"); const message_event_bus_1 = require("../../eventbus/message-event-bus/message-event-bus"); const publisher_service_1 = require("../../scaling/pubsub/publisher.service"); const event_destination_repository_1 = require("./database/repositories/event-destination.repository"); const message_event_bus_destination_from_db_1 = require("./destinations/message-event-bus-destination-from-db"); let LogStreamingDestinationService = class LogStreamingDestinationService { constructor(logger, eventDestinationsRepository, eventBus, publisher) { this.logger = logger; this.eventDestinationsRepository = eventDestinationsRepository; this.eventBus = eventBus; this.publisher = publisher; this.destinations = {}; this.isListening = false; this.messageHandler = this.handleMessage.bind(this); } async loadDestinationsFromDb() { const savedEventDestinations = await this.eventDestinationsRepository.find({}); if (savedEventDestinations.length > 0) { for (const destinationData of savedEventDestinations) { try { const destination = (0, message_event_bus_destination_from_db_1.messageEventBusDestinationFromDb)(this.eventBus, destinationData); if (destination) { this.destinations[destination.getId()] = destination; this.logger.debug(`Loaded destination ${destination.getId()} from database`); } } catch (error) { this.logger.debug('Failed to load destination from database', { error }); } } } } async saveDestinationToDb(destination) { const data = { id: destination.getId(), destination: destination.serialize(), }; const dbResult = await this.eventDestinationsRepository.upsert(data, { skipUpdateIfNoValuesChanged: true, conflictPaths: ['id'], }); return dbResult; } async deleteDestinationFromDb(id) { return await this.eventDestinationsRepository.delete({ id }); } async addDestination(destination, notifyInstances = true) { await this.destinations[destination.getId()]?.close(); this.destinations[destination.getId()] = destination; this.logger.debug(`Added destination ${destination.getId()}`); await this.saveDestinationToDb(destination); if (notifyInstances) { void this.publisher.publishCommand({ command: 'restart-event-bus' }); } return destination; } async removeDestination(id, notifyInstances = true) { if (this.destinations[id]) { await this.destinations[id].close(); delete this.destinations[id]; this.logger.debug(`Removed destination ${id}`); } if (notifyInstances) { void this.publisher.publishCommand({ command: 'restart-event-bus' }); } return await this.deleteDestinationFromDb(id); } async initialize() { if (this.isListening) { return; } this.logger.debug('Initializing log streaming destination service...'); this.eventBus.on('message', this.messageHandler); this.isListening = true; this.logger.debug(`Log streaming destination service initialized with ${Object.keys(this.destinations).length} destinations`); } async handleMessage(msg, confirmCallback) { if (!this.shouldSendMsg(msg)) { confirmCallback(msg, { id: '0', name: 'eventBus' }); return; } for (const destination of Object.values(this.destinations)) { if (destination.hasSubscribedToEvent(msg)) { try { await destination.sendMessage({ msg, confirmCallback }); } catch (error) { this.logger.error(`Failed to send message to destination ${destination.getId()}`, { error, }); } } } } async findDestination(id) { const result = id ? this.destinations[id] ? [this.destinations[id].serialize()] : [] : Object.values(this.destinations).map((dest) => dest.serialize()); return result.sort((a, b) => (a.__type ?? '').localeCompare(b.__type ?? '')); } async testDestination(destinationId) { const msg = new event_message_generic_1.EventMessageGeneric({ eventName: event_message_generic_1.eventMessageGenericDestinationTestEvent, }); const destination = await this.findDestination(destinationId); if (destination.length > 0) { const sendResult = await this.destinations[destinationId].receiveFromEventBus({ msg, confirmCallback: () => this.eventBus.confirmMessageDelivered(msg, { id: '0', name: 'eventBus' }), }); return sendResult; } return false; } hasAnyDestinationSubscribedToEvent(msg) { return Object.values(this.destinations).some((destination) => destination.hasSubscribedToEvent(msg)); } shouldSendMsg(msg) { return (Object.keys(this.destinations).length > 0 && this.hasAnyDestinationSubscribedToEvent(msg)); } async close() { this.logger.debug('Closing log streaming destination service...'); if (this.isListening) { this.eventBus.removeListener('message', this.messageHandler); this.isListening = false; } for (const destination of Object.values(this.destinations)) { this.logger.debug(`Closing destination ${destination.getId()}...`); await destination.close(); } this.destinations = {}; this.logger.debug('Log streaming destination service closed'); } async restart() { this.logger.debug('Restarting log streaming destination service...'); await this.close(); await this.loadDestinationsFromDb(); await this.initialize(); } }; exports.LogStreamingDestinationService = LogStreamingDestinationService; __decorate([ (0, decorators_1.OnPubSubEvent)('restart-event-bus'), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], LogStreamingDestinationService.prototype, "restart", null); exports.LogStreamingDestinationService = LogStreamingDestinationService = __decorate([ (0, di_1.Service)(), __metadata("design:paramtypes", [backend_common_1.Logger, event_destination_repository_1.EventDestinationsRepository, message_event_bus_1.MessageEventBus, publisher_service_1.Publisher]) ], LogStreamingDestinationService); //# sourceMappingURL=log-streaming-destination.service.js.map