Package not found. Please check the package name and try again.
@message-queue-toolkit/sqs 22.6.0 → 22.7.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 +219 -0
- package/dist/fakes/TestSqsPublisher.d.ts +127 -0
- package/dist/fakes/TestSqsPublisher.js +137 -0
- package/dist/fakes/TestSqsPublisher.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2400,6 +2400,225 @@ import { SQS_RESOURCE_CURRENT_QUEUE } from '@message-queue-toolkit/sqs'
|
|
|
2400
2400
|
|
|
2401
2401
|
The library is designed to be testable:
|
|
2402
2402
|
|
|
2403
|
+
### TestSqsPublisher - Testing Utility for Invalid Messages
|
|
2404
|
+
|
|
2405
|
+
`TestSqsPublisher` is a specialized testing utility that allows you to publish arbitrary messages to SQS queues **without any validation**. This is useful for:
|
|
2406
|
+
|
|
2407
|
+
- Testing error handling with invalid/malformed messages
|
|
2408
|
+
- Testing edge cases without schema constraints
|
|
2409
|
+
- Integration testing with arbitrary test data
|
|
2410
|
+
- Verifying consumer behavior with non-standard messages
|
|
2411
|
+
|
|
2412
|
+
**⚠️ IMPORTANT: This is a testing utility only. Do not use in production code.**
|
|
2413
|
+
|
|
2414
|
+
#### Features
|
|
2415
|
+
|
|
2416
|
+
- ✅ **No validation** - Bypasses Zod schemas, deduplication, and payload offloading
|
|
2417
|
+
- ✅ **Flexible queue targeting** - Accepts `queueUrl`, `queueName`, consumer, or publisher instances
|
|
2418
|
+
- ✅ **FIFO support** - Works with both standard and FIFO queues
|
|
2419
|
+
- ✅ **Simple API** - One publisher instance can publish to any queue
|
|
2420
|
+
|
|
2421
|
+
#### Basic Usage
|
|
2422
|
+
|
|
2423
|
+
```typescript
|
|
2424
|
+
import { TestSqsPublisher } from '@message-queue-toolkit/sqs'
|
|
2425
|
+
import { SQSClient } from '@aws-sdk/client-sqs'
|
|
2426
|
+
|
|
2427
|
+
const sqsClient = new SQSClient({ region: 'us-east-1' })
|
|
2428
|
+
const testPublisher = new TestSqsPublisher(sqsClient)
|
|
2429
|
+
|
|
2430
|
+
// Publish to a queue by URL
|
|
2431
|
+
await testPublisher.publish(
|
|
2432
|
+
{ any: 'data', without: 'validation' },
|
|
2433
|
+
{ queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue' }
|
|
2434
|
+
)
|
|
2435
|
+
|
|
2436
|
+
// Publish to a queue by name
|
|
2437
|
+
await testPublisher.publish(
|
|
2438
|
+
{ incomplete: 'message' },
|
|
2439
|
+
{ queueName: 'my-queue' }
|
|
2440
|
+
)
|
|
2441
|
+
```
|
|
2442
|
+
|
|
2443
|
+
#### Publishing to Consumer's Queue
|
|
2444
|
+
|
|
2445
|
+
Extract the queue URL from an existing consumer:
|
|
2446
|
+
|
|
2447
|
+
```typescript
|
|
2448
|
+
const consumer = new UserEventsConsumer(sqsClient, userService)
|
|
2449
|
+
await consumer.init()
|
|
2450
|
+
|
|
2451
|
+
const testPublisher = new TestSqsPublisher(sqsClient)
|
|
2452
|
+
|
|
2453
|
+
// Publish directly to the consumer's queue
|
|
2454
|
+
await testPublisher.publish(
|
|
2455
|
+
{
|
|
2456
|
+
invalid: 'schema',
|
|
2457
|
+
missing: 'required fields',
|
|
2458
|
+
},
|
|
2459
|
+
{ consumer }
|
|
2460
|
+
)
|
|
2461
|
+
```
|
|
2462
|
+
|
|
2463
|
+
#### Publishing to Publisher's Queue
|
|
2464
|
+
|
|
2465
|
+
Extract the queue URL from an existing publisher:
|
|
2466
|
+
|
|
2467
|
+
```typescript
|
|
2468
|
+
const regularPublisher = new UserEventsPublisher(sqsClient)
|
|
2469
|
+
await regularPublisher.init()
|
|
2470
|
+
|
|
2471
|
+
const testPublisher = new TestSqsPublisher(sqsClient)
|
|
2472
|
+
|
|
2473
|
+
// Publish to the same queue without validation
|
|
2474
|
+
await testPublisher.publish(
|
|
2475
|
+
{ totally: 'arbitrary', data: true },
|
|
2476
|
+
{ publisher: regularPublisher }
|
|
2477
|
+
)
|
|
2478
|
+
```
|
|
2479
|
+
|
|
2480
|
+
#### Testing Invalid Message Handling
|
|
2481
|
+
|
|
2482
|
+
```typescript
|
|
2483
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
|
|
2484
|
+
|
|
2485
|
+
describe('Consumer Error Handling', () => {
|
|
2486
|
+
let sqsClient: SQSClient
|
|
2487
|
+
let consumer: UserEventsConsumer
|
|
2488
|
+
let testPublisher: TestSqsPublisher
|
|
2489
|
+
|
|
2490
|
+
beforeEach(async () => {
|
|
2491
|
+
sqsClient = new SQSClient({
|
|
2492
|
+
endpoint: 'http://localhost:4566', // LocalStack
|
|
2493
|
+
region: 'us-east-1',
|
|
2494
|
+
})
|
|
2495
|
+
|
|
2496
|
+
consumer = new UserEventsConsumer(sqsClient, userService, {
|
|
2497
|
+
handlerSpy: true,
|
|
2498
|
+
})
|
|
2499
|
+
await consumer.start()
|
|
2500
|
+
|
|
2501
|
+
testPublisher = new TestSqsPublisher(sqsClient)
|
|
2502
|
+
})
|
|
2503
|
+
|
|
2504
|
+
afterEach(async () => {
|
|
2505
|
+
await consumer.close()
|
|
2506
|
+
})
|
|
2507
|
+
|
|
2508
|
+
it('handles message with missing required fields', async () => {
|
|
2509
|
+
// Publish invalid message
|
|
2510
|
+
await testPublisher.publish(
|
|
2511
|
+
{
|
|
2512
|
+
// Missing: id, messageType, timestamp
|
|
2513
|
+
someData: 'incomplete',
|
|
2514
|
+
},
|
|
2515
|
+
{ consumer } // Publish to consumer's queue
|
|
2516
|
+
)
|
|
2517
|
+
|
|
2518
|
+
// Wait briefly for processing
|
|
2519
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
2520
|
+
|
|
2521
|
+
// Verify consumer handled the error gracefully
|
|
2522
|
+
// (e.g., sent to DLQ, logged error, etc.)
|
|
2523
|
+
expect(errorLogger.errors).toContainEqual(
|
|
2524
|
+
expect.objectContaining({
|
|
2525
|
+
message: expect.stringContaining('Invalid message format'),
|
|
2526
|
+
})
|
|
2527
|
+
)
|
|
2528
|
+
})
|
|
2529
|
+
|
|
2530
|
+
it('handles message with wrong data types', async () => {
|
|
2531
|
+
await testPublisher.publish(
|
|
2532
|
+
{
|
|
2533
|
+
id: 123, // Should be string
|
|
2534
|
+
messageType: null, // Should be string literal
|
|
2535
|
+
userId: ['not', 'a', 'string'], // Should be string
|
|
2536
|
+
},
|
|
2537
|
+
{ consumer }
|
|
2538
|
+
)
|
|
2539
|
+
|
|
2540
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
2541
|
+
|
|
2542
|
+
// Verify error handling
|
|
2543
|
+
expect(validationErrors).toHaveLength(1)
|
|
2544
|
+
})
|
|
2545
|
+
|
|
2546
|
+
it('handles completely malformed messages', async () => {
|
|
2547
|
+
await testPublisher.publish(
|
|
2548
|
+
{
|
|
2549
|
+
totally: 'random',
|
|
2550
|
+
nested: { deeply: { data: [1, 2, 3] } },
|
|
2551
|
+
unexpected: true,
|
|
2552
|
+
},
|
|
2553
|
+
{ consumer }
|
|
2554
|
+
)
|
|
2555
|
+
|
|
2556
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
2557
|
+
|
|
2558
|
+
// Message should be rejected and sent to DLQ
|
|
2559
|
+
expect(dlqMessages).toHaveLength(1)
|
|
2560
|
+
})
|
|
2561
|
+
})
|
|
2562
|
+
```
|
|
2563
|
+
|
|
2564
|
+
#### FIFO Queue Testing
|
|
2565
|
+
|
|
2566
|
+
```typescript
|
|
2567
|
+
it('publishes to FIFO queue with MessageGroupId', async () => {
|
|
2568
|
+
const testPublisher = new TestSqsPublisher(sqsClient)
|
|
2569
|
+
|
|
2570
|
+
await testPublisher.publish(
|
|
2571
|
+
{ test: 'fifo-message' },
|
|
2572
|
+
{
|
|
2573
|
+
queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue.fifo',
|
|
2574
|
+
MessageGroupId: 'test-group',
|
|
2575
|
+
MessageDeduplicationId: 'unique-id-123',
|
|
2576
|
+
}
|
|
2577
|
+
)
|
|
2578
|
+
|
|
2579
|
+
// Verify message was published
|
|
2580
|
+
const result = await consumer.handlerSpy.waitForMessage(
|
|
2581
|
+
(msg) => msg.test === 'fifo-message',
|
|
2582
|
+
'consumed'
|
|
2583
|
+
)
|
|
2584
|
+
|
|
2585
|
+
expect(result).toBeDefined()
|
|
2586
|
+
})
|
|
2587
|
+
```
|
|
2588
|
+
|
|
2589
|
+
#### API Reference
|
|
2590
|
+
|
|
2591
|
+
```typescript
|
|
2592
|
+
class TestSqsPublisher {
|
|
2593
|
+
constructor(sqsClient: SQSClient)
|
|
2594
|
+
|
|
2595
|
+
/**
|
|
2596
|
+
* Publish a message to an SQS queue without validation
|
|
2597
|
+
* @param payload - Any JSON-serializable object
|
|
2598
|
+
* @param options - Queue targeting and FIFO options
|
|
2599
|
+
*/
|
|
2600
|
+
async publish(
|
|
2601
|
+
payload: any,
|
|
2602
|
+
options:
|
|
2603
|
+
| { queueUrl: string; MessageGroupId?: string; MessageDeduplicationId?: string }
|
|
2604
|
+
| { queueName: string; MessageGroupId?: string; MessageDeduplicationId?: string }
|
|
2605
|
+
| { consumer: AbstractSqsConsumer<any, any, any, any, any>; MessageGroupId?: string; MessageDeduplicationId?: string }
|
|
2606
|
+
| { publisher: AbstractSqsPublisher<any>; MessageGroupId?: string; MessageDeduplicationId?: string }
|
|
2607
|
+
): Promise<void>
|
|
2608
|
+
}
|
|
2609
|
+
```
|
|
2610
|
+
|
|
2611
|
+
**When to use `TestSqsPublisher`:**
|
|
2612
|
+
- ✅ Testing error handling and edge cases
|
|
2613
|
+
- ✅ Integration tests with invalid data
|
|
2614
|
+
- ✅ Testing consumer resilience
|
|
2615
|
+
- ✅ Debugging message processing issues
|
|
2616
|
+
|
|
2617
|
+
**When NOT to use `TestSqsPublisher`:**
|
|
2618
|
+
- ❌ Production code
|
|
2619
|
+
- ❌ Publishing valid messages (use regular publishers)
|
|
2620
|
+
- ❌ Messages that need validation, deduplication, or offloading
|
|
2621
|
+
|
|
2403
2622
|
### Integration Tests
|
|
2404
2623
|
|
|
2405
2624
|
```typescript
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { SQSClient } from '@aws-sdk/client-sqs';
|
|
2
|
+
import type { AbstractSqsConsumer } from '../sqs/AbstractSqsConsumer.ts';
|
|
3
|
+
import type { AbstractSqsPublisher } from '../sqs/AbstractSqsPublisher.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Options for publishing messages with TestSqsPublisher.
|
|
6
|
+
* Supports multiple mutually exclusive ways to specify the target queue.
|
|
7
|
+
*/
|
|
8
|
+
export type TestSqsPublishOptions = {
|
|
9
|
+
queueUrl: string;
|
|
10
|
+
queueName?: never;
|
|
11
|
+
consumer?: never;
|
|
12
|
+
publisher?: never;
|
|
13
|
+
MessageGroupId?: string;
|
|
14
|
+
MessageDeduplicationId?: string;
|
|
15
|
+
} | {
|
|
16
|
+
queueName: string;
|
|
17
|
+
queueUrl?: never;
|
|
18
|
+
consumer?: never;
|
|
19
|
+
publisher?: never;
|
|
20
|
+
MessageGroupId?: string;
|
|
21
|
+
MessageDeduplicationId?: string;
|
|
22
|
+
} | {
|
|
23
|
+
consumer: AbstractSqsConsumer<any, any, any, any, any>;
|
|
24
|
+
queueUrl?: never;
|
|
25
|
+
queueName?: never;
|
|
26
|
+
publisher?: never;
|
|
27
|
+
MessageGroupId?: string;
|
|
28
|
+
MessageDeduplicationId?: string;
|
|
29
|
+
} | {
|
|
30
|
+
publisher: AbstractSqsPublisher<any>;
|
|
31
|
+
queueUrl?: never;
|
|
32
|
+
queueName?: never;
|
|
33
|
+
consumer?: never;
|
|
34
|
+
MessageGroupId?: string;
|
|
35
|
+
MessageDeduplicationId?: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* TestSqsPublisher - A testing utility for publishing arbitrary messages to SQS queues without validation.
|
|
39
|
+
*
|
|
40
|
+
* This publisher bypasses all message validation, schema checking, deduplication, and payload offloading
|
|
41
|
+
* to enable testing edge cases, invalid messages, and integration scenarios.
|
|
42
|
+
*
|
|
43
|
+
* **IMPORTANT: This is a testing utility only. Do not use in production code.**
|
|
44
|
+
*
|
|
45
|
+
* Features:
|
|
46
|
+
* - Publish any JSON-serializable payload to any SQS queue
|
|
47
|
+
* - No Zod schema validation
|
|
48
|
+
* - No message deduplication
|
|
49
|
+
* - No payload offloading
|
|
50
|
+
* - Accept queueUrl string or consumer/publisher instance per publish call
|
|
51
|
+
* - Automatically resolve queueUrl from consumer/publisher
|
|
52
|
+
* - Support FIFO queue options (MessageGroupId, MessageDeduplicationId)
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // Create a single publisher for all queues
|
|
57
|
+
* const publisher = new TestSqsPublisher(sqsClient)
|
|
58
|
+
*
|
|
59
|
+
* // Publish to different queues
|
|
60
|
+
* await publisher.publish({ any: 'data' }, { queueUrl: 'https://sqs...' })
|
|
61
|
+
* await publisher.publish({ test: 'message' }, { queueName: 'my-queue' })
|
|
62
|
+
* await publisher.publish({ test: 'message' }, { consumer: myConsumer })
|
|
63
|
+
* await publisher.publish({ other: 'data' }, { publisher: myPublisher })
|
|
64
|
+
*
|
|
65
|
+
* // FIFO queue with options
|
|
66
|
+
* await publisher.publish(
|
|
67
|
+
* { test: 'message' },
|
|
68
|
+
* {
|
|
69
|
+
* queueUrl: 'https://sqs.../my-queue.fifo',
|
|
70
|
+
* MessageGroupId: 'group1',
|
|
71
|
+
* MessageDeduplicationId: 'unique-id'
|
|
72
|
+
* }
|
|
73
|
+
* )
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare class TestSqsPublisher {
|
|
77
|
+
private readonly sqsClient;
|
|
78
|
+
/**
|
|
79
|
+
* Creates a new TestSqsPublisher instance.
|
|
80
|
+
*
|
|
81
|
+
* @param sqsClient - AWS SQS client instance
|
|
82
|
+
*/
|
|
83
|
+
constructor(sqsClient: SQSClient);
|
|
84
|
+
/**
|
|
85
|
+
* Publishes a message to an SQS queue without any validation.
|
|
86
|
+
*
|
|
87
|
+
* @param payload - Any JSON-serializable object to publish
|
|
88
|
+
* @param options - Queue and message options
|
|
89
|
+
* @param options.queueUrl - Direct queue URL (mutually exclusive with queueName/consumer/publisher)
|
|
90
|
+
* @param options.queueName - Queue name to resolve to URL (mutually exclusive with queueUrl/consumer/publisher)
|
|
91
|
+
* @param options.consumer - Consumer instance to extract queue URL from (mutually exclusive with queueUrl/queueName/publisher)
|
|
92
|
+
* @param options.publisher - Publisher instance to extract queue URL from (mutually exclusive with queueUrl/queueName/consumer)
|
|
93
|
+
* @param options.MessageGroupId - Required for FIFO queues (queue name ends with .fifo)
|
|
94
|
+
* @param options.MessageDeduplicationId - Optional deduplication ID for FIFO queues
|
|
95
|
+
*
|
|
96
|
+
* @returns Promise that resolves when message is published
|
|
97
|
+
* @throws {Error} If none of queueUrl/queueName/consumer/publisher is provided
|
|
98
|
+
* @throws {Error} If consumer/publisher has not been initialized (no queueUrl available)
|
|
99
|
+
* @throws {Error} If SQS publish fails
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```typescript
|
|
103
|
+
* // Using with a queue URL
|
|
104
|
+
* await publisher.publish({ test: 'data' }, { queueUrl: 'https://sqs...' })
|
|
105
|
+
*
|
|
106
|
+
* // Using with a queue name
|
|
107
|
+
* await publisher.publish({ test: 'data' }, { queueName: 'my-queue' })
|
|
108
|
+
*
|
|
109
|
+
* // Using with a consumer
|
|
110
|
+
* await publisher.publish({ test: 'data' }, { consumer: myConsumer })
|
|
111
|
+
*
|
|
112
|
+
* // Using with a publisher
|
|
113
|
+
* await publisher.publish({ test: 'data' }, { publisher: myPublisher })
|
|
114
|
+
*
|
|
115
|
+
* // FIFO queue
|
|
116
|
+
* await publisher.publish(
|
|
117
|
+
* { test: 'data' },
|
|
118
|
+
* {
|
|
119
|
+
* queueUrl: 'https://sqs.../queue.fifo',
|
|
120
|
+
* MessageGroupId: 'group1',
|
|
121
|
+
* MessageDeduplicationId: 'unique-id'
|
|
122
|
+
* }
|
|
123
|
+
* )
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
publish(payload: unknown, options: TestSqsPublishOptions): Promise<void>;
|
|
127
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { SendMessageCommand } from '@aws-sdk/client-sqs';
|
|
2
|
+
import { getQueueUrl } from "../utils/sqsUtils.js";
|
|
3
|
+
/**
|
|
4
|
+
* TestSqsPublisher - A testing utility for publishing arbitrary messages to SQS queues without validation.
|
|
5
|
+
*
|
|
6
|
+
* This publisher bypasses all message validation, schema checking, deduplication, and payload offloading
|
|
7
|
+
* to enable testing edge cases, invalid messages, and integration scenarios.
|
|
8
|
+
*
|
|
9
|
+
* **IMPORTANT: This is a testing utility only. Do not use in production code.**
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Publish any JSON-serializable payload to any SQS queue
|
|
13
|
+
* - No Zod schema validation
|
|
14
|
+
* - No message deduplication
|
|
15
|
+
* - No payload offloading
|
|
16
|
+
* - Accept queueUrl string or consumer/publisher instance per publish call
|
|
17
|
+
* - Automatically resolve queueUrl from consumer/publisher
|
|
18
|
+
* - Support FIFO queue options (MessageGroupId, MessageDeduplicationId)
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Create a single publisher for all queues
|
|
23
|
+
* const publisher = new TestSqsPublisher(sqsClient)
|
|
24
|
+
*
|
|
25
|
+
* // Publish to different queues
|
|
26
|
+
* await publisher.publish({ any: 'data' }, { queueUrl: 'https://sqs...' })
|
|
27
|
+
* await publisher.publish({ test: 'message' }, { queueName: 'my-queue' })
|
|
28
|
+
* await publisher.publish({ test: 'message' }, { consumer: myConsumer })
|
|
29
|
+
* await publisher.publish({ other: 'data' }, { publisher: myPublisher })
|
|
30
|
+
*
|
|
31
|
+
* // FIFO queue with options
|
|
32
|
+
* await publisher.publish(
|
|
33
|
+
* { test: 'message' },
|
|
34
|
+
* {
|
|
35
|
+
* queueUrl: 'https://sqs.../my-queue.fifo',
|
|
36
|
+
* MessageGroupId: 'group1',
|
|
37
|
+
* MessageDeduplicationId: 'unique-id'
|
|
38
|
+
* }
|
|
39
|
+
* )
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class TestSqsPublisher {
|
|
43
|
+
sqsClient;
|
|
44
|
+
/**
|
|
45
|
+
* Creates a new TestSqsPublisher instance.
|
|
46
|
+
*
|
|
47
|
+
* @param sqsClient - AWS SQS client instance
|
|
48
|
+
*/
|
|
49
|
+
constructor(sqsClient) {
|
|
50
|
+
this.sqsClient = sqsClient;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Publishes a message to an SQS queue without any validation.
|
|
54
|
+
*
|
|
55
|
+
* @param payload - Any JSON-serializable object to publish
|
|
56
|
+
* @param options - Queue and message options
|
|
57
|
+
* @param options.queueUrl - Direct queue URL (mutually exclusive with queueName/consumer/publisher)
|
|
58
|
+
* @param options.queueName - Queue name to resolve to URL (mutually exclusive with queueUrl/consumer/publisher)
|
|
59
|
+
* @param options.consumer - Consumer instance to extract queue URL from (mutually exclusive with queueUrl/queueName/publisher)
|
|
60
|
+
* @param options.publisher - Publisher instance to extract queue URL from (mutually exclusive with queueUrl/queueName/consumer)
|
|
61
|
+
* @param options.MessageGroupId - Required for FIFO queues (queue name ends with .fifo)
|
|
62
|
+
* @param options.MessageDeduplicationId - Optional deduplication ID for FIFO queues
|
|
63
|
+
*
|
|
64
|
+
* @returns Promise that resolves when message is published
|
|
65
|
+
* @throws {Error} If none of queueUrl/queueName/consumer/publisher is provided
|
|
66
|
+
* @throws {Error} If consumer/publisher has not been initialized (no queueUrl available)
|
|
67
|
+
* @throws {Error} If SQS publish fails
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* // Using with a queue URL
|
|
72
|
+
* await publisher.publish({ test: 'data' }, { queueUrl: 'https://sqs...' })
|
|
73
|
+
*
|
|
74
|
+
* // Using with a queue name
|
|
75
|
+
* await publisher.publish({ test: 'data' }, { queueName: 'my-queue' })
|
|
76
|
+
*
|
|
77
|
+
* // Using with a consumer
|
|
78
|
+
* await publisher.publish({ test: 'data' }, { consumer: myConsumer })
|
|
79
|
+
*
|
|
80
|
+
* // Using with a publisher
|
|
81
|
+
* await publisher.publish({ test: 'data' }, { publisher: myPublisher })
|
|
82
|
+
*
|
|
83
|
+
* // FIFO queue
|
|
84
|
+
* await publisher.publish(
|
|
85
|
+
* { test: 'data' },
|
|
86
|
+
* {
|
|
87
|
+
* queueUrl: 'https://sqs.../queue.fifo',
|
|
88
|
+
* MessageGroupId: 'group1',
|
|
89
|
+
* MessageDeduplicationId: 'unique-id'
|
|
90
|
+
* }
|
|
91
|
+
* )
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
async publish(payload, options) {
|
|
95
|
+
let queueUrl;
|
|
96
|
+
if (options.queueUrl) {
|
|
97
|
+
queueUrl = options.queueUrl;
|
|
98
|
+
}
|
|
99
|
+
else if (options.queueName) {
|
|
100
|
+
// Resolve queue name to URL
|
|
101
|
+
const result = await getQueueUrl(this.sqsClient, options.queueName);
|
|
102
|
+
if (result.error) {
|
|
103
|
+
throw result.error;
|
|
104
|
+
}
|
|
105
|
+
queueUrl = result.result;
|
|
106
|
+
}
|
|
107
|
+
else if (options.consumer) {
|
|
108
|
+
// Extract queueUrl from consumer
|
|
109
|
+
// @ts-expect-error - Accessing protected property for testing purposes
|
|
110
|
+
const consumerQueueUrl = options.consumer.queueUrl;
|
|
111
|
+
if (!consumerQueueUrl) {
|
|
112
|
+
throw new Error('Consumer has not been initialized. Call consumer.init() before passing it to TestSqsPublisher.publish().');
|
|
113
|
+
}
|
|
114
|
+
queueUrl = consumerQueueUrl;
|
|
115
|
+
}
|
|
116
|
+
else if (options.publisher) {
|
|
117
|
+
// Extract queueUrl from publisher
|
|
118
|
+
// @ts-expect-error - Accessing protected property for testing purposes
|
|
119
|
+
const publisherQueueUrl = options.publisher.queueUrl;
|
|
120
|
+
if (!publisherQueueUrl) {
|
|
121
|
+
throw new Error('Publisher has not been initialized. Call publisher.init() or publisher.publish() before passing it to TestSqsPublisher.publish().');
|
|
122
|
+
}
|
|
123
|
+
queueUrl = publisherQueueUrl;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
throw new Error('Either queueUrl, queueName, consumer, or publisher must be provided in options');
|
|
127
|
+
}
|
|
128
|
+
const command = new SendMessageCommand({
|
|
129
|
+
QueueUrl: queueUrl,
|
|
130
|
+
MessageBody: JSON.stringify(payload),
|
|
131
|
+
MessageGroupId: options.MessageGroupId,
|
|
132
|
+
MessageDeduplicationId: options.MessageDeduplicationId,
|
|
133
|
+
});
|
|
134
|
+
await this.sqsClient.send(command);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=TestSqsPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestSqsPublisher.js","sourceRoot":"","sources":["../../lib/fakes/TestSqsPublisher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAIxD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAoDlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,OAAO,gBAAgB;IACV,SAAS,CAAW;IAErC;;;;OAIG;IACH,YAAY,SAAoB;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyCG;IACH,KAAK,CAAC,OAAO,CAAC,OAAgB,EAAE,OAA8B;QAC5D,IAAI,QAAgB,CAAA;QAEpB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;QAC7B,CAAC;aAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7B,4BAA4B;YAC5B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;YACnE,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,MAAM,MAAM,CAAC,KAAK,CAAA;YACpB,CAAC;YACD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAA;QAC1B,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC5B,iCAAiC;YACjC,uEAAuE;YACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,QAA8B,CAAA;YACxE,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,0GAA0G,CAC3G,CAAA;YACH,CAAC;YACD,QAAQ,GAAG,gBAAgB,CAAA;QAC7B,CAAC;aAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7B,kCAAkC;YAClC,uEAAuE;YACvE,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,QAA8B,CAAA;YAC1E,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAA;YACH,CAAC;YACD,QAAQ,GAAG,iBAAiB,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC;YACrC,QAAQ,EAAE,QAAQ;YAClB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACpC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,sBAAsB,EAAE,OAAO,CAAC,sBAAsB;SACvD,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { SqsConsumerErrorResolver } from './errors/SqsConsumerErrorResolver.ts';
|
|
2
2
|
export { FakeConsumerErrorResolver } from './fakes/FakeConsumerErrorResolver.ts';
|
|
3
|
+
export { TestSqsPublisher, type TestSqsPublishOptions } from './fakes/TestSqsPublisher.ts';
|
|
3
4
|
export type { SQSConsumerDependencies, SQSConsumerOptions } from './sqs/AbstractSqsConsumer.ts';
|
|
4
5
|
export { AbstractSqsConsumer } from './sqs/AbstractSqsConsumer.ts';
|
|
5
6
|
export type { SQSMessageOptions, SQSPublisherOptions } from './sqs/AbstractSqsPublisher.ts';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { SqsConsumerErrorResolver } from "./errors/SqsConsumerErrorResolver.js";
|
|
2
2
|
export { FakeConsumerErrorResolver } from "./fakes/FakeConsumerErrorResolver.js";
|
|
3
|
+
export { TestSqsPublisher } from "./fakes/TestSqsPublisher.js";
|
|
3
4
|
export { AbstractSqsConsumer } from "./sqs/AbstractSqsConsumer.js";
|
|
4
5
|
export { AbstractSqsPublisher, OFFLOADED_PAYLOAD_SIZE_ATTRIBUTE, } from "./sqs/AbstractSqsPublisher.js";
|
|
5
6
|
export { SQS_MESSAGE_MAX_SIZE, SQS_RESOURCE_ANY, SQS_RESOURCE_CURRENT_QUEUE, } from "./sqs/AbstractSqsService.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;
|
|
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;AAChF,OAAO,EAAE,gBAAgB,EAA8B,MAAM,6BAA6B,CAAA;AAE1F,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,EACxB,wBAAwB,GAGzB,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"}
|