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