@message-queue-toolkit/sqs 1.0.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.
@@ -0,0 +1,6 @@
1
+ export type { SQSQueueAWSConfig, SQSQueueConfig, SQSConsumerDependencies, } from './lib/sqs/AbstractSqsService';
2
+ export { AbstractSqsConsumer } from './lib/sqs/AbstractSqsConsumer';
3
+ export type { SQSMessage, SQSConsumerOptions } from './lib/sqs/AbstractSqsConsumer';
4
+ export { AbstractSqsPublisher } from './lib/sqs/AbstractSqsPublisher';
5
+ export type { SQSMessageOptions } from './lib/sqs/AbstractSqsPublisher';
6
+ export type { CommonMessage } from './lib/types/MessageTypes';
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqsPublisher = exports.AbstractSqsConsumer = void 0;
4
+ var AbstractSqsConsumer_1 = require("./lib/sqs/AbstractSqsConsumer");
5
+ Object.defineProperty(exports, "AbstractSqsConsumer", { enumerable: true, get: function () { return AbstractSqsConsumer_1.AbstractSqsConsumer; } });
6
+ var AbstractSqsPublisher_1 = require("./lib/sqs/AbstractSqsPublisher");
7
+ Object.defineProperty(exports, "AbstractSqsPublisher", { enumerable: true, get: function () { return AbstractSqsPublisher_1.AbstractSqsPublisher; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAMA,qEAAmE;AAA1D,0HAAA,mBAAmB,OAAA;AAG5B,uEAAqE;AAA5D,4HAAA,oBAAoB,OAAA"}
@@ -0,0 +1,5 @@
1
+ import type { ErrorResolver } from '@lokalise/node-core';
2
+ import { InternalError } from '@lokalise/node-core';
3
+ export declare class SqsConsumerErrorResolver implements ErrorResolver {
4
+ processError(error: unknown): InternalError;
5
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqsConsumerErrorResolver = void 0;
4
+ const node_util_1 = require("node:util");
5
+ const node_core_1 = require("@lokalise/node-core");
6
+ const zod_1 = require("zod");
7
+ const sqsErrors_1 = require("./sqsErrors");
8
+ class SqsConsumerErrorResolver {
9
+ processError(error) {
10
+ if (node_util_1.types.isNativeError(error) && error?.name === 'SyntaxError') {
11
+ return new sqsErrors_1.SqsMessageInvalidFormat({
12
+ message: error.message,
13
+ });
14
+ }
15
+ if (error instanceof zod_1.ZodError) {
16
+ return new sqsErrors_1.SqsValidationError({
17
+ message: error.message,
18
+ details: {
19
+ error: error.issues,
20
+ },
21
+ });
22
+ }
23
+ if ((0, node_core_1.isStandardizedError)(error)) {
24
+ return new node_core_1.InternalError({
25
+ message: error.message,
26
+ errorCode: error.code,
27
+ });
28
+ }
29
+ return new node_core_1.InternalError({
30
+ message: 'Error processing message',
31
+ errorCode: 'INTERNAL_ERROR',
32
+ });
33
+ }
34
+ }
35
+ exports.SqsConsumerErrorResolver = SqsConsumerErrorResolver;
36
+ //# sourceMappingURL=SqsConsumerErrorResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SqsConsumerErrorResolver.js","sourceRoot":"","sources":["../../../lib/errors/SqsConsumerErrorResolver.ts"],"names":[],"mappings":";;;AAAA,yCAAiC;AAGjC,mDAAwE;AACxE,6BAA8B;AAE9B,2CAAyE;AAEzE,MAAa,wBAAwB;IAC5B,YAAY,CAAC,KAAc;QAChC,IAAI,iBAAK,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,IAAI,KAAK,aAAa,EAAE;YAC/D,OAAO,IAAI,mCAAuB,CAAC;gBACjC,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAA;SACH;QACD,IAAI,KAAK,YAAY,cAAQ,EAAE;YAC7B,OAAO,IAAI,8BAAkB,CAAC;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE;oBACP,KAAK,EAAE,KAAK,CAAC,MAAM;iBACpB;aACF,CAAC,CAAA;SACH;QACD,IAAI,IAAA,+BAAmB,EAAC,KAAK,CAAC,EAAE;YAC9B,OAAO,IAAI,yBAAa,CAAC;gBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,SAAS,EAAE,KAAK,CAAC,IAAI;aACtB,CAAC,CAAA;SACH;QACD,OAAO,IAAI,yBAAa,CAAC;YACvB,OAAO,EAAE,0BAA0B;YACnC,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAA;IACJ,CAAC;CACF;AA1BD,4DA0BC"}
@@ -0,0 +1,12 @@
1
+ import { InternalError } from '@lokalise/node-core';
2
+ export type FreeformRecord = Record<string, any>;
3
+ export type CommonErrorParams = {
4
+ message: string;
5
+ details?: FreeformRecord;
6
+ };
7
+ export declare class SqsMessageInvalidFormat extends InternalError {
8
+ constructor(params: CommonErrorParams);
9
+ }
10
+ export declare class SqsValidationError extends InternalError {
11
+ constructor(params: CommonErrorParams);
12
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqsValidationError = exports.SqsMessageInvalidFormat = void 0;
4
+ const node_core_1 = require("@lokalise/node-core");
5
+ class SqsMessageInvalidFormat extends node_core_1.InternalError {
6
+ constructor(params) {
7
+ super({
8
+ message: params.message,
9
+ errorCode: 'SQS_MESSAGE_INVALID_FORMAT',
10
+ details: params.details,
11
+ });
12
+ }
13
+ }
14
+ exports.SqsMessageInvalidFormat = SqsMessageInvalidFormat;
15
+ class SqsValidationError extends node_core_1.InternalError {
16
+ constructor(params) {
17
+ super({
18
+ message: params.message,
19
+ errorCode: 'SQS_VALIDATION_ERROR',
20
+ details: params.details,
21
+ });
22
+ }
23
+ }
24
+ exports.SqsValidationError = SqsValidationError;
25
+ //# sourceMappingURL=sqsErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqsErrors.js","sourceRoot":"","sources":["../../../lib/errors/sqsErrors.ts"],"names":[],"mappings":";;;AAAA,mDAAmD;AAUnD,MAAa,uBAAwB,SAAQ,yBAAa;IACxD,YAAY,MAAyB;QACnC,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,4BAA4B;YACvC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAA;IACJ,CAAC;CACF;AARD,0DAQC;AAED,MAAa,kBAAmB,SAAQ,yBAAa;IACnD,YAAY,MAAyB;QACnC,KAAK,CAAC;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,sBAAsB;YACjC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAA;IACJ,CAAC;CACF;AARD,gDAQC"}
@@ -0,0 +1,27 @@
1
+ import type { Either, ErrorResolver } from '@lokalise/node-core';
2
+ import type { QueueConsumer as QueueConsumer, QueueOptions } from '@message-queue-toolkit/core';
3
+ import { Consumer } from 'sqs-consumer';
4
+ import type { ConsumerOptions } from 'sqs-consumer/src/types';
5
+ import type { SQSConsumerDependencies, SQSQueueAWSConfig } from './AbstractSqsService';
6
+ import { AbstractSqsService } from './AbstractSqsService';
7
+ export type SQSMessage = {
8
+ MessageId: string;
9
+ ReceiptHandle: string;
10
+ MD5OfBody: string;
11
+ Body: string;
12
+ };
13
+ export type SQSConsumerOptions<MessagePayloadType extends object> = QueueOptions<MessagePayloadType, SQSQueueAWSConfig> & {
14
+ consumerOverrides?: Partial<ConsumerOptions>;
15
+ };
16
+ export declare abstract class AbstractSqsConsumer<MessagePayloadType extends object> extends AbstractSqsService<MessagePayloadType, SQSConsumerOptions<MessagePayloadType>, SQSConsumerDependencies> implements QueueConsumer {
17
+ private readonly transactionObservabilityManager?;
18
+ protected readonly errorResolver: ErrorResolver;
19
+ protected consumer: Consumer;
20
+ private readonly consumerOptionsOverride;
21
+ constructor(dependencies: SQSConsumerDependencies, options: SQSConsumerOptions<MessagePayloadType>);
22
+ abstract processMessage(messagePayload: MessagePayloadType): Promise<Either<'retryLater', 'success'>>;
23
+ private deserializeMessage;
24
+ private failProcessing;
25
+ start(): Promise<void>;
26
+ close(abort?: boolean): Promise<void>;
27
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqsConsumer = void 0;
4
+ const sqs_consumer_1 = require("sqs-consumer");
5
+ const sqsErrors_1 = require("../errors/sqsErrors");
6
+ const AbstractSqsService_1 = require("./AbstractSqsService");
7
+ const messageDeserializer_1 = require("./messageDeserializer");
8
+ const ABORT_EARLY_EITHER = {
9
+ error: 'abort',
10
+ };
11
+ class AbstractSqsConsumer extends AbstractSqsService_1.AbstractSqsService {
12
+ transactionObservabilityManager;
13
+ errorResolver;
14
+ // @ts-ignore
15
+ consumer;
16
+ consumerOptionsOverride;
17
+ constructor(dependencies, options) {
18
+ super(dependencies, options);
19
+ this.transactionObservabilityManager = dependencies.transactionObservabilityManager;
20
+ this.errorResolver = dependencies.consumerErrorResolver;
21
+ this.consumerOptionsOverride = options.consumerOverrides ?? {};
22
+ }
23
+ deserializeMessage(message) {
24
+ if (message === null) {
25
+ return ABORT_EARLY_EITHER;
26
+ }
27
+ const deserializationResult = (0, messageDeserializer_1.deserializeMessage)(message, this.messageSchema, this.errorResolver);
28
+ if (deserializationResult.error instanceof sqsErrors_1.SqsValidationError ||
29
+ deserializationResult.error instanceof sqsErrors_1.SqsMessageInvalidFormat) {
30
+ this.handleError(deserializationResult.error);
31
+ return ABORT_EARLY_EITHER;
32
+ }
33
+ // Empty content for whatever reason
34
+ if (!deserializationResult.result) {
35
+ return ABORT_EARLY_EITHER;
36
+ }
37
+ return {
38
+ result: deserializationResult.result,
39
+ };
40
+ }
41
+ async failProcessing(message) {
42
+ // Not implemented yet - needs dead letter queue
43
+ }
44
+ async start() {
45
+ await this.init();
46
+ if (this.consumer) {
47
+ this.consumer.stop();
48
+ }
49
+ this.consumer = sqs_consumer_1.Consumer.create({
50
+ queueUrl: this.queueUrl,
51
+ handleMessage: async (message) => {
52
+ if (message === null) {
53
+ return;
54
+ }
55
+ const deserializedMessage = this.deserializeMessage(message);
56
+ if (deserializedMessage.error === 'abort') {
57
+ await this.failProcessing(message);
58
+ return;
59
+ }
60
+ const transactionSpanId = `queue_${this.queueName}:${
61
+ // @ts-ignore
62
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
63
+ deserializedMessage.result[this.messageTypeField]}`;
64
+ this.transactionObservabilityManager?.start(transactionSpanId);
65
+ const result = await this.processMessage(deserializedMessage.result)
66
+ .catch((err) => {
67
+ // ToDo we need sanity check to stop trying at some point, perhaps some kind of Redis counter
68
+ // If we fail due to unknown reason, let's retry
69
+ this.handleError(err);
70
+ return {
71
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
72
+ error: err,
73
+ };
74
+ })
75
+ .finally(() => {
76
+ this.transactionObservabilityManager?.stop(transactionSpanId);
77
+ });
78
+ if (result.result) {
79
+ return message;
80
+ }
81
+ else {
82
+ return Promise.reject(result);
83
+ }
84
+ },
85
+ sqs: this.sqsClient,
86
+ ...this.consumerOptionsOverride,
87
+ });
88
+ this.consumer.on('error', (err) => {
89
+ this.handleError(err);
90
+ });
91
+ this.consumer.start();
92
+ }
93
+ async close(abort) {
94
+ await super.close();
95
+ this.consumer?.stop({
96
+ abort: abort ?? false,
97
+ });
98
+ }
99
+ }
100
+ exports.AbstractSqsConsumer = AbstractSqsConsumer;
101
+ //# sourceMappingURL=AbstractSqsConsumer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractSqsConsumer.js","sourceRoot":"","sources":["../../../lib/sqs/AbstractSqsConsumer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AsyncPublisher } from '@message-queue-toolkit/core';
2
+ import { AbstractSqsService } from './AbstractSqsService';
3
+ export type SQSMessageOptions = {
4
+ MessageGroupId?: string;
5
+ MessageDeduplicationId?: string;
6
+ };
7
+ export declare abstract class AbstractSqsPublisher<MessagePayloadType extends object> extends AbstractSqsService<MessagePayloadType> implements AsyncPublisher<MessagePayloadType, SQSMessageOptions> {
8
+ publish(message: MessagePayloadType, options?: SQSMessageOptions): Promise<void>;
9
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqsPublisher = void 0;
4
+ const client_sqs_1 = require("@aws-sdk/client-sqs");
5
+ const AbstractSqsService_1 = require("./AbstractSqsService");
6
+ class AbstractSqsPublisher extends AbstractSqsService_1.AbstractSqsService {
7
+ async publish(message, options = {}) {
8
+ try {
9
+ const input = {
10
+ // SendMessageRequest
11
+ QueueUrl: this.queueUrl,
12
+ MessageBody: JSON.stringify(message),
13
+ ...options,
14
+ };
15
+ const command = new client_sqs_1.SendMessageCommand(input);
16
+ await this.sqsClient.send(command);
17
+ }
18
+ catch (error) {
19
+ this.handleError(error);
20
+ throw error;
21
+ }
22
+ }
23
+ }
24
+ exports.AbstractSqsPublisher = AbstractSqsPublisher;
25
+ //# sourceMappingURL=AbstractSqsPublisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractSqsPublisher.js","sourceRoot":"","sources":["../../../lib/sqs/AbstractSqsPublisher.ts"],"names":[],"mappings":";;;AACA,oDAAwD;AAGxD,6DAAyD;AAOzD,MAAsB,oBACpB,SAAQ,uCAAsC;IAG9C,KAAK,CAAC,OAAO,CAAC,OAA2B,EAAE,UAA6B,EAAE;QACxE,IAAI;YACF,MAAM,KAAK,GAAG;gBACZ,qBAAqB;gBACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBACpC,GAAG,OAAO;aACuB,CAAA;YACnC,MAAM,OAAO,GAAG,IAAI,+BAAkB,CAAC,KAAK,CAAC,CAAA;YAC7C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;SACnC;QAAC,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YACvB,MAAM,KAAK,CAAA;SACZ;IACH,CAAC;CACF;AAnBD,oDAmBC"}
@@ -0,0 +1,29 @@
1
+ import type { SQSClient } from '@aws-sdk/client-sqs';
2
+ import type { CreateQueueRequest } from '@aws-sdk/client-sqs/dist-types/models/models_0';
3
+ import type { QueueConsumerDependencies, QueueDependencies, QueueOptions } from '@message-queue-toolkit/core';
4
+ import { AbstractQueueService } from '@message-queue-toolkit/core';
5
+ export type SQSDependencies = QueueDependencies & {
6
+ sqsClient: SQSClient;
7
+ };
8
+ export type SQSConsumerDependencies = SQSDependencies & QueueConsumerDependencies;
9
+ export type SQSQueueAWSConfig = Omit<CreateQueueRequest, 'QueueName'>;
10
+ export type SQSQueueConfig = {
11
+ tags?: Record<string, string>;
12
+ Attributes?: {
13
+ DelaySeconds?: number;
14
+ MaximumMessageSize?: number;
15
+ MessageRetentionPeriod?: number;
16
+ Policy?: any;
17
+ ReceiveMessageWaitTimeSeconds?: number;
18
+ VisibilityTimeout?: number;
19
+ RedrivePolicy?: string;
20
+ RedriveAllowPolicy?: string;
21
+ };
22
+ };
23
+ export declare class AbstractSqsService<MessagePayloadType extends object, SQSOptionsType extends QueueOptions<MessagePayloadType, SQSQueueAWSConfig> = QueueOptions<MessagePayloadType, SQSQueueAWSConfig>, DependenciesType extends SQSDependencies = SQSDependencies> extends AbstractQueueService<MessagePayloadType, DependenciesType, SQSQueueAWSConfig, SQSOptionsType> {
24
+ protected readonly sqsClient: SQSClient;
25
+ queueUrl: string;
26
+ constructor(dependencies: DependenciesType, options: SQSOptionsType);
27
+ init(): Promise<void>;
28
+ close(): Promise<void>;
29
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AbstractSqsService = void 0;
4
+ const client_sqs_1 = require("@aws-sdk/client-sqs");
5
+ const core_1 = require("@message-queue-toolkit/core");
6
+ class AbstractSqsService extends core_1.AbstractQueueService {
7
+ sqsClient;
8
+ // @ts-ignore
9
+ queueUrl;
10
+ constructor(dependencies, options) {
11
+ super(dependencies, options);
12
+ this.sqsClient = dependencies.sqsClient;
13
+ }
14
+ async init() {
15
+ const command = new client_sqs_1.CreateQueueCommand({
16
+ QueueName: this.queueName,
17
+ });
18
+ await this.sqsClient.send(command);
19
+ const getUrlCommand = new client_sqs_1.GetQueueUrlCommand({
20
+ QueueName: this.queueName,
21
+ ...this.queueConfiguration,
22
+ });
23
+ const response = await this.sqsClient.send(getUrlCommand);
24
+ if (!response.QueueUrl) {
25
+ throw new Error(`Queue ${this.queueName} was not created`);
26
+ }
27
+ this.queueUrl = response.QueueUrl;
28
+ }
29
+ // eslint-disable-next-line @typescript-eslint/require-await
30
+ async close() { }
31
+ }
32
+ exports.AbstractSqsService = AbstractSqsService;
33
+ //# sourceMappingURL=AbstractSqsService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractSqsService.js","sourceRoot":"","sources":["../../../lib/sqs/AbstractSqsService.ts"],"names":[],"mappings":";;;AACA,oDAA4E;AAO5E,sDAAkE;AAwBlE,MAAa,kBAOX,SAAQ,2BAKT;IACoB,SAAS,CAAW;IACvC,aAAa;IACN,QAAQ,CAAQ;IAEvB,YAAY,YAA8B,EAAE,OAAuB;QACjE,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QAE5B,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,OAAO,GAAG,IAAI,+BAAkB,CAAC;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAElC,MAAM,aAAa,GAAG,IAAI,+BAAkB,CAAC;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,IAAI,CAAC,kBAAkB;SAC3B,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAEzD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;YACtB,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,kBAAkB,CAAC,CAAA;SAC3D;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAA;IACnC,CAAC;IAED,4DAA4D;IAC5C,KAAK,CAAC,KAAK,KAAmB,CAAC;CAChD;AA5CD,gDA4CC"}
@@ -0,0 +1,5 @@
1
+ import type { Either, ErrorResolver } from '@lokalise/node-core';
2
+ import type { ZodType } from 'zod';
3
+ import type { SqsMessageInvalidFormat, SqsValidationError } from '../errors/sqsErrors';
4
+ import type { SQSMessage } from './AbstractSqsConsumer';
5
+ export declare const deserializeMessage: <T extends object>(message: SQSMessage, type: ZodType<T, import("zod").ZodTypeDef, T>, errorProcessor: ErrorResolver) => Either<SqsMessageInvalidFormat | SqsValidationError, T>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deserializeMessage = void 0;
4
+ const deserializeMessage = (message, type, errorProcessor) => {
5
+ try {
6
+ return {
7
+ result: type.parse(JSON.parse(message.Body)),
8
+ };
9
+ }
10
+ catch (exception) {
11
+ return {
12
+ error: errorProcessor.processError(exception),
13
+ };
14
+ }
15
+ };
16
+ exports.deserializeMessage = deserializeMessage;
17
+ //# sourceMappingURL=messageDeserializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageDeserializer.js","sourceRoot":"","sources":["../../../lib/sqs/messageDeserializer.ts"],"names":[],"mappings":";;;AAOO,MAAM,kBAAkB,GAAG,CAChC,OAAmB,EACnB,IAAgB,EAChB,cAA6B,EAC4B,EAAE;IAC3D,IAAI;QACF,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7C,CAAA;KACF;IAAC,OAAO,SAAS,EAAE;QAClB,OAAO;YACL,KAAK,EAAE,cAAc,CAAC,YAAY,CAAC,SAAS,CAAC;SAC9C,CAAA;KACF;AACH,CAAC,CAAA;AAdY,QAAA,kBAAkB,sBAc9B"}
@@ -0,0 +1,3 @@
1
+ export type CommonMessage = {
2
+ messageType: string;
3
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=MessageTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageTypes.js","sourceRoot":"","sources":["../../../lib/types/MessageTypes.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,73 @@
1
+ {
2
+ "name": "@message-queue-toolkit/sqs",
3
+ "version": "1.0.0",
4
+ "private": false,
5
+ "license": "MIT",
6
+ "description": "SQS adapter for message-queue-toolkit",
7
+ "maintainers": [
8
+ {
9
+ "name": "Igor Savin",
10
+ "email": "kibertoad@gmail.com"
11
+ }
12
+ ],
13
+ "main": "dist/index.js",
14
+ "types": "dist/index.d.ts",
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "build:release": "del-cli dist && del-cli coverage && npm run lint && tsc --project tsconfig.release.json",
18
+ "test": "vitest",
19
+ "test:coverage": "npm test -- --coverage",
20
+ "lint": "eslint . --ext .ts",
21
+ "lint:fix": "eslint . --ext .ts --fix",
22
+ "format": "prettier --write .",
23
+ "docker:start:dev": "docker compose up -d",
24
+ "docker:stop:dev": "docker compose down",
25
+ "prepublishOnly": "npm run build:release"
26
+ },
27
+ "dependencies": {
28
+ "@aws-sdk/client-sqs": "^3.359.0",
29
+ "@lokalise/node-core": "^5.8.1",
30
+ "sqs-consumer": "^7.2.0",
31
+ "zod": "^3.21.4"
32
+ },
33
+ "peerDependencies": {
34
+ "@message-queue-toolkit/core": "^1.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@message-queue-toolkit/core": "*",
38
+ "@types/node": "^20.3.1",
39
+ "@typescript-eslint/eslint-plugin": "^5.60.0",
40
+ "@typescript-eslint/parser": "^5.60.0",
41
+ "@vitest/coverage-v8": "^0.32.2",
42
+ "awilix": "^8.0.1",
43
+ "awilix-manager": "^2.0.0",
44
+ "del-cli": "^5.0.0",
45
+ "eslint": "^8.43.0",
46
+ "eslint-config-prettier": "^8.8.0",
47
+ "eslint-plugin-import": "^2.27.5",
48
+ "eslint-plugin-prettier": "^4.2.1",
49
+ "eslint-plugin-vitest": "^0.2.6",
50
+ "prettier": "^2.8.8",
51
+ "typescript": "^5.1.3",
52
+ "vitest": "^0.32.2"
53
+ },
54
+ "homepage": "https://github.com/kibertoad/message-queue-toolkit",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git://github.com/kibertoad/message-queue-toolkit.git"
58
+ },
59
+ "keywords": [
60
+ "message",
61
+ "queue",
62
+ "queues",
63
+ "abstract",
64
+ "common",
65
+ "utils",
66
+ "sqs"
67
+ ],
68
+ "files": [
69
+ "README.md",
70
+ "LICENSE",
71
+ "dist/*"
72
+ ]
73
+ }