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.
- package/commonjs/src/enqueue.js +56 -17
- package/package.json +1 -1
- package/src/enqueue.js +56 -14
package/commonjs/src/enqueue.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
454
|
-
const
|
|
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
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)
|
|
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))
|
|
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
|
|
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
|
|
366
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
453
|
-
const
|
|
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
|