110 lines
3.6 KiB
JavaScript
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);
|
|
});
|