amqplib 0.10.2 → 0.10.4

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.
Files changed (55) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
  2. package/.github/workflows/test.yml +15 -2
  3. package/CHANGELOG.md +12 -1
  4. package/Makefile +3 -4
  5. package/README.md +1 -1
  6. package/bin/generate-defs.js +5 -5
  7. package/examples/direct_reply_to_client.js +22 -0
  8. package/examples/direct_reply_to_server.js +25 -0
  9. package/examples/headers.js +29 -31
  10. package/examples/ssl.js +16 -10
  11. package/examples/stream_queues/README.md +40 -0
  12. package/examples/stream_queues/package.json +14 -0
  13. package/examples/stream_queues/receive_stream.js +55 -0
  14. package/examples/stream_queues/send_stream.js +38 -0
  15. package/examples/tutorials/callback_api/emit_log.js +22 -22
  16. package/examples/tutorials/callback_api/emit_log_direct.js +24 -24
  17. package/examples/tutorials/callback_api/emit_log_topic.js +23 -20
  18. package/examples/tutorials/callback_api/new_task.js +21 -20
  19. package/examples/tutorials/callback_api/receive.js +27 -21
  20. package/examples/tutorials/callback_api/receive_logs.js +32 -26
  21. package/examples/tutorials/callback_api/receive_logs_direct.js +42 -41
  22. package/examples/tutorials/callback_api/receive_logs_topic.js +43 -40
  23. package/examples/tutorials/callback_api/rpc_client.js +39 -37
  24. package/examples/tutorials/callback_api/rpc_server.js +42 -32
  25. package/examples/tutorials/callback_api/send.js +21 -22
  26. package/examples/tutorials/callback_api/worker.js +29 -25
  27. package/examples/tutorials/emit_log.js +20 -15
  28. package/examples/tutorials/emit_log_direct.js +22 -16
  29. package/examples/tutorials/emit_log_topic.js +22 -15
  30. package/examples/tutorials/new_task.js +20 -13
  31. package/examples/tutorials/receive.js +19 -14
  32. package/examples/tutorials/receive_logs.js +25 -23
  33. package/examples/tutorials/receive_logs_direct.js +29 -35
  34. package/examples/tutorials/receive_logs_topic.js +28 -32
  35. package/examples/tutorials/rpc_client.js +37 -40
  36. package/examples/tutorials/rpc_server.js +36 -29
  37. package/examples/tutorials/send.js +26 -18
  38. package/examples/tutorials/worker.js +27 -21
  39. package/examples/waitForConfirms.js +18 -19
  40. package/lib/callback_model.js +295 -290
  41. package/lib/channel.js +353 -346
  42. package/lib/channel_model.js +5 -1
  43. package/lib/codec.js +2 -2
  44. package/lib/connection.js +542 -527
  45. package/lib/credentials.js +1 -1
  46. package/lib/defs.js +2568 -2457
  47. package/lib/format.js +0 -1
  48. package/lib/frame.js +1 -1
  49. package/lib/heartbeat.js +32 -29
  50. package/lib/mux.js +96 -99
  51. package/package.json +2 -2
  52. package/test/callback_api.js +182 -174
  53. package/test/channel_api.js +455 -445
  54. package/test/codec.js +4 -4
  55. package/test/frame.js +5 -5
@@ -5,47 +5,275 @@
5
5
  'use strict';
6
6
 
7
7
  var defs = require('./defs');
8
- var inherits = require('util').inherits;
9
- var EventEmitter = require('events').EventEmitter;
8
+ var EventEmitter = require('events');
10
9
  var BaseChannel = require('./channel').BaseChannel;
11
10
  var acceptMessage = require('./channel').acceptMessage;
12
11
  var Args = require('./api_args');
13
12
 
