#!/usr/bin/env node /** * Publish test messages to a Dead Letter Queue (DLQ) * * Usage: * node scripts/publish_to_dlq.js [--env ] [--queue ] [--partner ] [--count ] [--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 ] [--queue ] [--partner ] [--count ] [--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); });