()
| 487 | } |
| 488 | |
| 489 | private tick(): void { |
| 490 | const now = Date.now(); |
| 491 | |
| 492 | for (const [key, record] of this.idempotencyRecords) { |
| 493 | if (record.expiresAt <= now) { |
| 494 | this.idempotencyRecords.delete(key); |
| 495 | } |
| 496 | } |
| 497 | |
| 498 | for (const [messageId, record] of this.duplicateMessages) { |
| 499 | if (record.expiresAt <= now) { |
| 500 | this.duplicateMessages.delete(messageId); |
| 501 | } |
| 502 | } |
| 503 | |
| 504 | for (const group of this.consumerGroups) { |
| 505 | const groupDeliveries = this.deliveryState.get(group.id); |
| 506 | if (!groupDeliveries) continue; |
| 507 | |
| 508 | for (const [messageId, state] of groupDeliveries) { |
| 509 | const message = this.messages.get(messageId); |
| 510 | |
| 511 | // Clean up if message expired |
| 512 | if (message) { |
| 513 | const expiresAt = |
| 514 | new Date(message.createdAt).getTime() + message.retentionMs; |
| 515 | if (expiresAt < now) { |
| 516 | groupDeliveries.delete(messageId); |
| 517 | this.maybeCleanupMessage(messageId); |
| 518 | continue; |
| 519 | } |
| 520 | } |
| 521 | |
| 522 | if (!message) { |
| 523 | groupDeliveries.delete(messageId); |
| 524 | continue; |
| 525 | } |
| 526 | |
| 527 | if (state.status === 'in-flight' && state.leaseExpiresAt < now) { |
| 528 | if (state.deliveryCount >= group.maxDeliveries) { |
| 529 | output.debug( |
| 530 | `queues: message ${messageId} exceeded maxDeliveries (${group.maxDeliveries}) for group "${group.name}", dropping` |
| 531 | ); |
| 532 | groupDeliveries.delete(messageId); |
| 533 | this.maybeCleanupMessage(messageId); |
| 534 | } else { |
| 535 | state.status = 'pending'; |
| 536 | state.visibleAt = now + group.retryAfterMs; |
| 537 | state.leaseExpiresAt = 0; |
| 538 | } |
| 539 | continue; |
| 540 | } |
| 541 | |
| 542 | // Dispatch pending messages that are now visible |
| 543 | if (state.status === 'pending' && state.visibleAt <= now) { |
| 544 | this.dispatchToConsumer(message, group).catch(err => { |
| 545 | output.debug(`queues: unexpected dispatch error: ${err}`); |
| 546 | }); |
no test coverage detected