14
- function CallbackModel(connection) {
15
- if (!(this instanceof CallbackModel))
16
- return new CallbackModel(connection);
17
- EventEmitter.call( this );
18
- this.connection = connection;
19
- var self = this;
20
- ['error', 'close', 'blocked', 'unblocked'].forEach(function(ev) {
21
- connection.on(ev, self.emit.bind(self, ev));
22
- });
13
+ class CallbackModel extends EventEmitter {
14
+ constructor (connection) {
15
+ super();
16
+ this.connection = connection;
17
+ var self = this;
18
+ ['error', 'close', 'blocked', 'unblocked'].forEach(function (ev) {
19
+ connection.on(ev, self.emit.bind(self, ev));
20
+ });
21
+ }
22
+
23
+ close (cb) {
24
+ this.connection.close(cb);
25
+ }
26
+
27
+ updateSecret(newSecret, reason, cb) {
28
+ this.connection._updateSecret(newSecret, reason, cb);
29
+ }
30
+
31
+ createChannel (cb) {
32
+ var ch = new Channel(this.connection);
33
+ ch.open(function (err, ok) {
34
+ if (err === null)
35
+ cb && cb(null, ch);
36
+ else
37
+ cb && cb(err);
38
+ });
39
+ return ch;
40
+ }
41
+
42
+ createConfirmChannel (cb) {
43
+ var ch = new ConfirmChannel(this.connection);
44
+ ch.open(function (err) {
45
+ if (err !== null)
46
+ return cb && cb(err);
47
+ else {
48
+ ch.rpc(defs.ConfirmSelect, { nowait: false },
49
+ defs.ConfirmSelectOk, function (err, _ok) {
50
+ if (err !== null)
51
+ return cb && cb(err);
52
+ else
53
+ cb && cb(null, ch);
54
+ });
55
+ }
56
+ });
57
+ return ch;
58
+ }
23
59
  }
24
- inherits(CallbackModel, EventEmitter);
25
60
 
26
- module.exports.CallbackModel = CallbackModel;
61
+ class Channel extends BaseChannel {
62
+ constructor (connection) {
63
+ super(connection);
64
+ this.on('delivery', this.handleDelivery.bind(this));
65
+ this.on('cancel', this.handleCancel.bind(this));
66
+ }
67
+
68
+ // This encodes straight-forward RPC: no side-effects and return the
69
+ // fields from the server response. It wraps the callback given it, so
70
+ // the calling method argument can be passed as-is. For anything that
71
+ // needs to have side-effects, or needs to change the server response,
72
+ // use `#_rpc(...)` and remember to dereference `.fields` of the
73
+ // server response.
74
+ rpc (method, fields, expect, cb0) {
75
+ var cb = callbackWrapper(this, cb0);
76
+ this._rpc(method, fields, expect, function (err, ok) {
77
+ cb(err, ok && ok.fields); // in case of an error, ok will be
78
+
79
+ // undefined
80
+ });
81
+ return this;
82
+ }
83
+
84
+ // === Public API ===
85
+ open (cb) {
86
+ try { this.allocate(); }
87
+ catch (e) { return cb(e); }
88
+
89
+ return this.rpc(defs.ChannelOpen, { outOfBand: "" },
90
+ defs.ChannelOpenOk, cb);
91
+ }
92
+
93
+ close (cb) {
94
+ return this.closeBecause("Goodbye", defs.constants.REPLY_SUCCESS,
95
+ function () { cb && cb(null); });
96
+ }
97
+
98
+ assertQueue (queue, options, cb) {
99
+ return this.rpc(defs.QueueDeclare,
100
+ Args.assertQueue(queue, options),
101
+ defs.QueueDeclareOk, cb);
102
+ }
103
+
104
+ checkQueue (queue, cb) {
105
+ return this.rpc(defs.QueueDeclare,
106
+ Args.checkQueue(queue),
107
+ defs.QueueDeclareOk, cb);
108
+ }
109
+
110
+ deleteQueue (queue, options, cb) {
111
+ return this.rpc(defs.QueueDelete,
112
+ Args.deleteQueue(queue, options),
113
+ defs.QueueDeleteOk, cb);
114
+ }
115
+
116
+ purgeQueue (queue, cb) {
117
+ return this.rpc(defs.QueuePurge,
118
+ Args.purgeQueue(queue),
119
+ defs.QueuePurgeOk, cb);
120
+ }
121
+
122
+ bindQueue (queue, source, pattern, argt, cb) {
123
+ return this.rpc(defs.QueueBind,
124
+ Args.bindQueue(queue, source, pattern, argt),
125
+ defs.QueueBindOk, cb);
126
+ }
27
127
 
28
- CallbackModel.prototype.close = function(cb) {
29
- this.connection.close(cb);
30
- };
128
+ unbindQueue (queue, source, pattern, argt, cb) {
129
+ return this.rpc(defs.QueueUnbind,
130
+ Args.unbindQueue(queue, source, pattern, argt),
131
+ defs.QueueUnbindOk, cb);
132
+ }
133
+
134
+ assertExchange (ex, type, options, cb0) {
135
+ var cb = callbackWrapper(this, cb0);
136
+ this._rpc(defs.ExchangeDeclare,
137
+ Args.assertExchange(ex, type, options),
138
+ defs.ExchangeDeclareOk,
139
+ function (e, _) { cb(e, { exchange: ex }); });
140
+ return this;
141
+ }
142
+
143
+ checkExchange (exchange, cb) {
144
+ return this.rpc(defs.ExchangeDeclare,
145
+ Args.checkExchange(exchange),
146
+ defs.ExchangeDeclareOk, cb);
147
+ }
148
+
149
+ deleteExchange (exchange, options, cb) {
150
+ return this.rpc(defs.ExchangeDelete,
151
+ Args.deleteExchange(exchange, options),
152
+ defs.ExchangeDeleteOk, cb);
153
+ }
154
+
155
+ bindExchange (dest, source, pattern, argt, cb) {
156
+ return this.rpc(defs.ExchangeBind,
157
+ Args.bindExchange(dest, source, pattern, argt),
158
+ defs.ExchangeBindOk, cb);
159
+ }
31
160
 
32
- function Channel(connection) {
33
- BaseChannel.call(this, connection);
34
- this.on('delivery', this.handleDelivery.bind(this));
35
- this.on('cancel', this.handleCancel.bind(this));
36
- }
37
- inherits(Channel, BaseChannel);
161
+ unbindExchange (dest, source, pattern, argt, cb) {
162
+ return this.rpc(defs.ExchangeUnbind,
163
+ Args.unbindExchange(dest, source, pattern, argt),
164
+ defs.ExchangeUnbindOk, cb);
165
+ }
38
166
 
39
- module.exports.Channel = Channel;
167
+ publish (exchange, routingKey, content, options) {
168
+ var fieldsAndProps = Args.publish(exchange, routingKey, options);
169
+ return this.sendMessage(fieldsAndProps, fieldsAndProps, content);
170
+ }
171
+
172
+ sendToQueue (queue, content, options) {
173
+ return this.publish('', queue, content, options);
174
+ }
175
+
176
+ consume (queue, callback, options, cb0) {
177
+ var cb = callbackWrapper(this, cb0);
178
+ var fields = Args.consume(queue, options);
179
+ var self = this;
180
+ this._rpc(
181
+ defs.BasicConsume, fields, defs.BasicConsumeOk,
182
+ function (err, ok) {
183
+ if (err === null) {
184
+ self.registerConsumer(ok.fields.consumerTag, callback);
185
+ cb(null, ok.fields);
186
+ }
187
+ else
188
+ cb(err);
189
+ });
190
+ return this;
191
+ }
192
+
193
+ cancel (consumerTag, cb0) {
194
+ var cb = callbackWrapper(this, cb0);
195
+ var self = this;
196
+ this._rpc(
197
+ defs.BasicCancel, Args.cancel(consumerTag), defs.BasicCancelOk,
198
+ function (err, ok) {
199
+ if (err === null) {
200
+ self.unregisterConsumer(consumerTag);
201
+ cb(null, ok.fields);
202
+ }
203
+ else
204
+ cb(err);
205
+ });
206
+ return this;
207
+ }
208
+
209
+ get (queue, options, cb0) {
210
+ var self = this;
211
+ var fields = Args.get(queue, options);
212
+ var cb = callbackWrapper(this, cb0);
213
+ this.sendOrEnqueue(defs.BasicGet, fields, function (err, f) {
214
+ if (err === null) {
215
+ if (f.id === defs.BasicGetEmpty) {
216
+ cb(null, false);
217
+ }
218
+ else if (f.id === defs.BasicGetOk) {
219
+ self.handleMessage = acceptMessage(function (m) {
220
+ m.fields = f.fields;
221
+ cb(null, m);
222
+ });
223
+ }
224
+ else {
225
+ cb(new Error("Unexpected response to BasicGet: " +
226
+ inspect(f)));
227
+ }
228
+ }
229
+ });
230
+ return this;
231
+ }
232
+
233
+ ack (message, allUpTo) {
234
+ this.sendImmediately(
235
+ defs.BasicAck, Args.ack(message.fields.deliveryTag, allUpTo));
236
+ return this;
237
+ }
238
+
239
+ ackAll () {
240
+ this.sendImmediately(defs.BasicAck, Args.ack(0, true));
241
+ return this;
242
+ }
243
+
244
+ nack (message, allUpTo, requeue) {
245
+ this.sendImmediately(
246
+ defs.BasicNack,
247
+ Args.nack(message.fields.deliveryTag, allUpTo, requeue));
248
+ return this;
249
+ }
250
+
251
+ nackAll (requeue) {
252
+ this.sendImmediately(
253
+ defs.BasicNack, Args.nack(0, true, requeue));
254
+ return this;
255
+ }
256
+
257
+ reject (message, requeue) {
258
+ this.sendImmediately(
259
+ defs.BasicReject,
260
+ Args.reject(message.fields.deliveryTag, requeue));
261
+ return this;
262
+ }
263
+
264
+ prefetch (count, global, cb) {
265
+ return this.rpc(defs.BasicQos,
266
+ Args.prefetch(count, global),
267
+ defs.BasicQosOk, cb);
268
+ }
269
+
270
+ recover (cb) {
271
+ return this.rpc(defs.BasicRecover,
272
+ Args.recover(),
273
+ defs.BasicRecoverOk, cb);
274
+ }
275
+ }
40
276
 
41
- CallbackModel.prototype.createChannel = function(cb) {
42
- var ch = new Channel(this.connection);
43
- ch.open(function(err, ok) {
44
- if (err === null) cb && cb(null, ch);
45
- else cb && cb(err);
46
- });
47
- return ch;
48
- };
49
277
 
50
278
  // Wrap an RPC callback to make sure the callback is invoked with
51
279
  // either `(null, value)` or `(error)`, i.e., never two non-null
@@ -61,267 +289,44 @@ function callbackWrapper(ch, cb) {
61
289
  } : function() {};
62
290
  }
