agmission/Development/server/scripts/publish_to_dlq.js

110 lines
3.6 KiB
JavaScript

#!/usr/bin/env node
/**
* Publish test messages to a Dead Letter Queue (DLQ)
*
* Usage:
* node scripts/publish_to_dlq.js [--env <path>] [--queue <queueName>] [--partner <code>] [--count <n>] [--json '<json>']
*
* Examples:
* node scripts/publish_to_dlq.js --env ./environment.env --queue partner_tasks --partner SATLOC --count 3
* node scripts/publish_to_dlq.js --queue dev_partner_tasks --json '{"test":"x"}'
*/
'use strict';
const path = require('path');
// Parse args to find --env early (load env before other requires)
const rawArgs = process.argv.slice(2);
let envFile = './environment.env';
for (let i = 0; i < rawArgs.length; i++) {
if (rawArgs[i] === '--env' && rawArgs[i + 1]) {
envFile = rawArgs[i + 1];
i++;
}
}
const envPath = path.resolve(process.cwd(), envFile);
require('dotenv').config({ path: envPath });
const amqp = require('amqplib');
function printHelp() {
console.log('\nPublish test messages to a DLQ (Dead Letter Queue)');
console.log('Usage: node scripts/publish_to_dlq.js [--env <path>] [--queue <queueName>] [--partner <code>] [--count <n>] [--json "<json>"]');
console.log('\nExamples:');
console.log(' node scripts/publish_to_dlq.js --env ./environment.env --queue partner_tasks --partner SATLOC --count 3');
process.exit(0);
}
// Simple arg parsing
const args = {};
for (let i = 0; i < rawArgs.length; i++) {
const a = rawArgs[i];
if (a === '--help' || a === '-h') printHelp();
if (a === '--queue' && rawArgs[i + 1]) { args.queue = rawArgs[++i]; continue; }
if (a === '--partner' && rawArgs[i + 1]) { args.partner = rawArgs[++i]; continue; }
if (a === '--count' && rawArgs[i + 1]) { args.count = parseInt(rawArgs[++i], 10); continue; }
if (a === '--json' && rawArgs[i + 1]) { args.json = rawArgs[++i]; continue; }
}
const PRODUCTION = (process.env.PRODUCTION === 'true' || process.env.PRODUCTION === '1');
// Determine queue name (use provided --queue, else partner queue from env)
let baseQueue = args.queue;
if (!baseQueue) {
if (PRODUCTION) baseQueue = process.env.QUEUE_NAME_PARTNER || 'partner_tasks';
else baseQueue = process.env.QUEUE_NAME_PARTNER ? `dev_${process.env.QUEUE_NAME_PARTNER}` : 'dev_partner_tasks';
}
const DLQ_NAME = `${baseQueue}_failed`;
const COUNT = args.count && args.count > 0 ? args.count : 1;
async function publish() {
const connOpts = {
protocol: 'amqp',
hostname: process.env.QUEUE_HOST || 'localhost',
port: process.env.QUEUE_PORT ? parseInt(process.env.QUEUE_PORT, 10) : 5672,
username: process.env.QUEUE_USR,
password: process.env.QUEUE_PWD,
vhost: process.env.QUEUE_VHOST || '/',
};
console.log(`Loading env from: ${envPath}`);
console.log(`Publishing ${COUNT} message(s) to DLQ: ${DLQ_NAME}`);
const connection = await amqp.connect(connOpts);
const channel = await connection.createChannel();
await channel.assertQueue(DLQ_NAME, { durable: true });
for (let i = 0; i < COUNT; i++) {
const payload = args.json ? JSON.parse(args.json) : {
testPayload: true,
timestamp: new Date().toISOString(),
seq: i + 1
};
const headers = {};
if (args.partner) headers['x-partner-code'] = args.partner;
headers['x-test-injected'] = 'true';
const properties = {
persistent: true,
headers
};
channel.sendToQueue(DLQ_NAME, Buffer.from(JSON.stringify(payload)), properties);
console.log(`Published message ${i + 1} to ${DLQ_NAME}`);
}
await channel.close();
await connection.close();
console.log('Done');
}
publish().catch(err => {
console.error('Failed to publish to DLQ:', err && err.stack || err);
process.exit(1);
});