@aesop-fables/triginta 0.7.0 → 0.7.2

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,17 @@
1
+ export declare type SettingsExpression<T> = {
2
+ /**
3
+ * The name of the environmental variable.
4
+ */
5
+ variable: string;
6
+ /**
7
+ * The default value to use if the variable is undefined.
8
+ */
9
+ defaultValue: T;
10
+ };
11
+ declare type SettingsRegistry<Settings> = {
12
+ [Property in keyof Settings]: SettingsExpression<Settings[Property]>;
13
+ };
14
+ export declare function resolveEnvironmentSettings<Settings extends {
15
+ [key: string]: any;
16
+ }>(registry: SettingsRegistry<Settings>): Settings;
17
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveEnvironmentSettings = void 0;
4
+ function resolveEnvironmentSettings(registry) {
5
+ const settings = {};
6
+ Object.entries(registry).forEach(([key, val]) => {
7
+ var _a;
8
+ const property = key;
9
+ const { variable, defaultValue } = val;
10
+ const variableValue = (_a = process.env[variable]) !== null && _a !== void 0 ? _a : defaultValue;
11
+ if (variableValue) {
12
+ settings[property] = variableValue;
13
+ }
14
+ });
15
+ return settings;
16
+ }
17
+ exports.resolveEnvironmentSettings = resolveEnvironmentSettings;
@@ -0,0 +1,8 @@
1
+ import { CreateQueueRequest } from 'aws-sdk/clients/sqs';
2
+ import { SettingsExpression } from '../resolveEnvironmentSettings';
3
+ export interface IQueue extends CreateQueueRequest {
4
+ toEnvExpression(): SettingsExpression<string>;
5
+ }
6
+ export declare class Queue {
7
+ static for(name: string, variableName: string, defaultValue?: string): IQueue;
8
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Queue = void 0;
4
+ class Queue {
5
+ static for(name, variableName, defaultValue) {
6
+ return {
7
+ QueueName: name,
8
+ Attributes: {},
9
+ tags: {},
10
+ toEnvExpression() {
11
+ return { variable: variableName, defaultValue: defaultValue };
12
+ },
13
+ };
14
+ }
15
+ }
16
+ exports.Queue = Queue;
@@ -1,15 +1,19 @@
1
1
  import { SQSMessageAttributes } from 'aws-lambda';
2
+ import { IQueue } from './IQueue';
2
3
  export interface ISqsMessage {
3
4
  type: string;
4
5
  getAttributes(): SQSMessageAttributes;
5
6
  getBody(): string;
7
+ getQueueUrl(): string;
6
8
  }
7
9
  export declare const TrigintaMessageHeaders: {
8
10
  MessageType: string;
9
11
  };
10
12
  export declare abstract class BaseSqsMessage implements ISqsMessage {
11
13
  readonly type: string;
12
- constructor(type: string);
14
+ readonly queue: IQueue;
15
+ constructor(type: string, queue: IQueue);
16
+ getQueueUrl(): string;
13
17
  getAttributes(): SQSMessageAttributes;
14
18
  getData(): any;
15
19
  getBody(): string;
@@ -1,12 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseSqsMessage = exports.TrigintaMessageHeaders = void 0;
4
+ const resolveEnvironmentSettings_1 = require("../resolveEnvironmentSettings");
4
5
  exports.TrigintaMessageHeaders = {
5
6
  MessageType: 'X-Message-Type',
6
7
  };
7
8
  class BaseSqsMessage {
8
- constructor(type) {
9
+ constructor(type, queue) {
9
10
  this.type = type;
11
+ this.queue = queue;
12
+ }
13
+ getQueueUrl() {
14
+ const { queue } = (0, resolveEnvironmentSettings_1.resolveEnvironmentSettings)({ queue: this.queue.toEnvExpression() });
15
+ return queue;
10
16
  }
11
17
  getAttributes() {
12
18
  const attributes = {
@@ -0,0 +1,13 @@
1
+ import { MessageBodyAttributeMap, SendMessageResult } from 'aws-sdk/clients/sqs';
2
+ import { SqsPublisher } from './SqsPublisher';
3
+ import { SQSMessageAttributes } from 'aws-lambda';
4
+ import { ISqsMessage } from './ISqsMessage';
5
+ export interface IMessagePublisher {
6
+ publish(event: ISqsMessage): Promise<SendMessageResult>;
7
+ }
8
+ export declare class MessagePublisher implements IMessagePublisher {
9
+ private readonly sqsPublisher;
10
+ constructor(sqsPublisher: SqsPublisher);
11
+ publish(sqsMessage: ISqsMessage): Promise<SendMessageResult>;
12
+ }
13
+ export declare function messageTypeConverter(attributes: SQSMessageAttributes): MessageBodyAttributeMap;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.messageTypeConverter = exports.MessagePublisher = void 0;
25
+ const containr_1 = require("@aesop-fables/containr");
26
+ const SqsPublisher_1 = require("./SqsPublisher");
27
+ const SqsLambdaServices_1 = require("./SqsLambdaServices");
28
+ let MessagePublisher = class MessagePublisher {
29
+ // eslint-disable-next-line prettier/prettier
30
+ constructor(sqsPublisher) {
31
+ this.sqsPublisher = sqsPublisher;
32
+ }
33
+ publish(sqsMessage) {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ const message = {
36
+ MessageAttributes: messageTypeConverter(sqsMessage.getAttributes()),
37
+ MessageBody: sqsMessage.getBody(),
38
+ QueueUrl: sqsMessage.getQueueUrl(),
39
+ };
40
+ return this.sqsPublisher.sendMessage(message);
41
+ });
42
+ }
43
+ };
44
+ MessagePublisher = __decorate([
45
+ __param(0, (0, containr_1.inject)(SqsLambdaServices_1.SqsLambdaServices.SqsPublisher)),
46
+ __metadata("design:paramtypes", [SqsPublisher_1.SqsPublisher])
47
+ ], MessagePublisher);
48
+ exports.MessagePublisher = MessagePublisher;
49
+ function messageTypeConverter(attributes) {
50
+ const converted = {};
51
+ Object.entries(attributes).forEach(([key, val]) => {
52
+ converted[key] = { DataType: val.dataType, StringValue: val.stringValue };
53
+ });
54
+ return converted;
55
+ }
56
+ exports.messageTypeConverter = messageTypeConverter;
@@ -21,6 +21,8 @@ const core_1 = __importDefault(require("@middy/core"));
21
21
  const Decorators_1 = require("../Decorators");
22
22
  const SqsLambdaServices_1 = require("./SqsLambdaServices");
23
23
  const RecordMatchers_1 = require("./RecordMatchers");
24
+ const SqsPublisher_1 = require("./SqsPublisher");
25
+ const MessagePublisher_1 = require("./MessagePublisher");
24
26
  class SqsLambdaFactory {
25
27
  constructor(container) {
26
28
  this.container = container;
@@ -79,8 +81,11 @@ exports.useTrigintaSqs = (0, containr_1.createServiceModuleWithOptions)('trigint
79
81
  matchers.forEach((matcher) => {
80
82
  services.addDependency(SqsLambdaServices_1.SqsLambdaServices.RecordMatchers, matcher);
81
83
  });
84
+ services.register(SqsLambdaServices_1.SqsLambdaServices.SqsSettings, {});
82
85
  services.use(SqsLambdaServices_1.SqsLambdaServices.DefaultRecordMatcher, RecordMatchers_1.DefaultSqsRecordMatcher);
83
86
  services.use(SqsLambdaServices_1.SqsLambdaServices.MessageDeserializer, RecordMatchers_1.SqsMessageDeserializer);
87
+ services.use(SqsLambdaServices_1.SqsLambdaServices.SqsPublisher, SqsPublisher_1.SqsPublisher);
88
+ services.use(SqsLambdaServices_1.SqsLambdaServices.MessagePublisher, MessagePublisher_1.MessagePublisher);
84
89
  });
85
90
  let _currentContainer;
86
91
  class SqsLambda {
@@ -3,4 +3,7 @@ export declare const SqsLambdaServices: {
3
3
  DefaultRecordMatcher: string;
4
4
  MessageDeserializer: string;
5
5
  RecordMatchers: string;
6
+ MessagePublisher: string;
7
+ SqsPublisher: string;
8
+ SqsSettings: string;
6
9
  };
@@ -6,4 +6,7 @@ exports.SqsLambdaServices = {
6
6
  DefaultRecordMatcher: 'DefaultRecordMatcher',
7
7
  MessageDeserializer: 'MessageDeserializer',
8
8
  RecordMatchers: 'RecordMatchers',
9
+ MessagePublisher: 'MessagePublisher',
10
+ SqsPublisher: 'SqsPublisher',
11
+ SqsSettings: 'SqsSettings',
9
12
  };
@@ -0,0 +1,11 @@
1
+ import { SendMessageRequest, SendMessageResult } from 'aws-sdk/clients/sqs';
2
+ import { SqsSettings } from './SqsSettings';
3
+ export interface ISqsPublisher {
4
+ sendMessage(message: SendMessageRequest): Promise<SendMessageResult>;
5
+ }
6
+ export declare class SqsPublisher implements ISqsPublisher {
7
+ private readonly settings;
8
+ private readonly sqs;
9
+ constructor(settings: SqsSettings);
10
+ sendMessage(message: SendMessageRequest): Promise<SendMessageResult>;
11
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var __importDefault = (this && this.__importDefault) || function (mod) {
24
+ return (mod && mod.__esModule) ? mod : { "default": mod };
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.SqsPublisher = void 0;
28
+ const containr_1 = require("@aesop-fables/containr");
29
+ const aws_sdk_1 = __importDefault(require("aws-sdk"));
30
+ const SqsLambdaServices_1 = require("./SqsLambdaServices");
31
+ let SqsPublisher = class SqsPublisher {
32
+ constructor(settings) {
33
+ this.settings = settings;
34
+ this.sqs = new aws_sdk_1.default.SQS({
35
+ region: this.settings.region,
36
+ apiVersion: this.settings.apiVersion,
37
+ });
38
+ }
39
+ sendMessage(message) {
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ const response = this.sqs.sendMessage(message).promise();
42
+ if (!response) {
43
+ throw new Error(`${response}`);
44
+ }
45
+ return response;
46
+ });
47
+ }
48
+ };
49
+ SqsPublisher = __decorate([
50
+ __param(0, (0, containr_1.inject)(SqsLambdaServices_1.SqsLambdaServices.SqsSettings)),
51
+ __metadata("design:paramtypes", [Object])
52
+ ], SqsPublisher);
53
+ exports.SqsPublisher = SqsPublisher;
@@ -0,0 +1,4 @@
1
+ export interface SqsSettings {
2
+ region: string;
3
+ apiVersion: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aesop-fables/triginta",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "A lightweight framework that wraps the basic infrastructure usages of AWS Lambda (SQS, Kinesis, etc.).",
5
5
  "type": "commonjs",
6
6
  "exports": {
@@ -25,6 +25,7 @@
25
25
  },
26
26
  "devDependencies": {
27
27
  "@aesop-fables/containr": "^0.2.5",
28
+ "@aesop-fables/containr-testing": "^0.2.3",
28
29
  "@middy/core": "^4.2.7",
29
30
  "@middy/http-error-handler": "^4.2.3",
30
31
  "@middy/http-json-body-parser": "^4.2.3",