-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathSqsMessageQueue.ts
More file actions
53 lines (45 loc) · 1.49 KB
/
SqsMessageQueue.ts
File metadata and controls
53 lines (45 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { SQS } from 'aws-sdk';
import { inject, injectable } from 'inversify';
import { TYPES } from '../../inversify.constants';
import { Logger } from '../logger';
import { Message, MessageQueue } from './types';
const DEFAULT_VISIBILITY_TIMEOUT_S = 60;
@injectable()
export class SqsMessageQueue implements MessageQueue {
sqs: SQS;
constructor(@inject(TYPES.Logger) public logger: Logger) {
this.sqs = new SQS();
}
async get(queueUrl: string): Promise<Message | null> {
this.logger.info(`getting messages from queue: ${queueUrl}`);
const res = await this.sqs
.receiveMessage({
QueueUrl: queueUrl,
VisibilityTimeout: DEFAULT_VISIBILITY_TIMEOUT_S,
MaxNumberOfMessages: 1,
})
.promise();
const messages = res.Messages;
if (!messages) {
this.logger.info(`got no messages from queue: ${queueUrl}`);
return null;
}
const message = messages[0];
if (!message) {
this.logger.info(`got no messages from queue: ${queueUrl}`);
return null;
}
this.logger.info(`got message: ${message.MessageId}`);
return {
id: message.MessageId!,
body: message.Body!,
recieptHandle: message.ReceiptHandle!,
queueUrl,
};
}
async ack(message: Message): Promise<void> {
this.logger.info(`acking message: ${message.id}`);
await this.sqs.deleteMessage({ QueueUrl: message.queueUrl, ReceiptHandle: message.recieptHandle }).promise();
this.logger.info(`acked message: ${message.id}`);
}
}