@alanszp/eventbridge-client 7.4.3 → 7.6.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.
@@ -1,2 +1,2 @@
1
1
  import AWS from "aws-sdk";
2
- export declare const eventbridgeClient: AWS.EventBridge;
2
+ export declare const getEventbridgeClient: (endpoint?: string | undefined, region?: string | undefined) => AWS.EventBridge;
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.eventbridgeClient = void 0;
6
+ exports.getEventbridgeClient = void 0;
7
7
  const aws_sdk_1 = __importDefault(require("aws-sdk"));
8
- exports.eventbridgeClient = new aws_sdk_1.default.EventBridge();
8
+ const getEventbridgeClient = (endpoint, region) => new aws_sdk_1.default.EventBridge(endpoint ? { endpoint, region } : {});
9
+ exports.getEventbridgeClient = getEventbridgeClient;
9
10
  //# sourceMappingURL=awsEventbridgeClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"awsEventbridgeClient.js","sourceRoot":"","sources":["../../src/aws/awsEventbridgeClient.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA0B;AAEb,QAAA,iBAAiB,GAAG,IAAI,iBAAG,CAAC,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"awsEventbridgeClient.js","sourceRoot":"","sources":["../../src/aws/awsEventbridgeClient.ts"],"names":[],"mappings":";;;;;;AAAA,sDAA0B;AAEnB,MAAM,oBAAoB,GAAG,CAAC,QAAiB,EAAE,MAAe,EAAE,EAAE,CACzE,IAAI,iBAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAD/C,QAAA,oBAAoB,wBAC2B"}
@@ -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: PutEventEntryResponse[];
20
+ failed: PutEventFailedEntryResponse[];
18
21
  failedCount: number | undefined;
19
22
  }
20
23
  /**
@@ -25,8 +28,9 @@ export declare class BasicEventbridgeClient {
25
28
  private appName;
26
29
  private env;
27
30
  private bus;
31
+ private client;
28
32
  protected getLogger: () => ILogger;
29
33
  protected context: SharedContext;
30
- constructor(appName: string, env: string, getLogger: () => ILogger, context: SharedContext, bus: string);
34
+ constructor(appName: string, env: string, getLogger: () => ILogger, context: SharedContext, bus: string, customEndpoint?: string, customRegion?: string);
31
35
  protected sendEvents(events: LaraEvent[]): Promise<EventDispatchResult>;
32
36
  }
@@ -22,12 +22,13 @@ const MAX_BATCH_SIZE = 10;
22
22
  * Usage will be done by extending this class and implementing methods that internally call the protected sendEvents method.
23
23
  */
