amqplib 0.10.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/lint-disable.md +9 -0
- package/.claude/commands/lint-enable.md +12 -0
- package/.claude/settings.local.json +16 -0
- package/.github/workflows/publish.yml +1 -1
- package/.github/workflows/test.yml +1 -1
- package/CHANGELOG.md +34 -0
- package/CLAUDE.md +12 -0
- package/Makefile +5 -12
- package/bin/generate-defs.js +382 -369
- package/biome.json +51 -0
- package/callback_api.js +12 -8
- package/channel_api.js +5 -10
- package/examples/direct_reply_to_client.js +9 -5
- package/examples/direct_reply_to_server.js +8 -6
- package/examples/headers.js +13 -10
- package/examples/receive_generator.js +13 -20
- package/examples/send_generators.js +2 -9
- package/examples/ssl.js +2 -3
- package/examples/stream_queues/receive_stream.js +39 -36
- package/examples/stream_queues/send_stream.js +26 -29
- package/examples/tutorials/callback_api/emit_log.js +4 -3
- package/examples/tutorials/callback_api/emit_log_direct.js +5 -4
- package/examples/tutorials/callback_api/emit_log_topic.js +5 -4
- package/examples/tutorials/callback_api/new_task.js +5 -4
- package/examples/tutorials/callback_api/receive.js +16 -10
- package/examples/tutorials/callback_api/receive_logs.js +17 -11
- package/examples/tutorials/callback_api/receive_logs_direct.js +19 -13
- package/examples/tutorials/callback_api/receive_logs_topic.js +19 -14
- package/examples/tutorials/callback_api/rpc_client.js +20 -16
- package/examples/tutorials/callback_api/rpc_server.js +27 -21
- package/examples/tutorials/callback_api/send.js +4 -3
- package/examples/tutorials/callback_api/worker.js +18 -13
- package/examples/tutorials/emit_log.js +4 -6
- package/examples/tutorials/emit_log_direct.js +5 -7
- package/examples/tutorials/emit_log_topic.js +5 -7
- package/examples/tutorials/new_task.js +4 -6
- package/examples/tutorials/receive.js +8 -4
- package/examples/tutorials/receive_logs.js +10 -6
- package/examples/tutorials/receive_logs_direct.js +16 -10
- package/examples/tutorials/receive_logs_topic.js +16 -11
- package/examples/tutorials/rpc_client.js +17 -15
- package/examples/tutorials/rpc_server.js +9 -8
- package/examples/tutorials/send.js +4 -6
- package/examples/tutorials/worker.js +17 -14
- package/examples/waitForConfirms.js +2 -2
- package/lefthook.yml +14 -0
- package/lib/api_args.js +124 -149
- package/lib/bitset.js +28 -18
- package/lib/callback_model.js +134 -190
- package/lib/channel.js +175 -213
- package/lib/channel_model.js +41 -85
- package/lib/codec.js +257 -228
- package/lib/connect.js +74 -82
- package/lib/connection.js +204 -240
- package/lib/credentials.js +21 -29
- package/lib/defs.js +2559 -1927
- package/lib/error.js +5 -6
- package/lib/format.js +15 -33
- package/lib/frame.js +66 -66
- package/lib/heartbeat.js +17 -24
- package/lib/mux.js +32 -41
- package/package.json +8 -5
- package/test/bitset.test.js +65 -0
- package/test/callback_api.test.js +438 -0
- package/test/channel.test.js +592 -0
- package/test/channel_api.test.js +537 -0
- package/test/codec.test.js +172 -0
- package/test/connect.test.js +196 -0
- package/test/connection.test.js +330 -0
- package/test/data.test.js +33 -0
- package/test/frame.test.js +180 -0
- package/test/lib/data.js +249 -0
- package/test/lib/util.js +223 -0
- package/test/mux.test.js +215 -0
- package/test/bitset.js +0 -69
- package/test/callback_api.js +0 -379
- package/test/channel.js +0 -621
- package/test/channel_api.js +0 -606
- package/test/codec.js +0 -237
- package/test/connect.js +0 -197
- package/test/connection.js +0 -390
- package/test/data.js +0 -269
- package/test/frame.js +0 -191
- package/test/mux.js +0 -203
- package/test/util.js +0 -217
package/lib/channel_model.js
CHANGED
|
@@ -1,23 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
'use strict';
|
|
6
|
-
|
|
7
|
-
const EventEmitter = require('events');
|
|
8
|
-
const promisify = require('util').promisify;
|
|
1
|
+
const EventEmitter = require('node:events');
|
|
2
|
+
const promisify = require('node:util').promisify;
|
|
9
3
|
const defs = require('./defs');
|
|
10
|
-
const {BaseChannel} = require('./channel');
|
|
11
|
-
const {acceptMessage} = require('./channel');
|
|
4
|
+
const { BaseChannel } = require('./channel');
|
|
5
|
+
const { acceptMessage } = require('./channel');
|
|
12
6
|
const Args = require('./api_args');
|
|
13
|
-
const {inspect} = require('./format');
|
|
7
|
+
const { inspect } = require('./format');
|
|
14
8
|
|
|
15
9
|
class ChannelModel extends EventEmitter {
|
|
16
10
|
constructor(connection) {
|
|
17
11
|
super();
|
|
18
12
|
this.connection = connection;
|
|
19
13
|
|
|
20
|
-
['error', 'close', 'blocked', 'unblocked'].forEach(ev => {
|
|
14
|
+
['error', 'close', 'blocked', 'unblocked'].forEach((ev) => {
|
|
21
15
|
connection.on(ev, this.emit.bind(this, ev));
|
|
22
16
|
});
|
|
23
17
|
}
|
|
@@ -41,7 +35,7 @@ class ChannelModel extends EventEmitter {
|
|
|
41
35
|
const channel = new ConfirmChannel(this.connection);
|
|
42
36
|
channel.setOptions(options);
|
|
43
37
|
await channel.open();
|
|
44
|
-
await channel.rpc(defs.ConfirmSelect, {nowait: false}, defs.ConfirmSelectOk);
|
|
38
|
+
await channel.rpc(defs.ConfirmSelect, { nowait: false }, defs.ConfirmSelectOk);
|
|
45
39
|
return channel;
|
|
46
40
|
}
|
|
47
41
|
}
|
|
@@ -59,7 +53,7 @@ class Channel extends BaseChannel {
|
|
|
59
53
|
// response's fields; this is intended to be suitable for implementing
|
|
60
54
|
// API procedures.
|
|
61
55
|
async rpc(method, fields, expect) {
|
|
62
|
-
const f = await promisify(cb => {
|
|
56
|
+
const f = await promisify((cb) => {
|
|
63
57
|
return this._rpc(method, fields, expect, cb);
|
|
64
58
|
})();
|
|
65
59
|
|
|
@@ -69,86 +63,63 @@ class Channel extends BaseChannel {
|
|
|
69
63
|
// Do the remarkably simple channel open handshake
|
|
70
64
|
async open() {
|
|
71
65
|
const ch = await this.allocate.bind(this)();
|
|
72
|
-
return ch.rpc(defs.ChannelOpen, {outOfBand:
|
|
73
|
-
defs.ChannelOpenOk);
|
|
66
|
+
return ch.rpc(defs.ChannelOpen, { outOfBand: '' }, defs.ChannelOpenOk);
|
|
74
67
|
}
|
|
75
68
|
|
|
76
69
|
close() {
|
|
77
|
-
return promisify(cb => {
|
|
78
|
-
return this.closeBecause(
|
|
79
|
-
cb);
|
|
70
|
+
return promisify((cb) => {
|
|
71
|
+
return this.closeBecause('Goodbye', defs.constants.REPLY_SUCCESS, cb);
|
|
80
72
|
})();
|
|
81
73
|
}
|
|
82
74
|
|
|
83
75
|
// === Public API, declaring queues and stuff ===
|
|
84
76
|
|
|
85
77
|
assertQueue(queue, options) {
|
|
86
|
-
return this.rpc(defs.QueueDeclare,
|
|
87
|
-
Args.assertQueue(queue, options),
|
|
88
|
-
defs.QueueDeclareOk);
|
|
78
|
+
return this.rpc(defs.QueueDeclare, Args.assertQueue(queue, options), defs.QueueDeclareOk);
|
|
89
79
|
}
|
|
90
80
|
|
|
91
81
|
checkQueue(queue) {
|
|
92
|
-
return this.rpc(defs.QueueDeclare,
|
|
93
|
-
Args.checkQueue(queue),
|
|
94
|
-
defs.QueueDeclareOk);
|
|
82
|
+
return this.rpc(defs.QueueDeclare, Args.checkQueue(queue), defs.QueueDeclareOk);
|
|
95
83
|
}
|
|
96
84
|
|
|
97
85
|
deleteQueue(queue, options) {
|
|
98
|
-
return this.rpc(defs.QueueDelete,
|
|
99
|
-
Args.deleteQueue(queue, options),
|
|
100
|
-
defs.QueueDeleteOk);
|
|
86
|
+
return this.rpc(defs.QueueDelete, Args.deleteQueue(queue, options), defs.QueueDeleteOk);
|
|
101
87
|
}
|
|
102
88
|
|
|
103
89
|
purgeQueue(queue) {
|
|
104
|
-
return this.rpc(defs.QueuePurge,
|
|
105
|
-
Args.purgeQueue(queue),
|
|
106
|
-
defs.QueuePurgeOk);
|
|
90
|
+
return this.rpc(defs.QueuePurge, Args.purgeQueue(queue), defs.QueuePurgeOk);
|
|
107
91
|
}
|
|
108
92
|
|
|
109
93
|
bindQueue(queue, source, pattern, argt) {
|
|
110
|
-
return this.rpc(defs.QueueBind,
|
|
111
|
-
Args.bindQueue(queue, source, pattern, argt),
|
|
112
|
-
defs.QueueBindOk);
|
|
94
|
+
return this.rpc(defs.QueueBind, Args.bindQueue(queue, source, pattern, argt), defs.QueueBindOk);
|
|
113
95
|
}
|
|
114
96
|
|
|
115
97
|
unbindQueue(queue, source, pattern, argt) {
|
|
116
|
-
return this.rpc(defs.QueueUnbind,
|
|
117
|
-
Args.unbindQueue(queue, source, pattern, argt),
|
|
118
|
-
defs.QueueUnbindOk);
|
|
98
|
+
return this.rpc(defs.QueueUnbind, Args.unbindQueue(queue, source, pattern, argt), defs.QueueUnbindOk);
|
|
119
99
|
}
|
|
120
100
|
|
|
121
101
|
assertExchange(exchange, type, options) {
|
|
122
102
|
// The server reply is an empty set of fields, but it's convenient
|
|
123
103
|
// to have the exchange name handed to the continuation.
|
|
124
|
-
return this.rpc(defs.ExchangeDeclare,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
.then(_ok => { return { exchange }; });
|
|
104
|
+
return this.rpc(defs.ExchangeDeclare, Args.assertExchange(exchange, type, options), defs.ExchangeDeclareOk).then((_ok) => {
|
|
105
|
+
return { exchange };
|
|
106
|
+
});
|
|
128
107
|
}
|
|
129
108
|
|
|
130
109
|
checkExchange(exchange) {
|
|
131
|
-
return this.rpc(defs.ExchangeDeclare,
|
|
132
|
-
Args.checkExchange(exchange),
|
|
133
|
-
defs.ExchangeDeclareOk);
|
|
110
|
+
return this.rpc(defs.ExchangeDeclare, Args.checkExchange(exchange), defs.ExchangeDeclareOk);
|
|
134
111
|
}
|
|
135
112
|
|
|
136
113
|
deleteExchange(name, options) {
|
|
137
|
-
return this.rpc(defs.ExchangeDelete,
|
|
138
|
-
Args.deleteExchange(name, options),
|
|
139
|
-
defs.ExchangeDeleteOk);
|
|
114
|
+
return this.rpc(defs.ExchangeDelete, Args.deleteExchange(name, options), defs.ExchangeDeleteOk);
|
|
140
115
|
}
|
|
141
116
|
|
|
142
117
|
bindExchange(dest, source, pattern, argt) {
|
|
143
|
-
return this.rpc(defs.ExchangeBind,
|
|
144
|
-
Args.bindExchange(dest, source, pattern, argt),
|
|
145
|
-
defs.ExchangeBindOk);
|
|
118
|
+
return this.rpc(defs.ExchangeBind, Args.bindExchange(dest, source, pattern, argt), defs.ExchangeBindOk);
|
|
146
119
|
}
|
|
147
120
|
|
|
148
121
|
unbindExchange(dest, source, pattern, argt) {
|
|
149
|
-
return this.rpc(defs.ExchangeUnbind,
|
|
150
|
-
Args.unbindExchange(dest, source, pattern, argt),
|
|
151
|
-
defs.ExchangeUnbindOk);
|
|
122
|
+
return this.rpc(defs.ExchangeUnbind, Args.unbindExchange(dest, source, pattern, argt), defs.ExchangeUnbindOk);
|
|
152
123
|
}
|
|
153
124
|
|
|
154
125
|
// Working with messages
|
|
@@ -176,12 +147,9 @@ class Channel extends BaseChannel {
|
|
|
176
147
|
}
|
|
177
148
|
|
|
178
149
|
async cancel(consumerTag) {
|
|
179
|
-
|
|
180
|
-
this._rpc(defs.BasicCancel, Args.cancel(consumerTag),
|
|
181
|
-
|
|
182
|
-
cb);
|
|
183
|
-
})()
|
|
184
|
-
.then(ok => {
|
|
150
|
+
await promisify((cb) => {
|
|
151
|
+
this._rpc(defs.BasicCancel, Args.cancel(consumerTag), defs.BasicCancelOk, cb);
|
|
152
|
+
})().then((ok) => {
|
|
185
153
|
this.unregisterConsumer(consumerTag);
|
|
186
154
|
return ok.fields;
|
|
187
155
|
});
|
|
@@ -194,15 +162,13 @@ class Channel extends BaseChannel {
|
|
|
194
162
|
if (err) return reject(err);
|
|
195
163
|
if (f.id === defs.BasicGetEmpty) {
|
|
196
164
|
return resolve(false);
|
|
197
|
-
}
|
|
198
|
-
else if (f.id === defs.BasicGetOk) {
|
|
165
|
+
} else if (f.id === defs.BasicGetOk) {
|
|
199
166
|
const fields = f.fields;
|
|
200
|
-
this.handleMessage = acceptMessage(m => {
|
|
167
|
+
this.handleMessage = acceptMessage((m) => {
|
|
201
168
|
m.fields = fields;
|
|
202
169
|
resolve(m);
|
|
203
170
|
});
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
171
|
+
} else {
|
|
206
172
|
reject(new Error(`Unexpected response to BasicGet: ${inspect(f)}`));
|
|
207
173
|
}
|
|
208
174
|
});
|
|
@@ -210,9 +176,7 @@ class Channel extends BaseChannel {
|
|
|
210
176
|
}
|
|
211
177
|
|
|
212
178
|
ack(message, allUpTo) {
|
|
213
|
-
this.sendImmediately(
|
|
214
|
-
defs.BasicAck,
|
|
215
|
-
Args.ack(message.fields.deliveryTag, allUpTo));
|
|
179
|
+
this.sendImmediately(defs.BasicAck, Args.ack(message.fields.deliveryTag, allUpTo));
|
|
216
180
|
}
|
|
217
181
|
|
|
218
182
|
ackAll() {
|
|
@@ -220,14 +184,11 @@ class Channel extends BaseChannel {
|
|
|
220
184
|
}
|
|
221
185
|
|
|
222
186
|
nack(message, allUpTo, requeue) {
|
|
223
|
-
this.sendImmediately(
|
|
224
|
-
defs.BasicNack,
|
|
225
|
-
Args.nack(message.fields.deliveryTag, allUpTo, requeue));
|
|
187
|
+
this.sendImmediately(defs.BasicNack, Args.nack(message.fields.deliveryTag, allUpTo, requeue));
|
|
226
188
|
}
|
|
227
189
|
|
|
228
190
|
nackAll(requeue) {
|
|
229
|
-
this.sendImmediately(defs.BasicNack,
|
|
230
|
-
Args.nack(0, true, requeue));
|
|
191
|
+
this.sendImmediately(defs.BasicNack, Args.nack(0, true, requeue));
|
|
231
192
|
}
|
|
232
193
|
|
|
233
194
|
// `Basic.Nack` is not available in older RabbitMQ versions (or in the
|
|
@@ -235,21 +196,15 @@ class Channel extends BaseChannel {
|
|
|
235
196
|
// `Basic.Reject`. This is otherwise synonymous with
|
|
236
197
|
// `#nack(message, false, requeue)`.
|
|
237
198
|
reject(message, requeue) {
|
|
238
|
-
this.sendImmediately(
|
|
239
|
-
defs.BasicReject,
|
|
240
|
-
Args.reject(message.fields.deliveryTag, requeue));
|
|
199
|
+
this.sendImmediately(defs.BasicReject, Args.reject(message.fields.deliveryTag, requeue));
|
|
241
200
|
}
|
|
242
201
|
|
|
243
202
|
recover() {
|
|
244
|
-
return this.rpc(defs.BasicRecover,
|
|
245
|
-
Args.recover(),
|
|
246
|
-
defs.BasicRecoverOk);
|
|
203
|
+
return this.rpc(defs.BasicRecover, Args.recover(), defs.BasicRecoverOk);
|
|
247
204
|
}
|
|
248
205
|
|
|
249
206
|
qos(count, global) {
|
|
250
|
-
return this.rpc(defs.BasicQos,
|
|
251
|
-
Args.prefetch(count, global),
|
|
252
|
-
defs.BasicQosOk);
|
|
207
|
+
return this.rpc(defs.BasicQos, Args.prefetch(count, global), defs.BasicQosOk);
|
|
253
208
|
}
|
|
254
209
|
}
|
|
255
210
|
|
|
@@ -258,7 +213,7 @@ class Channel extends BaseChannel {
|
|
|
258
213
|
// channels or consumers. RabbitMQ v3.3.0 and after treat prefetch
|
|
259
214
|
// (without `global` set) as per-consumer (for consumers following),
|
|
260
215
|
// and prefetch with `global` set as per-channel.
|
|
261
|
-
Channel.prototype.prefetch = Channel.prototype.qos
|
|
216
|
+
Channel.prototype.prefetch = Channel.prototype.qos;
|
|
262
217
|
|
|
263
218
|
// Confirm channel. This is a channel with confirms 'switched on',
|
|
264
219
|
// meaning sent messages will provoke a responding 'ack' or 'nack'
|
|
@@ -283,7 +238,7 @@ class ConfirmChannel extends Channel {
|
|
|
283
238
|
unconfirmed.forEach((val, index) => {
|
|
284
239
|
if (val !== null) {
|
|
285
240
|
const confirmed = new Promise((resolve, reject) => {
|
|
286
|
-
unconfirmed[index] = err => {
|
|
241
|
+
unconfirmed[index] = (err) => {
|
|
287
242
|
if (val) val(err);
|
|
288
243
|
if (err === null) resolve();
|
|
289
244
|
else reject(err);
|
|
@@ -294,9 +249,10 @@ class ConfirmChannel extends Channel {
|
|
|
294
249
|
});
|
|
295
250
|
// Channel closed
|
|
296
251
|
if (!this.pending) {
|
|
297
|
-
|
|
298
|
-
while (cb
|
|
252
|
+
let cb = this.unconfirmed.shift();
|
|
253
|
+
while (cb) {
|
|
299
254
|
if (cb) cb(new Error('channel closed'));
|
|
255
|
+
cb = this.unconfirmed.shift();
|
|
300
256
|
}
|
|
301
257
|
}
|
|
302
258
|
return Promise.all(awaiting);
|