@klarna/nest-lambda-microservice 0.1.0-beta.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/CHANGELOG.md +12 -0
- package/LICENSE +202 -0
- package/README.md +364 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +17 -0
- package/dist/client/lambda-microservice.client.d.ts +21 -0
- package/dist/client/lambda-microservice.client.js +102 -0
- package/dist/ctx-host/index.d.ts +1 -0
- package/dist/ctx-host/index.js +17 -0
- package/dist/ctx-host/lambda.context.d.ts +10 -0
- package/dist/ctx-host/lambda.context.js +18 -0
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.js +17 -0
- package/dist/decorators/use-partial-pattern-match.d.ts +21 -0
- package/dist/decorators/use-partial-pattern-match.js +53 -0
- package/dist/errors/IncomingResponseError.d.ts +6 -0
- package/dist/errors/IncomingResponseError.js +25 -0
- package/dist/errors/NoConsumerError.d.ts +3 -0
- package/dist/errors/NoConsumerError.js +9 -0
- package/dist/errors/index.d.ts +2 -0
- package/dist/errors/index.js +18 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +24 -0
- package/dist/interfaces/index.d.ts +4 -0
- package/dist/interfaces/index.js +20 -0
- package/dist/interfaces/lambda-microservice.config.d.ts +9 -0
- package/dist/interfaces/lambda-microservice.config.js +2 -0
- package/dist/interfaces/lambda-microservice.packet.d.ts +35 -0
- package/dist/interfaces/lambda-microservice.packet.js +2 -0
- package/dist/interfaces/request.builder.d.ts +4 -0
- package/dist/interfaces/request.builder.js +2 -0
- package/dist/interfaces/response.builder.d.ts +3 -0
- package/dist/interfaces/response.builder.js +2 -0
- package/dist/lambda/event-mapper.d.ts +7 -0
- package/dist/lambda/event-mapper.js +54 -0
- package/dist/lambda/index.d.ts +2 -0
- package/dist/lambda/index.js +18 -0
- package/dist/lambda/integrations/apigateway.d.ts +5 -0
- package/dist/lambda/integrations/apigateway.js +26 -0
- package/dist/lambda/integrations/dynamodb.d.ts +3 -0
- package/dist/lambda/integrations/dynamodb.js +16 -0
- package/dist/lambda/integrations/eventbridge.d.ts +10 -0
- package/dist/lambda/integrations/eventbridge.js +13 -0
- package/dist/lambda/integrations/index.d.ts +7 -0
- package/dist/lambda/integrations/index.js +23 -0
- package/dist/lambda/integrations/kinesis.d.ts +3 -0
- package/dist/lambda/integrations/kinesis.js +16 -0
- package/dist/lambda/integrations/s3.d.ts +3 -0
- package/dist/lambda/integrations/s3.js +16 -0
- package/dist/lambda/integrations/sns.d.ts +4 -0
- package/dist/lambda/integrations/sns.js +26 -0
- package/dist/lambda/integrations/sqs.d.ts +5 -0
- package/dist/lambda/integrations/sqs.js +38 -0
- package/dist/record-builders/api-gateway-request.builder.d.ts +17 -0
- package/dist/record-builders/api-gateway-request.builder.js +43 -0
- package/dist/record-builders/api-gateway-response.builder.d.ts +6 -0
- package/dist/record-builders/api-gateway-response.builder.js +23 -0
- package/dist/record-builders/custom-request.builder.d.ts +10 -0
- package/dist/record-builders/custom-request.builder.js +22 -0
- package/dist/record-builders/custom-response.builder.d.ts +6 -0
- package/dist/record-builders/custom-response.builder.js +27 -0
- package/dist/record-builders/event-bridge-request.builder.d.ts +16 -0
- package/dist/record-builders/event-bridge-request.builder.js +29 -0
- package/dist/record-builders/event-bridge-response.builder.d.ts +6 -0
- package/dist/record-builders/event-bridge-response.builder.js +23 -0
- package/dist/record-builders/index.d.ts +12 -0
- package/dist/record-builders/index.js +28 -0
- package/dist/record-builders/s3-request.builder.d.ts +15 -0
- package/dist/record-builders/s3-request.builder.js +30 -0
- package/dist/record-builders/s3-response.builder.d.ts +6 -0
- package/dist/record-builders/s3-response.builder.js +19 -0
- package/dist/record-builders/sns-request.builder.d.ts +16 -0
- package/dist/record-builders/sns-request.builder.js +51 -0
- package/dist/record-builders/sns-response.builder.d.ts +6 -0
- package/dist/record-builders/sns-response.builder.js +19 -0
- package/dist/record-builders/sqs-request.builder.d.ts +16 -0
- package/dist/record-builders/sqs-request.builder.js +57 -0
- package/dist/record-builders/sqs-response.builder.d.ts +11 -0
- package/dist/record-builders/sqs-response.builder.js +24 -0
- package/dist/server/__mocks__/index.d.ts +1 -0
- package/dist/server/__mocks__/index.js +17 -0
- package/dist/server/__mocks__/lambda-microservice.broker.d.ts +11 -0
- package/dist/server/__mocks__/lambda-microservice.broker.js +37 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +18 -0
- package/dist/server/lambda-microservice.broker.d.ts +13 -0
- package/dist/server/lambda-microservice.broker.js +44 -0
- package/dist/server/lambda-microservice.server.d.ts +26 -0
- package/dist/server/lambda-microservice.server.js +144 -0
- package/dist/server/mocks.d.ts +1 -0
- package/dist/server/mocks.js +17 -0
- package/package.json +59 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./apigateway"), exports);
|
|
18
|
+
__exportStar(require("./dynamodb"), exports);
|
|
19
|
+
__exportStar(require("./eventbridge"), exports);
|
|
20
|
+
__exportStar(require("./kinesis"), exports);
|
|
21
|
+
__exportStar(require("./s3"), exports);
|
|
22
|
+
__exportStar(require("./sns"), exports);
|
|
23
|
+
__exportStar(require("./sqs"), exports);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isKinesisEvent = exports.isKinesisRecord = void 0;
|
|
5
|
+
const isKinesisRecord = (record) => {
|
|
6
|
+
return (record !== null && typeof record === 'object' && 'eventSource' in record && record?.eventSource === 'aws:kinesis');
|
|
7
|
+
};
|
|
8
|
+
exports.isKinesisRecord = isKinesisRecord;
|
|
9
|
+
const isKinesisEvent = (event) => {
|
|
10
|
+
return (event !== null &&
|
|
11
|
+
typeof event === 'object' &&
|
|
12
|
+
'Records' in event &&
|
|
13
|
+
Array.isArray(event?.Records) &&
|
|
14
|
+
event.Records.every(exports.isKinesisRecord));
|
|
15
|
+
};
|
|
16
|
+
exports.isKinesisEvent = isKinesisEvent;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// https://docs.aws.amazon.com/lambda/latest/dg/with-s3.html
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isS3Event = exports.isS3Record = void 0;
|
|
5
|
+
const isS3Record = (record) => {
|
|
6
|
+
return record !== null && typeof record === 'object' && 'eventSource' in record && record?.eventSource === 'aws:s3';
|
|
7
|
+
};
|
|
8
|
+
exports.isS3Record = isS3Record;
|
|
9
|
+
const isS3Event = (event) => {
|
|
10
|
+
return (event !== null &&
|
|
11
|
+
typeof event === 'object' &&
|
|
12
|
+
'Records' in event &&
|
|
13
|
+
Array.isArray(event?.Records) &&
|
|
14
|
+
event.Records.every(exports.isS3Record));
|
|
15
|
+
};
|
|
16
|
+
exports.isS3Event = isS3Event;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { SNSEvent, SNSEventRecord, SNSMessage } from 'aws-lambda';
|
|
2
|
+
export declare const isSnsMessage: (payload: unknown) => payload is SNSMessage;
|
|
3
|
+
export declare const isSnsRecord: (record: unknown) => record is SNSEventRecord;
|
|
4
|
+
export declare const isSnsEvent: (event: unknown) => event is SNSEvent;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isSnsEvent = exports.isSnsRecord = exports.isSnsMessage = void 0;
|
|
5
|
+
const isSnsMessage = (payload) => {
|
|
6
|
+
return (payload !== null &&
|
|
7
|
+
typeof payload === 'object' &&
|
|
8
|
+
'Type' in payload &&
|
|
9
|
+
'TopicArn' in payload &&
|
|
10
|
+
typeof payload.TopicArn === 'string' &&
|
|
11
|
+
payload?.Type === 'Notification' &&
|
|
12
|
+
payload?.TopicArn?.startsWith('arn:aws:sns'));
|
|
13
|
+
};
|
|
14
|
+
exports.isSnsMessage = isSnsMessage;
|
|
15
|
+
const isSnsRecord = (record) => {
|
|
16
|
+
return record !== null && typeof record === 'object' && 'EventSource' in record && record?.EventSource === 'aws:sns';
|
|
17
|
+
};
|
|
18
|
+
exports.isSnsRecord = isSnsRecord;
|
|
19
|
+
const isSnsEvent = (event) => {
|
|
20
|
+
return (event !== null &&
|
|
21
|
+
typeof event === 'object' &&
|
|
22
|
+
'Records' in event &&
|
|
23
|
+
Array.isArray(event?.Records) &&
|
|
24
|
+
event.Records.every(exports.isSnsRecord));
|
|
25
|
+
};
|
|
26
|
+
exports.isSnsEvent = isSnsEvent;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SNSMessage, SQSEvent, SQSRecord } from 'aws-lambda';
|
|
2
|
+
export declare const isSqsRecord: (record: unknown) => record is SQSRecord;
|
|
3
|
+
export declare const isSqsEvent: (event: unknown) => event is SQSEvent;
|
|
4
|
+
export declare const tryUnwrapSnsMessageFromSqsRecord: (record: SQSRecord) => SNSMessage | never;
|
|
5
|
+
export declare const isSqsRecordWithEmbeddedSnsMessage: (record: unknown) => record is SQSRecord;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.isSqsRecordWithEmbeddedSnsMessage = exports.tryUnwrapSnsMessageFromSqsRecord = exports.isSqsEvent = exports.isSqsRecord = void 0;
|
|
5
|
+
const sns_1 = require("./sns");
|
|
6
|
+
const isSqsRecord = (record) => {
|
|
7
|
+
return typeof record === 'object' && record !== null && 'eventSource' in record && record?.eventSource === 'aws:sqs';
|
|
8
|
+
};
|
|
9
|
+
exports.isSqsRecord = isSqsRecord;
|
|
10
|
+
const isSqsEvent = (event) => {
|
|
11
|
+
return (event !== null &&
|
|
12
|
+
typeof event === 'object' &&
|
|
13
|
+
'Records' in event &&
|
|
14
|
+
Array.isArray(event?.Records) &&
|
|
15
|
+
event.Records.every(exports.isSqsRecord));
|
|
16
|
+
};
|
|
17
|
+
exports.isSqsEvent = isSqsEvent;
|
|
18
|
+
const tryUnwrapSnsMessageFromSqsRecord = (record) => {
|
|
19
|
+
const parsedBody = JSON.parse(record.body);
|
|
20
|
+
if (!(0, sns_1.isSnsMessage)(parsedBody)) {
|
|
21
|
+
throw new Error('The SQS Record body is not a serialised SNS Message');
|
|
22
|
+
}
|
|
23
|
+
return parsedBody;
|
|
24
|
+
};
|
|
25
|
+
exports.tryUnwrapSnsMessageFromSqsRecord = tryUnwrapSnsMessageFromSqsRecord;
|
|
26
|
+
const isSqsRecordWithEmbeddedSnsMessage = (record) => {
|
|
27
|
+
if (!(0, exports.isSqsRecord)(record)) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
(0, exports.tryUnwrapSnsMessageFromSqsRecord)(record);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.isSqsRecordWithEmbeddedSnsMessage = isSqsRecordWithEmbeddedSnsMessage;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Context } from 'aws-lambda';
|
|
2
|
+
import { OutgoingApiGatewayRequest, RequestBuilder } from '../interfaces';
|
|
3
|
+
import { AnyAPIGatewayEvent } from '../lambda';
|
|
4
|
+
export interface ApiGatewayPattern {
|
|
5
|
+
httpMethod: string;
|
|
6
|
+
resource: string;
|
|
7
|
+
queryStringParameters: Record<string, unknown> | null;
|
|
8
|
+
pathParameters: Record<string, unknown> | null;
|
|
9
|
+
}
|
|
10
|
+
export declare class ApiGatewayRequestBuilder implements RequestBuilder {
|
|
11
|
+
protected readonly data: AnyAPIGatewayEvent;
|
|
12
|
+
protected readonly context: Context;
|
|
13
|
+
static buildPattern(data: AnyAPIGatewayEvent): ApiGatewayPattern;
|
|
14
|
+
protected pattern: ApiGatewayPattern;
|
|
15
|
+
constructor(data: AnyAPIGatewayEvent, context: Context);
|
|
16
|
+
build(): OutgoingApiGatewayRequest;
|
|
17
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiGatewayRequestBuilder = void 0;
|
|
4
|
+
const lambda_1 = require("../lambda");
|
|
5
|
+
class ApiGatewayRequestBuilder {
|
|
6
|
+
data;
|
|
7
|
+
context;
|
|
8
|
+
static buildPattern(data) {
|
|
9
|
+
if ((0, lambda_1.isApiGatewayEventV1)(data)) {
|
|
10
|
+
return {
|
|
11
|
+
httpMethod: data.httpMethod,
|
|
12
|
+
resource: data.resource,
|
|
13
|
+
queryStringParameters: data.queryStringParameters,
|
|
14
|
+
pathParameters: data.pathParameters,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if ((0, lambda_1.isApiGatewayEventV2)(data)) {
|
|
18
|
+
const [httpMethod, resource] = data.routeKey.split(' ');
|
|
19
|
+
return {
|
|
20
|
+
httpMethod: httpMethod,
|
|
21
|
+
resource: resource,
|
|
22
|
+
queryStringParameters: data.queryStringParameters ?? null,
|
|
23
|
+
pathParameters: data.pathParameters ?? null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
throw new Error('Unknown API Gateway event type');
|
|
27
|
+
}
|
|
28
|
+
pattern;
|
|
29
|
+
constructor(data, context) {
|
|
30
|
+
this.data = data;
|
|
31
|
+
this.context = context;
|
|
32
|
+
this.pattern = ApiGatewayRequestBuilder.buildPattern(this.data);
|
|
33
|
+
}
|
|
34
|
+
build() {
|
|
35
|
+
return {
|
|
36
|
+
id: this.data.requestContext.requestId,
|
|
37
|
+
pattern: this.pattern,
|
|
38
|
+
data: this.data,
|
|
39
|
+
context: this.context,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ApiGatewayRequestBuilder = ApiGatewayRequestBuilder;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiGatewayResponseBuilder = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class ApiGatewayResponseBuilder {
|
|
6
|
+
responseTuples;
|
|
7
|
+
constructor(responseTuples) {
|
|
8
|
+
this.responseTuples = responseTuples;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
for (const [_request, response] of this.responseTuples) {
|
|
12
|
+
if (response instanceof errors_1.IncomingResponseError) {
|
|
13
|
+
throw response.cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (this.responseTuples.length > 1) {
|
|
17
|
+
return this.responseTuples.map((tuple) => tuple[1]);
|
|
18
|
+
}
|
|
19
|
+
const tuple = this.responseTuples[0];
|
|
20
|
+
return tuple[1];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.ApiGatewayResponseBuilder = ApiGatewayResponseBuilder;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Context } from 'aws-lambda';
|
|
2
|
+
import { OutgoingCustomRequest, RequestBuilder } from '../interfaces';
|
|
3
|
+
export type CustomRecordPattern = '*';
|
|
4
|
+
export declare class CustomRequestBuilder implements RequestBuilder {
|
|
5
|
+
protected readonly data: unknown;
|
|
6
|
+
protected readonly context: Context;
|
|
7
|
+
protected pattern: CustomRecordPattern;
|
|
8
|
+
constructor(data: unknown, context: Context);
|
|
9
|
+
build(): OutgoingCustomRequest;
|
|
10
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CustomRequestBuilder = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
class CustomRequestBuilder {
|
|
6
|
+
data;
|
|
7
|
+
context;
|
|
8
|
+
pattern = '*';
|
|
9
|
+
constructor(data, context) {
|
|
10
|
+
this.data = data;
|
|
11
|
+
this.context = context;
|
|
12
|
+
}
|
|
13
|
+
build() {
|
|
14
|
+
return {
|
|
15
|
+
id: (0, uuid_1.v4)(),
|
|
16
|
+
pattern: this.pattern,
|
|
17
|
+
data: this.data,
|
|
18
|
+
context: this.context,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.CustomRequestBuilder = CustomRequestBuilder;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CustomResponseBuilder = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class CustomResponseBuilder {
|
|
6
|
+
responseTuples;
|
|
7
|
+
constructor(responseTuples) {
|
|
8
|
+
this.responseTuples = responseTuples;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
12
|
+
for (const [_request, response] of this.responseTuples) {
|
|
13
|
+
if (response instanceof errors_1.IncomingResponseError) {
|
|
14
|
+
throw response.cause;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
if (!this.responseTuples.length) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
if (this.responseTuples.length > 1) {
|
|
21
|
+
return this.responseTuples.map((tuple) => tuple[1]);
|
|
22
|
+
}
|
|
23
|
+
const tuple = this.responseTuples[0];
|
|
24
|
+
return tuple[1];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.CustomResponseBuilder = CustomResponseBuilder;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context } from 'aws-lambda';
|
|
2
|
+
import { AnyEventBridgeEvent, JSONValue } from '../lambda';
|
|
3
|
+
import { OutgoingEventBridgeRequest, RequestBuilder } from '../interfaces';
|
|
4
|
+
export interface EventBridgePattern {
|
|
5
|
+
source: string;
|
|
6
|
+
detailType: string;
|
|
7
|
+
detail: JSONValue;
|
|
8
|
+
}
|
|
9
|
+
export declare class EventBridgeRequestBuilder implements RequestBuilder {
|
|
10
|
+
protected readonly data: AnyEventBridgeEvent;
|
|
11
|
+
protected readonly context: Context;
|
|
12
|
+
static buildPattern(data: AnyEventBridgeEvent): EventBridgePattern;
|
|
13
|
+
protected pattern: EventBridgePattern;
|
|
14
|
+
constructor(data: AnyEventBridgeEvent, context: Context);
|
|
15
|
+
build(): OutgoingEventBridgeRequest;
|
|
16
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventBridgeRequestBuilder = void 0;
|
|
4
|
+
class EventBridgeRequestBuilder {
|
|
5
|
+
data;
|
|
6
|
+
context;
|
|
7
|
+
static buildPattern(data) {
|
|
8
|
+
return {
|
|
9
|
+
source: data.source,
|
|
10
|
+
detailType: data['detail-type'],
|
|
11
|
+
detail: data.detail,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
pattern;
|
|
15
|
+
constructor(data, context) {
|
|
16
|
+
this.data = data;
|
|
17
|
+
this.context = context;
|
|
18
|
+
this.pattern = EventBridgeRequestBuilder.buildPattern(this.data);
|
|
19
|
+
}
|
|
20
|
+
build() {
|
|
21
|
+
return {
|
|
22
|
+
id: this.data.id,
|
|
23
|
+
pattern: this.pattern,
|
|
24
|
+
data: this.data,
|
|
25
|
+
context: this.context,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.EventBridgeRequestBuilder = EventBridgeRequestBuilder;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventBridgeResponseBuilder = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class EventBridgeResponseBuilder {
|
|
6
|
+
responseTuples;
|
|
7
|
+
constructor(responseTuples) {
|
|
8
|
+
this.responseTuples = responseTuples;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
for (const [_request, response] of this.responseTuples) {
|
|
12
|
+
if (response instanceof errors_1.IncomingResponseError) {
|
|
13
|
+
throw response.cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (this.responseTuples.length > 1) {
|
|
17
|
+
return this.responseTuples.map((tuple) => tuple[1]);
|
|
18
|
+
}
|
|
19
|
+
const tuple = this.responseTuples[0];
|
|
20
|
+
return tuple[1];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.EventBridgeResponseBuilder = EventBridgeResponseBuilder;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './api-gateway-request.builder';
|
|
2
|
+
export * from './api-gateway-response.builder';
|
|
3
|
+
export * from './custom-request.builder';
|
|
4
|
+
export * from './custom-response.builder';
|
|
5
|
+
export * from './event-bridge-request.builder';
|
|
6
|
+
export * from './event-bridge-response.builder';
|
|
7
|
+
export * from './s3-request.builder';
|
|
8
|
+
export * from './s3-response.builder';
|
|
9
|
+
export * from './sns-request.builder';
|
|
10
|
+
export * from './sns-response.builder';
|
|
11
|
+
export * from './sqs-request.builder';
|
|
12
|
+
export * from './sqs-response.builder';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./api-gateway-request.builder"), exports);
|
|
18
|
+
__exportStar(require("./api-gateway-response.builder"), exports);
|
|
19
|
+
__exportStar(require("./custom-request.builder"), exports);
|
|
20
|
+
__exportStar(require("./custom-response.builder"), exports);
|
|
21
|
+
__exportStar(require("./event-bridge-request.builder"), exports);
|
|
22
|
+
__exportStar(require("./event-bridge-response.builder"), exports);
|
|
23
|
+
__exportStar(require("./s3-request.builder"), exports);
|
|
24
|
+
__exportStar(require("./s3-response.builder"), exports);
|
|
25
|
+
__exportStar(require("./sns-request.builder"), exports);
|
|
26
|
+
__exportStar(require("./sns-response.builder"), exports);
|
|
27
|
+
__exportStar(require("./sqs-request.builder"), exports);
|
|
28
|
+
__exportStar(require("./sqs-response.builder"), exports);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Context, S3EventRecord } from 'aws-lambda';
|
|
2
|
+
import { OutgoingS3Request, RequestBuilder } from '../interfaces';
|
|
3
|
+
export interface S3RecordPattern {
|
|
4
|
+
eventName: string;
|
|
5
|
+
bucketName: string;
|
|
6
|
+
objectKey: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class S3RequestBuilder implements RequestBuilder {
|
|
9
|
+
protected readonly data: S3EventRecord;
|
|
10
|
+
protected readonly context: Context;
|
|
11
|
+
static buildPattern(data: S3EventRecord): S3RecordPattern;
|
|
12
|
+
protected pattern: S3RecordPattern;
|
|
13
|
+
constructor(data: S3EventRecord, context: Context);
|
|
14
|
+
build(): OutgoingS3Request;
|
|
15
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3RequestBuilder = void 0;
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
|
+
class S3RequestBuilder {
|
|
6
|
+
data;
|
|
7
|
+
context;
|
|
8
|
+
static buildPattern(data) {
|
|
9
|
+
return {
|
|
10
|
+
eventName: data.eventName,
|
|
11
|
+
bucketName: data.s3.bucket.name,
|
|
12
|
+
objectKey: data.s3.object.key,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
pattern;
|
|
16
|
+
constructor(data, context) {
|
|
17
|
+
this.data = data;
|
|
18
|
+
this.context = context;
|
|
19
|
+
this.pattern = S3RequestBuilder.buildPattern(this.data);
|
|
20
|
+
}
|
|
21
|
+
build() {
|
|
22
|
+
return {
|
|
23
|
+
id: (0, uuid_1.v4)(),
|
|
24
|
+
pattern: this.pattern,
|
|
25
|
+
data: this.data,
|
|
26
|
+
context: this.context,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.S3RequestBuilder = S3RequestBuilder;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3ResponseBuilder = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class S3ResponseBuilder {
|
|
6
|
+
responseTuples;
|
|
7
|
+
constructor(responseTuples) {
|
|
8
|
+
this.responseTuples = responseTuples;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
for (const [_request, response] of this.responseTuples) {
|
|
12
|
+
if (response instanceof errors_1.IncomingResponseError) {
|
|
13
|
+
throw response.cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return this.responseTuples.map(([_request, response]) => response);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.S3ResponseBuilder = S3ResponseBuilder;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, SNSMessage, SNSMessageAttribute } from 'aws-lambda';
|
|
2
|
+
import { SNSEventRecord } from 'aws-lambda/trigger/sns';
|
|
3
|
+
import { OutgoingSnsRequest, RequestBuilder } from '../interfaces';
|
|
4
|
+
export interface SnsRecordPattern {
|
|
5
|
+
[key: string]: string | number;
|
|
6
|
+
}
|
|
7
|
+
export declare class SnsRequestBuilder implements RequestBuilder {
|
|
8
|
+
protected readonly data: SNSEventRecord;
|
|
9
|
+
protected readonly context: Context;
|
|
10
|
+
static buildPattern(data: SNSEventRecord): SnsRecordPattern;
|
|
11
|
+
static buildSnsMessagePattern(data: SNSMessage): SnsRecordPattern;
|
|
12
|
+
static mapSnsMessageAttributes(messageAttribute: SNSMessageAttribute): string | number;
|
|
13
|
+
protected pattern: SnsRecordPattern;
|
|
14
|
+
constructor(data: SNSEventRecord, context: Context);
|
|
15
|
+
build(): OutgoingSnsRequest;
|
|
16
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SnsRequestBuilder = void 0;
|
|
4
|
+
class SnsRequestBuilder {
|
|
5
|
+
data;
|
|
6
|
+
context;
|
|
7
|
+
static buildPattern(data) {
|
|
8
|
+
return SnsRequestBuilder.buildSnsMessagePattern(data.Sns);
|
|
9
|
+
}
|
|
10
|
+
static buildSnsMessagePattern(data) {
|
|
11
|
+
const pattern = {};
|
|
12
|
+
const messageAttrs = data.MessageAttributes;
|
|
13
|
+
return Reflect.ownKeys(messageAttrs).reduce((pattern, key) => {
|
|
14
|
+
Reflect.set(pattern, key, SnsRequestBuilder.mapSnsMessageAttributes(Reflect.get(messageAttrs, key)));
|
|
15
|
+
return pattern;
|
|
16
|
+
}, pattern);
|
|
17
|
+
}
|
|
18
|
+
static mapSnsMessageAttributes(messageAttribute) {
|
|
19
|
+
switch (messageAttribute.Type) {
|
|
20
|
+
case 'String':
|
|
21
|
+
try {
|
|
22
|
+
return messageAttribute.Value ? JSON.parse(messageAttribute.Value) : '';
|
|
23
|
+
}
|
|
24
|
+
catch (_error) {
|
|
25
|
+
return messageAttribute.Value ?? '';
|
|
26
|
+
}
|
|
27
|
+
case 'String.Array':
|
|
28
|
+
return messageAttribute.Value ? JSON.parse(messageAttribute.Value) : [];
|
|
29
|
+
case 'Number':
|
|
30
|
+
return messageAttribute.Value ? JSON.parse(messageAttribute.Value) : 0;
|
|
31
|
+
case 'Binary':
|
|
32
|
+
default:
|
|
33
|
+
throw new Error('Attribute type not implemented');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
pattern = {};
|
|
37
|
+
constructor(data, context) {
|
|
38
|
+
this.data = data;
|
|
39
|
+
this.context = context;
|
|
40
|
+
this.pattern = SnsRequestBuilder.buildPattern(this.data);
|
|
41
|
+
}
|
|
42
|
+
build() {
|
|
43
|
+
return {
|
|
44
|
+
id: this.data.Sns.MessageId,
|
|
45
|
+
pattern: this.pattern,
|
|
46
|
+
data: this.data.Sns,
|
|
47
|
+
context: this.context,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.SnsRequestBuilder = SnsRequestBuilder;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SnsResponseBuilder = void 0;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
class SnsResponseBuilder {
|
|
6
|
+
responseTuples;
|
|
7
|
+
constructor(responseTuples) {
|
|
8
|
+
this.responseTuples = responseTuples;
|
|
9
|
+
}
|
|
10
|
+
build() {
|
|
11
|
+
for (const [_request, response] of this.responseTuples) {
|
|
12
|
+
if (response instanceof errors_1.IncomingResponseError) {
|
|
13
|
+
throw response.cause;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return this.responseTuples.map(([_request, response]) => response);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.SnsResponseBuilder = SnsResponseBuilder;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Context, SQSRecord } from 'aws-lambda';
|
|
2
|
+
import { SQSMessageAttribute } from 'aws-lambda/trigger/sqs';
|
|
3
|
+
import { OutgoingSqsRequest, RequestBuilder } from '../interfaces';
|
|
4
|
+
export interface SqsRecordPattern {
|
|
5
|
+
[key: string]: string | number;
|
|
6
|
+
}
|
|
7
|
+
export declare class SqsRequestBuilder implements RequestBuilder {
|
|
8
|
+
protected readonly data: SQSRecord;
|
|
9
|
+
protected readonly context: Context;
|
|
10
|
+
static buildPattern(data: SQSRecord): SqsRecordPattern;
|
|
11
|
+
static buildSqsMessagePattern(data: SQSRecord): SqsRecordPattern;
|
|
12
|
+
static mapSqsMessageAttributes(messageAttribute: SQSMessageAttribute): string | number;
|
|
13
|
+
protected pattern: SqsRecordPattern;
|
|
14
|
+
constructor(data: SQSRecord, context: Context);
|
|
15
|
+
build(): OutgoingSqsRequest;
|
|
16
|
+
}
|