@alanszp/eventbridge-client 7.4.3 → 7.5.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/dist/basicEventbridgeClient.d.ts +5 -2
- package/dist/basicEventbridgeClient.js +36 -14
- package/dist/basicEventbridgeClient.js.map +1 -1
- package/dist/basicEventbridgeClient.test.js +44 -21
- package/dist/basicEventbridgeClient.test.js.map +1 -1
- package/dist/mocks/fixtures/eventbridgeFixture.d.ts +32 -53
- package/dist/mocks/fixtures/eventbridgeFixture.js +34 -98
- package/dist/mocks/fixtures/eventbridgeFixture.js.map +1 -1
- package/package.json +2 -2
- package/src/basicEventbridgeClient.test.ts +76 -32
- package/src/basicEventbridgeClient.ts +55 -16
- package/src/mocks/fixtures/eventbridgeFixture.ts +34 -98
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ILogger } from "@alanszp/logger";
|
|
2
2
|
import { SharedContext } from "@alanszp/shared-context";
|
|
3
|
-
import { PutEventEntryResponse } from "./aws";
|
|
3
|
+
import { PutEventEntryRequest, PutEventEntryResponse } from "./aws";
|
|
4
4
|
/**
|
|
5
5
|
* Represents an event that is sent in the Lara ecosystem.
|
|
6
6
|
*
|
|
@@ -12,9 +12,12 @@ export declare type LaraEvent = {
|
|
|
12
12
|
topic: string;
|
|
13
13
|
body: Record<string, unknown>;
|
|
14
14
|
};
|
|
15
|
+
export declare type PutEventFailedEntryResponse = PutEventEntryResponse & {
|
|
16
|
+
event: PutEventEntryRequest;
|
|
17
|
+
};
|
|
15
18
|
export interface EventDispatchResult {
|
|
16
19
|
successful: PutEventEntryResponse[];
|
|
17
|
-
failed:
|
|
20
|
+
failed: PutEventFailedEntryResponse[];
|
|
18
21
|
failedCount: number | undefined;
|
|
19
22
|
}
|
|
20
23
|
/**
|
|
@@ -35,33 +35,55 @@ class BasicEventbridgeClient {
|
|
|
35
35
|
const eventsToSend = (0, lodash_1.chain)(events)
|
|
36
36
|
.map((event) => (0, mapLaraEventToAWSEvent_1.mapLaraEventToAWSEvent)(event, this.env, this.appName, this.bus, logger, this.context))
|
|
37
37
|
.compact()
|
|
38
|
-
.
|
|
39
|
-
|
|
40
|
-
Entries: mappedEventsChunk,
|
|
38
|
+
.map((event) => ({
|
|
39
|
+
Entries: [event],
|
|
41
40
|
}))
|
|
42
41
|
.value();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Eventbridge in US-EAST-1 has a limit of 10.000 events/second.
|
|
44
|
+
* We should be fine without a limiter here.
|
|
45
|
+
*/
|
|
46
|
+
const results = yield Promise.all(eventsToSend.map((singleEventArray) => aws_1.eventbridgeClient
|
|
47
|
+
.putEvents(singleEventArray)
|
|
48
|
+
.promise()
|
|
49
|
+
.then(({ Entries, FailedEntryCount }) => ({
|
|
50
|
+
FailedEntryCount,
|
|
51
|
+
Entries: [
|
|
52
|
+
Object.assign(Object.assign({}, (Entries || [])[0]), { event: singleEventArray.Entries[0] }),
|
|
53
|
+
],
|
|
54
|
+
}))
|
|
55
|
+
.catch((error) => ({
|
|
56
|
+
FailedEntryCount: 1,
|
|
57
|
+
Entries: [
|
|
58
|
+
{
|
|
59
|
+
EventId: undefined,
|
|
60
|
+
ErrorMessage: JSON.stringify(error),
|
|
61
|
+
event: singleEventArray.Entries[0],
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
}))));
|
|
46
65
|
const aggregatedResult = results.reduce((prev, act) => {
|
|
47
66
|
const { Entries: NewEntries, FailedEntryCount: newFailedCount } = act;
|
|
48
|
-
const {
|
|
67
|
+
const { eventsDispatched, failedCount } = prev;
|
|
49
68
|
return {
|
|
50
|
-
|
|
51
|
-
|
|
69
|
+
eventsDispatched: [
|
|
70
|
+
...(eventsDispatched || []),
|
|
71
|
+
...(NewEntries || []),
|
|
72
|
+
],
|
|
73
|
+
failedCount: (failedCount || 0) + (newFailedCount || 0),
|
|
52
74
|
};
|
|
53
75
|
}, {
|
|
54
|
-
|
|
55
|
-
|
|
76
|
+
eventsDispatched: [],
|
|
77
|
+
failedCount: 0,
|
|
56
78
|
});
|
|
57
|
-
const {
|
|
58
|
-
const [successful, failed] = (0, lodash_1.partition)(
|
|
79
|
+
const { eventsDispatched, failedCount } = aggregatedResult;
|
|
80
|
+
const [successful, failed] = (0, lodash_1.partition)(eventsDispatched, (entry) => entry.EventId);
|
|
59
81
|
logger.info("eventbridge.client.sendEvents.end", {
|
|
60
82
|
successful,
|
|
61
83
|
failed,
|
|
62
84
|
});
|
|
63
85
|
return {
|
|
64
|
-
successful,
|
|
86
|
+
successful: successful.map((eventDispatched) => (0, lodash_1.omit)(eventDispatched, "event")),
|
|
65
87
|
failed,
|
|
66
88
|
failedCount,
|
|
67
89
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicEventbridgeClient.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,
|
|
1
|
+
{"version":3,"file":"basicEventbridgeClient.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,61 +14,84 @@ const shared_context_1 = require("@alanszp/shared-context");
|
|
|
14
14
|
const awsEventbridgeClient_1 = require("./aws/awsEventbridgeClient");
|
|
15
15
|
const mockEventbridgeClient_1 = require("./mockEventbridgeClient");
|
|
16
16
|
const eventbridgeFixture_1 = require("./mocks/fixtures/eventbridgeFixture");
|
|
17
|
-
const { eventsToSend, allSuccessfulResponses, allUnsuccessfulResponses, sevenUnsuccessfulResponses, } = eventbridgeFixture_1.fifteenEventsFixture;
|
|
18
17
|
jest.mock("./aws/awsEventbridgeClient");
|
|
19
18
|
const client = new mockEventbridgeClient_1.MockEventbridgeClient("appName", "env", () => (0, logger_1.createMockLogger)({}), new shared_context_1.SharedContext(), "busName");
|
|
20
19
|
describe("BasicEventbridgeClient", () => {
|
|
21
20
|
describe("sendEvents", () => {
|
|
22
|
-
describe("when there are
|
|
21
|
+
describe("when there are two events", () => {
|
|
23
22
|
describe("when they're all successful", () => {
|
|
24
23
|
it("should send two requests, aggregate results, and show no failures", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
24
|
awsEventbridgeClient_1.eventbridgeClient.putEvents
|
|
26
25
|
.mockImplementationOnce((_) => ({
|
|
27
|
-
promise: () => Promise.resolve(
|
|
26
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.twoSuccessfulResponses[0]),
|
|
28
27
|
}))
|
|
29
28
|
.mockImplementationOnce((_) => ({
|
|
30
|
-
promise: () => Promise.resolve(
|
|
29
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.twoSuccessfulResponses[1]),
|
|
31
30
|
}));
|
|
32
|
-
const response = yield client.mockSendEvents(
|
|
31
|
+
const response = yield client.mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
|
|
33
32
|
expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
34
33
|
expect(response.failedCount).toBe(0);
|
|
35
|
-
expect(response.successful.length).toBe(
|
|
34
|
+
expect(response.successful.length).toBe(2);
|
|
36
35
|
expect(response.failed.length).toBe(0);
|
|
37
36
|
}));
|
|
38
37
|
});
|
|
39
|
-
describe("when they're all
|
|
40
|
-
it("should send two requests, aggregate results, and show
|
|
38
|
+
describe("when they're all unsuccessful", () => {
|
|
39
|
+
it("should send two requests, aggregate results, and show two failures", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
41
40
|
awsEventbridgeClient_1.eventbridgeClient.putEvents
|
|
42
41
|
.mockImplementationOnce((_) => ({
|
|
43
|
-
promise: () => Promise.resolve(
|
|
42
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.twoUnsuccessfulResponses[0]),
|
|
44
43
|
}))
|
|
45
44
|
.mockImplementationOnce((_) => ({
|
|
46
|
-
promise: () => Promise.resolve(
|
|
45
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.twoUnsuccessfulResponses[1]),
|
|
47
46
|
}));
|
|
48
|
-
const response = yield client.mockSendEvents(
|
|
47
|
+
const response = yield client.mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
|
|
49
48
|
expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
50
|
-
expect(response.failedCount).toBe(
|
|
49
|
+
expect(response.failedCount).toBe(2);
|
|
51
50
|
expect(response.successful.length).toBe(0);
|
|
52
|
-
expect(response.failed.length).toBe(
|
|
51
|
+
expect(response.failed.length).toBe(2);
|
|
52
|
+
expect(response.failed[0].event.DetailType).toBe(eventbridgeFixture_1.topics[0]);
|
|
53
|
+
expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[0]), { lch: "aws.eventbridge" }));
|
|
54
|
+
expect(response.failed[1].event.DetailType).toBe(eventbridgeFixture_1.topics[1]);
|
|
55
|
+
expect(JSON.parse(response.failed[1].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[1]), { lch: "aws.eventbridge" }));
|
|
53
56
|
}));
|
|
54
57
|
});
|
|
55
|
-
describe("when
|
|
56
|
-
it("should send two requests, aggregate results, and show
|
|
58
|
+
describe("when one isn't successful", () => {
|
|
59
|
+
it("should send two requests, aggregate results, and show one failure", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
57
60
|
awsEventbridgeClient_1.eventbridgeClient.putEvents
|
|
58
61
|
.mockImplementationOnce((_) => ({
|
|
59
|
-
promise: () => Promise.resolve(
|
|
62
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.oneSuccessfulOneUnsuccessfulResponses[0]),
|
|
60
63
|
}))
|
|
61
64
|
.mockImplementationOnce((_) => ({
|
|
62
|
-
promise: () => Promise.resolve(
|
|
65
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.oneSuccessfulOneUnsuccessfulResponses[1]),
|
|
63
66
|
}));
|
|
64
|
-
const response = yield client.mockSendEvents(
|
|
67
|
+
const response = yield client.mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
|
|
65
68
|
expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
66
|
-
expect(response.failedCount).toBe(
|
|
67
|
-
expect(response.successful.length).toBe(
|
|
68
|
-
expect(response.failed.length).toBe(
|
|
69
|
+
expect(response.failedCount).toBe(1);
|
|
70
|
+
expect(response.successful.length).toBe(1);
|
|
71
|
+
expect(response.failed.length).toBe(1);
|
|
72
|
+
expect(response.failed[0].event.DetailType).toBe(eventbridgeFixture_1.topics[1]);
|
|
73
|
+
expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[1]), { lch: "aws.eventbridge" }));
|
|
69
74
|
}));
|
|
70
75
|
});
|
|
71
76
|
});
|
|
77
|
+
describe("when a request to eventbridge fails", () => {
|
|
78
|
+
it("shouldn't break following requests and should count as a failure", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
79
|
+
awsEventbridgeClient_1.eventbridgeClient.putEvents
|
|
80
|
+
.mockImplementationOnce((_) => ({
|
|
81
|
+
promise: () => Promise.reject(),
|
|
82
|
+
}))
|
|
83
|
+
.mockImplementationOnce((_) => ({
|
|
84
|
+
promise: () => Promise.resolve(eventbridgeFixture_1.twoSuccessfulResponses[1]),
|
|
85
|
+
}));
|
|
86
|
+
const response = yield client.mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
|
|
87
|
+
expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
88
|
+
expect(response.failedCount).toBe(1);
|
|
89
|
+
expect(response.successful.length).toBe(1);
|
|
90
|
+
expect(response.failed.length).toBe(1);
|
|
91
|
+
expect(response.failed[0].event.DetailType).toBe(eventbridgeFixture_1.topics[0]);
|
|
92
|
+
expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[0]), { lch: "aws.eventbridge" }));
|
|
93
|
+
}));
|
|
94
|
+
});
|
|
72
95
|
});
|
|
73
96
|
});
|
|
74
97
|
//# sourceMappingURL=basicEventbridgeClient.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicEventbridgeClient.test.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4CAAmD;AACnD,4DAAwD;AACxD,qEAA+D;AAC/D,mEAAgE;AAChE,
|
|
1
|
+
{"version":3,"file":"basicEventbridgeClient.test.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +1,33 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
firstResponse: {
|
|
10
|
-
Entries: {
|
|
11
|
-
EventId: number;
|
|
12
|
-
}[];
|
|
13
|
-
FailedEntryCount: number;
|
|
14
|
-
};
|
|
15
|
-
secondResponse: {
|
|
16
|
-
Entries: {
|
|
17
|
-
EventId: number;
|
|
18
|
-
}[];
|
|
19
|
-
FailedEntryCount: number;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
allUnsuccessfulResponses: {
|
|
23
|
-
firstResponse: {
|
|
24
|
-
Entries: {
|
|
25
|
-
EventId: null;
|
|
26
|
-
}[];
|
|
27
|
-
FailedEntryCount: number;
|
|
28
|
-
};
|
|
29
|
-
secondResponse: {
|
|
30
|
-
Entries: {
|
|
31
|
-
EventId: null;
|
|
32
|
-
}[];
|
|
33
|
-
FailedEntryCount: number;
|
|
34
|
-
};
|
|
1
|
+
export declare const topics: string[];
|
|
2
|
+
export declare const events: {
|
|
3
|
+
property: string;
|
|
4
|
+
}[];
|
|
5
|
+
export declare const twoEventsToSend: {
|
|
6
|
+
topic: string;
|
|
7
|
+
body: {
|
|
8
|
+
property: string;
|
|
35
9
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
10
|
+
}[];
|
|
11
|
+
export declare const twoSuccessfulResponses: {
|
|
12
|
+
Entries: {
|
|
13
|
+
EventId: number;
|
|
14
|
+
}[];
|
|
15
|
+
FailedEntryCount: number;
|
|
16
|
+
}[];
|
|
17
|
+
export declare const twoUnsuccessfulResponses: {
|
|
18
|
+
Entries: {
|
|
19
|
+
EventId: undefined;
|
|
20
|
+
}[];
|
|
21
|
+
FailedEntryCount: number;
|
|
22
|
+
}[];
|
|
23
|
+
export declare const oneSuccessfulOneUnsuccessfulResponses: ({
|
|
24
|
+
Entries: {
|
|
25
|
+
EventId: number;
|
|
26
|
+
}[];
|
|
27
|
+
FailedEntryCount: number;
|
|
28
|
+
} | {
|
|
29
|
+
Entries: {
|
|
30
|
+
EventId: null;
|
|
31
|
+
}[];
|
|
32
|
+
FailedEntryCount: number;
|
|
33
|
+
})[];
|
|
@@ -1,104 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
{ topic: "topic", body: { property: true } },
|
|
15
|
-
{ topic: "topic", body: { property: true } },
|
|
16
|
-
{ topic: "topic", body: { property: true } },
|
|
17
|
-
{ topic: "topic", body: { property: true } },
|
|
18
|
-
{ topic: "topic", body: { property: true } },
|
|
19
|
-
{ topic: "topic", body: { property: true } },
|
|
20
|
-
{ topic: "topic", body: { property: true } },
|
|
21
|
-
],
|
|
22
|
-
allSuccessfulResponses: {
|
|
23
|
-
firstResponse: {
|
|
24
|
-
Entries: [
|
|
25
|
-
{ EventId: 1 },
|
|
26
|
-
{ EventId: 2 },
|
|
27
|
-
{ EventId: 3 },
|
|
28
|
-
{ EventId: 4 },
|
|
29
|
-
{ EventId: 5 },
|
|
30
|
-
{ EventId: 6 },
|
|
31
|
-
{ EventId: 7 },
|
|
32
|
-
{ EventId: 8 },
|
|
33
|
-
{ EventId: 9 },
|
|
34
|
-
{ EventId: 10 },
|
|
35
|
-
],
|
|
36
|
-
FailedEntryCount: 0,
|
|
37
|
-
},
|
|
38
|
-
secondResponse: {
|
|
39
|
-
Entries: [
|
|
40
|
-
{ EventId: 11 },
|
|
41
|
-
{ EventId: 12 },
|
|
42
|
-
{ EventId: 13 },
|
|
43
|
-
{ EventId: 14 },
|
|
44
|
-
{ EventId: 15 },
|
|
45
|
-
],
|
|
46
|
-
FailedEntryCount: 0,
|
|
47
|
-
},
|
|
3
|
+
exports.oneSuccessfulOneUnsuccessfulResponses = exports.twoUnsuccessfulResponses = exports.twoSuccessfulResponses = exports.twoEventsToSend = exports.events = exports.topics = void 0;
|
|
4
|
+
exports.topics = ["topic1", "topic2"];
|
|
5
|
+
exports.events = [{ property: "1" }, { property: "2" }];
|
|
6
|
+
exports.twoEventsToSend = [
|
|
7
|
+
{ topic: exports.topics[0], body: exports.events[0] },
|
|
8
|
+
{ topic: exports.topics[1], body: exports.events[1] },
|
|
9
|
+
];
|
|
10
|
+
exports.twoSuccessfulResponses = [
|
|
11
|
+
{
|
|
12
|
+
Entries: [{ EventId: 1 }],
|
|
13
|
+
FailedEntryCount: 0,
|
|
48
14
|
},
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
{ EventId: null },
|
|
53
|
-
{ EventId: null },
|
|
54
|
-
{ EventId: null },
|
|
55
|
-
{ EventId: null },
|
|
56
|
-
{ EventId: null },
|
|
57
|
-
{ EventId: null },
|
|
58
|
-
{ EventId: null },
|
|
59
|
-
{ EventId: null },
|
|
60
|
-
{ EventId: null },
|
|
61
|
-
{ EventId: null },
|
|
62
|
-
],
|
|
63
|
-
FailedEntryCount: 10,
|
|
64
|
-
},
|
|
65
|
-
secondResponse: {
|
|
66
|
-
Entries: [
|
|
67
|
-
{ EventId: null },
|
|
68
|
-
{ EventId: null },
|
|
69
|
-
{ EventId: null },
|
|
70
|
-
{ EventId: null },
|
|
71
|
-
{ EventId: null },
|
|
72
|
-
],
|
|
73
|
-
FailedEntryCount: 5,
|
|
74
|
-
},
|
|
15
|
+
{
|
|
16
|
+
Entries: [{ EventId: 2 }],
|
|
17
|
+
FailedEntryCount: 0,
|
|
75
18
|
},
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
{ EventId: 3 },
|
|
82
|
-
{ EventId: 4 },
|
|
83
|
-
{ EventId: null },
|
|
84
|
-
{ EventId: null },
|
|
85
|
-
{ EventId: null },
|
|
86
|
-
{ EventId: null },
|
|
87
|
-
{ EventId: null },
|
|
88
|
-
{ EventId: null },
|
|
89
|
-
],
|
|
90
|
-
FailedEntryCount: 6,
|
|
91
|
-
},
|
|
92
|
-
secondResponse: {
|
|
93
|
-
Entries: [
|
|
94
|
-
{ EventId: 5 },
|
|
95
|
-
{ EventId: 6 },
|
|
96
|
-
{ EventId: 8 },
|
|
97
|
-
{ EventId: null },
|
|
98
|
-
{ EventId: 7 },
|
|
99
|
-
],
|
|
100
|
-
FailedEntryCount: 1,
|
|
101
|
-
},
|
|
19
|
+
];
|
|
20
|
+
exports.twoUnsuccessfulResponses = [
|
|
21
|
+
{
|
|
22
|
+
Entries: [{ EventId: undefined }],
|
|
23
|
+
FailedEntryCount: 1,
|
|
102
24
|
},
|
|
103
|
-
|
|
25
|
+
{
|
|
26
|
+
Entries: [{ EventId: undefined }],
|
|
27
|
+
FailedEntryCount: 1,
|
|
28
|
+
},
|
|
29
|
+
];
|
|
30
|
+
exports.oneSuccessfulOneUnsuccessfulResponses = [
|
|
31
|
+
{
|
|
32
|
+
Entries: [{ EventId: 1 }],
|
|
33
|
+
FailedEntryCount: 0,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
Entries: [{ EventId: null }],
|
|
37
|
+
FailedEntryCount: 1,
|
|
38
|
+
},
|
|
39
|
+
];
|
|
104
40
|
//# sourceMappingURL=eventbridgeFixture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbridgeFixture.js","sourceRoot":"","sources":["../../../src/mocks/fixtures/eventbridgeFixture.ts"],"names":[],"mappings":";;;AAAa,QAAA,
|
|
1
|
+
{"version":3,"file":"eventbridgeFixture.js","sourceRoot":"","sources":["../../../src/mocks/fixtures/eventbridgeFixture.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE9B,QAAA,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AAEhD,QAAA,eAAe,GAAG;IAC7B,EAAE,KAAK,EAAE,cAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAM,CAAC,CAAC,CAAC,EAAE;IACrC,EAAE,KAAK,EAAE,cAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,cAAM,CAAC,CAAC,CAAC,EAAE;CACtC,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC;QACE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;KACpB;IACD;QACE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;KACpB;CACF,CAAC;AAEW,QAAA,wBAAwB,GAAG;IACtC;QACE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACjC,gBAAgB,EAAE,CAAC;KACpB;IACD;QACE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QACjC,gBAAgB,EAAE,CAAC;KACpB;CACF,CAAC;AAEW,QAAA,qCAAqC,GAAG;IACnD;QACE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACzB,gBAAgB,EAAE,CAAC;KACpB;IACD;QACE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5B,gBAAgB,EAAE,CAAC;KACpB;CACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alanszp/eventbridge-client",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.5.0",
|
|
4
4
|
"description": "Alan's basic eventbridge client.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
"cuid": "^2.1.8",
|
|
36
36
|
"lodash": "^4.17.21"
|
|
37
37
|
},
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "1cdd9b6c453ac10c3dd29772f6538284ad5df605"
|
|
39
39
|
}
|
|
@@ -2,14 +2,14 @@ import { createMockLogger } from "@alanszp/logger";
|
|
|
2
2
|
import { SharedContext } from "@alanszp/shared-context";
|
|
3
3
|
import { eventbridgeClient } from "./aws/awsEventbridgeClient";
|
|
4
4
|
import { MockEventbridgeClient } from "./mockEventbridgeClient";
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
5
|
+
import {
|
|
6
|
+
twoEventsToSend,
|
|
7
|
+
twoSuccessfulResponses,
|
|
8
|
+
twoUnsuccessfulResponses,
|
|
9
|
+
oneSuccessfulOneUnsuccessfulResponses,
|
|
10
|
+
topics,
|
|
11
|
+
events,
|
|
12
|
+
} from "./mocks/fixtures/eventbridgeFixture";
|
|
13
13
|
|
|
14
14
|
jest.mock("./aws/awsEventbridgeClient");
|
|
15
15
|
|
|
@@ -23,67 +23,111 @@ const client = new MockEventbridgeClient(
|
|
|
23
23
|
|
|
24
24
|
describe("BasicEventbridgeClient", () => {
|
|
25
25
|
describe("sendEvents", () => {
|
|
26
|
-
describe("when there are
|
|
26
|
+
describe("when there are two events", () => {
|
|
27
27
|
describe("when they're all successful", () => {
|
|
28
28
|
it("should send two requests, aggregate results, and show no failures", async () => {
|
|
29
29
|
(eventbridgeClient.putEvents as jest.Mock)
|
|
30
30
|
.mockImplementationOnce((_) => ({
|
|
31
|
-
promise: () =>
|
|
32
|
-
Promise.resolve(allSuccessfulResponses.firstResponse),
|
|
31
|
+
promise: () => Promise.resolve(twoSuccessfulResponses[0]),
|
|
33
32
|
}))
|
|
34
33
|
.mockImplementationOnce((_) => ({
|
|
35
|
-
promise: () =>
|
|
36
|
-
Promise.resolve(allSuccessfulResponses.secondResponse),
|
|
34
|
+
promise: () => Promise.resolve(twoSuccessfulResponses[1]),
|
|
37
35
|
}));
|
|
38
36
|
|
|
39
|
-
const response = await client.mockSendEvents(
|
|
37
|
+
const response = await client.mockSendEvents(twoEventsToSend);
|
|
40
38
|
|
|
41
39
|
expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
42
40
|
expect(response.failedCount).toBe(0);
|
|
43
|
-
expect(response.successful.length).toBe(
|
|
41
|
+
expect(response.successful.length).toBe(2);
|
|
44
42
|
expect(response.failed.length).toBe(0);
|
|
45
43
|
});
|
|
46
44
|
});
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
|
|
46
|
+
describe("when they're all unsuccessful", () => {
|
|
47
|
+
it("should send two requests, aggregate results, and show two failures", async () => {
|
|
49
48
|
(eventbridgeClient.putEvents as jest.Mock)
|
|
50
49
|
.mockImplementationOnce((_) => ({
|
|
51
|
-
promise: () =>
|
|
52
|
-
Promise.resolve(allUnsuccessfulResponses.firstResponse),
|
|
50
|
+
promise: () => Promise.resolve(twoUnsuccessfulResponses[0]),
|
|
53
51
|
}))
|
|
54
52
|
.mockImplementationOnce((_) => ({
|
|
55
|
-
promise: () =>
|
|
56
|
-
Promise.resolve(allUnsuccessfulResponses.secondResponse),
|
|
53
|
+
promise: () => Promise.resolve(twoUnsuccessfulResponses[1]),
|
|
57
54
|
}));
|
|
58
55
|
|
|
59
|
-
const response = await client.mockSendEvents(
|
|
56
|
+
const response = await client.mockSendEvents(twoEventsToSend);
|
|
60
57
|
|
|
61
58
|
expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
62
|
-
expect(response.failedCount).toBe(
|
|
59
|
+
expect(response.failedCount).toBe(2);
|
|
63
60
|
expect(response.successful.length).toBe(0);
|
|
64
|
-
expect(response.failed.length).toBe(
|
|
61
|
+
expect(response.failed.length).toBe(2);
|
|
62
|
+
expect(response.failed[0].event.DetailType).toBe(topics[0]);
|
|
63
|
+
expect(
|
|
64
|
+
JSON.parse(response.failed[0].event.Detail || "")
|
|
65
|
+
).toMatchObject({
|
|
66
|
+
...events[0],
|
|
67
|
+
lch: "aws.eventbridge",
|
|
68
|
+
});
|
|
69
|
+
expect(response.failed[1].event.DetailType).toBe(topics[1]);
|
|
70
|
+
expect(
|
|
71
|
+
JSON.parse(response.failed[1].event.Detail || "")
|
|
72
|
+
).toMatchObject({
|
|
73
|
+
...events[1],
|
|
74
|
+
lch: "aws.eventbridge",
|
|
75
|
+
});
|
|
65
76
|
});
|
|
66
77
|
});
|
|
67
|
-
|
|
68
|
-
|
|
78
|
+
|
|
79
|
+
describe("when one isn't successful", () => {
|
|
80
|
+
it("should send two requests, aggregate results, and show one failure", async () => {
|
|
69
81
|
(eventbridgeClient.putEvents as jest.Mock)
|
|
70
82
|
.mockImplementationOnce((_) => ({
|
|
71
83
|
promise: () =>
|
|
72
|
-
Promise.resolve(
|
|
84
|
+
Promise.resolve(oneSuccessfulOneUnsuccessfulResponses[0]),
|
|
73
85
|
}))
|
|
74
86
|
.mockImplementationOnce((_) => ({
|
|
75
87
|
promise: () =>
|
|
76
|
-
Promise.resolve(
|
|
88
|
+
Promise.resolve(oneSuccessfulOneUnsuccessfulResponses[1]),
|
|
77
89
|
}));
|
|
78
90
|
|
|
79
|
-
const response = await client.mockSendEvents(
|
|
91
|
+
const response = await client.mockSendEvents(twoEventsToSend);
|
|
80
92
|
|
|
81
93
|
expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
82
|
-
expect(response.failedCount).toBe(
|
|
83
|
-
expect(response.successful.length).toBe(
|
|
84
|
-
expect(response.failed.length).toBe(
|
|
94
|
+
expect(response.failedCount).toBe(1);
|
|
95
|
+
expect(response.successful.length).toBe(1);
|
|
96
|
+
expect(response.failed.length).toBe(1);
|
|
97
|
+
expect(response.failed[0].event.DetailType).toBe(topics[1]);
|
|
98
|
+
expect(
|
|
99
|
+
JSON.parse(response.failed[0].event.Detail || "")
|
|
100
|
+
).toMatchObject({
|
|
101
|
+
...events[1],
|
|
102
|
+
lch: "aws.eventbridge",
|
|
103
|
+
});
|
|
85
104
|
});
|
|
86
105
|
});
|
|
87
106
|
});
|
|
107
|
+
describe("when a request to eventbridge fails", () => {
|
|
108
|
+
it("shouldn't break following requests and should count as a failure", async () => {
|
|
109
|
+
(eventbridgeClient.putEvents as jest.Mock)
|
|
110
|
+
.mockImplementationOnce((_) => ({
|
|
111
|
+
promise: () => Promise.reject(),
|
|
112
|
+
}))
|
|
113
|
+
.mockImplementationOnce((_) => ({
|
|
114
|
+
promise: () => Promise.resolve(twoSuccessfulResponses[1]),
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
const response = await client.mockSendEvents(twoEventsToSend);
|
|
118
|
+
|
|
119
|
+
expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
|
|
120
|
+
expect(response.failedCount).toBe(1);
|
|
121
|
+
expect(response.successful.length).toBe(1);
|
|
122
|
+
expect(response.failed.length).toBe(1);
|
|
123
|
+
expect(response.failed[0].event.DetailType).toBe(topics[0]);
|
|
124
|
+
expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(
|
|
125
|
+
{
|
|
126
|
+
...events[0],
|
|
127
|
+
lch: "aws.eventbridge",
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
88
132
|
});
|
|
89
133
|
});
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { ILogger } from "@alanszp/logger";
|
|
2
2
|
import { SharedContext } from "@alanszp/shared-context";
|
|
3
|
-
import { chain, chunk, compact, partition } from "lodash";
|
|
4
|
-
import {
|
|
3
|
+
import { chain, chunk, compact, omit, partition } from "lodash";
|
|
4
|
+
import {
|
|
5
|
+
eventbridgeClient,
|
|
6
|
+
EventRequest,
|
|
7
|
+
PutEventEntryRequest,
|
|
8
|
+
PutEventEntryResponse,
|
|
9
|
+
} from "./aws";
|
|
5
10
|
import { mapLaraEventToAWSEvent } from "./helpers/mapLaraEventToAWSEvent";
|
|
6
11
|
|
|
7
12
|
/**
|
|
@@ -16,9 +21,13 @@ export type LaraEvent = {
|
|
|
16
21
|
body: Record<string, unknown>;
|
|
17
22
|
};
|
|
18
23
|
|
|
24
|
+
export type PutEventFailedEntryResponse = PutEventEntryResponse & {
|
|
25
|
+
event: PutEventEntryRequest;
|
|
26
|
+
};
|
|
27
|
+
|
|
19
28
|
export interface EventDispatchResult {
|
|
20
29
|
successful: PutEventEntryResponse[];
|
|
21
|
-
failed:
|
|
30
|
+
failed: PutEventFailedEntryResponse[];
|
|
22
31
|
failedCount: number | undefined;
|
|
23
32
|
}
|
|
24
33
|
|
|
@@ -70,39 +79,67 @@ export class BasicEventbridgeClient {
|
|
|
70
79
|
)
|
|
71
80
|
)
|
|
72
81
|
.compact()
|
|
73
|
-
.
|
|
74
|
-
|
|
75
|
-
Entries: mappedEventsChunk,
|
|
82
|
+
.map((event) => ({
|
|
83
|
+
Entries: [event],
|
|
76
84
|
}))
|
|
77
85
|
.value();
|
|
78
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Eventbridge in US-EAST-1 has a limit of 10.000 events/second.
|
|
89
|
+
* We should be fine without a limiter here.
|
|
90
|
+
*/
|
|
79
91
|
const results = await Promise.all(
|
|
80
|
-
eventsToSend.map((
|
|
92
|
+
eventsToSend.map((singleEventArray) =>
|
|
81
93
|
eventbridgeClient
|
|
82
|
-
.putEvents(
|
|
94
|
+
.putEvents(singleEventArray)
|
|
83
95
|
.promise()
|
|
96
|
+
.then(({ Entries, FailedEntryCount }) => ({
|
|
97
|
+
FailedEntryCount,
|
|
98
|
+
Entries: [
|
|
99
|
+
{
|
|
100
|
+
...(Entries || [])[0],
|
|
101
|
+
event: singleEventArray.Entries[0],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
}))
|
|
105
|
+
.catch((error) => ({
|
|
106
|
+
FailedEntryCount: 1,
|
|
107
|
+
Entries: [
|
|
108
|
+
{
|
|
109
|
+
EventId: undefined,
|
|
110
|
+
ErrorMessage: JSON.stringify(error),
|
|
111
|
+
event: singleEventArray.Entries[0],
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
}))
|
|
84
115
|
)
|
|
85
116
|
);
|
|
86
117
|
|
|
87
118
|
const aggregatedResult = results.reduce(
|
|
88
119
|
(prev, act) => {
|
|
89
120
|
const { Entries: NewEntries, FailedEntryCount: newFailedCount } = act;
|
|
90
|
-
const {
|
|
121
|
+
const { eventsDispatched, failedCount } = prev;
|
|
91
122
|
|
|
92
123
|
return {
|
|
93
|
-
|
|
94
|
-
|
|
124
|
+
eventsDispatched: [
|
|
125
|
+
...(eventsDispatched || []),
|
|
126
|
+
...(NewEntries || []),
|
|
127
|
+
],
|
|
128
|
+
failedCount: (failedCount || 0) + (newFailedCount || 0),
|
|
95
129
|
};
|
|
96
130
|
},
|
|
97
131
|
{
|
|
98
|
-
|
|
99
|
-
|
|
132
|
+
eventsDispatched: [],
|
|
133
|
+
failedCount: 0,
|
|
100
134
|
}
|
|
101
135
|
);
|
|
102
136
|
|
|
103
|
-
const {
|
|
137
|
+
const { eventsDispatched, failedCount } = aggregatedResult;
|
|
104
138
|
|
|
105
|
-
const [successful, failed] = partition(
|
|
139
|
+
const [successful, failed] = partition(
|
|
140
|
+
eventsDispatched,
|
|
141
|
+
(entry) => entry.EventId
|
|
142
|
+
);
|
|
106
143
|
|
|
107
144
|
logger.info("eventbridge.client.sendEvents.end", {
|
|
108
145
|
successful,
|
|
@@ -110,7 +147,9 @@ export class BasicEventbridgeClient {
|
|
|
110
147
|
});
|
|
111
148
|
|
|
112
149
|
return {
|
|
113
|
-
successful
|
|
150
|
+
successful: successful.map((eventDispatched) =>
|
|
151
|
+
omit(eventDispatched, "event")
|
|
152
|
+
),
|
|
114
153
|
failed,
|
|
115
154
|
failedCount,
|
|
116
155
|
};
|
|
@@ -1,105 +1,41 @@
|
|
|
1
|
-
export const
|
|
2
|
-
eventsToSend: [
|
|
3
|
-
{ topic: "topic", body: { property: true } },
|
|
4
|
-
{ topic: "topic", body: { property: true } },
|
|
5
|
-
{ topic: "topic", body: { property: true } },
|
|
6
|
-
{ topic: "topic", body: { property: true } },
|
|
7
|
-
{ topic: "topic", body: { property: true } },
|
|
8
|
-
{ topic: "topic", body: { property: true } },
|
|
9
|
-
{ topic: "topic", body: { property: true } },
|
|
10
|
-
{ topic: "topic", body: { property: true } },
|
|
11
|
-
{ topic: "topic", body: { property: true } },
|
|
12
|
-
{ topic: "topic", body: { property: true } },
|
|
13
|
-
{ topic: "topic", body: { property: true } },
|
|
14
|
-
{ topic: "topic", body: { property: true } },
|
|
15
|
-
{ topic: "topic", body: { property: true } },
|
|
16
|
-
{ topic: "topic", body: { property: true } },
|
|
17
|
-
{ topic: "topic", body: { property: true } },
|
|
18
|
-
],
|
|
1
|
+
export const topics = ["topic1", "topic2"];
|
|
19
2
|
|
|
20
|
-
|
|
21
|
-
firstResponse: {
|
|
22
|
-
Entries: [
|
|
23
|
-
{ EventId: 1 },
|
|
24
|
-
{ EventId: 2 },
|
|
25
|
-
{ EventId: 3 },
|
|
26
|
-
{ EventId: 4 },
|
|
27
|
-
{ EventId: 5 },
|
|
28
|
-
{ EventId: 6 },
|
|
29
|
-
{ EventId: 7 },
|
|
30
|
-
{ EventId: 8 },
|
|
31
|
-
{ EventId: 9 },
|
|
32
|
-
{ EventId: 10 },
|
|
33
|
-
],
|
|
34
|
-
FailedEntryCount: 0,
|
|
35
|
-
},
|
|
3
|
+
export const events = [{ property: "1" }, { property: "2" }];
|
|
36
4
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{ EventId: 13 },
|
|
42
|
-
{ EventId: 14 },
|
|
43
|
-
{ EventId: 15 },
|
|
44
|
-
],
|
|
45
|
-
FailedEntryCount: 0,
|
|
46
|
-
},
|
|
47
|
-
},
|
|
5
|
+
export const twoEventsToSend = [
|
|
6
|
+
{ topic: topics[0], body: events[0] },
|
|
7
|
+
{ topic: topics[1], body: events[1] },
|
|
8
|
+
];
|
|
48
9
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
{ EventId: null },
|
|
58
|
-
{ EventId: null },
|
|
59
|
-
{ EventId: null },
|
|
60
|
-
{ EventId: null },
|
|
61
|
-
{ EventId: null },
|
|
62
|
-
],
|
|
63
|
-
FailedEntryCount: 10,
|
|
64
|
-
},
|
|
65
|
-
secondResponse: {
|
|
66
|
-
Entries: [
|
|
67
|
-
{ EventId: null },
|
|
68
|
-
{ EventId: null },
|
|
69
|
-
{ EventId: null },
|
|
70
|
-
{ EventId: null },
|
|
71
|
-
{ EventId: null },
|
|
72
|
-
],
|
|
73
|
-
FailedEntryCount: 5,
|
|
74
|
-
},
|
|
10
|
+
export const twoSuccessfulResponses = [
|
|
11
|
+
{
|
|
12
|
+
Entries: [{ EventId: 1 }],
|
|
13
|
+
FailedEntryCount: 0,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
Entries: [{ EventId: 2 }],
|
|
17
|
+
FailedEntryCount: 0,
|
|
75
18
|
},
|
|
19
|
+
];
|
|
76
20
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
{ EventId: null },
|
|
88
|
-
{ EventId: null },
|
|
89
|
-
{ EventId: null },
|
|
90
|
-
],
|
|
91
|
-
FailedEntryCount: 6,
|
|
92
|
-
},
|
|
21
|
+
export const twoUnsuccessfulResponses = [
|
|
22
|
+
{
|
|
23
|
+
Entries: [{ EventId: undefined }],
|
|
24
|
+
FailedEntryCount: 1,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
Entries: [{ EventId: undefined }],
|
|
28
|
+
FailedEntryCount: 1,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
93
31
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
FailedEntryCount: 1,
|
|
103
|
-
},
|
|
32
|
+
export const oneSuccessfulOneUnsuccessfulResponses = [
|
|
33
|
+
{
|
|
34
|
+
Entries: [{ EventId: 1 }],
|
|
35
|
+
FailedEntryCount: 0,
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
Entries: [{ EventId: null }],
|
|
39
|
+
FailedEntryCount: 1,
|
|
104
40
|
},
|
|
105
|
-
|
|
41
|
+
];
|