63
291
 
64
- // This encodes straight-forward RPC: no side-effects and return the
65
- // fields from the server response. It wraps the callback given it, so
66
- // the calling method argument can be passed as-is. For anything that
67
- // needs to have side-effects, or needs to change the server response,
68
- // use `#_rpc(...)` and remember to dereference `.fields` of the
69
- // server response.
70
- Channel.prototype.rpc = function(method, fields, expect, cb0) {
71
- var cb = callbackWrapper(this, cb0);
72
- this._rpc(method, fields, expect, function(err, ok) {
73
- cb(err, ok && ok.fields); // in case of an error, ok will be
74
- // undefined
75
- });
76
- return this;
77
- };
78
-
79
- // === Public API ===
80
-
81
- Channel.prototype.open = function(cb) {
82
- try { this.allocate(); }
83
- catch (e) { return cb(e); }
84
-
85
- return this.rpc(defs.ChannelOpen, {outOfBand: ""},
86
- defs.ChannelOpenOk, cb);
87
- };
88
-
89
- Channel.prototype.close = function(cb) {
90
- return this.closeBecause("Goodbye", defs.constants.REPLY_SUCCESS,
91
- function() { cb && cb(null); });
92
- };
93
-
94
- Channel.prototype.assertQueue = function(queue, options, cb) {
95
- return this.rpc(defs.QueueDeclare,
96
- Args.assertQueue(queue, options),
97
- defs.QueueDeclareOk, cb);
98
- };
99
-
100
- Channel.prototype.checkQueue = function(queue, cb) {
101
- return this.rpc(defs.QueueDeclare,
102
- Args.checkQueue(queue),
103
- defs.QueueDeclareOk, cb);
104
- };
105
-
106
- Channel.prototype.deleteQueue = function(queue, options, cb) {
107
- return this.rpc(defs.QueueDelete,
108
- Args.deleteQueue(queue, options),
109
- defs.QueueDeleteOk, cb);
110
- };
111
-
112
- Channel.prototype.purgeQueue = function(queue, cb) {
113
- return this.rpc(defs.QueuePurge,
114
- Args.purgeQueue(queue),
115
- defs.QueuePurgeOk, cb);
116
- };
117
-
118
- Channel.prototype.bindQueue =
119
- function(queue, source, pattern, argt, cb) {
120
- return this.rpc(defs.QueueBind,
121
- Args.bindQueue(queue, source, pattern, argt),
122
- defs.QueueBindOk, cb);
123
- };
124
-
125
- Channel.prototype.unbindQueue =
126
- function(queue, source, pattern, argt, cb) {
127
- return this.rpc(defs.QueueUnbind,
128
- Args.unbindQueue(queue, source, pattern, argt),
129
- defs.QueueUnbindOk, cb);
130
- };
131
-
132
- Channel.prototype.assertExchange = function(ex, type, options, cb0) {
133
- var cb = callbackWrapper(this, cb0);
134
- this._rpc(defs.ExchangeDeclare,
135
- Args.assertExchange(ex, type, options),
136
- defs.ExchangeDeclareOk,
137
- function(e, _) { cb(e, {exchange: ex}); });
138
- return this;
139
- };
140
-
141
- Channel.prototype.checkExchange = function(exchange, cb) {
142
- return this.rpc(defs.ExchangeDeclare,
143
- Args.checkExchange(exchange),
144
- defs.ExchangeDeclareOk, cb);
145
- };
146
-
147
- Channel.prototype.deleteExchange = function(exchange, options, cb) {
148
- return this.rpc(defs.ExchangeDelete,
149
- Args.deleteExchange(exchange, options),
150
- defs.ExchangeDeleteOk, cb);
151
- };
152
-
153
- Channel.prototype.bindExchange =
154
- function(dest, source, pattern, argt, cb) {
155
- return this.rpc(defs.ExchangeBind,
156
- Args.bindExchange(dest, source, pattern, argt),
157
- defs.ExchangeBindOk, cb);
158
- };
159
-
160
- Channel.prototype.unbindExchange =
161
- function(dest, source, pattern, argt, cb) {
162
- return this.rpc(defs.ExchangeUnbind,
163
- Args.unbindExchange(dest, source, pattern, argt),
164
- defs.ExchangeUnbindOk, cb);
165
- };
166
-
167
- Channel.prototype.publish =
168
- function(exchange, routingKey, content, options) {
169
- var fieldsAndProps = Args.publish(exchange, routingKey, options);
170
- return this.sendMessage(fieldsAndProps, fieldsAndProps, content);
171
- };
172
-
173
- Channel.prototype.sendToQueue = function(queue, content, options) {
174
- return this.publish('', queue, content, options);
175
- };
176
-
177
- Channel.prototype.consume = function(queue, callback, options, cb0) {
178
- var cb = callbackWrapper(this, cb0);
179
- var fields = Args.consume(queue, options);
180
- var self = this;
181
- this._rpc(
182
- defs.BasicConsume, fields, defs.BasicConsumeOk,
183
- function(err, ok) {
184
- if (err === null) {
185
- self.registerConsumer(ok.fields.consumerTag, callback);
186
- cb(null, ok.fields);
187
- }
188
- else cb(err);
189
- });
190
- return this;
191
- };
192
-
193
- Channel.prototype.cancel = function(consumerTag, cb0) {
194
- var cb = callbackWrapper(this, cb0);
195
- var self = this;
196
- this._rpc(
197
- defs.BasicCancel, Args.cancel(consumerTag), defs.BasicCancelOk,
198
- function(err, ok) {
199
- if (err === null) {
200
- self.unregisterConsumer(consumerTag);
201
- cb(null, ok.fields);
202
- }
203
- else cb(err);
204
- });
205
- return this;
206
- };
207
-
208
- Channel.prototype.get = function(queue, options, cb0) {
209
- var self = this;
210
- var fields = Args.get(queue, options);
211
- var cb = callbackWrapper(this, cb0);
212
- this.sendOrEnqueue(defs.BasicGet, fields, function(err, f) {
213
- if (err === null) {
214
- if (f.id === defs.BasicGetEmpty) {
215
- cb(null, false);
216
- }
217
- else if (f.id === defs.BasicGetOk) {
218
- self.handleMessage = acceptMessage(function(m) {
219
- m.fields = f.fields;
220
- cb(null, m);
221
- });
222
- }
292
+ class ConfirmChannel extends Channel {
293
+ publish (exchange, routingKey,
294
+ content, options, cb) {
295
+ this.pushConfirmCallback(cb);
296
+ return Channel.prototype.publish.call(
297
+ this, exchange, routingKey, content, options);
298
+ }
299
+
300
+ sendToQueue (queue, content,
301
+ options, cb) {
302
+ return this.publish('', queue, content, options, cb);
303
+ }
304
+
305
+ waitForConfirms (k) {
306
+ var awaiting = [];
307
+ var unconfirmed = this.unconfirmed;
308
+ unconfirmed.forEach(function (val, index) {
309
+ if (val === null)
310
+ ; // already confirmed
223
311
  else {
224
- cb(new Error("Unexpected response to BasicGet: " +
225
- inspect(f)));
312
+ var confirmed = new Promise(function (resolve, reject) {
313
+ unconfirmed[index] = function (err) {
314
+ if (val)
315
+ val(err);
316
+ if (err === null)
317
+ resolve();
318
+ else
319
+ reject(err);
320
+ };
321
+ });
322
+ awaiting.push(confirmed);
226
323
  }
227
- }
228
- });
229
- return this;
230
- };
231
-
232
- Channel.prototype.ack = function(message, allUpTo) {
233
- this.sendImmediately(
234
- defs.BasicAck, Args.ack(message.fields.deliveryTag, allUpTo));
235
- return this;
236
- };
237
-
238
- Channel.prototype.ackAll = function() {
239
- this.sendImmediately(defs.BasicAck, Args.ack(0, true));
240
- return this;
241
- };
242
-
243
- Channel.prototype.nack = function(message, allUpTo, requeue) {
244
- this.sendImmediately(
245
- defs.BasicNack,
246
- Args.nack(message.fields.deliveryTag, allUpTo, requeue));
247
- return this;
248
- };
249
-
250
- Channel.prototype.nackAll = function(requeue) {
251
- this.sendImmediately(
252
- defs.BasicNack, Args.nack(0, true, requeue))
253
- return this;
254
- };
255
-
256
- Channel.prototype.reject = function(message, requeue) {
257
- this.sendImmediately(
258
- defs.BasicReject,
259
- Args.reject(message.fields.deliveryTag, requeue));
260
- return this;
261
- };
262
-
263
- Channel.prototype.prefetch = function(count, global, cb) {
264
- return this.rpc(defs.BasicQos,
265
- Args.prefetch(count, global),
266
- defs.BasicQosOk, cb);
267
- };
268
-
269
- Channel.prototype.recover = function(cb) {
270
- return this.rpc(defs.BasicRecover,
271
- Args.recover(),
272
- defs.BasicRecoverOk, cb);
273
- };
274
-
275
- function ConfirmChannel(connection) {
276
- Channel.call(this, connection);
324
+ });
325
+ return Promise.all(awaiting).then(function () { k(); },
326
+ function (err) { k(err); });
327
+ }
277
328
  }
278
- inherits(ConfirmChannel, Channel);
279
329
 
330
+ module.exports.CallbackModel = CallbackModel;
331
+ module.exports.Channel = Channel;
280
332
  module.exports.ConfirmChannel = ConfirmChannel;
281
-
282
- CallbackModel.prototype.createConfirmChannel = function(cb) {
283
- var ch = new ConfirmChannel(this.connection);
284
- ch.open(function(err) {
285
- if (err !== null) return cb && cb(err);
286
- else {
287
- ch.rpc(defs.ConfirmSelect, {nowait: false},
288
- defs.ConfirmSelectOk, function(err, _ok) {
289
- if (err !== null) return cb && cb(err);
290
- else cb && cb(null, ch);
291
- });
292
- }
293
- });
294
- return ch;
295
- };
296
-
297
- ConfirmChannel.prototype.publish = function(exchange, routingKey,
298
- content, options, cb) {
299
- this.pushConfirmCallback(cb);
300
- return Channel.prototype.publish.call(
301
- this, exchange, routingKey, content, options);
302
- };
303
-
304
- ConfirmChannel.prototype.sendToQueue = function(queue, content,
305
- options, cb) {
306
- return this.publish('', queue, content, options, cb);
307
- };
308
-
309
- ConfirmChannel.prototype.waitForConfirms = function(k) {
310
- var awaiting = [];
311
- var unconfirmed = this.unconfirmed;
312
- unconfirmed.forEach(function(val, index) {
313
- if (val === null); // already confirmed
314
- else {
315
- var confirmed = new Promise(function(resolve, reject) {
316
- unconfirmed[index] = function(err) {
317
- if (val) val(err);
318
- if (err === null) resolve();
319
- else reject(err);
320
- };
321
- });
322
- awaiting.push(confirmed);
323
- }
324
- });
325
- return Promise.all(awaiting).then(function() { k(); },
326
- function(err) { k(err); });
327
- };