@tigthor/kokocrypt
Version:
Enhanced Fortress Edition - Secure, quantum-resistant, high-performance encryption package
150 lines • 5.88 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 ConsumerService_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ConsumerService = void 0;
const common_1 = require("@nestjs/common");
const config_1 = require("@nestjs/config");
const kafkajs_1 = require("kafkajs");
const event_emitter_1 = require("@nestjs/event-emitter");
let ConsumerService = ConsumerService_1 = class ConsumerService {
constructor(configService, eventEmitter) {
this.configService = configService;
this.eventEmitter = eventEmitter;
this.logger = new common_1.Logger(ConsumerService_1.name);
this.isConnected = false;
this.kafka = new kafkajs_1.Kafka({
clientId: this.configService.get('kafka.clientId') || 'api-gateway-client',
brokers: [this.configService.get('kafka.broker') || 'localhost:9092'],
retry: {
initialRetryTime: 300,
retries: 10,
maxRetryTime: 30000,
},
});
this.consumer = this.kafka.consumer({
groupId: this.configService.get('kafka.groupId') || 'api-gateway-group',
sessionTimeout: 30000,
heartbeatInterval: 3000,
rebalanceTimeout: 60000,
maxWaitTimeInMs: 1000,
maxBytes: 1048576,
});
}
async onModuleInit() {
try {
await this.consumer.connect();
this.isConnected = true;
this.logger.log('Kafka consumer connected successfully');
const topics = [
'user-events',
'wallet-events',
'points-events',
'game-events',
'activity-events',
'bonus-events',
'nft-events',
'chat-events',
'report-events',
'socket-topic',
];
for (const topic of topics) {
await this.consumer.subscribe({
topic,
fromBeginning: false,
});
this.logger.log(`Subscribed to topic: ${topic}`);
}
await this.consumer.run({
autoCommit: true,
autoCommitInterval: 5000,
partitionsConsumedConcurrently: 3,
eachMessage: async (payload) => {
await this.handleMessage(payload);
},
});
}
catch (error) {
this.logger.error('Failed to connect Kafka consumer', error);
}
}
async onModuleDestroy() {
if (this.isConnected) {
try {
await this.consumer.disconnect();
this.logger.log('Kafka consumer disconnected successfully');
}
catch (error) {
this.logger.error('Failed to disconnect Kafka consumer', error);
}
}
}
async handleMessage({ topic, partition, message, }) {
var _a;
try {
if (!message.value)
return;
const messageValue = message.value.toString();
let parsedMessage;
try {
parsedMessage = JSON.parse(messageValue);
}
catch (error) {
this.logger.warn(`Failed to parse message from topic ${topic}:`, error);
return;
}
this.logger.debug(`Received message from topic ${topic}, partition ${partition}`);
const eventName = `kafka.${topic}`;
this.eventEmitter.emit(eventName, {
value: parsedMessage,
topic,
partition,
offset: message.offset,
headers: message.headers,
key: (_a = message.key) === null || _a === void 0 ? void 0 : _a.toString(),
timestamp: message.timestamp,
});
switch (topic) {
case 'user-events':
break;
case 'game-events':
break;
case 'points-events':
break;
default:
break;
}
}
catch (error) {
this.logger.error(`Error handling message from topic ${topic}, partition ${partition}:`, error);
}
}
async subscribeToTopic(topic) {
if (!this.isConnected) {
throw new Error('Kafka consumer is not connected');
}
try {
await this.consumer.subscribe({ topic, fromBeginning: false });
this.logger.log(`Dynamically subscribed to topic: ${topic}`);
}
catch (error) {
this.logger.error(`Failed to subscribe to topic ${topic}:`, error);
throw error;
}
}
};
exports.ConsumerService = ConsumerService;
exports.ConsumerService = ConsumerService = ConsumerService_1 = __decorate([
(0, common_1.Injectable)(),
__metadata("design:paramtypes", [config_1.ConfigService,
event_emitter_1.EventEmitter2])
], ConsumerService);
//# sourceMappingURL=consumer.service.js.map