
Security News
White House Authorizes Private Companies to Conduct Offensive Cyber Operations
A new federal program will let vetted U.S. cybersecurity firms help investigate and disrupt foreign cybercrime groups under government direction.
A library for making AMQP 0-9-1 clients for Node.JS, and an AMQP 0-9-1 client for Node.JS v10+. This library does not implement AMQP1.0 or AMQP0-10.
npm install amqplib
Only 0.10.7 and later versions of this library are compatible with RabbitMQ 4.1.0 (and later releases).
Still working on:
const amqplib = require('amqplib/callback_api');
const queue = 'tasks';
amqplib.connect('amqp://localhost', (err, conn) => {
if (err) throw err;
conn.on('error', (err) => { console.error('Connection error:', err); });
conn.on('handler-error', (err, event) => { console.error(`Uncaught exception in connection ${event} listener:`, err); });
// Listener
conn.createChannel((err, ch2) => {
if (err) throw err;
ch2.on('error', (err) => { console.error('Channel error:', err); });
ch2.on('handler-error', (err, event) => { console.error(`Uncaught exception in channel ${event} listener:`, err); });
ch2.assertQueue(queue);
ch2.consume(queue, (msg) => {
if (msg !== null) {
console.log(msg.content.toString());
ch2.ack(msg);
} else {
console.log('Consumer cancelled by server');
}
});
});
// Sender
conn.createChannel((err, ch1) => {
if (err) throw err;
ch1.on('error', (err) => { console.error('Channel error:', err); });
ch1.on('handler-error', (err, event) => { console.error(`Uncaught exception in channel ${event} listener:`, err); });
ch1.assertQueue(queue);
setInterval(() => {
ch1.sendToQueue(queue, Buffer.from('something to do'));
}, 1000);
});
});
const amqplib = require('amqplib');
(async () => {
const queue = 'tasks';
const conn = await amqplib.connect('amqp://localhost');
conn.on('error', (err) => { console.error('Connection error:', err); });
conn.on('handler-error', (err, event) => { console.error(`Uncaught exception in connection ${event} listener:`, err); });
const ch1 = await conn.createChannel();
ch1.on('error', (err) => { console.error('Channel error:', err); });
ch1.on('handler-error', (err, event) => { console.error(`Uncaught exception in channel ${event} listener:`, err); });
await ch1.assertQueue(queue);
// Listener
ch1.consume(queue, (msg) => {
if (msg !== null) {
console.log('Received:', msg.content.toString());
ch1.ack(msg);
} else {
console.log('Consumer cancelled by server');
}
});
// Sender
const ch2 = await conn.createChannel();
ch2.on('error', (err) => { console.error('Channel error:', err); });
ch2.on('handler-error', (err, event) => { console.error(`Uncaught exception in channel ${event} listener:`, err); });
setInterval(() => {
ch2.sendToQueue(queue, Buffer.from('something to do'));
}, 1000);
})();
Automatic recovery is available as an opt-in feature through connect options:
const amqplib = require('amqplib');
const connection = await amqplib.connect('amqp://localhost', {
recovery: {
initialDelay: 200, // ms
maxDelay: 5000, // ms
factor: 2,
jitter: 0.2,
maxRetries: Infinity,
async setup(model) {
// Called after every successful (re)connect.
// Recreate topology/consumers here.
const ch = await model.createChannel();
await ch.assertQueue('tasks', {durable: true});
},
},
});
connection.on('connect', () => {
console.log('connected');
});
connection.on('disconnect', (err) => {
console.warn('disconnected', err.message);
});
Callback API supports the same option:
const amqplib = require('amqplib/callback_api');
amqplib.connect(
'amqp://localhost',
{
recovery: {
initialDelay: 200,
maxDelay: 5000,
setup(model, done) {
model.createChannel((err, ch) => {
if (err) return done(err);
ch.assertQueue('tasks', {durable: true}, done);
});
},
},
},
(err, conn) => {
if (err) throw err;
conn.on('connect', () => console.log('connected'));
},
);
Without recovery options, behavior is unchanged.
If a user-supplied event handler throws a synchronous error, the throw will propagate into amqplib internals. Depending on where in the call stack it escapes, this can silently swallow the error, or close the channel or connection.
To avoid this, register a handler-error listener on the connection and on
each channel. If a listener is present, amqplib will catch any throw from a
user event handler and deliver it there instead of letting it propagate
internally. The listener receives the thrown error and the name of the event
whose handler threw.
Note that handler-error is not a replacement for the error event.
The error event is emitted by amqplib itself when the connection or channel
encounters a protocol-level error. The handler-error event is only emitted
when your own event listener throws.
const connection = await amqp.connect('amqp://localhost');
connection.on('error', (err) => { /* handle protocol errors */ });
connection.on('handler-error', (err, event) => {
console.error(`Uncaught exception in connection ${event} listener:`, err);
});
const channel = await connection.createChannel();
channel.on('error', (err) => { /* handle protocol errors */ });
channel.on('handler-error', (err, event) => {
console.error(`Uncaught exception in channel ${event} listener:`, err);
});
If no handler-error listener is registered, behaviour is unchanged from
previous versions.
npm test
To run the tests RabbitMQ is required. Either install it with your package manager, or use docker to run a RabbitMQ instance.
docker run -d --name amqp.test -p 5672:5672 rabbitmq
If prefer not to run RabbitMQ locally it is also possible to use a
instance of RabbitMQ hosted elsewhere. Use the URL environment
variable to configure a different amqp host to connect to. You may
also need to do this if docker is not on localhost; e.g., if it's
running in docker-machine.
One public host is dev.rabbitmq.com:
URL=amqp://dev.rabbitmq.com npm test
NB You may experience test failures due to timeouts if using the dev.rabbitmq.com instance.
You can run it under different versions of Node.JS using nave:
nave use 10 npm test
or run the tests on all supported versions of Node.JS in one go:
make test-all-nodejs
(which also needs nave installed, of course).
Lastly, setting the environment variable LOG_ERRORS will cause the
tests to output error messages encountered, to the console; this is
really only useful for checking the kind and formatting of the errors.
LOG_ERRORS=true npm test
make coverage
open file://`pwd`/coverage/lcov-report/index.html
rabbit.js is a messaging library for Node.js that is built on top of amqplib. It provides a simpler API for common messaging patterns. However, it may not be as actively maintained or feature-rich as amqplib.
rascal is an advanced message bus for Node.js that wraps amqplib. It provides additional features like configuration-based setup, automatic reconnection, and message redelivery. It's a higher-level abstraction compared to amqplib.
seneca-amqp-transport is a plugin for the Seneca microservices toolkit that allows Seneca-based microservices to communicate over AMQP using RabbitMQ. It's more specialized for use with Seneca, whereas amqplib is a general-purpose AMQP library.
FAQs
An AMQP 0-9-1 (e.g., RabbitMQ) library and client.
The npm package amqplib receives a total of 2,414,217 weekly downloads. As such, amqplib popularity was classified as popular.
We found that amqplib demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
A new federal program will let vetted U.S. cybersecurity firms help investigate and disrupt foreign cybercrime groups under government direction.

Research
/Security News
The campaign amassed more than 75,000 installs by targeting Russian-speaking users seeking access to blocked services.

Company News
Open source maintainers are under more pressure than ever. We're raising our open source program from the Team plan to the Business plan, free.