@message-queue-toolkit/sqs 22.4.0 → 22.5.0
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/README.md +469 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/sqs/AbstractSqsConsumer.d.ts +55 -3
- package/dist/sqs/AbstractSqsConsumer.js +172 -20
- package/dist/sqs/AbstractSqsConsumer.js.map +1 -1
- package/dist/utils/eventBridgeSchemaBuilder.d.ts +85 -0
- package/dist/utils/eventBridgeSchemaBuilder.js +81 -0
- package/dist/utils/eventBridgeSchemaBuilder.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,6 +26,9 @@ AWS SQS (Simple Queue Service) implementation for the message-queue-toolkit. Pro
|
|
|
26
26
|
- [Message Handlers](#message-handlers)
|
|
27
27
|
- [Pre-handlers and Barriers](#pre-handlers-and-barriers)
|
|
28
28
|
- [Handler Spies](#handler-spies)
|
|
29
|
+
- [Non-Standard Message Formats](#non-standard-message-formats)
|
|
30
|
+
- [EventBridge Events](#eventbridge-events)
|
|
31
|
+
- [Custom Message Structures](#custom-message-structures)
|
|
29
32
|
- [FIFO Queues](#fifo-queues)
|
|
30
33
|
- [FIFO Queue Requirements](#fifo-queue-requirements)
|
|
31
34
|
- [Message Ordering](#message-ordering)
|
|
@@ -1670,6 +1673,308 @@ interface HandlerSpy<Message> {
|
|
|
1670
1673
|
4. **Use in integration tests** - Handler spies are most valuable for integration tests, not unit tests
|
|
1671
1674
|
5. **Don't use in production** - Handler spies add memory overhead (circular buffer of messages)
|
|
1672
1675
|
|
|
1676
|
+
## Non-Standard Message Formats
|
|
1677
|
+
|
|
1678
|
+
The toolkit supports consuming messages that don't follow the standard message structure (with `type`, `id`, and `timestamp` fields at the root level). This is particularly useful for consuming events from external systems like AWS EventBridge, CloudWatch Events, or custom event sources.
|
|
1679
|
+
|
|
1680
|
+
### EventBridge Events
|
|
1681
|
+
|
|
1682
|
+
AWS EventBridge events have a different structure than standard toolkit messages. They use:
|
|
1683
|
+
- `detail-type` instead of `type` (routing field at root level)
|
|
1684
|
+
- `time` instead of `timestamp`
|
|
1685
|
+
- `detail` for the actual payload (nested)
|
|
1686
|
+
- `id` for the message ID (same as default)
|
|
1687
|
+
|
|
1688
|
+
Handlers receive the full EventBridge envelope and can access the nested `detail` field directly.
|
|
1689
|
+
|
|
1690
|
+
#### Using the EventBridge Schema Builder
|
|
1691
|
+
|
|
1692
|
+
The toolkit provides helper functions to create properly typed EventBridge schemas:
|
|
1693
|
+
|
|
1694
|
+
```typescript
|
|
1695
|
+
import {
|
|
1696
|
+
AbstractSqsConsumer, createEventBridgeSchema,
|
|
1697
|
+
} from '@message-queue-toolkit/sqs'
|
|
1698
|
+
import { MessageHandlerConfigBuilder } from '@message-queue-toolkit/core'
|
|
1699
|
+
import z from 'zod'
|
|
1700
|
+
|
|
1701
|
+
// Step 1: Define your detail (payload) schema
|
|
1702
|
+
const USER_PRESENCE_DETAIL = z.object({
|
|
1703
|
+
userId: z.string(),
|
|
1704
|
+
status: z.enum(['AVAILABLE', 'AWAY', 'BUSY', 'OFFLINE']),
|
|
1705
|
+
timestamp: z.string(),
|
|
1706
|
+
})
|
|
1707
|
+
|
|
1708
|
+
// Step 2: Create envelope schema with literal detail-type for routing
|
|
1709
|
+
const USER_PRESENCE_ENVELOPE = createEventBridgeSchema(
|
|
1710
|
+
USER_PRESENCE_DETAIL,
|
|
1711
|
+
'user.presence.changed' // Literal value for routing
|
|
1712
|
+
)
|
|
1713
|
+
|
|
1714
|
+
// Step 3: Infer the envelope type (what handlers receive)
|
|
1715
|
+
type UserPresenceEvent = z.infer<typeof USER_PRESENCE_ENVELOPE>
|
|
1716
|
+
// {
|
|
1717
|
+
// version: string
|
|
1718
|
+
// id: string
|
|
1719
|
+
// 'detail-type': 'user.presence.changed' // Literal type for routing
|
|
1720
|
+
// source: string
|
|
1721
|
+
// account: string
|
|
1722
|
+
// time: string
|
|
1723
|
+
// region: string
|
|
1724
|
+
// resources: string[]
|
|
1725
|
+
// detail: {
|
|
1726
|
+
// userId: string
|
|
1727
|
+
// status: 'AVAILABLE' | 'AWAY' | 'BUSY' | 'OFFLINE'
|
|
1728
|
+
// timestamp: string
|
|
1729
|
+
// }
|
|
1730
|
+
// }
|
|
1731
|
+
```
|
|
1732
|
+
|
|
1733
|
+
#### Creating an EventBridge Consumer
|
|
1734
|
+
|
|
1735
|
+
```typescript
|
|
1736
|
+
class EventBridgeConsumer extends AbstractSqsConsumer<UserPresenceEvent, ExecutionContext> {
|
|
1737
|
+
constructor(dependencies: SQSConsumerDependencies) {
|
|
1738
|
+
super(dependencies, {
|
|
1739
|
+
creationConfig: {
|
|
1740
|
+
queue: { QueueName: 'eventbridge-events' },
|
|
1741
|
+
},
|
|
1742
|
+
|
|
1743
|
+
// Configure field mappings for EventBridge
|
|
1744
|
+
messageTypeField: 'detail-type', // EventBridge uses 'detail-type'
|
|
1745
|
+
messageIdField: 'id', // Standard, same as default
|
|
1746
|
+
messageTimestampField: 'time', // EventBridge uses 'time'
|
|
1747
|
+
|
|
1748
|
+
// Handlers receive the full EventBridge envelope
|
|
1749
|
+
handlers: new MessageHandlerConfigBuilder<UserPresenceEvent, ExecutionContext>()
|
|
1750
|
+
.addConfig(
|
|
1751
|
+
USER_PRESENCE_ENVELOPE, // Schema validates full envelope
|
|
1752
|
+
async (message, context) => {
|
|
1753
|
+
// message is the full EventBridge envelope
|
|
1754
|
+
// Access the detail field directly
|
|
1755
|
+
console.log('User status changed:', message.detail.userId, message.detail.status)
|
|
1756
|
+
return { result: 'success' as const }
|
|
1757
|
+
},
|
|
1758
|
+
)
|
|
1759
|
+
.build(),
|
|
1760
|
+
})
|
|
1761
|
+
}
|
|
1762
|
+
}
|
|
1763
|
+
```
|
|
1764
|
+
|
|
1765
|
+
**Key Points:**
|
|
1766
|
+
- The envelope schema validates the full EventBridge message structure
|
|
1767
|
+
- The literal `detail-type` value in the schema is used for routing
|
|
1768
|
+
- Handlers receive the complete validated envelope
|
|
1769
|
+
- Access nested payload via `message.detail`
|
|
1770
|
+
|
|
1771
|
+
#### Multiple EventBridge Event Types
|
|
1772
|
+
|
|
1773
|
+
Handle multiple EventBridge event types with distinct detail-type values:
|
|
1774
|
+
|
|
1775
|
+
```typescript
|
|
1776
|
+
import { createEventBridgeSchema } from '@message-queue-toolkit/sqs'
|
|
1777
|
+
|
|
1778
|
+
// Step 1: Define detail (payload) schemas
|
|
1779
|
+
const USER_PRESENCE_DETAIL = z.object({
|
|
1780
|
+
userId: z.string(),
|
|
1781
|
+
status: z.string(),
|
|
1782
|
+
timestamp: z.string(),
|
|
1783
|
+
})
|
|
1784
|
+
|
|
1785
|
+
const USER_ROUTING_STATUS_DETAIL = z.object({
|
|
1786
|
+
userId: z.string(),
|
|
1787
|
+
routingStatus: z.object({
|
|
1788
|
+
id: z.string(),
|
|
1789
|
+
status: z.string(),
|
|
1790
|
+
}),
|
|
1791
|
+
timestamp: z.string(),
|
|
1792
|
+
})
|
|
1793
|
+
|
|
1794
|
+
// Step 2: Create envelope schemas with literal detail-type values
|
|
1795
|
+
const USER_PRESENCE_ENVELOPE = createEventBridgeSchema(
|
|
1796
|
+
USER_PRESENCE_DETAIL,
|
|
1797
|
+
'v2.users.{id}.presence' // Literal routing value
|
|
1798
|
+
)
|
|
1799
|
+
|
|
1800
|
+
const USER_ROUTING_STATUS_ENVELOPE = createEventBridgeSchema(
|
|
1801
|
+
USER_ROUTING_STATUS_DETAIL,
|
|
1802
|
+
'v2.users.{id}.routing.status' // Literal routing value
|
|
1803
|
+
)
|
|
1804
|
+
|
|
1805
|
+
// Step 3: Union type for all event envelopes
|
|
1806
|
+
type SupportedEventBridgeEvents =
|
|
1807
|
+
| z.infer<typeof USER_PRESENCE_ENVELOPE>
|
|
1808
|
+
| z.infer<typeof USER_ROUTING_STATUS_ENVELOPE>
|
|
1809
|
+
|
|
1810
|
+
// Step 4: Consumer with multiple handlers
|
|
1811
|
+
class MultiEventConsumer extends AbstractSqsConsumer<SupportedEventBridgeEvents, ExecutionContext> {
|
|
1812
|
+
constructor(dependencies: SQSConsumerDependencies) {
|
|
1813
|
+
super(dependencies, {
|
|
1814
|
+
creationConfig: { queue: { QueueName: 'multi-event-queue' } },
|
|
1815
|
+
|
|
1816
|
+
messageTypeField: 'detail-type',
|
|
1817
|
+
messageTimestampField: 'time',
|
|
1818
|
+
|
|
1819
|
+
handlers: new MessageHandlerConfigBuilder<SupportedEventBridgeEvents, ExecutionContext>()
|
|
1820
|
+
.addConfig(
|
|
1821
|
+
USER_PRESENCE_ENVELOPE,
|
|
1822
|
+
async (message, context) => {
|
|
1823
|
+
// message.detail is typed as UserPresenceDetail
|
|
1824
|
+
console.log(`User ${message.detail.userId} status: ${message.detail.status}`)
|
|
1825
|
+
return { result: 'success' as const }
|
|
1826
|
+
}
|
|
1827
|
+
)
|
|
1828
|
+
.addConfig(
|
|
1829
|
+
USER_ROUTING_STATUS_ENVELOPE,
|
|
1830
|
+
async (message, context) => {
|
|
1831
|
+
// message.detail is typed as UserRoutingStatusDetail
|
|
1832
|
+
console.log(`User ${message.detail.userId} routing: ${message.detail.routingStatus.status}`)
|
|
1833
|
+
return { result: 'success' as const }
|
|
1834
|
+
}
|
|
1835
|
+
)
|
|
1836
|
+
.build(),
|
|
1837
|
+
})
|
|
1838
|
+
}
|
|
1839
|
+
}
|
|
1840
|
+
```
|
|
1841
|
+
|
|
1842
|
+
#### Complete EventBridge Example
|
|
1843
|
+
|
|
1844
|
+
```typescript
|
|
1845
|
+
import { SQSClient } from '@aws-sdk/client-sqs'
|
|
1846
|
+
import {
|
|
1847
|
+
AbstractSqsConsumer,
|
|
1848
|
+
createEventBridgeSchema,
|
|
1849
|
+
SqsConsumerErrorResolver,
|
|
1850
|
+
type SQSConsumerDependencies
|
|
1851
|
+
} from '@message-queue-toolkit/sqs'
|
|
1852
|
+
import { MessageHandlerConfigBuilder } from '@message-queue-toolkit/core'
|
|
1853
|
+
import z from 'zod'
|
|
1854
|
+
|
|
1855
|
+
// 1. Define the detail payload schema
|
|
1856
|
+
const USER_CREATED_DETAIL = z.object({
|
|
1857
|
+
userId: z.string(),
|
|
1858
|
+
email: z.string().email(),
|
|
1859
|
+
name: z.string(),
|
|
1860
|
+
createdAt: z.string(),
|
|
1861
|
+
})
|
|
1862
|
+
|
|
1863
|
+
// 2. Create envelope schema with literal detail-type for routing
|
|
1864
|
+
const USER_CREATED_ENVELOPE = createEventBridgeSchema(
|
|
1865
|
+
USER_CREATED_DETAIL,
|
|
1866
|
+
'user.created' // Literal value for routing
|
|
1867
|
+
)
|
|
1868
|
+
|
|
1869
|
+
// 3. Type for the event envelope (what handlers receive)
|
|
1870
|
+
type UserCreatedEvent = z.infer<typeof USER_CREATED_ENVELOPE>
|
|
1871
|
+
|
|
1872
|
+
// 4. Create consumer
|
|
1873
|
+
class UserEventConsumer extends AbstractSqsConsumer<UserCreatedEvent> {
|
|
1874
|
+
constructor(dependencies: SQSConsumerDependencies) {
|
|
1875
|
+
super(dependencies, {
|
|
1876
|
+
creationConfig: {
|
|
1877
|
+
queue: { QueueName: 'user-events' },
|
|
1878
|
+
},
|
|
1879
|
+
|
|
1880
|
+
// EventBridge field mappings
|
|
1881
|
+
messageTypeField: 'detail-type',
|
|
1882
|
+
messageTimestampField: 'time',
|
|
1883
|
+
|
|
1884
|
+
handlers: new MessageHandlerConfigBuilder<UserCreatedEvent>()
|
|
1885
|
+
.addConfig(
|
|
1886
|
+
USER_CREATED_ENVELOPE,
|
|
1887
|
+
async (message) => {
|
|
1888
|
+
// message is the full EventBridge envelope
|
|
1889
|
+
// Access the detail field directly
|
|
1890
|
+
console.log(`New user created: ${message.detail.name} (${message.detail.email})`)
|
|
1891
|
+
await saveUserToDatabase(message.detail)
|
|
1892
|
+
return { result: 'success' as const }
|
|
1893
|
+
},
|
|
1894
|
+
)
|
|
1895
|
+
.build(),
|
|
1896
|
+
})
|
|
1897
|
+
}
|
|
1898
|
+
}
|
|
1899
|
+
|
|
1900
|
+
// 5. Use the consumer
|
|
1901
|
+
const sqsClient = new SQSClient({ region: 'us-east-1' })
|
|
1902
|
+
const consumer = new UserEventConsumer({
|
|
1903
|
+
sqsClient,
|
|
1904
|
+
consumerErrorResolver: new SqsConsumerErrorResolver(),
|
|
1905
|
+
errorReporter: { report: (error) => console.error(error) },
|
|
1906
|
+
logger: console,
|
|
1907
|
+
transactionObservabilityManager: undefined,
|
|
1908
|
+
})
|
|
1909
|
+
|
|
1910
|
+
await consumer.start()
|
|
1911
|
+
|
|
1912
|
+
// Example EventBridge event structure (for testing):
|
|
1913
|
+
const exampleEvent = {
|
|
1914
|
+
version: '0',
|
|
1915
|
+
id: '12345678-1234-1234-1234-123456789012',
|
|
1916
|
+
'detail-type': 'user.created',
|
|
1917
|
+
source: 'my.application',
|
|
1918
|
+
account: '123456789012',
|
|
1919
|
+
time: '2025-01-15T12:00:00Z',
|
|
1920
|
+
region: 'us-east-1',
|
|
1921
|
+
resources: [],
|
|
1922
|
+
detail: {
|
|
1923
|
+
userId: 'user-123',
|
|
1924
|
+
email: 'user@example.com',
|
|
1925
|
+
name: 'John Doe',
|
|
1926
|
+
createdAt: '2025-01-15T12:00:00Z',
|
|
1927
|
+
},
|
|
1928
|
+
} satisfies UserCreatedEvent
|
|
1929
|
+
```
|
|
1930
|
+
|
|
1931
|
+
### Custom Message Structures
|
|
1932
|
+
|
|
1933
|
+
For other non-standard message formats, you can configure the field mappings:
|
|
1934
|
+
|
|
1935
|
+
```typescript
|
|
1936
|
+
// Define your custom message schema
|
|
1937
|
+
const CUSTOM_MESSAGE_SCHEMA = z.object({
|
|
1938
|
+
eventType: z.literal('order.created'), // Routing field
|
|
1939
|
+
correlationId: z.string(),
|
|
1940
|
+
occurredAt: z.string(),
|
|
1941
|
+
data: z.object({
|
|
1942
|
+
orderId: z.string(),
|
|
1943
|
+
amount: z.number(),
|
|
1944
|
+
}),
|
|
1945
|
+
})
|
|
1946
|
+
|
|
1947
|
+
type CustomMessage = z.infer<typeof CUSTOM_MESSAGE_SCHEMA>
|
|
1948
|
+
|
|
1949
|
+
class CustomConsumer extends AbstractSqsConsumer<CustomMessage> {
|
|
1950
|
+
constructor(dependencies: SQSConsumerDependencies) {
|
|
1951
|
+
super(dependencies, {
|
|
1952
|
+
creationConfig: { queue: { QueueName: 'custom-queue' } },
|
|
1953
|
+
|
|
1954
|
+
// Map your custom field names
|
|
1955
|
+
messageTypeField: 'eventType', // Instead of 'type'
|
|
1956
|
+
messageIdField: 'correlationId', // Instead of 'id'
|
|
1957
|
+
messageTimestampField: 'occurredAt', // Instead of 'timestamp'
|
|
1958
|
+
|
|
1959
|
+
handlers: new MessageHandlerConfigBuilder<CustomMessage>()
|
|
1960
|
+
.addConfig(CUSTOM_MESSAGE_SCHEMA, async (message) => {
|
|
1961
|
+
// Handler receives the full validated message
|
|
1962
|
+
// Access nested data via message.data
|
|
1963
|
+
console.log(`Order ${message.data.orderId}: $${message.data.amount}`)
|
|
1964
|
+
return { result: 'success' as const }
|
|
1965
|
+
})
|
|
1966
|
+
.build(),
|
|
1967
|
+
})
|
|
1968
|
+
}
|
|
1969
|
+
}
|
|
1970
|
+
```
|
|
1971
|
+
|
|
1972
|
+
**Configuration Options:**
|
|
1973
|
+
|
|
1974
|
+
- `messageTypeField` (required) - Field name containing the message type for routing
|
|
1975
|
+
- `messageIdField` (optional, default: `'id'`) - Field name containing the message ID
|
|
1976
|
+
- `messageTimestampField` (optional, default: `'timestamp'`) - Field name containing the timestamp
|
|
1977
|
+
|
|
1673
1978
|
## FIFO Queues
|
|
1674
1979
|
|
|
1675
1980
|
FIFO (First-In-First-Out) queues provide message ordering and exactly-once processing.
|
|
@@ -1742,6 +2047,170 @@ Message 1 (user-123) → Message 2 (user-123) → Message 3 (user-123)
|
|
|
1742
2047
|
Message 4 (user-456) can process in parallel with above
|
|
1743
2048
|
```
|
|
1744
2049
|
|
|
2050
|
+
### FIFO Retry Behavior
|
|
2051
|
+
|
|
2052
|
+
**IMPORTANT**: FIFO queues have special retry behavior to preserve message ordering.
|
|
2053
|
+
|
|
2054
|
+
When a handler returns `{ error: 'retryLater' }` for a FIFO queue:
|
|
2055
|
+
|
|
2056
|
+
1. **The consumer throws an error** instead of republishing the message
|
|
2057
|
+
2. **AWS SQS handles the retry** using its native retry mechanism
|
|
2058
|
+
3. **Message order is preserved** within the MessageGroupId
|
|
2059
|
+
4. The message returns to the **same position** in the queue after visibility timeout
|
|
2060
|
+
|
|
2061
|
+
**Why this matters:**
|
|
2062
|
+
|
|
2063
|
+
```typescript
|
|
2064
|
+
// ❌ Standard queue: Republishes message to back of queue (breaks order)
|
|
2065
|
+
// Message 1 → Message 2 → Message 3
|
|
2066
|
+
// If Message 1 retries: Message 2 → Message 3 → Message 1 (wrong!)
|
|
2067
|
+
|
|
2068
|
+
// ✅ FIFO queue: Throws error, AWS retries in place (preserves order)
|
|
2069
|
+
// Message 1 → Message 2 → Message 3
|
|
2070
|
+
// If Message 1 retries: Message 1 (retry) → Message 2 → Message 3 (correct!)
|
|
2071
|
+
```
|
|
2072
|
+
|
|
2073
|
+
**Configuration:**
|
|
2074
|
+
|
|
2075
|
+
```typescript
|
|
2076
|
+
class MyFifoConsumer extends AbstractSqsConsumer<MessageType, Context> {
|
|
2077
|
+
constructor(dependencies: SQSConsumerDependencies) {
|
|
2078
|
+
super(dependencies, {
|
|
2079
|
+
creationConfig: {
|
|
2080
|
+
queue: {
|
|
2081
|
+
QueueName: 'my-queue.fifo',
|
|
2082
|
+
Attributes: {
|
|
2083
|
+
FifoQueue: 'true',
|
|
2084
|
+
VisibilityTimeout: '30', // Retry delay
|
|
2085
|
+
},
|
|
2086
|
+
},
|
|
2087
|
+
},
|
|
2088
|
+
handlers: new MessageHandlerConfigBuilder()
|
|
2089
|
+
.addConfig(SCHEMA, async (message) => {
|
|
2090
|
+
// Return retryLater to trigger AWS SQS native retry
|
|
2091
|
+
if (shouldRetry) {
|
|
2092
|
+
return { error: 'retryLater' }
|
|
2093
|
+
}
|
|
2094
|
+
return { result: 'success' }
|
|
2095
|
+
})
|
|
2096
|
+
.build(),
|
|
2097
|
+
})
|
|
2098
|
+
}
|
|
2099
|
+
}
|
|
2100
|
+
```
|
|
2101
|
+
|
|
2102
|
+
**Barrier Sleep Mechanism (FIFO Queues):**
|
|
2103
|
+
|
|
2104
|
+
When using barriers with FIFO queues, the consumer implements a smart sleep-and-check mechanism to avoid unnecessary AWS retries:
|
|
2105
|
+
|
|
2106
|
+
1. **Handler or barrier returns `{ error: 'retryLater' }`**
|
|
2107
|
+
2. **Consumer enters sleep loop** instead of immediately throwing error
|
|
2108
|
+
3. **Periodically re-checks barrier** (every `barrierSleepCheckIntervalInMsecs`, default: 5 seconds)
|
|
2109
|
+
4. **If barrier passes**: Process message successfully and exit
|
|
2110
|
+
5. **If max retry duration exceeded** (`maxRetryDuration`, default: 4 days): Send message to DLQ
|
|
2111
|
+
6. **Visibility timeout extended** every 30 seconds during sleep to prevent message reclaim
|
|
2112
|
+
|
|
2113
|
+
**Configuration with barrier sleep:**
|
|
2114
|
+
|
|
2115
|
+
```typescript
|
|
2116
|
+
class MyFifoConsumer extends AbstractSqsConsumer<MessageType, Context> {
|
|
2117
|
+
constructor(dependencies: SQSConsumerDependencies) {
|
|
2118
|
+
super(dependencies, {
|
|
2119
|
+
creationConfig: {
|
|
2120
|
+
queue: {
|
|
2121
|
+
QueueName: 'my-queue.fifo',
|
|
2122
|
+
Attributes: {
|
|
2123
|
+
FifoQueue: 'true',
|
|
2124
|
+
VisibilityTimeout: '3600', // 1 hour - must be greater than heartbeatInterval
|
|
2125
|
+
},
|
|
2126
|
+
},
|
|
2127
|
+
},
|
|
2128
|
+
maxRetryDuration: 345600, // 4 days in seconds (default)
|
|
2129
|
+
barrierSleepCheckIntervalInMsecs: 5000, // 5 seconds (default)
|
|
2130
|
+
|
|
2131
|
+
// Consumer configuration - controls visibility timeout management
|
|
2132
|
+
consumerOverrides: {
|
|
2133
|
+
heartbeatInterval: 300, // Extends visibility every 5 minutes (default)
|
|
2134
|
+
// Must be less than VisibilityTimeout
|
|
2135
|
+
// Prevents AWS from reclaiming the message during long processing or barrier sleep
|
|
2136
|
+
},
|
|
2137
|
+
|
|
2138
|
+
handlers: new MessageHandlerConfigBuilder()
|
|
2139
|
+
.addConfig(
|
|
2140
|
+
SCHEMA,
|
|
2141
|
+
async (message) => {
|
|
2142
|
+
return { result: 'success' }
|
|
2143
|
+
},
|
|
2144
|
+
{
|
|
2145
|
+
preHandlerBarrier: async (message, context) => {
|
|
2146
|
+
// Check if prerequisite is met
|
|
2147
|
+
const prerequisiteMet = await checkPrerequisite(message)
|
|
2148
|
+
return { isPassing: prerequisiteMet }
|
|
2149
|
+
}
|
|
2150
|
+
}
|
|
2151
|
+
)
|
|
2152
|
+
.build(),
|
|
2153
|
+
})
|
|
2154
|
+
}
|
|
2155
|
+
}
|
|
2156
|
+
```
|
|
2157
|
+
|
|
2158
|
+
**Retry flow for FIFO queues (with barrier sleep):**
|
|
2159
|
+
1. Handler or barrier returns `{ error: 'retryLater' }`
|
|
2160
|
+
2. Consumer enters sleep loop for up to `maxRetryDuration` (default: 4 days)
|
|
2161
|
+
3. Every `barrierSleepCheckIntervalInMsecs` (default: 5 sec), consumer:
|
|
2162
|
+
- Re-checks barrier
|
|
2163
|
+
- Extends visibility timeout (every 30 seconds)
|
|
2164
|
+
4. If barrier passes: Process message and mark as consumed
|
|
2165
|
+
5. If `maxRetryDuration` exceeded: Send message to DLQ with error `"FIFO queue: Retry duration exceeded. Moving message to DLQ."`
|
|
2166
|
+
|
|
2167
|
+
**Retry flow for FIFO queues (without barrier - immediate retry):**
|
|
2168
|
+
1. Handler returns `{ error: 'retryLater' }` but no barrier configured
|
|
2169
|
+
2. Consumer immediately throws error: `"FIFO queue: Triggering AWS SQS retry to preserve message order"`
|
|
2170
|
+
3. AWS SQS makes message invisible for `VisibilityTimeout` duration
|
|
2171
|
+
4. After timeout, message becomes visible again **at the same position**
|
|
2172
|
+
5. Consumer processes it again
|
|
2173
|
+
|
|
2174
|
+
**Retry duration limit:**
|
|
2175
|
+
- The `maxRetryDuration` setting still applies (default: 4 days)
|
|
2176
|
+
- After exceeding retry duration, message moves to DLQ
|
|
2177
|
+
- Error message: `"FIFO queue: Retry duration exceeded. Moving message to DLQ"`
|
|
2178
|
+
|
|
2179
|
+
**Understanding VisibilityTimeout and heartbeatInterval:**
|
|
2180
|
+
|
|
2181
|
+
The visibility timeout mechanism prevents multiple consumers from processing the same message:
|
|
2182
|
+
|
|
2183
|
+
- **`VisibilityTimeout` (queue attribute)**: Initial time (in seconds) that a message is hidden from other consumers after being received. This is the starting timeout when a message is first picked up.
|
|
2184
|
+
|
|
2185
|
+
- **`heartbeatInterval` (consumerOverrides option)**: Interval (in seconds) at which the consumer automatically extends the visibility timeout using `ChangeMessageVisibilityCommand`. This keeps the message "locked" to the current consumer during long processing.
|
|
2186
|
+
|
|
2187
|
+
**How they work together:**
|
|
2188
|
+
|
|
2189
|
+
1. **Message received**: AWS SQS hides message for `VisibilityTimeout` seconds
|
|
2190
|
+
2. **During processing**: Consumer automatically extends timeout every `heartbeatInterval` seconds
|
|
2191
|
+
3. **If processing exceeds VisibilityTimeout without extension**: AWS makes message visible again (allowing retry)
|
|
2192
|
+
4. **Requirement**: `heartbeatInterval` < `VisibilityTimeout` (otherwise extension happens after message already became visible)
|
|
2193
|
+
|
|
2194
|
+
**For FIFO queues with barrier sleep:**
|
|
2195
|
+
- The barrier sleep mechanism can explicitly extend visibility timeout every 30 seconds
|
|
2196
|
+
- Extensions set visibility to 90 seconds **from now** (not cumulative) before each sleep chunk
|
|
2197
|
+
- Extension happens BEFORE sleeping (not after) to prevent first-check vulnerability
|
|
2198
|
+
- The 90-second value (3x the check interval) provides a 60-second safety buffer against timing drift
|
|
2199
|
+
- However, it smartly defers to `heartbeatInterval` when set to avoid redundant API calls:
|
|
2200
|
+
- If `heartbeatInterval` <= 30 seconds: rely on sqs-consumer's automatic extension (no explicit extension)
|
|
2201
|
+
- If `heartbeatInterval` > 30 seconds or not set: explicitly extend every 30 seconds during sleep
|
|
2202
|
+
- This optimization prevents unnecessary ChangeMessageVisibility API calls
|
|
2203
|
+
- Set `VisibilityTimeout` high enough for expected barrier wait time (e.g., 3600 seconds / 1 hour)
|
|
2204
|
+
|
|
2205
|
+
**Best practices:**
|
|
2206
|
+
- Set `VisibilityTimeout` high enough to accommodate the barrier sleep period (consider `maxRetryDuration`)
|
|
2207
|
+
- Use `heartbeatInterval` < `VisibilityTimeout` (default: 300 seconds / 5 minutes)
|
|
2208
|
+
- For long-running barriers: increase `VisibilityTimeout` (not `heartbeatInterval`)
|
|
2209
|
+
- Use `maxRetryDuration` to control total retry time for both FIFO and standard queues
|
|
2210
|
+
- Adjust `barrierSleepCheckIntervalInMsecs` based on how quickly prerequisites typically become available
|
|
2211
|
+
- For FIFO queues: barriers are rechecked periodically instead of republishing messages
|
|
2212
|
+
- For standard queues: messages are republished with exponential backoff delay
|
|
2213
|
+
|
|
1745
2214
|
### Message Groups
|
|
1746
2215
|
|
|
1747
2216
|
Message groups enable parallel processing while maintaining order:
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export type { SQSMessageOptions, SQSPublisherOptions } from './sqs/AbstractSqsPu
|
|
|
6
6
|
export { AbstractSqsPublisher, OFFLOADED_PAYLOAD_SIZE_ATTRIBUTE, } from './sqs/AbstractSqsPublisher.ts';
|
|
7
7
|
export { type ExtraSQSCreationParams, SQS_MESSAGE_MAX_SIZE, SQS_RESOURCE_ANY, SQS_RESOURCE_CURRENT_QUEUE, type SQSCreationConfig, type SQSDependencies, type SQSOptions, type SQSPolicyConfig, type SQSQueueConfig, type SQSQueueLocatorType, } from './sqs/AbstractSqsService.ts';
|
|
8
8
|
export type { CommonMessage, SQSMessage } from './types/MessageTypes.ts';
|
|
9
|
+
export { createEventBridgeSchema, createEventBridgeSchemas, type EventBridgeDetail, } from './utils/eventBridgeSchemaBuilder.ts';
|
|
9
10
|
export { resolveOutgoingMessageAttributes } from './utils/messageUtils.ts';
|
|
10
11
|
export { generateQueuePublishForTopicPolicy, generateWildcardSnsArn, generateWildcardSqsArn, } from './utils/sqsAttributeUtils.ts';
|
|
11
12
|
export { deleteSqs, updateQueueAttributes } from './utils/sqsInitter.ts';
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export { FakeConsumerErrorResolver } from "./fakes/FakeConsumerErrorResolver.js"
|
|
|
3
3
|
export { AbstractSqsConsumer } from "./sqs/AbstractSqsConsumer.js";
|
|
4
4
|
export { AbstractSqsPublisher, OFFLOADED_PAYLOAD_SIZE_ATTRIBUTE, } from "./sqs/AbstractSqsPublisher.js";
|
|
5
5
|
export { SQS_MESSAGE_MAX_SIZE, SQS_RESOURCE_ANY, SQS_RESOURCE_CURRENT_QUEUE, } from "./sqs/AbstractSqsService.js";
|
|
6
|
+
export { createEventBridgeSchema, createEventBridgeSchemas, } from "./utils/eventBridgeSchemaBuilder.js";
|
|
6
7
|
export { resolveOutgoingMessageAttributes } from "./utils/messageUtils.js";
|
|
7
8
|
export { generateQueuePublishForTopicPolicy, generateWildcardSnsArn, generateWildcardSqsArn, } from "./utils/sqsAttributeUtils.js";
|
|
8
9
|
export { deleteSqs, updateQueueAttributes } from "./utils/sqsInitter.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAGlE,OAAO,EACL,oBAAoB,EACpB,gCAAgC,GACjC,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAEL,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,GAO3B,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EACL,WAAW,EACX,4BAA4B,EAC5B,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,gCAAgC,EAChC,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAA;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AAEhF,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAGlE,OAAO,EACL,oBAAoB,EACpB,gCAAgC,GACjC,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAEL,oBAAoB,EACpB,gBAAgB,EAChB,0BAA0B,GAO3B,MAAM,6BAA6B,CAAA;AAEpC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAEzB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,EACL,kCAAkC,EAClC,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EACL,WAAW,EACX,4BAA4B,EAC5B,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,gCAAgC,EAChC,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,qBAAqB,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Either, ErrorResolver } from '@lokalise/node-core';
|
|
2
2
|
import { type BarrierResult, type MessageSchemaContainer, type PreHandlingOutputs, type Prehandler, type QueueConsumer, type QueueConsumerDependencies, type QueueConsumerOptions } from '@message-queue-toolkit/core';
|
|
3
3
|
import type { ConsumerOptions } from 'sqs-consumer';
|
|
4
|
+
import type { ZodSchema } from 'zod/v4';
|
|
4
5
|
import type { SQSMessage } from '../types/MessageTypes.ts';
|
|
5
6
|
import type { SQSCreationConfig, SQSDependencies, SQSQueueLocatorType } from './AbstractSqsService.ts';
|
|
6
7
|
import { AbstractSqsService } from './AbstractSqsService.ts';
|
|
@@ -10,15 +11,42 @@ type SQSDeadLetterQueueOptions = {
|
|
|
10
11
|
};
|
|
11
12
|
};
|
|
12
13
|
export type SQSConsumerDependencies = SQSDependencies & QueueConsumerDependencies;
|
|
13
|
-
|
|
14
|
+
type SQSConsumerCommonOptions<MessagePayloadSchemas extends object, ExecutionContext, PrehandlerOutput, CreationConfigType extends SQSCreationConfig = SQSCreationConfig, QueueLocatorType extends object = SQSQueueLocatorType> = QueueConsumerOptions<CreationConfigType, QueueLocatorType, SQSDeadLetterQueueOptions, MessagePayloadSchemas, ExecutionContext, PrehandlerOutput, SQSCreationConfig, SQSQueueLocatorType> & {
|
|
14
15
|
/**
|
|
15
16
|
* Omitting properties which will be set internally ins this class
|
|
16
17
|
* `visibilityTimeout` is also omitted to avoid conflicts with queue config
|
|
17
18
|
*/
|
|
18
19
|
consumerOverrides?: Omit<ConsumerOptions, 'sqs' | 'queueUrl' | 'handler' | 'handleMessageBatch' | 'visibilityTimeout' | 'messageAttributeNames' | 'messageSystemAttributeNames' | 'attributeNames'>;
|
|
19
20
|
concurrentConsumersAmount?: number;
|
|
20
|
-
fifoQueue?: boolean;
|
|
21
21
|
};
|
|
22
|
+
type SQSConsumerFifoOptions = {
|
|
23
|
+
fifoQueue: true;
|
|
24
|
+
/**
|
|
25
|
+
* Interval in milliseconds between barrier re-checks during sleep period (FIFO queues only).
|
|
26
|
+
* FIFO queues sleep and recheck barriers instead of republishing messages to preserve order.
|
|
27
|
+
* The consumer will sleep and recheck for up to maxRetryDuration before moving to DLQ.
|
|
28
|
+
* Default: 5000 (5 seconds)
|
|
29
|
+
*/
|
|
30
|
+
barrierSleepCheckIntervalInMsecs?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Interval in milliseconds between visibility timeout extensions during barrier sleep (FIFO queues only).
|
|
33
|
+
* Extensions happen BEFORE each sleep chunk to prevent message from becoming visible during long waits.
|
|
34
|
+
* Should be less than the VisibilityTimeout to prevent message reclaim.
|
|
35
|
+
* Default: 30000 (30 seconds)
|
|
36
|
+
*/
|
|
37
|
+
barrierVisibilityExtensionIntervalInMsecs?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Duration in seconds to extend visibility timeout to during barrier sleep (FIFO queues only).
|
|
40
|
+
* Each extension sets visibility to this value from NOW (not cumulative).
|
|
41
|
+
* Should be significantly longer than barrierVisibilityExtensionIntervalInMsecs for safety buffer.
|
|
42
|
+
* Default: 90 (90 seconds, providing 60s buffer with 30s check interval)
|
|
43
|
+
*/
|
|
44
|
+
barrierVisibilityTimeoutInSeconds?: number;
|
|
45
|
+
};
|
|
46
|
+
type SQSConsumerStandardQueueOptions = {
|
|
47
|
+
fifoQueue?: false;
|
|
48
|
+
};
|
|
49
|
+
export type SQSConsumerOptions<MessagePayloadSchemas extends object, ExecutionContext, PrehandlerOutput, CreationConfigType extends SQSCreationConfig = SQSCreationConfig, QueueLocatorType extends object = SQSQueueLocatorType> = (SQSConsumerCommonOptions<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput, CreationConfigType, QueueLocatorType> & SQSConsumerFifoOptions) | (SQSConsumerCommonOptions<MessagePayloadSchemas, ExecutionContext, PrehandlerOutput, CreationConfigType, QueueLocatorType> & SQSConsumerStandardQueueOptions);
|
|
22
50
|
export declare abstract class AbstractSqsConsumer<MessagePayloadType extends object, ExecutionContext, PrehandlerOutput = undefined, CreationConfigType extends SQSCreationConfig = SQSCreationConfig, QueueLocatorType extends object = SQSQueueLocatorType, ConsumerOptionsType extends SQSConsumerOptions<MessagePayloadType, ExecutionContext, PrehandlerOutput, CreationConfigType, QueueLocatorType> = SQSConsumerOptions<MessagePayloadType, ExecutionContext, PrehandlerOutput, CreationConfigType, QueueLocatorType>> extends AbstractSqsService<MessagePayloadType, QueueLocatorType, CreationConfigType, ConsumerOptionsType, SQSConsumerDependencies, ExecutionContext, PrehandlerOutput> implements QueueConsumer {
|
|
23
51
|
private consumers;
|
|
24
52
|
private readonly concurrentConsumersAmount;
|
|
@@ -29,6 +57,9 @@ export declare abstract class AbstractSqsConsumer<MessagePayloadType extends obj
|
|
|
29
57
|
private readonly isDeduplicationEnabled;
|
|
30
58
|
private maxRetryDuration;
|
|
31
59
|
private cachedContentBasedDeduplication?;
|
|
60
|
+
private readonly barrierSleepCheckIntervalInMsecs;
|
|
61
|
+
private readonly barrierVisibilityExtensionIntervalInMsecs;
|
|
62
|
+
private readonly barrierVisibilityTimeoutInSeconds;
|
|
32
63
|
protected deadLetterQueueUrl?: string;
|
|
33
64
|
protected readonly errorResolver: ErrorResolver;
|
|
34
65
|
protected readonly executionContext: ExecutionContext;
|
|
@@ -40,6 +71,27 @@ export declare abstract class AbstractSqsConsumer<MessagePayloadType extends obj
|
|
|
40
71
|
close(abort?: boolean): Promise<void>;
|
|
41
72
|
private createConsumer;
|
|
42
73
|
private handleRetryLater;
|
|
74
|
+
/**
|
|
75
|
+
* Sleep and periodically recheck barrier for FIFO queues.
|
|
76
|
+
* This method implements the barrier sleep mechanism to avoid unnecessary AWS retries.
|
|
77
|
+
*/
|
|
78
|
+
private sleepAndRecheckBarrier;
|
|
79
|
+
/**
|
|
80
|
+
* Sleep for the specified duration while optionally extending visibility timeout to prevent message reclaim.
|
|
81
|
+
* AWS SQS will reclaim messages if visibility timeout expires during processing.
|
|
82
|
+
*
|
|
83
|
+
* Visibility extension strategy:
|
|
84
|
+
* - If heartbeatInterval is set and <= extension interval: rely on sqs-consumer's automatic extension
|
|
85
|
+
* - Otherwise: explicitly extend at configured intervals during sleep
|
|
86
|
+
*
|
|
87
|
+
* This prevents redundant API calls when heartbeatInterval already provides sufficient coverage.
|
|
88
|
+
*/
|
|
89
|
+
private sleepWithVisibilityTimeoutExtension;
|
|
90
|
+
/**
|
|
91
|
+
* Determines whether to use async or sync path for building retry message params.
|
|
92
|
+
* For FIFO queues with locatorConfig, we need to fetch ContentBasedDeduplication from SQS.
|
|
93
|
+
*/
|
|
94
|
+
private buildRetryMessageParamsWithDeduplicationCheck;
|
|
43
95
|
/**
|
|
44
96
|
* Builds SendMessageCommand parameters for retry, handling FIFO vs standard queues (synchronous)
|
|
45
97
|
*/
|
|
@@ -55,7 +107,7 @@ export declare abstract class AbstractSqsConsumer<MessagePayloadType extends obj
|
|
|
55
107
|
protected processMessage(message: MessagePayloadType, messageType: string, preHandlingOutputs: PreHandlingOutputs<PrehandlerOutput, any>): Promise<Either<'retryLater', 'success'>>;
|
|
56
108
|
protected processPrehandlers(message: MessagePayloadType, messageType: string): Promise<PrehandlerOutput>;
|
|
57
109
|
protected preHandlerBarrier<BarrierOutput>(message: MessagePayloadType, messageType: string, preHandlerOutput: PrehandlerOutput): Promise<BarrierResult<BarrierOutput>>;
|
|
58
|
-
protected resolveSchema(message: MessagePayloadType): Either<Error,
|
|
110
|
+
protected resolveSchema(message: MessagePayloadType): Either<Error, ZodSchema<MessagePayloadType>>;
|
|
59
111
|
protected resolveNextFunction(preHandlers: Prehandler<MessagePayloadType, ExecutionContext, unknown>[], message: MessagePayloadType, index: number, preHandlerOutput: PrehandlerOutput, resolve: (value: PrehandlerOutput | PromiseLike<PrehandlerOutput>) => void, reject: (err: Error) => void): (preHandlerResult: import("@message-queue-toolkit/core").PrehandlerResult) => void;
|
|
60
112
|
protected resolveMessageLog(message: MessagePayloadType, messageType: string): unknown;
|
|
61
113
|
protected resolveMessage(message: SQSMessage): Either<import("@message-queue-toolkit/core").MessageInvalidFormatError | import("@message-queue-toolkit/core").MessageValidationError, import("@message-queue-toolkit/core").ResolvedMessage>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SendMessageCommand, SetQueueAttributesCommand } from '@aws-sdk/client-sqs';
|
|
1
|
+
import { ChangeMessageVisibilityCommand, SendMessageCommand, SetQueueAttributesCommand, } from '@aws-sdk/client-sqs';
|
|
2
2
|
import { DeduplicationRequesterEnum, HandlerContainer, isMessageError, noopReleasableLock, parseMessage, } from '@message-queue-toolkit/core';
|
|
3
3
|
import { Consumer } from 'sqs-consumer';
|
|
4
4
|
import { hasOffloadedPayload } from "../utils/messageUtils.js";
|
|
@@ -11,6 +11,9 @@ const ABORT_EARLY_EITHER = {
|
|
|
11
11
|
error: 'abort',
|
|
12
12
|
};
|
|
13
13
|
const DEFAULT_MAX_RETRY_DURATION = 4 * 24 * 60 * 60; // 4 days in seconds
|
|
14
|
+
const DEFAULT_BARRIER_SLEEP_CHECK_INTERVAL_IN_MSECS = 5000; // 5 seconds in milliseconds
|
|
15
|
+
const DEFAULT_BARRIER_VISIBILITY_EXTENSION_INTERVAL_IN_MSECS = 30000; // 30 seconds in milliseconds
|
|
16
|
+
const DEFAULT_BARRIER_VISIBILITY_TIMEOUT_IN_SECONDS = 90; // 90 seconds
|
|
14
17
|
export class AbstractSqsConsumer extends AbstractSqsService {
|
|
15
18
|
consumers;
|
|
16
19
|
concurrentConsumersAmount;
|
|
@@ -21,6 +24,9 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
21
24
|
isDeduplicationEnabled;
|
|
22
25
|
maxRetryDuration;
|
|
23
26
|
cachedContentBasedDeduplication;
|
|
27
|
+
barrierSleepCheckIntervalInMsecs;
|
|
28
|
+
barrierVisibilityExtensionIntervalInMsecs;
|
|
29
|
+
barrierVisibilityTimeoutInSeconds;
|
|
24
30
|
deadLetterQueueUrl;
|
|
25
31
|
errorResolver;
|
|
26
32
|
executionContext;
|
|
@@ -32,6 +38,15 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
32
38
|
this.consumerOptionsOverride = options.consumerOverrides ?? {};
|
|
33
39
|
this.deadLetterQueueOptions = options.deadLetterQueue;
|
|
34
40
|
this.maxRetryDuration = options.maxRetryDuration ?? DEFAULT_MAX_RETRY_DURATION;
|
|
41
|
+
// Access FIFO-specific options (only available when fifoQueue: true)
|
|
42
|
+
const fifoOptions = options;
|
|
43
|
+
this.barrierSleepCheckIntervalInMsecs =
|
|
44
|
+
fifoOptions.barrierSleepCheckIntervalInMsecs ?? DEFAULT_BARRIER_SLEEP_CHECK_INTERVAL_IN_MSECS;
|
|
45
|
+
this.barrierVisibilityExtensionIntervalInMsecs =
|
|
46
|
+
fifoOptions.barrierVisibilityExtensionIntervalInMsecs ??
|
|
47
|
+
DEFAULT_BARRIER_VISIBILITY_EXTENSION_INTERVAL_IN_MSECS;
|
|
48
|
+
this.barrierVisibilityTimeoutInSeconds =
|
|
49
|
+
fifoOptions.barrierVisibilityTimeoutInSeconds ?? DEFAULT_BARRIER_VISIBILITY_TIMEOUT_IN_SECONDS;
|
|
35
50
|
this.executionContext = executionContext;
|
|
36
51
|
this.consumers = [];
|
|
37
52
|
this.concurrentConsumersAmount = options.concurrentConsumersAmount ?? 1;
|
|
@@ -132,7 +147,7 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
132
147
|
// We don't want to discard message yet as we don't know if the other consumer will be able to process it successfully.
|
|
133
148
|
// We're re-queueing the message, so it can be processed later.
|
|
134
149
|
if (acquireLockResult.error) {
|
|
135
|
-
await this.handleRetryLater(message, originalMessage, parsedMessage, messageProcessingStartTimestamp);
|
|
150
|
+
await this.handleRetryLater(message, originalMessage, parsedMessage, messageProcessingStartTimestamp, false);
|
|
136
151
|
return message;
|
|
137
152
|
}
|
|
138
153
|
// While the consumer was waiting for a lock to be acquired, the message might have been processed
|
|
@@ -183,7 +198,7 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
183
198
|
}
|
|
184
199
|
if (result.error === 'retryLater') {
|
|
185
200
|
await acquireLockResult.result?.release();
|
|
186
|
-
await this.handleRetryLater(message, originalMessage, parsedMessage, messageProcessingStartTimestamp);
|
|
201
|
+
await this.handleRetryLater(message, originalMessage, parsedMessage, messageProcessingStartTimestamp, true);
|
|
187
202
|
return message;
|
|
188
203
|
}
|
|
189
204
|
await acquireLockResult.result?.release();
|
|
@@ -197,21 +212,42 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
197
212
|
},
|
|
198
213
|
});
|
|
199
214
|
}
|
|
200
|
-
async handleRetryLater(message, originalMessage, parsedMessage, messageProcessingStartTimestamp) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
if
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
215
|
+
async handleRetryLater(message, originalMessage, parsedMessage, messageProcessingStartTimestamp, isHandlerRetry = true) {
|
|
216
|
+
/**
|
|
217
|
+
* For FIFO queues, we use a special retry approach to preserve message ordering.
|
|
218
|
+
* For handler/barrier retries: sleep and periodically re-check until barrier passes or max sleep exceeded
|
|
219
|
+
* For lock failures: throw error immediately to trigger AWS retry
|
|
220
|
+
*/
|
|
221
|
+
if (this.isFifoQueue) {
|
|
222
|
+
// Check if retry is still within the allowed duration
|
|
223
|
+
if (this.shouldBeRetried(originalMessage, this.maxRetryDuration)) {
|
|
224
|
+
// Only use sleep-and-recheck for handler/barrier retries, not lock failures
|
|
225
|
+
if (isHandlerRetry) {
|
|
226
|
+
await this.sleepAndRecheckBarrier(message, originalMessage, parsedMessage, messageProcessingStartTimestamp);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// For lock failures, throw error immediately
|
|
230
|
+
this.handleMessageProcessed({
|
|
231
|
+
message: parsedMessage,
|
|
232
|
+
processingResult: { status: 'retryLater' },
|
|
233
|
+
messageProcessingStartTimestamp,
|
|
234
|
+
queueName: this.queueName,
|
|
235
|
+
});
|
|
236
|
+
throw new Error('FIFO queue: Lock acquisition failed. Triggering AWS SQS retry to preserve message order.');
|
|
214
237
|
}
|
|
238
|
+
// Retry duration exceeded for FIFO queue
|
|
239
|
+
await this.failProcessing(message);
|
|
240
|
+
this.handleMessageProcessed({
|
|
241
|
+
message: parsedMessage,
|
|
242
|
+
processingResult: { status: 'error', errorReason: 'retryLaterExceeded' },
|
|
243
|
+
messageProcessingStartTimestamp,
|
|
244
|
+
queueName: this.queueName,
|
|
245
|
+
});
|
|
246
|
+
throw new Error('FIFO queue: Retry duration exceeded. Moving message to DLQ.');
|
|
247
|
+
}
|
|
248
|
+
// Standard queue handling: republish the message with delay
|
|
249
|
+
if (this.shouldBeRetried(originalMessage, this.maxRetryDuration)) {
|
|
250
|
+
const sendMessageParams = await this.buildRetryMessageParamsWithDeduplicationCheck(message, originalMessage);
|
|
215
251
|
await this.sqsClient.send(new SendMessageCommand(sendMessageParams));
|
|
216
252
|
this.handleMessageProcessed({
|
|
217
253
|
message: parsedMessage,
|
|
@@ -230,6 +266,118 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
230
266
|
});
|
|
231
267
|
}
|
|
232
268
|
}
|
|
269
|
+
/**
|
|
270
|
+
* Sleep and periodically recheck barrier for FIFO queues.
|
|
271
|
+
* This method implements the barrier sleep mechanism to avoid unnecessary AWS retries.
|
|
272
|
+
*/
|
|
273
|
+
async sleepAndRecheckBarrier(message, originalMessage, parsedMessage, messageProcessingStartTimestamp) {
|
|
274
|
+
// Extract message type for barrier rechecks
|
|
275
|
+
// @ts-expect-error
|
|
276
|
+
const messageType = parsedMessage[this.messageTypeField];
|
|
277
|
+
// Sleep and periodically recheck barrier until maxRetryDuration is exceeded
|
|
278
|
+
while (this.shouldBeRetried(originalMessage, this.maxRetryDuration)) {
|
|
279
|
+
// Sleep for the check interval
|
|
280
|
+
await this.sleepWithVisibilityTimeoutExtension(message, this.barrierSleepCheckIntervalInMsecs);
|
|
281
|
+
// Re-check barrier
|
|
282
|
+
const result = await this.internalProcessMessage(parsedMessage, messageType).catch((err) => {
|
|
283
|
+
this.handleError(err);
|
|
284
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
285
|
+
return { error: err };
|
|
286
|
+
});
|
|
287
|
+
// If barrier passed and message processed successfully, we're done
|
|
288
|
+
if ('result' in result && result.result === 'success') {
|
|
289
|
+
this.handleMessageProcessed({
|
|
290
|
+
message: originalMessage,
|
|
291
|
+
processingResult: { status: 'consumed' },
|
|
292
|
+
messageProcessingStartTimestamp,
|
|
293
|
+
queueName: this.queueName,
|
|
294
|
+
});
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
// If handler threw an error (not just retryLater), rethrow it
|
|
298
|
+
if (result.error !== 'retryLater') {
|
|
299
|
+
this.handleMessageProcessed({
|
|
300
|
+
message: parsedMessage,
|
|
301
|
+
processingResult: { status: 'error', errorReason: 'handlerError' },
|
|
302
|
+
messageProcessingStartTimestamp,
|
|
303
|
+
queueName: this.queueName,
|
|
304
|
+
});
|
|
305
|
+
throw result.error;
|
|
306
|
+
}
|
|
307
|
+
// Barrier still not passing, continue sleeping
|
|
308
|
+
}
|
|
309
|
+
// Max retry duration exceeded, send to DLQ
|
|
310
|
+
await this.failProcessing(message);
|
|
311
|
+
this.handleMessageProcessed({
|
|
312
|
+
message: parsedMessage,
|
|
313
|
+
processingResult: { status: 'error', errorReason: 'retryLaterExceeded' },
|
|
314
|
+
messageProcessingStartTimestamp,
|
|
315
|
+
queueName: this.queueName,
|
|
316
|
+
});
|
|
317
|
+
throw new Error('FIFO queue: Retry duration exceeded. Moving message to DLQ.');
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Sleep for the specified duration while optionally extending visibility timeout to prevent message reclaim.
|
|
321
|
+
* AWS SQS will reclaim messages if visibility timeout expires during processing.
|
|
322
|
+
*
|
|
323
|
+
* Visibility extension strategy:
|
|
324
|
+
* - If heartbeatInterval is set and <= extension interval: rely on sqs-consumer's automatic extension
|
|
325
|
+
* - Otherwise: explicitly extend at configured intervals during sleep
|
|
326
|
+
*
|
|
327
|
+
* This prevents redundant API calls when heartbeatInterval already provides sufficient coverage.
|
|
328
|
+
*/
|
|
329
|
+
async sleepWithVisibilityTimeoutExtension(message, sleepDurationMs) {
|
|
330
|
+
// Check if heartbeatInterval is set and sufficient for our needs
|
|
331
|
+
// If heartbeatInterval <= extension interval, sqs-consumer will extend frequently enough
|
|
332
|
+
const heartbeatInterval = this.consumerOptionsOverride?.heartbeatInterval;
|
|
333
|
+
const extensionIntervalSeconds = this.barrierVisibilityExtensionIntervalInMsecs / 1000;
|
|
334
|
+
const shouldExplicitlyExtend = !heartbeatInterval || heartbeatInterval > extensionIntervalSeconds;
|
|
335
|
+
let remainingSleepMs = sleepDurationMs;
|
|
336
|
+
const startTime = Date.now();
|
|
337
|
+
while (remainingSleepMs > 0) {
|
|
338
|
+
// Extend visibility timeout BEFORE sleeping (not after) to prevent message from becoming visible
|
|
339
|
+
// Only extend explicitly if heartbeatInterval is not set or is too long
|
|
340
|
+
if (shouldExplicitlyExtend) {
|
|
341
|
+
try {
|
|
342
|
+
await this.sqsClient.send(new ChangeMessageVisibilityCommand({
|
|
343
|
+
QueueUrl: this.queueUrl,
|
|
344
|
+
ReceiptHandle: message.ReceiptHandle,
|
|
345
|
+
VisibilityTimeout: this.barrierVisibilityTimeoutInSeconds,
|
|
346
|
+
}));
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
// Log error but don't fail - the message might have already been processed or deleted
|
|
350
|
+
this.logger.warn({
|
|
351
|
+
message: 'Failed to extend visibility timeout during barrier sleep',
|
|
352
|
+
error: err,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Now sleep for the chunk
|
|
357
|
+
const sleepChunkMs = Math.min(remainingSleepMs, this.barrierVisibilityExtensionIntervalInMsecs);
|
|
358
|
+
await new Promise((resolve) => setTimeout(resolve, sleepChunkMs));
|
|
359
|
+
// Calculate remaining sleep time for next iteration
|
|
360
|
+
remainingSleepMs = sleepDurationMs - (Date.now() - startTime);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Determines whether to use async or sync path for building retry message params.
|
|
365
|
+
* For FIFO queues with locatorConfig, we need to fetch ContentBasedDeduplication from SQS.
|
|
366
|
+
*/
|
|
367
|
+
async buildRetryMessageParamsWithDeduplicationCheck(message, originalMessage) {
|
|
368
|
+
// For FIFO queues, check if ContentBasedDeduplication is explicitly set in creationConfig
|
|
369
|
+
// If not explicitly set (undefined), we must fetch from SQS (async path)
|
|
370
|
+
if (this.isFifoQueue) {
|
|
371
|
+
const contentBasedDedup = this.creationConfig?.queue.Attributes?.ContentBasedDeduplication;
|
|
372
|
+
const isContentBasedDedupExplicit = contentBasedDedup === 'true' || contentBasedDedup === 'false';
|
|
373
|
+
if (!isContentBasedDedupExplicit) {
|
|
374
|
+
// Need to fetch ContentBasedDeduplication attribute from SQS (locatorConfig or not explicitly set)
|
|
375
|
+
return await this.buildFifoRetryMessageParamsAsync(message, originalMessage);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Standard queue or FIFO with explicit ContentBasedDeduplication value - synchronous path
|
|
379
|
+
return this.buildRetryMessageParams(message, originalMessage);
|
|
380
|
+
}
|
|
233
381
|
/**
|
|
234
382
|
* Builds SendMessageCommand parameters for retry, handling FIFO vs standard queues (synchronous)
|
|
235
383
|
*/
|
|
@@ -398,12 +546,13 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
398
546
|
if (resolveMessageResult.error) {
|
|
399
547
|
return ABORT_EARLY_EITHER;
|
|
400
548
|
}
|
|
401
|
-
const
|
|
549
|
+
const fullMessage = resolveMessageResult.result.body;
|
|
550
|
+
const resolveSchemaResult = this.resolveSchema(fullMessage);
|
|
402
551
|
if (resolveSchemaResult.error) {
|
|
403
552
|
this.handleError(resolveSchemaResult.error);
|
|
404
553
|
return ABORT_EARLY_EITHER;
|
|
405
554
|
}
|
|
406
|
-
const deserializationResult = parseMessage(
|
|
555
|
+
const deserializationResult = parseMessage(fullMessage, resolveSchemaResult.result, this.errorResolver);
|
|
407
556
|
if (isMessageError(deserializationResult.error)) {
|
|
408
557
|
this.handleError(deserializationResult.error);
|
|
409
558
|
return ABORT_EARLY_EITHER;
|
|
@@ -413,7 +562,10 @@ export class AbstractSqsConsumer extends AbstractSqsService {
|
|
|
413
562
|
return ABORT_EARLY_EITHER;
|
|
414
563
|
}
|
|
415
564
|
return {
|
|
416
|
-
result:
|
|
565
|
+
result: {
|
|
566
|
+
parsedMessage: deserializationResult.result.parsedMessage,
|
|
567
|
+
originalMessage: deserializationResult.result.originalMessage,
|
|
568
|
+
},
|
|
417
569
|
};
|
|
418
570
|
}
|
|
419
571
|
async failProcessing(message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractSqsConsumer.js","sourceRoot":"","sources":["../../lib/sqs/AbstractSqsConsumer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AbstractSqsConsumer.js","sourceRoot":"","sources":["../../lib/sqs/AbstractSqsConsumer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { ZodType } from 'zod/v4';
|
|
2
|
+
import z from 'zod/v4';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a typed EventBridge event schema with a custom detail payload.
|
|
5
|
+
*
|
|
6
|
+
* @template T - The Zod schema type for the detail payload
|
|
7
|
+
* @param detailSchema - Zod schema for the 'detail' field
|
|
8
|
+
* @param detailType - Optional literal value for 'detail-type' field (for routing)
|
|
9
|
+
* @returns A Zod schema for the complete EventBridge event with typed detail
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const USER_CREATED_DETAIL = z.object({
|
|
14
|
+
* userId: z.string(),
|
|
15
|
+
* email: z.string().email(),
|
|
16
|
+
* timestamp: z.string(),
|
|
17
|
+
* })
|
|
18
|
+
*
|
|
19
|
+
* // With generic detail-type (for test schemas)
|
|
20
|
+
* const USER_CREATED_EVENT = createEventBridgeSchema(USER_CREATED_DETAIL)
|
|
21
|
+
*
|
|
22
|
+
* // With literal detail-type (for routing in consumers)
|
|
23
|
+
* const USER_CREATED_ENVELOPE = createEventBridgeSchema(
|
|
24
|
+
* USER_CREATED_DETAIL,
|
|
25
|
+
* 'app.user.created'
|
|
26
|
+
* )
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function createEventBridgeSchema<T extends ZodType>(detailSchema: T, detailType?: string): z.ZodObject<{
|
|
30
|
+
version: z.ZodString;
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
'detail-type': z.ZodString;
|
|
33
|
+
source: z.ZodString;
|
|
34
|
+
account: z.ZodString;
|
|
35
|
+
time: z.ZodString;
|
|
36
|
+
region: z.ZodString;
|
|
37
|
+
resources: z.ZodArray<z.ZodString>;
|
|
38
|
+
detail: T;
|
|
39
|
+
}, z.core.$strip> | z.ZodObject<{
|
|
40
|
+
version: z.ZodString;
|
|
41
|
+
id: z.ZodString;
|
|
42
|
+
source: z.ZodString;
|
|
43
|
+
account: z.ZodString;
|
|
44
|
+
time: z.ZodString;
|
|
45
|
+
region: z.ZodString;
|
|
46
|
+
resources: z.ZodArray<z.ZodString>;
|
|
47
|
+
detail: T;
|
|
48
|
+
'detail-type': z.ZodLiteral<string>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
/**
|
|
51
|
+
* Helper to extract just the detail type from an EventBridge schema.
|
|
52
|
+
* Useful when you need the payload type for handlers.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const USER_CREATED_EVENT = createEventBridgeSchema(USER_CREATED_DETAIL)
|
|
57
|
+
* type UserCreatedDetail = EventBridgeDetail<typeof USER_CREATED_EVENT>
|
|
58
|
+
* // Same as: z.infer<typeof USER_CREATED_DETAIL>
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export type EventBridgeDetail<T> = T extends z.ZodObject<infer U> ? U extends {
|
|
62
|
+
detail: infer D;
|
|
63
|
+
} ? D extends ZodType ? z.infer<D> : never : never : never;
|
|
64
|
+
/**
|
|
65
|
+
* Creates multiple EventBridge event schemas for different detail types.
|
|
66
|
+
* Useful when you have multiple event types from the same source.
|
|
67
|
+
*
|
|
68
|
+
* @param detailSchemas - Record of event names to detail schemas
|
|
69
|
+
* @returns Record of event names to complete EventBridge schemas
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const EVENTS = createEventBridgeSchemas({
|
|
74
|
+
* userCreated: z.object({ userId: z.string(), email: z.string() }),
|
|
75
|
+
* userUpdated: z.object({ userId: z.string(), changes: z.record(z.any()) }),
|
|
76
|
+
* userDeleted: z.object({ userId: z.string() }),
|
|
77
|
+
* })
|
|
78
|
+
*
|
|
79
|
+
* type UserCreatedEvent = z.infer<typeof EVENTS.userCreated>
|
|
80
|
+
* type UserUpdatedEvent = z.infer<typeof EVENTS.userUpdated>
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function createEventBridgeSchemas<T extends Record<string, ZodType>>(detailSchemas: T): {
|
|
84
|
+
[K in keyof T]: ReturnType<typeof createEventBridgeSchema<T[K]>>;
|
|
85
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import z from 'zod/v4';
|
|
2
|
+
/**
|
|
3
|
+
* Base EventBridge envelope schema (without detail typing)
|
|
4
|
+
*/
|
|
5
|
+
const EVENT_BRIDGE_BASE_SCHEMA = z.object({
|
|
6
|
+
version: z.string(),
|
|
7
|
+
id: z.string(),
|
|
8
|
+
'detail-type': z.string(),
|
|
9
|
+
source: z.string(),
|
|
10
|
+
account: z.string(),
|
|
11
|
+
time: z.string(),
|
|
12
|
+
region: z.string(),
|
|
13
|
+
resources: z.array(z.string()),
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Creates a typed EventBridge event schema with a custom detail payload.
|
|
17
|
+
*
|
|
18
|
+
* @template T - The Zod schema type for the detail payload
|
|
19
|
+
* @param detailSchema - Zod schema for the 'detail' field
|
|
20
|
+
* @param detailType - Optional literal value for 'detail-type' field (for routing)
|
|
21
|
+
* @returns A Zod schema for the complete EventBridge event with typed detail
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const USER_CREATED_DETAIL = z.object({
|
|
26
|
+
* userId: z.string(),
|
|
27
|
+
* email: z.string().email(),
|
|
28
|
+
* timestamp: z.string(),
|
|
29
|
+
* })
|
|
30
|
+
*
|
|
31
|
+
* // With generic detail-type (for test schemas)
|
|
32
|
+
* const USER_CREATED_EVENT = createEventBridgeSchema(USER_CREATED_DETAIL)
|
|
33
|
+
*
|
|
34
|
+
* // With literal detail-type (for routing in consumers)
|
|
35
|
+
* const USER_CREATED_ENVELOPE = createEventBridgeSchema(
|
|
36
|
+
* USER_CREATED_DETAIL,
|
|
37
|
+
* 'app.user.created'
|
|
38
|
+
* )
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function createEventBridgeSchema(detailSchema, detailType) {
|
|
42
|
+
const baseSchema = EVENT_BRIDGE_BASE_SCHEMA.extend({
|
|
43
|
+
detail: detailSchema,
|
|
44
|
+
});
|
|
45
|
+
if (detailType) {
|
|
46
|
+
return baseSchema.extend({
|
|
47
|
+
'detail-type': z.literal(detailType),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return baseSchema;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates multiple EventBridge event schemas for different detail types.
|
|
54
|
+
* Useful when you have multiple event types from the same source.
|
|
55
|
+
*
|
|
56
|
+
* @param detailSchemas - Record of event names to detail schemas
|
|
57
|
+
* @returns Record of event names to complete EventBridge schemas
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const EVENTS = createEventBridgeSchemas({
|
|
62
|
+
* userCreated: z.object({ userId: z.string(), email: z.string() }),
|
|
63
|
+
* userUpdated: z.object({ userId: z.string(), changes: z.record(z.any()) }),
|
|
64
|
+
* userDeleted: z.object({ userId: z.string() }),
|
|
65
|
+
* })
|
|
66
|
+
*
|
|
67
|
+
* type UserCreatedEvent = z.infer<typeof EVENTS.userCreated>
|
|
68
|
+
* type UserUpdatedEvent = z.infer<typeof EVENTS.userUpdated>
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export function createEventBridgeSchemas(detailSchemas) {
|
|
72
|
+
const result = {};
|
|
73
|
+
for (const key in detailSchemas) {
|
|
74
|
+
const schema = detailSchemas[key];
|
|
75
|
+
if (schema) {
|
|
76
|
+
result[key] = createEventBridgeSchema(schema);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=eventBridgeSchemaBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventBridgeSchemaBuilder.js","sourceRoot":"","sources":["../../lib/utils/eventBridgeSchemaBuilder.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,QAAQ,CAAA;AAEtB;;GAEG;AACH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,uBAAuB,CAAoB,YAAe,EAAE,UAAmB;IAC7F,MAAM,UAAU,GAAG,wBAAwB,CAAC,MAAM,CAAC;QACjD,MAAM,EAAE,YAAY;KACrB,CAAC,CAAA;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,MAAM,CAAC;YACvB,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;SACrC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAqBD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAAgB;IAEhB,MAAM,MAAM,GAAG,EAA0E,CAAA;IAEzF,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;QACjC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,MAAM,CAE3C,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
|