{"_id":"@corentin.pasquier/node-red-contrib-amqp","_rev":"8-63dcedf1d2c5deed47cf359c7e9088df","name":"@corentin.pasquier/node-red-contrib-amqp","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.0.0","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"cpasquier"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.0.0","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"6a2009e801a4bf590d9893105c32e2d5bb43247c","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.0.0.tgz","fileCount":31,"integrity":"sha512-z7v6MYcufCnl0kdVjsKvubDapqBGoHIsOfqWKb45GlnqW3z9wl8tzhYsNRrV5kZfpmcVbAvQgliTSGXzif1XWg==","signatures":[{"sig":"MEQCIH6kI4aueDiOcCRFLzvfMQ8rapBzvhbvWks8FFQ9vIMTAiB4kG+q5hegIJRppCfVWZzmXxzvrgDn/bX9fwTdfy11ww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":223415},"main":"index.js","gitHead":"7ea182f7cb3d86136279354f712cc95ab01e931e","scripts":{"test":"mocha test/*_spec.js","build":"bash build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.0.0_1764852154434_0.30407870482248844","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.0.1","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"cpasquier"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.0.1","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"1a96162dd80798500ecd7f9ffd0d0d5762bc2c4d","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.0.1.tgz","fileCount":32,"integrity":"sha512-lGr85QM3FoqWQ29e0A1rlI1mPH2ER2HwMpPfpREXMP+05ZSUuj4VctOqDNPJPHOJMKVzJC8lUGpVXql9ewlsrg==","signatures":[{"sig":"MEUCIAE+81goLz0pRO0zSRQshJwXgOmbZe5zbHCY34DIaMWGAiEAug7iMAa5QYQMbaxewIUtxqbfqHHB4iEkTkakQIWACO0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236585},"main":"index.js","gitHead":"7ea182f7cb3d86136279354f712cc95ab01e931e","scripts":{"test":"mocha test/*_spec.js","build":"bash build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.0.1_1764852394140_0.059597781294636","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.0.2","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"cpasquier"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.0.2","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"3ae2136bc9dae0856060b4ca71853a7c3fd7d167","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.0.2.tgz","fileCount":32,"integrity":"sha512-rnAKLPaITc5QnZkjV+XIpLOrOsMz2aGHZwjEpnoHZHVZua5lUTjvybsNQi4Ly4p+UYK4c7nwkJokSds5uvDLAA==","signatures":[{"sig":"MEYCIQCJ/HgOMoWn5Enu9/6FHjZymEOoRiynDhVesxsSEbbDuAIhANCrj++gxvJ1FH6dbMpRRO4I0oL2ZD2OclQcArSk7/XX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236618},"main":"index.js","gitHead":"7ea182f7cb3d86136279354f712cc95ab01e931e","scripts":{"test":"mocha test/*_spec.js","build":"bash build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.0.2_1764852504337_0.9186046549229456","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.0.3","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"cpasquier"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.0.3","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"8c333002f7ab683c89397c5a108bf1ad3fba4459","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.0.3.tgz","fileCount":32,"integrity":"sha512-JD9i8MPRlOWsmsm/cr03OREOI49EG4RH3kgP50iwtADOZvShnbmHV8eBB+Exlc8rS9o5AqgpxG2aC7gdRKO/iA==","signatures":[{"sig":"MEYCIQCU6n/+TDJ8IsfDu3KdSQIYfsmSUsjmMgHJ77BQwQY/wwIhAMvtESK76o3eBN/ilfO91lQfPT44+dlKAV+GnqMP0xNg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236618},"main":"index.js","gitHead":"7ea182f7cb3d86136279354f712cc95ab01e931e","scripts":{"test":"mocha test/*_spec.js","build":"bash build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.0.3_1764852543327_0.2176404607677862","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.0.4","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"Sodebo"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.0.4","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"02ab936f3640e592f9ba16a81cd155b0fc26e388","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.0.4.tgz","fileCount":32,"integrity":"sha512-YYXJZQrDuHg+grtRv3HSylWgTLDvi8Hcj3a7DeD7a3C+Q/ZoUUCyFewMkWBmb6+ZutLtBnAO1hCXlP0ejXA0cw==","signatures":[{"sig":"MEUCIAQX3uD/QraPcLNXOqOIaM+NVBfINL6kSt66LMmo+uGgAiEA82JcOjjDezsDw5ajOy+1OZ3jnw38T/R20ZssIH+JI4c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236831},"main":"index.js","gitHead":"4146bc33db95b9097f49258dfa122dabb05b6912","scripts":{"test":"mocha test/*_spec.js","build":"./build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.0.4_1767772982819_0.7523978611834206","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.0.5","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"Sodebo"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.0.5","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"ac95c75ad46c16f89c7de1de362632bc4f87046c","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.0.5.tgz","fileCount":32,"integrity":"sha512-fQ5UzU6jlKqvLzubtHD+uUgny+Bj8KJANcaeYAZCuf/Vqa1jK7iN9O7WO+x68d03Nl2k/0FRVVXbrVe3g1FWIA==","signatures":[{"sig":"MEQCIHAs1ZrvGhHqnRkK29p3Om4jVa+ynvLwqGPVmbIK446jAiBSlriTTaRjCPTILI+kd5AGVjtk5+jiBpM0PD4XT7cZ8w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":238015},"main":"index.js","gitHead":"26f27b644c8ba4a376da6b0bbad126898a8dd27e","scripts":{"test":"mocha test/*_spec.js","build":"./build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.0.5_1767773221197_0.1392628733804897","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.1.0","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"Sodebo"},"license":"Unlicenced","_id":"@corentin.pasquier/node-red-contrib-amqp@1.1.0","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"dist":{"shasum":"8560dacbd0c740106f21317544744147e0c14d5a","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.1.0.tgz","fileCount":32,"integrity":"sha512-YIdEMbbe1LQ5qiuNKKE8+pXc1Bg2OepMGDjUq7cMl7MHjHmhAIJRCRgBN2Tgl27gOQ9A5vfEeYbz8m7tAbX53Q==","signatures":[{"sig":"MEQCIC98MIs+DjqdjWC7jISF1HlFi0Ra7BZkuNlOtKwjvY2QAiAGhhp6VIMN7LlUF8xi9O2jV9yFqgKNbMhreEVfilpC3A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":238946},"main":"index.js","gitHead":"a1d7508bec07f8296d80658f9ff7dcb89e57d5bb","scripts":{"test":"mocha test/*_spec.js","build":"./build.sh","test:watch":"mocha test/*_spec.js --watch"},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"node-red":{"nodes":{"amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-out":"nodes/amqp-out.js","amqp-nack":"nodes/amqp-nack.js","amqp-broker":"nodes/amqp-broker.js","amqp-reject":"nodes/amqp-reject.js"}},"_npmVersion":"10.9.3","description":"Node-RED AMQP nodes to connect to AMQP broker","directories":{},"_nodeVersion":"22.18.0","dependencies":{"amqplib":"^0.10.9"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.0.0","should":"^13.2.3","node-red-node-test-helper":"^0.3.0"},"_npmOperationalInternal":{"tmp":"tmp/node-red-contrib-amqp_1.1.0_1769608997524_0.28841167466548745","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@corentin.pasquier/node-red-contrib-amqp","version":"1.1.1","description":"Node-RED AMQP nodes to connect to AMQP broker","main":"index.js","node-red":{"nodes":{"amqp-broker":"nodes/amqp-broker.js","amqp-in":"nodes/amqp-in.js","amqp-ack":"nodes/amqp-ack.js","amqp-nack":"nodes/amqp-nack.js","amqp-reject":"nodes/amqp-reject.js","amqp-out":"nodes/amqp-out.js"}},"scripts":{"test":"mocha test/*_spec.js","test:watch":"mocha test/*_spec.js --watch","build":"./build.sh"},"keywords":["rabbitmq","node-red","amqp","queue","messaging"],"author":{"name":"Sodebo"},"license":"Unlicenced","dependencies":{"amqplib":"^0.10.9"},"devDependencies":{"mocha":"^10.0.0","node-red-node-test-helper":"^0.3.0","should":"^13.2.3"},"_id":"@corentin.pasquier/node-red-contrib-amqp@1.1.1","gitHead":"da7d54e8800f6f223a9d0595b1eb335b912ab8cc","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-18rnaqCvNrF8CkRV9/C2Z9fd6oaF0ElRUc/VYU0lH7E/OeiNy0fVkG840KOI4ffP22TWz4AmkJLww97Yy71BdQ==","shasum":"93cc10f181fddf82c62ec0bef93cc3a4e995c11b","tarball":"https://registry.npmjs.org/@corentin.pasquier/node-red-contrib-amqp/-/node-red-contrib-amqp-1.1.1.tgz","fileCount":32,"unpackedSize":238984,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF8XSuNGMVjL1DXtdHQ6DE2HLgImXyb4EgAqD010C0xIAiEA7u65g4dowodPsKdDj7tgchruuYjCy1Ss1vnmf8DkzRY="}]},"_npmUser":{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"},"directories":{},"maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-red-contrib-amqp_1.1.1_1769610331649_0.42695610335884204"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-04T12:42:34.278Z","modified":"2026-01-28T14:25:31.969Z","1.0.0":"2025-12-04T12:42:34.584Z","1.0.1":"2025-12-04T12:46:34.316Z","1.0.2":"2025-12-04T12:48:24.491Z","1.0.3":"2025-12-04T12:49:03.476Z","1.0.4":"2026-01-07T08:03:02.953Z","1.0.5":"2026-01-07T08:07:01.459Z","1.1.0":"2026-01-28T14:03:17.662Z","1.1.1":"2026-01-28T14:25:31.852Z"},"author":{"name":"Sodebo"},"license":"Unlicenced","keywords":["rabbitmq","node-red","amqp","queue","messaging"],"description":"Node-RED AMQP nodes to connect to AMQP broker","maintainers":[{"name":"corentin.pasquier","email":"co.pasquier@gmail.com"}],"readme":"# node-red-contrib-amqp\r\n\r\nNœuds Node-RED robustes pour RabbitMQ/AMQP avec reconnexion automatique, logging détaillé et gestion avancée des erreurs.\r\n\r\n## Fonctionnalités\r\n\r\n- **Reconnexion automatique** : Gère automatiquement les coupures de connexion et se reconnecte au broker\r\n- **ACK/NACK manuel** : Contrôle total sur l'acquittement des messages\r\n- **Confirmation de publication** : Mode confirm pour garantir la livraison des messages\r\n- **Dead Letter Exchange** : Support complet pour les messages rejetés\r\n- **Logging détaillé** : Suivi complet de toutes les opérations\r\n- **Prefetch configurable** : Contrôle du nombre de messages non acquittés\r\n- **Propriétés AMQP complètes** : Support de toutes les propriétés standard (persistent, priority, expiration, headers, etc.)\r\n- **Gestion des coupures pendant consommation** : Reprise propre après reconnexion\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @corentin.pasquier/node-red-contrib-amqp\r\n```\r\n\r\nOu depuis Node-RED : Menu → Manage palette → Install → Rechercher \"@corentin.pasquier/node-red-contrib-amqp\"\r\n\r\n## Nœuds disponibles\r\n\r\nCe module fournit 6 nœuds :\r\n\r\n1. **AMQP Broker** - Nœud de configuration pour la connexion au broker\r\n2. **AMQP In** - Consumer (consommation de messages depuis une queue)\r\n3. **AMQP Out** - Publisher (publication de messages vers un exchange)\r\n4. **AMQP ACK** - Acquittement de messages (approche visuelle)\r\n5. **AMQP NACK** - Rejet négatif avec option de requeue (approche visuelle)\r\n6. **AMQP REJECT** - Rejet de messages (approche visuelle)\r\n\r\n### AMQP Broker (Configuration)\r\n\r\nNœud de configuration qui gère la connexion au serveur RabbitMQ. Partagé entre tous les nœuds consumer/publisher.\r\n\r\n**Configuration :**\r\n- **Host** : Adresse du serveur RabbitMQ (défaut : localhost)\r\n- **Port** : Port de connexion (défaut : 5672, ou 5671 pour TLS)\r\n- **Virtual Host** : Virtual host RabbitMQ (défaut : /)\r\n- **Username** : Nom d'utilisateur (défaut : guest)\r\n- **Password** : Mot de passe (stocké de manière sécurisée)\r\n- **Use TLS** : Activer le chiffrement TLS/SSL\r\n- **Reconnect Time** : Délai entre les tentatives de reconnexion en ms (défaut : 5000)\r\n- **Heartbeat** : Intervalle de heartbeat en secondes (défaut : 60)\r\n\r\n### AMQP In (Consumer)\r\n\r\nConsomme des messages depuis une queue RabbitMQ avec ACK/NACK manuel.\r\n\r\n**Configuration :**\r\n- **Queue** : Nom de la queue à consommer\r\n- **Prefetch** : Nombre maximum de messages non acquittés (QoS)\r\n- **Exchange** (optionnel) : Exchange auquel binder la queue\r\n- **Exchange Type** : Type d'exchange (direct, topic, fanout, headers)\r\n- **Routing Key** : Clé de routage pour le binding (supporte les wildcards pour topic)\r\n- **Durable** : Queue durable (survit au redémarrage du broker)\r\n- **Auto Delete** : Suppression automatique quand plus de consumers\r\n- **Dead Letter Exchange** (optionnel) : Exchange pour les messages rejetés\r\n- **DLX Routing Key** (optionnel) : Routing key pour le DLX\r\n\r\n**Message sortant :**\r\n```javascript\r\n{\r\n    payload: {...},           // Contenu du message (JSON parsé si possible)\r\n    fields: {                 // Champs AMQP\r\n        deliveryTag: 1,\r\n        exchange: \"...\",\r\n        routingKey: \"...\",\r\n        redelivered: false\r\n    },\r\n    properties: {...},        // Propriétés AMQP\r\n    ack: function(),         // Fonction pour acquitter le message\r\n    nack: function(requeue), // Fonction pour rejeter avec option de requeue\r\n    reject: function(requeue) // Fonction pour rejeter le message\r\n}\r\n```\r\n\r\n**Exemples d'utilisation :**\r\n\r\n```javascript\r\n// ACK simple\r\nmsg.ack();\r\nreturn msg;\r\n\r\n// NACK avec requeue\r\nif (erreur_temporaire) {\r\n    msg.nack(true);  // Requeue le message\r\n}\r\n\r\n// NACK sans requeue (envoi vers DLX si configuré)\r\nif (erreur_permanente) {\r\n    msg.nack(false);  // Vers DLX\r\n}\r\n\r\n// Reject\r\nmsg.reject(false);  // Rejette sans requeue\r\n```\r\n\r\n### AMQP ACK\r\n\r\nNœud dédié pour acquitter un message reçu via AMQP In.\r\n\r\n**Utilisation :**\r\n- Connecter après un nœud AMQP In (ou après traitement)\r\n- Appelle automatiquement `msg.ack()`\r\n- Permet une visualisation claire du flow d'acquittement\r\n- Affiche un compteur de messages acquittés\r\n- Passe le message au nœud suivant après ACK\r\n\r\n**Avantage :** Rend le flow plus lisible qu'un appel de fonction dans un function node.\r\n\r\n### AMQP NACK\r\n\r\nNœud dédié pour rejeter négativement un message avec option de requeue.\r\n\r\n**Configuration :**\r\n- **Requeue** : Si coché, le message est remis en queue, sinon envoyé vers DLX (défaut : non coché)\r\n\r\n**Utilisation :**\r\n- Connecter après un nœud AMQP In\r\n- Appelle automatiquement `msg.nack(requeue)`\r\n- Le paramètre `requeue` peut être surchargé par `msg.requeue`\r\n- Affiche un compteur et l'état (requeued ou to DLX)\r\n\r\n**Cas d'usage :**\r\n- **NACK avec requeue=true** : Erreur temporaire (service indisponible, retry plus tard)\r\n- **NACK avec requeue=false** : Erreur permanente, envoi vers DLX pour analyse\r\n\r\n### AMQP REJECT\r\n\r\nNœud dédié pour rejeter un message (similaire à NACK mais pour un seul message).\r\n\r\n**Configuration :**\r\n- **Requeue** : Si coché, le message est remis en queue, sinon envoyé vers DLX (défaut : non coché)\r\n\r\n**Utilisation :**\r\n- Identique à AMQP NACK dans le comportement\r\n- Sémantiquement différent : REJECT est plus explicite sur le rejet\r\n- Utile pour distinguer visuellement les différents chemins d'erreur dans le flow\r\n\r\n**Note :** Dans AMQP, NACK et REJECT sont fonctionnellement similaires pour un message unique.\r\n\r\n### AMQP Out (Publisher)\r\n\r\nPublie des messages vers un exchange RabbitMQ avec confirmation optionnelle.\r\n\r\n**Configuration :**\r\n- **Exchange** : Nom de l'exchange cible\r\n- **Exchange Type** : Type d'exchange (direct, topic, fanout, headers)\r\n- **Routing Key** : Clé de routage par défaut (peut être surchargée)\r\n- **Durable** : Exchange durable\r\n- **Confirm Mode** : Attendre l'ACK du broker (recommandé)\r\n- **Persistent** : Messages persistants (survivent au redémarrage)\r\n- **Mandatory** : Retourner le message si non routé vers une queue\r\n\r\n**Message entrant :**\r\n\r\nConfiguration depuis le message :\r\n```javascript\r\nmsg.payload = {...};              // Données à publier (sera JSON stringifié)\r\nmsg.exchange = \"mon-exchange\";    // Surcharge l'exchange configuré\r\nmsg.routingKey = \"ma.cle\";        // Surcharge la routing key\r\nmsg.topic = \"ma.cle\";             // Alternative à routingKey\r\n\r\n// Propriétés AMQP optionnelles\r\nmsg.persistent = true;            // Message persistant\r\nmsg.priority = 5;                 // Priorité 0-9\r\nmsg.expiration = \"60000\";         // TTL en ms (string)\r\nmsg.headers = {                   // Headers personnalisés\r\n    source: \"web-app\",\r\n    version: \"1.0\"\r\n};\r\nmsg.correlationId = \"12345\";      // Pour pattern RPC\r\nmsg.replyTo = \"rpc.replies\";      // Queue de réponse RPC\r\nmsg.messageId = \"msg-001\";        // ID unique\r\nmsg.contentType = \"application/json\";\r\nmsg.contentEncoding = \"utf-8\";\r\nmsg.timestamp = Date.now();\r\nmsg.type = \"order.created\";\r\nmsg.userId = \"user123\";\r\nmsg.appId = \"my-app\";\r\n```\r\n\r\n## Exemples de flow\r\n\r\n### Exemple 1a : Consumer simple avec ACK (approche function)\r\n\r\n```\r\n[amqp-in] → [function: traiter] → [debug]\r\n\r\n// Dans le function node\r\nif (msg.payload.valid) {\r\n    msg.ack();\r\n    node.log(\"Message traité avec succès\");\r\n} else {\r\n    msg.nack(false);  // Vers DLX\r\n    node.error(\"Message invalide\");\r\n}\r\nreturn msg;\r\n```\r\n\r\n### Exemple 1b : Consumer simple avec ACK (approche visuelle avec nœuds dédiés)\r\n\r\n```\r\n                    ┌→ [function: traiter] → [amqp-ack] → [debug]\r\n[amqp-in] → [switch]│\r\n                    └→ [function: logger] → [amqp-nack] → [debug]\r\n\r\n// Dans le switch node : router selon msg.payload.valid\r\n// Output 1 (valid=true) : vers traitement puis ACK\r\n// Output 2 (valid=false) : vers logging puis NACK (DLX)\r\n```\r\n\r\n**Avantage de l'approche visuelle :** Le flow est plus facile à comprendre en un coup d'œil, idéal pour les architectures complexes.\r\n\r\n### Exemple 2 : Publisher avec propriétés\r\n\r\n```\r\n[inject] → [function: préparer] → [amqp-out]\r\n\r\n// Dans le function node\r\nmsg.payload = {\r\n    orderId: 12345,\r\n    amount: 99.99\r\n};\r\nmsg.routingKey = \"orders.new\";\r\nmsg.priority = 5;\r\nmsg.persistent = true;\r\nmsg.headers = {\r\n    source: \"web-app\",\r\n    timestamp: new Date().toISOString()\r\n};\r\nreturn msg;\r\n```\r\n\r\n### Exemple 3 : Pattern RPC (Request/Reply)\r\n\r\n**Requête :**\r\n```\r\n[inject] → [function: request] → [amqp-out]\r\n\r\nmsg.payload = { query: \"getUser\", userId: 123 };\r\nmsg.routingKey = \"rpc.requests\";\r\nmsg.replyTo = \"rpc.replies.\" + flow.get(\"instanceId\");\r\nmsg.correlationId = msg._msgid;\r\nreturn msg;\r\n```\r\n\r\n**Réponse :**\r\n```\r\n[amqp-in: queue=rpc.replies.*] → [function: response] → [debug]\r\n\r\nconst correlationId = msg.properties.correlationId;\r\n// Traiter la réponse selon correlationId\r\nmsg.ack();\r\nreturn msg;\r\n```\r\n\r\n### Exemple 4 : Retry avec DLX\r\n\r\n**Configuration :**\r\n1. Exchange principal : `orders`\r\n2. Queue principale : `orders.processing` avec DLX = `orders.dlx`\r\n3. Exchange DLX : `orders.dlx`\r\n4. Queue retry : `orders.retry` (bindée à `orders.dlx`) avec TTL et DLX = `orders`\r\n\r\nAprès le TTL, les messages retournent automatiquement vers `orders` pour un nouveau traitement.\r\n\r\n## Gestion de la reconnexion\r\n\r\nLes nœuds gèrent automatiquement la reconnexion en cas de perte de connexion :\r\n\r\n1. **Détection de coupure** : Le broker détecte la fermeture de connexion\r\n2. **Notification** : Tous les nœuds (consumer/publisher) sont notifiés\r\n3. **Nettoyage** : Les channels sont fermés proprement\r\n4. **Reconnexion automatique** : Tentatives toutes les X ms (configurable)\r\n5. **Reprise** : Une fois reconnecté, les nœuds reprennent automatiquement :\r\n   - Consumer : Recrée le channel et reprend la consommation\r\n   - Publisher : Recrée le channel et envoie les messages en file d'attente\r\n\r\n**Important pour les consumers :** Les messages non acquittés au moment de la coupure seront automatiquement requeued par RabbitMQ et redistribués une fois la connexion rétablie.\r\n\r\n## Logging\r\n\r\nTous les événements importants sont loggés avec des préfixes clairs :\r\n- `[AMQP Broker {id}]` : Événements du broker (connexion, reconnexion)\r\n- `[AMQP In {id}]` : Événements du consumer (consommation, ACK/NACK)\r\n- `[AMQP Out {id}]` : Événements du publisher (publication, confirmation)\r\n\r\nNiveaux de log :\r\n- **INFO** : Événements normaux (connexion, message reçu/envoyé)\r\n- **WARN** : Avertissements (reconnexion, buffer plein)\r\n- **ERROR** : Erreurs (échec de connexion, erreur de publication)\r\n\r\n## Bonnes pratiques\r\n\r\n1. **Toujours acquitter les messages** : Ne jamais oublier d'appeler `msg.ack()`, `msg.nack()` ou `msg.reject()`. Les messages non acquittés bloquent la consommation (selon prefetch).\r\n\r\n2. **Utiliser le mode confirm** : Active la confirmation de publication pour garantir que les messages sont bien reçus par le broker.\r\n\r\n3. **Configurer un prefetch approprié** :\r\n   - Prefetch = 1 : Garantie de traitement séquentiel, mais moins performant\r\n   - Prefetch > 1 : Meilleure performance, mais messages peuvent être redelivrés dans le désordre en cas de coupure\r\n\r\n4. **Utiliser Dead Letter Exchange** : Configure un DLX pour gérer les messages en erreur sans les perdre.\r\n\r\n5. **Messages persistants pour données critiques** : Active `persistent: true` pour les messages qui ne doivent pas être perdus en cas de redémarrage du broker.\r\n\r\n6. **Gérer les erreurs de traitement** :\r\n```javascript\r\ntry {\r\n    // Traitement du message\r\n    resultat = traiterMessage(msg.payload);\r\n    msg.ack();\r\n} catch (err) {\r\n    if (err.code === 'RETRY') {\r\n        msg.nack(true);  // Requeue pour retry\r\n    } else {\r\n        msg.nack(false); // Vers DLX\r\n    }\r\n    node.error(err);\r\n}\r\n```\r\n\r\n7. **Monitoring** : Surveiller les logs pour détecter :\r\n   - Reconnexions fréquentes (problème réseau ou broker)\r\n   - Messages vers DLX (erreurs de traitement)\r\n   - Buffer plein (débit trop élevé)\r\n\r\n## Dépannage\r\n\r\n### Le consumer ne reçoit pas de messages\r\n- Vérifier que la queue existe et contient des messages\r\n- Vérifier le binding exchange/queue/routing key\r\n- Vérifier les permissions de l'utilisateur\r\n- Vérifier les logs pour détecter les erreurs de connexion\r\n\r\n### Les messages ne sont pas publiés\r\n- Vérifier que l'exchange existe\r\n- En mode confirm, vérifier les logs pour les erreurs d'ACK\r\n- Vérifier que le routing key correspond à un binding existant (si mandatory=true)\r\n\r\n### Reconnexions fréquentes\r\n- Vérifier la stabilité du réseau\r\n- Augmenter le heartbeat si le réseau est lent\r\n- Vérifier les logs du broker RabbitMQ pour détecter des erreurs côté serveur\r\n\r\n### Messages redelivrés en boucle\r\n- Vérifier que `msg.ack()` est bien appelé\r\n- Vérifier qu'il n'y a pas d'exception avant l'ACK\r\n- Configurer un DLX avec TTL pour limiter les retries\r\n\r\n## Licence\r\n\r\nISC\r\n\r\n## Auteur\r\n\r\nSodebo\r\n\r\n## Changelog\r\n\r\n### 1.1.1\r\n- Ajout de l'output = 1\r\n\r\n### 1.1.0\r\n- Ajout fonctionnalité pour poursuivre le flux après une publication sur rabibtmq (avec attente confirmation ou non)\r\n\r\n### 1.0.5\r\n- Correction pour gérer la consommation d'un message dont le consumerTag n'est pas connu du broker\r\n\r\n### 1.0.4\r\n- Correction pour gérer la consommation d'un message dont le consumerTag n'est pas connu du broker\r\n\r\n### 1.0.3\r\n- Mise à jour README.md\r\n\r\n### 1.0.2\r\n- Mise à jour README.md\r\n\r\n### 1.0.1\r\n- Mise à jour README.md\r\n\r\n### 1.0.0\r\n- Implémentation initiale\r\n- Nœud AMQP Broker avec reconnexion automatique\r\n- Nœud AMQP In avec ACK/NACK manuel\r\n- Nœud AMQP Out avec mode confirm\r\n- Nœuds dédiés AMQP ACK, NACK et REJECT pour une approche visuelle\r\n- Support complet des propriétés AMQP\r\n- Dead Letter Exchange\r\n- Logging détaillé\r\n- Diagnostics d'erreur avancés\r\n- Indicateurs de statut visuels pour tous les nœuds\r\n- Documentation complète (API, tests, troubleshooting)\r\n- Tests unitaires avec Mocha\r\n","readmeFilename":"README.md"}