24
24
  class BasicEventbridgeClient {
25
- constructor(appName, env, getLogger, context, bus) {
25
+ constructor(appName, env, getLogger, context, bus, customEndpoint, customRegion) {
26
26
  this.appName = appName;
27
27
  this.env = env;
28
28
  this.bus = bus;
29
29
  this.getLogger = getLogger;
30
30
  this.context = context;
31
+ this.client = (0, aws_1.getEventbridgeClient)(customEndpoint, customRegion);
31
32
  }
32
33
  sendEvents(events) {
33
34
  return __awaiter(this, void 0, void 0, function* () {
@@ -35,33 +36,55 @@ class BasicEventbridgeClient {
35
36
  const eventsToSend = (0, lodash_1.chain)(events)
36
37
  .map((event) => (0, mapLaraEventToAWSEvent_1.mapLaraEventToAWSEvent)(event, this.env, this.appName, this.bus, logger, this.context))
37
38
  .compact()
38
- .chunk(MAX_BATCH_SIZE)
39
- .map((mappedEventsChunk) => ({
40
- Entries: mappedEventsChunk,
39
+ .map((event) => ({
40
+ Entries: [event],
41
41
  }))
42
42
  .value();
43
- const results = yield Promise.all(eventsToSend.map((events) => aws_1.eventbridgeClient
44
- .putEvents(events)
45
- .promise()));
43
+ /**
44
+ * Eventbridge in US-EAST-1 has a limit of 10.000 events/second.
45
+ * We should be fine without a limiter here.
46
+ */
47
+ const results = yield Promise.all(eventsToSend.map((singleEventArray) => this.client
48
+ .putEvents(singleEventArray)
49
+ .promise()
50
+ .then(({ Entries, FailedEntryCount }) => ({
51
+ FailedEntryCount,
52
+ Entries: [
53
+ Object.assign(Object.assign({}, (Entries || [])[0]), { event: singleEventArray.Entries[0] }),
54
+ ],
55
+ }))
56
+ .catch((error) => ({
57
+ FailedEntryCount: 1,
58
+ Entries: [
59
+ {
60
+ EventId: undefined,
61
+ ErrorMessage: JSON.stringify(error),
62
+ event: singleEventArray.Entries[0],
63
+ },
64
+ ],
65
+ }))));
46
66
  const aggregatedResult = results.reduce((prev, act) => {
47
67
  const { Entries: NewEntries, FailedEntryCount: newFailedCount } = act;
48
- const { Entries, FailedEntryCount } = prev;
68
+ const { eventsDispatched, failedCount } = prev;
49
69
  return {
50
- Entries: [...(Entries || []), ...(NewEntries || [])],
51
- FailedEntryCount: (FailedEntryCount || 0) + (newFailedCount || 0),
70
+ eventsDispatched: [
71
+ ...(eventsDispatched || []),
72
+ ...(NewEntries || []),
73
+ ],
74
+ failedCount: (failedCount || 0) + (newFailedCount || 0),
52
75
  };
53
76
  }, {
54
- Entries: [],
55
- FailedEntryCount: 0,
77
+ eventsDispatched: [],
78
+ failedCount: 0,
56
79
  });
57
- const { Entries, FailedEntryCount: failedCount } = aggregatedResult;
58
- const [successful, failed] = (0, lodash_1.partition)(Entries, (entry) => entry.EventId);
80
+ const { eventsDispatched, failedCount } = aggregatedResult;
81
+ const [successful, failed] = (0, lodash_1.partition)(eventsDispatched, (entry) => entry.EventId);
59
82
  logger.info("eventbridge.client.sendEvents.end", {
60
83
  successful,
61
84
  failed,
62
85
  });
63
86
  return {
64
- successful,
87
+ successful: successful.map((eventDispatched) => (0, lodash_1.omit)(eventDispatched, "event")),
65
88
  failed,
66
89
  failedCount,
67
90
  };
@@ -1 +1 @@
1
- {"version":3,"file":"basicEventbridgeClient.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,mCAA0D;AAC1D,+BAA+E;AAC/E,6EAA0E;AAoB1E;;GAEG;AACH,MAAM,cAAc,GAAG,EAAE,CAAC;AAE1B;;;GAGG;AACH,MAAa,sBAAsB;IAQjC,YACE,OAAe,EACf,GAAW,EACX,SAAwB,EACxB,OAAsB,EACtB,GAAW;QAEX,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEe,UAAU,CACxB,MAAmB;;YAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAEhC,MAAM,YAAY,GAAG,IAAA,cAAK,EAAC,MAAM,CAAC;iBAC/B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,IAAA,+CAAsB,EACpB,KAAK,EACL,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,GAAG,EACR,MAAM,EACN,IAAI,CAAC,OAAO,CACb,CACF;iBACA,OAAO,EAAE;iBACT,KAAK,CAAC,cAAc,CAAC;iBACrB,GAAG,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;gBAC3B,OAAO,EAAE,iBAAiB;aAC3B,CAAC,CAAC;iBACF,KAAK,EAAE,CAAC;YAEX,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC1B,uBAAiB;iBACd,SAAS,CAAC,MAAM,CAAC;iBACjB,OAAO,EAAE,CACb,CACF,CAAC;YAEF,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CACrC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;gBACZ,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC;gBACtE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;gBAE3C,OAAO;oBACL,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;oBACpD,gBAAgB,EAAE,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC;iBAClE,CAAC;YACJ,CAAC,EACD;gBACE,OAAO,EAAE,EAAE;gBACX,gBAAgB,EAAE,CAAC;aACpB,CACF,CAAC;YAEF,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAC;YAEpE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAS,EAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE1E,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;gBAC/C,UAAU;gBACV,MAAM;aACP,CAAC,CAAC;YAEH,OAAO;gBACL,UAAU;gBACV,MAAM;gBACN,WAAW;aACZ,CAAC;QACJ,CAAC;KAAA;CACF;AApFD,wDAoFC"}
1
+ {"version":3,"file":"basicEventbridgeClient.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.ts"],"names":[],"mappings":"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"}
@@ -14,60 +14,91 @@ 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
- const client = new mockEventbridgeClient_1.MockEventbridgeClient("appName", "env", () => (0, logger_1.createMockLogger)({}), new shared_context_1.SharedContext(), "busName");
18
+ const createClient = () => 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 more than 10 events", () => {
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
- awsEventbridgeClient_1.eventbridgeClient.putEvents
26
- .mockImplementationOnce((_) => ({
27
- promise: () => Promise.resolve(allSuccessfulResponses.firstResponse),
28
- }))
29
- .mockImplementationOnce((_) => ({
30
- promise: () => Promise.resolve(allSuccessfulResponses.secondResponse),
24
+ awsEventbridgeClient_1.getEventbridgeClient.mockImplementationOnce((_, __) => ({
25
+ putEvents: jest
26
+ .fn()
27
+ .mockImplementationOnce((_) => ({
28
+ promise: () => Promise.resolve(eventbridgeFixture_1.twoSuccessfulResponses[0]),
29
+ }))
30
+ .mockImplementationOnce((_) => ({
31
+ promise: () => Promise.resolve(eventbridgeFixture_1.twoSuccessfulResponses[1]),
32
+ })),
31
33
  }));
32
- const response = yield client.mockSendEvents(eventsToSend);
33
- expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
34
+ const response = yield createClient().mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
34
35
  expect(response.failedCount).toBe(0);
35
- expect(response.successful.length).toBe(15);
36
+ expect(response.successful.length).toBe(2);
36
37
  expect(response.failed.length).toBe(0);
37
38
  }));
38
39
  });
39
- describe("when they're all successful", () => {
40
- it("should send two requests, aggregate results, and show fifteen failures", () => __awaiter(void 0, void 0, void 0, function* () {
41
- awsEventbridgeClient_1.eventbridgeClient.putEvents
42
- .mockImplementationOnce((_) => ({
43
- promise: () => Promise.resolve(allUnsuccessfulResponses.firstResponse),
44
- }))
45
- .mockImplementationOnce((_) => ({
46
- promise: () => Promise.resolve(allUnsuccessfulResponses.secondResponse),
40
+ describe("when they're all unsuccessful", () => {
41
+ it("should send two requests, aggregate results, and show two failures", () => __awaiter(void 0, void 0, void 0, function* () {
42
+ awsEventbridgeClient_1.getEventbridgeClient.mockImplementationOnce((_, __) => ({
43
+ putEvents: jest
44
+ .fn()
45
+ .mockImplementationOnce((_) => ({
46
+ promise: () => Promise.resolve(eventbridgeFixture_1.twoUnsuccessfulResponses[0]),
47
+ }))
48
+ .mockImplementationOnce((_) => ({
49
+ promise: () => Promise.resolve(eventbridgeFixture_1.twoUnsuccessfulResponses[1]),
50
+ })),
47
51
  }));
48
- const response = yield client.mockSendEvents(eventsToSend);
49
- expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
50
- expect(response.failedCount).toBe(15);
52
+ const response = yield createClient().mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
53
+ expect(response.failedCount).toBe(2);
51
54
  expect(response.successful.length).toBe(0);
52
- expect(response.failed.length).toBe(15);
55
+ expect(response.failed.length).toBe(2);
56
+ expect(response.failed[0].event.DetailType).toBe(eventbridgeFixture_1.topics[0]);
57
+ expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[0]), { lch: "aws.eventbridge" }));
58
+ expect(response.failed[1].event.DetailType).toBe(eventbridgeFixture_1.topics[1]);
59
+ expect(JSON.parse(response.failed[1].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[1]), { lch: "aws.eventbridge" }));
53
60
  }));
54
61
  });
55
- describe("when eight are successful", () => {
56
- it("should send two requests, aggregate results, and show seven failures", () => __awaiter(void 0, void 0, void 0, function* () {
57
- awsEventbridgeClient_1.eventbridgeClient.putEvents
62
+ describe("when one isn't successful", () => {
63
+ it("should send two requests, aggregate results, and show one failure", () => __awaiter(void 0, void 0, void 0, function* () {
64
+ awsEventbridgeClient_1.getEventbridgeClient.mockImplementationOnce((_, __) => ({
65
+ putEvents: jest
66
+ .fn()
67
+ .mockImplementationOnce((_) => ({
68
+ promise: () => Promise.resolve(eventbridgeFixture_1.oneSuccessfulOneUnsuccessfulResponses[0]),
69
+ }))
70
+ .mockImplementationOnce((_) => ({
71
+ promise: () => Promise.resolve(eventbridgeFixture_1.oneSuccessfulOneUnsuccessfulResponses[1]),
72
+ })),
73
+ }));
74
+ const response = yield createClient().mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
75
+ expect(response.failedCount).toBe(1);
76
+ expect(response.successful.length).toBe(1);
77
+ expect(response.failed.length).toBe(1);
78
+ expect(response.failed[0].event.DetailType).toBe(eventbridgeFixture_1.topics[1]);
79
+ expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[1]), { lch: "aws.eventbridge" }));
80
+ }));
81
+ });
82
+ });
83
+ describe("when a request to eventbridge fails", () => {
84
+ it("shouldn't break following requests and should count as a failure", () => __awaiter(void 0, void 0, void 0, function* () {
85
+ awsEventbridgeClient_1.getEventbridgeClient.mockImplementationOnce((_, __) => ({
86
+ putEvents: jest
87
+ .fn()
58
88
  .mockImplementationOnce((_) => ({
59
- promise: () => Promise.resolve(sevenUnsuccessfulResponses.firstResponse),
89
+ promise: () => Promise.reject(),
60
90
  }))
61
91
  .mockImplementationOnce((_) => ({
62
- promise: () => Promise.resolve(sevenUnsuccessfulResponses.secondResponse),
63
- }));
64
- const response = yield client.mockSendEvents(eventsToSend);
65
- expect(awsEventbridgeClient_1.eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
66
- expect(response.failedCount).toBe(7);
67
- expect(response.successful.length).toBe(8);
68
- expect(response.failed.length).toBe(7);
92
+ promise: () => Promise.resolve(eventbridgeFixture_1.twoSuccessfulResponses[1]),
93
+ })),
69
94
  }));
70
- });
95
+ const response = yield createClient().mockSendEvents(eventbridgeFixture_1.twoEventsToSend);
96
+ expect(response.failedCount).toBe(1);
97
+ expect(response.successful.length).toBe(1);
98
+ expect(response.failed.length).toBe(1);
99
+ expect(response.failed[0].event.DetailType).toBe(eventbridgeFixture_1.topics[0]);
100
+ expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(Object.assign(Object.assign({}, eventbridgeFixture_1.events[0]), { lch: "aws.eventbridge" }));
101
+ }));
71
102
  });
72
103
  });
73
104
  });
@@ -1 +1 @@
1
- {"version":3,"file":"basicEventbridgeClient.test.js","sourceRoot":"","sources":["../src/basicEventbridgeClient.test.ts"],"names":[],"mappings":"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"}
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 fifteenEventsFixture: {
2
- eventsToSend: {
3
- topic: string;
4
- body: {
5
- property: boolean;
6
- };
7
- }[];
8
- allSuccessfulResponses: {
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
- sevenUnsuccessfulResponses: {
37
- firstResponse: {
38
- Entries: ({
39
- EventId: number;
40
- } | {
41
- EventId: null;
42
- })[];
43
- FailedEntryCount: number;
44
- };
45
- secondResponse: {
46
- Entries: ({
47
- EventId: number;
48
- } | {
49
- EventId: null;
50
- })[];
51
- FailedEntryCount: number;
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.fifteenEventsFixture = void 0;
4
- exports.fifteenEventsFixture = {
5
- eventsToSend: [
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
- { 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
- allUnsuccessfulResponses: {
50
- firstResponse: {
51
- Entries: [
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
- sevenUnsuccessfulResponses: {
77
- firstResponse: {
78
- Entries: [
79
- { EventId: 1 },
80
- { EventId: 2 },
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":"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"}
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.4.3",
3
+ "version": "7.6.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": "3d54c1c62cb0c48b79abf79498e00eafe7843269"
38
+ "gitHead": "48d91b84197715449eb33e992d15e1bb65c2568d"
39
39
  }
@@ -1,3 +1,4 @@
1
1
  import AWS from "aws-sdk";
2
2
 
3
- export const eventbridgeClient = new AWS.EventBridge();
3
+ export const getEventbridgeClient = (endpoint?: string, region?: string) =>
4
+ new AWS.EventBridge(endpoint ? { endpoint, region } : {});
@@ -1,88 +1,148 @@
1
1
  import { createMockLogger } from "@alanszp/logger";
2
2
  import { SharedContext } from "@alanszp/shared-context";
3
- import { eventbridgeClient } from "./aws/awsEventbridgeClient";
3
+ import { getEventbridgeClient } from "./aws/awsEventbridgeClient";
4
4
  import { MockEventbridgeClient } from "./mockEventbridgeClient";
5
- import { fifteenEventsFixture } from "./mocks/fixtures/eventbridgeFixture";
6
-
7
- const {
8
- eventsToSend,
9
- allSuccessfulResponses,
10
- allUnsuccessfulResponses,
11
- sevenUnsuccessfulResponses,
12
- } = fifteenEventsFixture;
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
 
16
- const client = new MockEventbridgeClient(
17
- "appName",
18
- "env",
19
- () => createMockLogger({}),
20
- new SharedContext(),
21
- "busName"
22
- );
16
+ const createClient = () =>
17
+ new MockEventbridgeClient(
18
+ "appName",
19
+ "env",
20
+ () => createMockLogger({}),
21
+ new SharedContext(),
22
+ "busName"
23
+ );
23
24
 
24
25
  describe("BasicEventbridgeClient", () => {
25
26
  describe("sendEvents", () => {
26
- describe("when there are more than 10 events", () => {
27
+ describe("when there are two events", () => {
27
28
  describe("when they're all successful", () => {
28
29
  it("should send two requests, aggregate results, and show no failures", async () => {
29
- (eventbridgeClient.putEvents as jest.Mock)
30
- .mockImplementationOnce((_) => ({
31
- promise: () =>
32
- Promise.resolve(allSuccessfulResponses.firstResponse),
33
- }))
34
- .mockImplementationOnce((_) => ({
35
- promise: () =>
36
- Promise.resolve(allSuccessfulResponses.secondResponse),
37
- }));
30
+ (getEventbridgeClient as jest.Mock).mockImplementationOnce(
31
+ (_, __) => ({
32
+ putEvents: jest
33
+ .fn()
34
+ .mockImplementationOnce((_) => ({
35
+ promise: () => Promise.resolve(twoSuccessfulResponses[0]),
36
+ }))
37
+ .mockImplementationOnce((_) => ({
38
+ promise: () => Promise.resolve(twoSuccessfulResponses[1]),
39
+ })),
40
+ })
41
+ );
38
42
 
39
- const response = await client.mockSendEvents(eventsToSend);
43
+ const response = await createClient().mockSendEvents(twoEventsToSend);
40
44
 
41
- expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
42
45
  expect(response.failedCount).toBe(0);
43
- expect(response.successful.length).toBe(15);
46
+ expect(response.successful.length).toBe(2);
44
47
  expect(response.failed.length).toBe(0);
45
48
  });
46
49
  });
47
- describe("when they're all successful", () => {
48
- it("should send two requests, aggregate results, and show fifteen failures", async () => {
49
- (eventbridgeClient.putEvents as jest.Mock)
50
- .mockImplementationOnce((_) => ({
51
- promise: () =>
52
- Promise.resolve(allUnsuccessfulResponses.firstResponse),
53
- }))
54
- .mockImplementationOnce((_) => ({
55
- promise: () =>
56
- Promise.resolve(allUnsuccessfulResponses.secondResponse),
57
- }));
58
50
 
59
- const response = await client.mockSendEvents(eventsToSend);
51
+ describe("when they're all unsuccessful", () => {
52
+ it("should send two requests, aggregate results, and show two failures", async () => {
53
+ (getEventbridgeClient as jest.Mock).mockImplementationOnce(
54
+ (_, __) => ({
55
+ putEvents: jest
56
+ .fn()
57
+ .mockImplementationOnce((_) => ({
58
+ promise: () => Promise.resolve(twoUnsuccessfulResponses[0]),
59
+ }))
60
+ .mockImplementationOnce((_) => ({
61
+ promise: () => Promise.resolve(twoUnsuccessfulResponses[1]),
62
+ })),
63
+ })
64
+ );
65
+
66
+ const response = await createClient().mockSendEvents(twoEventsToSend);
60
67
 
61
- expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
62
- expect(response.failedCount).toBe(15);
68
+ expect(response.failedCount).toBe(2);
63
69
  expect(response.successful.length).toBe(0);
64
- expect(response.failed.length).toBe(15);
70
+ expect(response.failed.length).toBe(2);
71
+ expect(response.failed[0].event.DetailType).toBe(topics[0]);
72
+ expect(
73
+ JSON.parse(response.failed[0].event.Detail || "")
74
+ ).toMatchObject({
75
+ ...events[0],
76
+ lch: "aws.eventbridge",
77
+ });
78
+ expect(response.failed[1].event.DetailType).toBe(topics[1]);
79
+ expect(
80
+ JSON.parse(response.failed[1].event.Detail || "")
81
+ ).toMatchObject({
82
+ ...events[1],
83
+ lch: "aws.eventbridge",
84
+ });
65
85
  });
66
86
  });
67
- describe("when eight are successful", () => {
68
- it("should send two requests, aggregate results, and show seven failures", async () => {
69
- (eventbridgeClient.putEvents as jest.Mock)
87
+
88
+ describe("when one isn't successful", () => {
89
+ it("should send two requests, aggregate results, and show one failure", async () => {
90
+ (getEventbridgeClient as jest.Mock).mockImplementationOnce(
91
+ (_, __) => ({
92
+ putEvents: jest
93
+ .fn()
94
+ .mockImplementationOnce((_) => ({
95
+ promise: () =>
96
+ Promise.resolve(oneSuccessfulOneUnsuccessfulResponses[0]),
97
+ }))
98
+ .mockImplementationOnce((_) => ({
99
+ promise: () =>
100
+ Promise.resolve(oneSuccessfulOneUnsuccessfulResponses[1]),
101
+ })),
102
+ })
103
+ );
104
+
105
+ const response = await createClient().mockSendEvents(twoEventsToSend);
106
+
107
+ expect(response.failedCount).toBe(1);
108
+ expect(response.successful.length).toBe(1);
109
+ expect(response.failed.length).toBe(1);
110
+ expect(response.failed[0].event.DetailType).toBe(topics[1]);
111
+ expect(
112
+ JSON.parse(response.failed[0].event.Detail || "")
113
+ ).toMatchObject({
114
+ ...events[1],
115
+ lch: "aws.eventbridge",
116
+ });
117
+ });
118
+ });
119
+ });
120
+
121
+ describe("when a request to eventbridge fails", () => {
122
+ it("shouldn't break following requests and should count as a failure", async () => {
123
+ (getEventbridgeClient as jest.Mock).mockImplementationOnce((_, __) => ({
124
+ putEvents: jest
125
+ .fn()
70
126
  .mockImplementationOnce((_) => ({
71
- promise: () =>
72
- Promise.resolve(sevenUnsuccessfulResponses.firstResponse),
127
+ promise: () => Promise.reject(),
73
128
  }))
74
129
  .mockImplementationOnce((_) => ({
75
- promise: () =>
76
- Promise.resolve(sevenUnsuccessfulResponses.secondResponse),
77
- }));
130
+ promise: () => Promise.resolve(twoSuccessfulResponses[1]),
131
+ })),
132
+ }));
78
133
 
79
- const response = await client.mockSendEvents(eventsToSend);
134
+ const response = await createClient().mockSendEvents(twoEventsToSend);
80
135
 
81
- expect(eventbridgeClient.putEvents).toHaveBeenCalledTimes(2);
82
- expect(response.failedCount).toBe(7);
83
- expect(response.successful.length).toBe(8);
84
- expect(response.failed.length).toBe(7);
85
- });
136
+ expect(response.failedCount).toBe(1);
137
+ expect(response.successful.length).toBe(1);
138
+ expect(response.failed.length).toBe(1);
139
+ expect(response.failed[0].event.DetailType).toBe(topics[0]);
140
+ expect(JSON.parse(response.failed[0].event.Detail || "")).toMatchObject(
141
+ {
142
+ ...events[0],
143
+ lch: "aws.eventbridge",
144
+ }
145
+ );
86
146
  });
87
147
  });
88
148
  });
@@ -1,7 +1,11 @@
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 { eventbridgeClient, EventRequest, PutEventEntryResponse } from "./aws";
3
+ import { chain, omit, partition } from "lodash";
4
+ import {
5
+ getEventbridgeClient,
6
+ PutEventEntryRequest,
7
+ PutEventEntryResponse,
8
+ } from "./aws";
5
9
  import { mapLaraEventToAWSEvent } from "./helpers/mapLaraEventToAWSEvent";
6
10
 
7
11
  /**
@@ -16,9 +20,13 @@ export type LaraEvent = {
16
20
  body: Record<string, unknown>;
17
21
  };
18
22
 
23
+ export type PutEventFailedEntryResponse = PutEventEntryResponse & {
24
+ event: PutEventEntryRequest;
25
+ };
26
+
19
27
  export interface EventDispatchResult {
20
28
  successful: PutEventEntryResponse[];
21
- failed: PutEventEntryResponse[];
29
+ failed: PutEventFailedEntryResponse[];
22
30
  failedCount: number | undefined;
23
31
  }
24
32
 
@@ -35,6 +43,7 @@ export class BasicEventbridgeClient {
35
43
  private appName: string;
36
44
  private env: string;
37
45
  private bus: string;
46
+ private client;
38
47
 
39
48
  protected getLogger: () => ILogger;
40
49
  protected context: SharedContext;
@@ -44,13 +53,16 @@ export class BasicEventbridgeClient {
44
53
  env: string,
45
54
  getLogger: () => ILogger,
46
55
  context: SharedContext,
47
- bus: string
56
+ bus: string,
57
+ customEndpoint?: string,
58
+ customRegion?: string
48
59
  ) {
49
60
  this.appName = appName;
50
61
  this.env = env;
51
62
  this.bus = bus;
52
63
  this.getLogger = getLogger;
53
64
  this.context = context;
65
+ this.client = getEventbridgeClient(customEndpoint, customRegion);
54
66
  }
55
67
 
56
68
  protected async sendEvents(
@@ -70,39 +82,67 @@ export class BasicEventbridgeClient {
70
82
  )
71
83
  )
72
84
  .compact()
73
- .chunk(MAX_BATCH_SIZE)
74
- .map((mappedEventsChunk) => ({
75
- Entries: mappedEventsChunk,
85
+ .map((event) => ({
86
+ Entries: [event],
76
87
  }))
77
88
  .value();
78
89
 
90
+ /**
91
+ * Eventbridge in US-EAST-1 has a limit of 10.000 events/second.
92
+ * We should be fine without a limiter here.
93
+ */
79
94
  const results = await Promise.all(
80
- eventsToSend.map((events) =>
81
- eventbridgeClient
82
- .putEvents(events)
95
+ eventsToSend.map((singleEventArray) =>
96
+ this.client
97
+ .putEvents(singleEventArray)
83
98
  .promise()
99
+ .then(({ Entries, FailedEntryCount }) => ({
100
+ FailedEntryCount,
101
+ Entries: [
102
+ {
103
+ ...(Entries || [])[0],
104
+ event: singleEventArray.Entries[0],
105
+ },
106
+ ],
107
+ }))
108
+ .catch((error) => ({
109
+ FailedEntryCount: 1,
110
+ Entries: [
111
+ {
112
+ EventId: undefined,
113
+ ErrorMessage: JSON.stringify(error),
114
+ event: singleEventArray.Entries[0],
115
+ },
116
+ ],
117
+ }))
84
118
  )
85
119
  );
86
120
 
87
121
  const aggregatedResult = results.reduce(
88
122
  (prev, act) => {
89
123
  const { Entries: NewEntries, FailedEntryCount: newFailedCount } = act;
90
- const { Entries, FailedEntryCount } = prev;
124
+ const { eventsDispatched, failedCount } = prev;
91
125
 
92
126
  return {
93
- Entries: [...(Entries || []), ...(NewEntries || [])],
94
- FailedEntryCount: (FailedEntryCount || 0) + (newFailedCount || 0),
127
+ eventsDispatched: [
128
+ ...(eventsDispatched || []),
129
+ ...(NewEntries || []),
130
+ ],
131
+ failedCount: (failedCount || 0) + (newFailedCount || 0),
95
132
  };
96
133
  },
97
134
  {
98
- Entries: [],
99
- FailedEntryCount: 0,
135
+ eventsDispatched: [],
136
+ failedCount: 0,
100
137
  }
101
138
  );
102
139
 
103
- const { Entries, FailedEntryCount: failedCount } = aggregatedResult;
140
+ const { eventsDispatched, failedCount } = aggregatedResult;
104
141
 
105
- const [successful, failed] = partition(Entries, (entry) => entry.EventId);
142
+ const [successful, failed] = partition(
143
+ eventsDispatched,
144
+ (entry) => entry.EventId
145
+ );
106
146
 
107
147
  logger.info("eventbridge.client.sendEvents.end", {
108
148
  successful,
@@ -110,7 +150,9 @@ export class BasicEventbridgeClient {
110
150
  });
111
151
 
112
152
  return {
113
- successful,
153
+ successful: successful.map((eventDispatched) =>
154
+ omit(eventDispatched, "event")
155
+ ),
114
156
  failed,
115
157
  failedCount,
116
158
  };
@@ -1,105 +1,41 @@
1
- export const fifteenEventsFixture = {
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
- allSuccessfulResponses: {
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
- secondResponse: {
38
- Entries: [
39
- { EventId: 11 },
40
- { EventId: 12 },
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
- allUnsuccessfulResponses: {
50
- firstResponse: {
51
- Entries: [
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
- },
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
- sevenUnsuccessfulResponses: {
78
- firstResponse: {
79
- Entries: [
80
- { EventId: 1 },
81
- { EventId: 2 },
82
- { EventId: 3 },
83
- { EventId: 4 },
84
- { EventId: null },
85
- { EventId: null },
86
- { EventId: null },
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
- secondResponse: {
95
- Entries: [
96
- { EventId: 5 },
97
- { EventId: 6 },
98
- { EventId: 8 },
99
- { EventId: null },
100
- { EventId: 7 },
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
+ ];