qdone 2.0.46-alpha → 2.0.47-alpha

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.
@@ -333,12 +333,27 @@ let requestCount = 0;
333
333
  // Returns number of messages flushed.
334
334
  //
335
335
  async function flushMessages(qrl, opt, sendBuffer) {
336
- debug('flushMessages', qrl);
336
+ debug('flushMessages', { qrl, sendBuffer });
337
+ // Track our outgoing messages to map with Failed / Successful returns
338
+ const messagesById = new Map();
339
+ const resultsById = new Map();
340
+ const results = [];
341
+ if (sendBuffer[qrl] && sendBuffer[qrl].length) {
342
+ for (const message of sendBuffer[qrl]) {
343
+ const Id = message.Id;
344
+ messagesById.set(Id, message);
345
+ // Pre-prepare results
346
+ const result = { Id };
347
+ resultsById.set(Id, result);
348
+ results.push(result);
349
+ }
350
+ }
337
351
  // Flush until empty
338
352
  let numFlushed = 0;
339
353
  async function whileNotEmpty() {
340
- if (!(sendBuffer[qrl] && sendBuffer[qrl].length))
341
- return numFlushed;
354
+ if (!(sendBuffer[qrl] && sendBuffer[qrl].length)) {
355
+ return { numFlushed, results };
356
+ }
342
357
  // Construct batch until full
343
358
  const batch = [];
344
359
  let nextSize = JSON.stringify(sendBuffer[qrl][0]).length;
@@ -353,9 +368,8 @@ async function flushMessages(qrl, opt, sendBuffer) {
353
368
  }
354
369
  // Send batch
355
370
  const data = await sendMessageBatch(qrl, batch, opt);
356
- debug({ data });
357
371
  // Fail if there are any individual message failures
358
- if (data.Failed && data.Failed.length) {
372
+ if (data?.Failed && data?.Failed.length) {
359
373
  const err = new Error('One or more message failures: ' + JSON.stringify(data.Failed));
360
374
  err.Failed = data.Failed;
361
375
  throw err;
@@ -363,10 +377,19 @@ async function flushMessages(qrl, opt, sendBuffer) {
363
377
  // If we actually managed to flush any of them
364
378
  if (batch.length) {
365
379
  requestCount += 1;
366
- data.Successful.forEach(message => {
367
- if (opt.verbose)
368
- console.error(chalk_1.default.blue('Enqueued job ') + message.MessageId + chalk_1.default.blue(' request ' + requestCount));
369
- });
380
+ if (data?.Successful) {
381
+ for (const { Id, MessageId } of data.Successful) {
382
+ const result = resultsById.get(Id);
383
+ const message = messagesById.get(Id);
384
+ result.MessageId = MessageId;
385
+ result.Id = Id;
386
+ if (message?.MessageAttributes?.QdoneDeduplicationId?.StringValue) {
387
+ result.QdoneDeduplicationId = message?.MessageAttributes?.QdoneDeduplicationId?.StringValue;
388
+ }
389
+ if (opt.verbose)
390
+ console.error(chalk_1.default.blue('Enqueued job ') + MessageId + chalk_1.default.blue(' request ' + requestCount));
391
+ }
392
+ }
370
393
  numFlushed += batch.length;
371
394
  }
372
395
  return whileNotEmpty();
@@ -379,15 +402,16 @@ exports.flushMessages = flushMessages;
379
402
  // Automaticaly flushes if queue has >= 10 messages.
380
403
  // Returns number of messages flushed.
381
404
  //
405
+ const debugAddMessage = (0, debug_1.default)('qdone:enqueue:addMessage');
382
406
  async function addMessage(qrl, command, messageIndex, opt, sendBuffer, messageOptions) {
383
407
  const message = formatMessage(command, messageIndex, opt, messageOptions);
384
408
  sendBuffer[qrl] = sendBuffer[qrl] || [];
385
409
  sendBuffer[qrl].push(message);
386
- debug({ location: 'addMessage', sendBuffer });
410
+ debugAddMessage({ location: 'addMessage', messageIndex, sendBuffer });
387
411
  if (sendBuffer[qrl].length >= 10) {
388
412
  return flushMessages(qrl, opt, sendBuffer);
389
413
  }
390
- return 0;
414
+ return { numFlushed: 0, results: [] };
391
415
  }
392
416
  exports.addMessage = addMessage;
393
417
  //
@@ -421,6 +445,7 @@ async function enqueueBatch(pairs, options) {
421
445
  (0, node_1.setExtra)({ qdoneOperation: 'enqueueBatch', args: { pairs, opt } });
422
446
  }
423
447
  try {
448
+ const allResults = [];
424
449
  // Find unique queues so we can pre-fetch qrls. We do this so that all
425
450
  // queues are created prior to going through our flush logic
426
451
  const normalizedPairs = pairs.map(({ queue, command, messageOptions }) => ({
@@ -443,18 +468,23 @@ async function enqueueBatch(pairs, options) {
443
468
  let initialFlushTotal = 0;
444
469
  for (const { qname, command, messageOptions } of normalizedPairs) {
445
470
  const qrl = await getOrCreateQueue(qname, opt);
446
- initialFlushTotal += await addMessage(qrl, command, messageIndex++, opt, sendBuffer, messageOptions);
471
+ const { numFlushed, results } = await addMessage(qrl, command, messageIndex++, opt, sendBuffer, messageOptions);
472
+ initialFlushTotal += numFlushed;
473
+ allResults.push(...results);
447
474
  }
448
475
  // And flush any remaining messages
449
476
  const extraFlushPromises = [];
450
477
  for (const qrl in sendBuffer) {
451
478
  extraFlushPromises.push(flushMessages(qrl, opt, sendBuffer));
452
479
  }
453
- const extraFlushCounts = await Promise.all(extraFlushPromises);
454
- const extraFlushTotal = extraFlushCounts.reduce((a, b) => a + b, 0);
480
+ let extraFlushTotal = 0;
481
+ for (const { numFlushed, results } of await Promise.all(extraFlushPromises)) {
482
+ allResults.push(...results);
483
+ extraFlushTotal += numFlushed;
484
+ }
455
485
  const totalFlushed = initialFlushTotal + extraFlushTotal;
456
486
  debug({ initialFlushTotal, extraFlushTotal, totalFlushed });
457
- return totalFlushed;
487
+ return { numFlushed: totalFlushed, results: allResults };
458
488
  }
459
489
  catch (e) {
460
490
  console.log(e);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "qdone",
3
- "version": "2.0.46-alpha",
3
+ "version": "2.0.47-alpha",
4
4
  "description": "A distributed scheduler for SQS",
5
5
  "type": "module",
6
6
  "main": "./index.js",
package/src/enqueue.js CHANGED
@@ -332,11 +332,27 @@ let requestCount = 0
332
332
  // Returns number of messages flushed.
333
333
  //
334
334
  export async function flushMessages (qrl, opt, sendBuffer) {
335
- debug('flushMessages', qrl)
335
+ debug('flushMessages', { qrl, sendBuffer })
336
+ // Track our outgoing messages to map with Failed / Successful returns
337
+ const messagesById = new Map()
338
+ const resultsById = new Map()
339
+ const results = []
340
+ if (sendBuffer[qrl] && sendBuffer[qrl].length) {
341
+ for (const message of sendBuffer[qrl]) {
342
+ const Id = message.Id
343
+ messagesById.set(Id, message)
344
+ // Pre-prepare results
345
+ const result = { Id }
346
+ resultsById.set(Id, result)
347
+ results.push(result)
348
+ }
349
+ }
336
350
  // Flush until empty
337
351
  let numFlushed = 0
338
352
  async function whileNotEmpty () {
339
- if (!(sendBuffer[qrl] && sendBuffer[qrl].length)) return numFlushed
353
+ if (!(sendBuffer[qrl] && sendBuffer[qrl].length)) {
354
+ return { numFlushed, results }
355
+ }
340
356
  // Construct batch until full
341
357
  const batch = []
342
358
  let nextSize = JSON.stringify(sendBuffer[qrl][0]).length
@@ -350,10 +366,9 @@ export async function flushMessages (qrl, opt, sendBuffer) {
350
366
 
351
367
  // Send batch
352
368
  const data = await sendMessageBatch(qrl, batch, opt)
353
- debug({ data })
354
369
 
355
370
  // Fail if there are any individual message failures
356
- if (data.Failed && data.Failed.length) {
371
+ if (data?.Failed && data?.Failed.length) {
357
372
  const err = new Error('One or more message failures: ' + JSON.stringify(data.Failed))
358
373
  err.Failed = data.Failed
359
374
  throw err
@@ -362,9 +377,18 @@ export async function flushMessages (qrl, opt, sendBuffer) {
362
377
  // If we actually managed to flush any of them
363
378
  if (batch.length) {
364
379
  requestCount += 1
365
- data.Successful.forEach(message => {
366
- if (opt.verbose) console.error(chalk.blue('Enqueued job ') + message.MessageId + chalk.blue(' request ' + requestCount))
367
- })
380
+ if (data?.Successful) {
381
+ for (const { Id, MessageId } of data.Successful) {
382
+ const result = resultsById.get(Id)
383
+ const message = messagesById.get(Id)
384
+ result.MessageId = MessageId
385
+ result.Id = Id
386
+ if (message?.MessageAttributes?.QdoneDeduplicationId?.StringValue) {
387
+ result.QdoneDeduplicationId = message?.MessageAttributes?.QdoneDeduplicationId?.StringValue
388
+ }
389
+ if (opt.verbose) console.error(chalk.blue('Enqueued job ') + MessageId + chalk.blue(' request ' + requestCount))
390
+ }
391
+ }
368
392
  numFlushed += batch.length
369
393
  }
370
394
  return whileNotEmpty()
@@ -377,15 +401,16 @@ export async function flushMessages (qrl, opt, sendBuffer) {
377
401
  // Automaticaly flushes if queue has >= 10 messages.
378
402
  // Returns number of messages flushed.
379
403
  //
404
+ const debugAddMessage = Debug('qdone:enqueue:addMessage')
380
405
  export async function addMessage (qrl, command, messageIndex, opt, sendBuffer, messageOptions) {
381
406
  const message = formatMessage(command, messageIndex, opt, messageOptions)
382
407
  sendBuffer[qrl] = sendBuffer[qrl] || []
383
408
  sendBuffer[qrl].push(message)
384
- debug({ location: 'addMessage', sendBuffer })
409
+ debugAddMessage({ location: 'addMessage', messageIndex, sendBuffer })
385
410
  if (sendBuffer[qrl].length >= 10) {
386
411
  return flushMessages(qrl, opt, sendBuffer)
387
412
  }
388
- return 0
413
+ return { numFlushed: 0, results: [] }
389
414
  }
390
415
 
391
416
  //
@@ -418,6 +443,7 @@ export async function enqueueBatch (pairs, options) {
418
443
  setExtra({ qdoneOperation: 'enqueueBatch', args: { pairs, opt } })
419
444
  }
420
445
  try {
446
+ const allResults = []
421
447
  // Find unique queues so we can pre-fetch qrls. We do this so that all
422
448
  // queues are created prior to going through our flush logic
423
449
  const normalizedPairs = pairs.map(({ queue, command, messageOptions }) => ({
@@ -441,7 +467,9 @@ export async function enqueueBatch (pairs, options) {
441
467
  let initialFlushTotal = 0
442
468
  for (const { qname, command, messageOptions } of normalizedPairs) {
443
469
  const qrl = await getOrCreateQueue(qname, opt)
444
- initialFlushTotal += await addMessage(qrl, command, messageIndex++, opt, sendBuffer, messageOptions)
470
+ const { numFlushed, results } = await addMessage(qrl, command, messageIndex++, opt, sendBuffer, messageOptions)
471
+ initialFlushTotal += numFlushed
472
+ allResults.push(...results)
445
473
  }
446
474
 
447
475
  // And flush any remaining messages
@@ -449,11 +477,14 @@ export async function enqueueBatch (pairs, options) {
449
477
  for (const qrl in sendBuffer) {
450
478
  extraFlushPromises.push(flushMessages(qrl, opt, sendBuffer))
451
479
  }
452
- const extraFlushCounts = await Promise.all(extraFlushPromises)
453
- const extraFlushTotal = extraFlushCounts.reduce((a, b) => a + b, 0)
480
+ let extraFlushTotal = 0
481
+ for (const { numFlushed, results } of await Promise.all(extraFlushPromises)) {
482
+ allResults.push(...results)
483
+ extraFlushTotal += numFlushed
484
+ }
454
485
  const totalFlushed = initialFlushTotal + extraFlushTotal
455
486
  debug({ initialFlushTotal, extraFlushTotal, totalFlushed })
456
- return totalFlushed
487
+ return { numFlushed: totalFlushed, results: allResults }
457
488
  } catch (e) {
458
489
  console.log(e)
459
490
  throw e