UNPKG

@sotatech/nest-quickfix

Version:

A powerful NestJS implementation of the FIX (Financial Information eXchange) protocol. Provides high-performance, reliable messaging for financial trading applications with built-in session management, message validation, and recovery mechanisms.

231 lines 9.46 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); }; var FIXModule_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.FIXModule = void 0; const common_1 = require("@nestjs/common"); const core_1 = require("@nestjs/core"); const acceptor_1 = require("./acceptor/acceptor"); const constants_1 = require("./constants"); const initiator_1 = require("./initiator/initiator"); const manager_1 = require("./protocol/manager"); const fix_metadata_explorer_1 = require("./services/fix.metadata.explorer"); const fix_service_1 = require("./services/fix.service"); const room_manager_1 = require("./services/room.manager"); const session_manager_1 = require("./session/session.manager"); const COMMON_PROVIDERS = [ fix_metadata_explorer_1.FixMetadataExplorer, fix_service_1.FixService, room_manager_1.RoomManager, session_manager_1.SessionManager, { provide: constants_1.MAX_SESSIONS, useValue: constants_1.DEFAULT_MAX_SESSIONS }, ]; const COMMON_EXPORTS = [ acceptor_1.FIXAcceptor, initiator_1.FIXInitiator, fix_service_1.FixService, room_manager_1.RoomManager, session_manager_1.SessionManager, ]; const createAcceptor = (config, discoveryService, metadataScanner, roomManager, sessionManager) => { return config.application.type === constants_1.APP_TYPE.ACCEPTOR ? new acceptor_1.FIXAcceptor(config, discoveryService, metadataScanner, roomManager, sessionManager) : null; }; const createInitiator = (config, roomManager) => { return config.application.type === constants_1.APP_TYPE.INITIATOR ? new initiator_1.FIXInitiator(config, roomManager) : null; }; class ConfigStorage { constructor() { this.configs = {}; } storeAcceptorConfig(config, providers) { this.configs.acceptorConfig = config; this.configs.providers = providers; } storeInitiatorConfig(config, roomManager) { this.configs.initiatorConfig = config; if (!this.configs.providers) this.configs.providers = {}; this.configs.providers.roomManager = roomManager; } getConfigs() { return this.configs; } clear() { this.configs = {}; } } let FIXModule = FIXModule_1 = class FIXModule { constructor(metadataExplorer, configStorage) { this.metadataExplorer = metadataExplorer; this.configStorage = configStorage; this.fixAcceptor = null; this.fixInitiator = null; this.logger = new common_1.Logger(FIXModule_1.name); } static register(options) { const acceptorConfig = { ...options.config, auth: options?.auth, session: options?.session, }; return { module: FIXModule_1, imports: [core_1.DiscoveryModule], providers: [ { provide: constants_1.FIX_OPTIONS, useValue: options }, ...COMMON_PROVIDERS, manager_1.ProtocolManager, ConfigStorage, { provide: acceptor_1.FIXAcceptor, useFactory: (discoveryService, metadataScanner, roomManager, sessionManager, configStorage) => { configStorage.storeAcceptorConfig(acceptorConfig, { config: acceptorConfig, discoveryService, metadataScanner, roomManager, sessionManager, }); return null; }, inject: [ constants_1.DISCOVERY_SERVICE, constants_1.METADATA_SCANNER, room_manager_1.RoomManager, session_manager_1.SessionManager, ConfigStorage, ], }, { provide: initiator_1.FIXInitiator, useFactory: (roomManager, configStorage) => { configStorage.storeInitiatorConfig(options.config, roomManager); return null; }, inject: [room_manager_1.RoomManager, ConfigStorage], }, ], exports: COMMON_EXPORTS, }; } static registerAsync(options) { return { module: FIXModule_1, imports: [core_1.DiscoveryModule], providers: [ { provide: constants_1.FIX_OPTIONS, useFactory: options.useFactory, inject: options.inject || [], }, ...COMMON_PROVIDERS, manager_1.ProtocolManager, ConfigStorage, { provide: acceptor_1.FIXAcceptor, useFactory: async (discoveryService, metadataScanner, roomManager, sessionManager, fixOptions, configStorage) => { const acceptorConfig = { ...fixOptions.config, auth: fixOptions?.auth, session: fixOptions?.session, }; configStorage.storeAcceptorConfig(acceptorConfig, { config: acceptorConfig, discoveryService, metadataScanner, roomManager, sessionManager, }); return null; }, inject: [ constants_1.DISCOVERY_SERVICE, constants_1.METADATA_SCANNER, room_manager_1.RoomManager, session_manager_1.SessionManager, constants_1.FIX_OPTIONS, ConfigStorage, ], }, { provide: initiator_1.FIXInitiator, useFactory: async (roomManager, fixOptions, configStorage) => { configStorage.storeInitiatorConfig(fixOptions.config, roomManager); return null; }, inject: [room_manager_1.RoomManager, constants_1.FIX_OPTIONS, ConfigStorage], }, ], exports: COMMON_EXPORTS, }; } async onModuleInit() { this.logger.log('FIXModule initialized, waiting for application bootstrap...'); } async onApplicationBootstrap() { this.logger.log('Application bootstrapped, creating FIX instances...'); const { acceptorConfig, initiatorConfig, providers } = this.configStorage.getConfigs(); if (!providers) { this.logger.warn('No stored providers found'); return; } if (acceptorConfig) { this.fixAcceptor = createAcceptor(acceptorConfig, providers.discoveryService, providers.metadataScanner, providers.roomManager, providers.sessionManager); this.logger.log('FIXAcceptor created'); } if (initiatorConfig) { this.fixInitiator = createInitiator(initiatorConfig, providers.roomManager); this.logger.log('FIXInitiator created'); } this.registerLogonHandlers(); this.configStorage.clear(); } registerLogonHandlers() { if (!this.fixAcceptor) return; const metadata = this.metadataExplorer.explore(); const sessionManager = this.fixAcceptor.getSessionManager(); metadata .filter((meta) => meta.onLogon) .forEach((meta) => { sessionManager .getAllSessions() .forEach((session) => session.registerLogonHandler(meta.onLogon)); }); } }; exports.FIXModule = FIXModule; exports.FIXModule = FIXModule = FIXModule_1 = __decorate([ (0, common_1.Global)(), (0, common_1.Module)({ imports: [core_1.DiscoveryModule], providers: [ ...COMMON_PROVIDERS, { provide: constants_1.DISCOVERY_SERVICE, useExisting: core_1.DiscoveryService, }, { provide: constants_1.METADATA_SCANNER, useFactory: () => new core_1.MetadataScanner(), }, ], exports: COMMON_EXPORTS, }), __metadata("design:paramtypes", [fix_metadata_explorer_1.FixMetadataExplorer, ConfigStorage]) ], FIXModule); exports.default = FIXModule; //# sourceMappingURL=fix.module.js.map