@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
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 __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