import dotenv from 'dotenv'; import kafka from 'kafka-node'; dotenv.config(); const probeTs = Number(process.argv[2] || Date.now()); const probeRoom = process.argv[3] || `PROBE-${probeTs}`; const probeHotelId = Number(process.argv[4] || 1085); const topic = process.env.KAFKA_TOPIC || process.env.KAFKA_TOPICS || 'blwlog4Nodejs-rcu-register-topic'; const kafkaHost = (process.env.KAFKA_BROKERS || '').split(',').map((s) => s.trim()).filter(Boolean).join(','); const saslEnabled = process.env.KAFKA_SASL_ENABLED === 'true'; const sslEnabled = process.env.KAFKA_SSL_ENABLED === 'true'; const kafkaClientOptions = { kafkaHost, clientId: process.env.KAFKA_CLIENT_ID || 'bls-register-producer' }; if (saslEnabled && process.env.KAFKA_SASL_USERNAME && process.env.KAFKA_SASL_PASSWORD) { kafkaClientOptions.sasl = { mechanism: process.env.KAFKA_SASL_MECHANISM || 'plain', username: process.env.KAFKA_SASL_USERNAME, password: process.env.KAFKA_SASL_PASSWORD }; } if (sslEnabled) { kafkaClientOptions.sslOptions = { rejectUnauthorized: false }; } const payload = { ts_ms: probeTs, upgrade_ts_ms: probeTs + 1234, hotel_id: Number.isFinite(probeHotelId) ? probeHotelId : 1085, room_id: probeRoom, device_id: `probe-device-${probeTs}`, is_send: 0, udp_raw: 'abc\u0000def', extra: { source: 'probe', note: 'with\\u0000nul' }, app_version: 'v1\u0000.2', launcher_version: 'launcher-1', config_version: 'cfg-1' }; const client = new kafka.KafkaClient(kafkaClientOptions); const producer = new kafka.Producer(client); producer.on('ready', () => { producer.send( [{ topic, messages: JSON.stringify(payload) }], (err) => { if (err) { console.error(`[probe] publish failed: ${err.message}`); process.exit(1); } console.log(`[probe] published topic=${topic} ts_ms=${probeTs} hotel_id=${payload.hotel_id} room_id=${probeRoom}`); producer.close(() => client.close(() => process.exit(0))); } ); }); producer.on('error', (err) => { console.error(`[probe] producer error: ${err.message}`); process.exit(1); });