@squiz/dx-common-lib 1.72.0 → 1.72.3

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.
Files changed (54) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/events/EventBusService.d.ts +107 -0
  3. package/lib/events/EventBusService.js +196 -0
  4. package/lib/events/EventBusService.js.map +1 -0
  5. package/lib/events/EventBusService.spec.d.ts +1 -0
  6. package/lib/events/EventBusService.spec.js +527 -0
  7. package/lib/events/EventBusService.spec.js.map +1 -0
  8. package/lib/index.d.ts +5 -0
  9. package/lib/index.js +5 -0
  10. package/lib/index.js.map +1 -1
  11. package/lib/secret-api-key-service/DevSecretApiKeyService.d.ts +25 -0
  12. package/lib/secret-api-key-service/DevSecretApiKeyService.js +35 -0
  13. package/lib/secret-api-key-service/DevSecretApiKeyService.js.map +1 -0
  14. package/lib/secret-api-key-service/DevSecretApiKeyService.spec.d.ts +1 -0
  15. package/lib/secret-api-key-service/DevSecretApiKeyService.spec.js +157 -0
  16. package/lib/secret-api-key-service/DevSecretApiKeyService.spec.js.map +1 -0
  17. package/lib/secret-api-key-service/SecretApiKeyService.d.ts +0 -9
  18. package/lib/secret-api-key-service/SecretApiKeyService.js +0 -7
  19. package/lib/secret-api-key-service/SecretApiKeyService.js.map +1 -1
  20. package/lib/secret-api-key-service/SecretApiKeyService.spec.js +0 -37
  21. package/lib/secret-api-key-service/SecretApiKeyService.spec.js.map +1 -1
  22. package/lib/secret-api-key-service/getSecretApiKeyService.d.ts +20 -0
  23. package/lib/secret-api-key-service/getSecretApiKeyService.js +41 -0
  24. package/lib/secret-api-key-service/getSecretApiKeyService.js.map +1 -0
  25. package/lib/secret-api-key-service/getSecretApiKeyService.spec.d.ts +1 -0
  26. package/lib/secret-api-key-service/getSecretApiKeyService.spec.js +313 -0
  27. package/lib/secret-api-key-service/getSecretApiKeyService.spec.js.map +1 -0
  28. package/lib/stream/EventStreamHandler.d.ts +38 -0
  29. package/lib/stream/EventStreamHandler.js +128 -0
  30. package/lib/stream/EventStreamHandler.js.map +1 -0
  31. package/lib/stream/EventStreamHandler.spec.d.ts +1 -0
  32. package/lib/stream/EventStreamHandler.spec.js +364 -0
  33. package/lib/stream/EventStreamHandler.spec.js.map +1 -0
  34. package/lib/stream/StreamUtils.d.ts +38 -0
  35. package/lib/stream/StreamUtils.js +59 -0
  36. package/lib/stream/StreamUtils.js.map +1 -0
  37. package/lib/stream/StreamUtils.spec.d.ts +1 -0
  38. package/lib/stream/StreamUtils.spec.js +92 -0
  39. package/lib/stream/StreamUtils.spec.js.map +1 -0
  40. package/package.json +3 -2
  41. package/src/events/EventBusService.spec.ts +707 -0
  42. package/src/events/EventBusService.ts +316 -0
  43. package/src/index.ts +5 -0
  44. package/src/secret-api-key-service/DevSecretApiKeyService.spec.ts +211 -0
  45. package/src/secret-api-key-service/DevSecretApiKeyService.ts +36 -0
  46. package/src/secret-api-key-service/SecretApiKeyService.spec.ts +0 -46
  47. package/src/secret-api-key-service/SecretApiKeyService.ts +0 -13
  48. package/src/secret-api-key-service/getSecretApiKeyService.spec.ts +405 -0
  49. package/src/secret-api-key-service/getSecretApiKeyService.ts +45 -0
  50. package/src/stream/EventStreamHandler.spec.ts +440 -0
  51. package/src/stream/EventStreamHandler.ts +192 -0
  52. package/src/stream/StreamUtils.spec.ts +113 -0
  53. package/src/stream/StreamUtils.ts +58 -0
  54. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /*!
4
+ * @license
5
+ * Copyright Squiz Australia Pty Ltd. All Rights Reserved.
6
+ */
7
+ const EventStreamHandler_1 = require("./EventStreamHandler");
8
+ describe('EventStreamHandler', () => {
9
+ let mockLogger;
10
+ let mockEventBusService;
11
+ beforeEach(() => {
12
+ mockLogger = {
13
+ info: jest.fn(),
14
+ debug: jest.fn(),
15
+ error: jest.fn(),
16
+ };
17
+ mockEventBusService = {
18
+ setTenantId: jest.fn(),
19
+ publishEvents: jest.fn().mockResolvedValue(undefined),
20
+ };
21
+ });
22
+ const createMockRecord = (overrides = {}) => {
23
+ return {
24
+ eventID: '1',
25
+ eventVersion: '1.0',
26
+ dynamodb: {
27
+ Keys: {
28
+ pk: { S: 'cv#component-123' },
29
+ sk: { S: 'v#1.0.0' },
30
+ },
31
+ SequenceNumber: '111',
32
+ SizeBytes: 26,
33
+ StreamViewType: 'NEW_AND_OLD_IMAGES',
34
+ },
35
+ awsRegion: 'us-east-1',
36
+ eventName: 'INSERT',
37
+ eventSource: 'aws:dynamodb',
38
+ eventSourceARN: 'arn:aws:dynamodb:us-east-1:123456789012:table/dev.cmp-service.tenant123/stream/2024-01-01T00:00:00.000',
39
+ ...overrides,
40
+ };
41
+ };
42
+ const createMockContext = () => ({
43
+ awsRequestId: 'test-request-id',
44
+ invokeid: 'test-invoke-id',
45
+ logGroupName: 'test-log-group',
46
+ logStreamName: 'test-log-stream',
47
+ functionName: 'test-function',
48
+ memoryLimitInMB: '128',
49
+ functionVersion: '1',
50
+ getRemainingTimeInMillis: jest.fn(() => 30000),
51
+ done: jest.fn(),
52
+ fail: jest.fn(),
53
+ succeed: jest.fn(),
54
+ });
55
+ describe('createEventStreamHandler', () => {
56
+ it('should successfully process records with mapped events', async () => {
57
+ const mockMapper = jest.fn(async () => [
58
+ { detailType: 'component.change.create', detail: { name: 'test' } },
59
+ ]);
60
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
61
+ logger: mockLogger,
62
+ eventBusService: mockEventBusService,
63
+ tableServiceIdentifier: 'cmp',
64
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
65
+ mappers: { componentVersion: mockMapper },
66
+ extractTenantId: (arn, _identifier) => {
67
+ const tableName = arn.split('/')[1];
68
+ const parts = tableName.split('.');
69
+ return parts[parts.length - 1];
70
+ },
71
+ batchSize: 10,
72
+ });
73
+ const event = {
74
+ Records: [createMockRecord()],
75
+ };
76
+ const response = await handle(event, createMockContext());
77
+ expect(mockLogger.info).toHaveBeenCalledWith('Processing DynamoDB stream batch', expect.any(Object));
78
+ expect(mockEventBusService.setTenantId).toHaveBeenCalledWith('tenant123');
79
+ expect(mockEventBusService.publishEvents).toHaveBeenCalledWith([
80
+ { detailType: 'component.change.create', detail: { name: 'test' } },
81
+ ]);
82
+ expect(response.batchItemFailures).toHaveLength(0);
83
+ });
84
+ it('should pass the stream record as the third argument to extractTenantId', async () => {
85
+ const extractTenantId = jest.fn((arn, _identifier, _record) => {
86
+ const tableName = arn.split('/')[1];
87
+ const parts = tableName.split('.');
88
+ return parts[parts.length - 1];
89
+ });
90
+ const mockMapper = jest.fn(async () => [{ detailType: 'component.change.create', detail: {} }]);
91
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
92
+ logger: mockLogger,
93
+ eventBusService: mockEventBusService,
94
+ tableServiceIdentifier: 'cmp',
95
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
96
+ mappers: { componentVersion: mockMapper },
97
+ extractTenantId,
98
+ });
99
+ const streamRecord = createMockRecord();
100
+ await handle({ Records: [streamRecord] }, createMockContext());
101
+ expect(extractTenantId).toHaveBeenCalledWith(streamRecord.eventSourceARN, 'cmp', streamRecord);
102
+ });
103
+ it('should handle records with no mapper registered', async () => {
104
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
105
+ logger: mockLogger,
106
+ eventBusService: mockEventBusService,
107
+ tableServiceIdentifier: 'cmp',
108
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
109
+ mappers: {},
110
+ extractTenantId: (arn, _identifier) => {
111
+ const tableName = arn.split('/')[1];
112
+ const parts = tableName.split('.');
113
+ return parts[parts.length - 1];
114
+ },
115
+ });
116
+ const event = {
117
+ Records: [createMockRecord()],
118
+ };
119
+ const response = await handle(event, createMockContext());
120
+ expect(mockLogger.debug).toHaveBeenCalledWith('No event mapper registered for entity type: componentVersion');
121
+ expect(mockEventBusService.publishEvents).not.toHaveBeenCalled();
122
+ expect(response.batchItemFailures).toHaveLength(0);
123
+ });
124
+ it('should handle records with unknown entity types', async () => {
125
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
126
+ logger: mockLogger,
127
+ eventBusService: mockEventBusService,
128
+ tableServiceIdentifier: 'cmp',
129
+ entityTypePrefixMap: { 'cs#': 'componentSet' },
130
+ mappers: {},
131
+ extractTenantId: (arn, _identifier) => {
132
+ const tableName = arn.split('/')[1];
133
+ const parts = tableName.split('.');
134
+ return parts[parts.length - 1];
135
+ },
136
+ });
137
+ const event = {
138
+ Records: [createMockRecord()],
139
+ };
140
+ const response = await handle(event, createMockContext());
141
+ expect(mockEventBusService.publishEvents).not.toHaveBeenCalled();
142
+ expect(response.batchItemFailures).toHaveLength(0);
143
+ });
144
+ it('should handle records without eventSourceARN', async () => {
145
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
146
+ logger: mockLogger,
147
+ eventBusService: mockEventBusService,
148
+ tableServiceIdentifier: 'cmp',
149
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
150
+ mappers: {},
151
+ extractTenantId: (arn, _identifier) => {
152
+ const tableName = arn.split('/')[1];
153
+ const parts = tableName.split('.');
154
+ return parts[parts.length - 1];
155
+ },
156
+ });
157
+ const event = {
158
+ Records: [createMockRecord({ eventSourceARN: undefined })],
159
+ };
160
+ const response = await handle(event, createMockContext());
161
+ expect(mockLogger.error).toHaveBeenCalledWith('Failed to process record', expect.any(Object));
162
+ expect(response.batchItemFailures).toHaveLength(0);
163
+ });
164
+ it('should batch records according to batchSize', async () => {
165
+ const mockMapper = jest.fn(async () => [{ detailType: 'component.change.create', detail: {} }]);
166
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
167
+ logger: mockLogger,
168
+ eventBusService: mockEventBusService,
169
+ tableServiceIdentifier: 'cmp',
170
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
171
+ mappers: { componentVersion: mockMapper },
172
+ extractTenantId: (arn, _identifier) => {
173
+ const tableName = arn.split('/')[1];
174
+ const parts = tableName.split('.');
175
+ return parts[parts.length - 1];
176
+ },
177
+ batchSize: 2,
178
+ });
179
+ const records = [
180
+ createMockRecord({ eventID: '1' }),
181
+ createMockRecord({ eventID: '2' }),
182
+ createMockRecord({ eventID: '3' }),
183
+ ];
184
+ const event = { Records: records };
185
+ await handle(event, createMockContext());
186
+ expect(mockMapper).toHaveBeenCalledTimes(3);
187
+ });
188
+ it('should mark records as failed when event publishing fails', async () => {
189
+ const mockMapper = jest.fn(async () => [
190
+ { detailType: 'component.change.create', detail: { name: 'test' } },
191
+ ]);
192
+ mockEventBusService.publishEvents.mockRejectedValue(new Error('Publishing failed'));
193
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
194
+ logger: mockLogger,
195
+ eventBusService: mockEventBusService,
196
+ tableServiceIdentifier: 'cmp',
197
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
198
+ mappers: { componentVersion: mockMapper },
199
+ extractTenantId: (arn, _identifier) => {
200
+ const tableName = arn.split('/')[1];
201
+ const parts = tableName.split('.');
202
+ return parts[parts.length - 1];
203
+ },
204
+ });
205
+ const event = {
206
+ Records: [createMockRecord()],
207
+ };
208
+ const response = await handle(event, createMockContext());
209
+ expect(mockLogger.error).toHaveBeenCalledWith('Failed to publish events for tenant', expect.any(Object));
210
+ expect(response.batchItemFailures).toHaveLength(1);
211
+ expect(response.batchItemFailures[0].itemIdentifier).toBe('111');
212
+ });
213
+ it('should handle mapper returning empty events', async () => {
214
+ const mockMapper = jest.fn(async () => []);
215
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
216
+ logger: mockLogger,
217
+ eventBusService: mockEventBusService,
218
+ tableServiceIdentifier: 'cmp',
219
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
220
+ mappers: { componentVersion: mockMapper },
221
+ extractTenantId: (arn, _identifier) => {
222
+ const tableName = arn.split('/')[1];
223
+ const parts = tableName.split('.');
224
+ return parts[parts.length - 1];
225
+ },
226
+ });
227
+ const event = {
228
+ Records: [createMockRecord()],
229
+ };
230
+ const response = await handle(event, createMockContext());
231
+ expect(mockEventBusService.publishEvents).not.toHaveBeenCalled();
232
+ expect(response.batchItemFailures).toHaveLength(0);
233
+ });
234
+ it('should handle multiple mappers for different entity types', async () => {
235
+ const cvMapper = jest.fn(async () => [
236
+ { detailType: 'component.change.create', detail: { type: 'cv' } },
237
+ ]);
238
+ const csMapper = jest.fn(async () => [{ detailType: 'set.change.create', detail: { type: 'cs' } }]);
239
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
240
+ logger: mockLogger,
241
+ eventBusService: mockEventBusService,
242
+ tableServiceIdentifier: 'cmp',
243
+ entityTypePrefixMap: { 'cv#': 'componentVersion', 'cs#': 'componentSet' },
244
+ mappers: { componentVersion: cvMapper, componentSet: csMapper },
245
+ extractTenantId: (arn, _identifier) => {
246
+ const tableName = arn.split('/')[1];
247
+ const parts = tableName.split('.');
248
+ return parts[parts.length - 1];
249
+ },
250
+ });
251
+ const event = {
252
+ Records: [
253
+ createMockRecord({ eventID: '1' }),
254
+ createMockRecord({ eventID: '2', dynamodb: { Keys: { pk: { S: 'cs#set-123' } } } }),
255
+ ],
256
+ };
257
+ await handle(event, createMockContext());
258
+ expect(cvMapper).toHaveBeenCalledTimes(1);
259
+ expect(csMapper).toHaveBeenCalledTimes(1);
260
+ });
261
+ it('should handle mapper errors gracefully', async () => {
262
+ const mockMapper = jest.fn(async () => {
263
+ throw new Error('Mapper failed');
264
+ });
265
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
266
+ logger: mockLogger,
267
+ eventBusService: mockEventBusService,
268
+ tableServiceIdentifier: 'cmp',
269
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
270
+ mappers: { componentVersion: mockMapper },
271
+ extractTenantId: (arn, _identifier) => {
272
+ const tableName = arn.split('/')[1];
273
+ const parts = tableName.split('.');
274
+ return parts[parts.length - 1];
275
+ },
276
+ });
277
+ const event = {
278
+ Records: [createMockRecord()],
279
+ };
280
+ const response = await handle(event, createMockContext());
281
+ expect(mockLogger.error).toHaveBeenCalledWith('Failed to process record', expect.any(Object));
282
+ expect(response.batchItemFailures).toHaveLength(0);
283
+ });
284
+ it('should group events by tenant and publish separately', async () => {
285
+ const mockMapper = jest.fn(async () => [{ detailType: 'component.change.create', detail: {} }]);
286
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
287
+ logger: mockLogger,
288
+ eventBusService: mockEventBusService,
289
+ tableServiceIdentifier: 'cmp',
290
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
291
+ mappers: { componentVersion: mockMapper },
292
+ extractTenantId: (arn) => {
293
+ if (arn.includes('tenant1'))
294
+ return 'tenant1';
295
+ if (arn.includes('tenant2'))
296
+ return 'tenant2';
297
+ return 'unknown';
298
+ },
299
+ });
300
+ const event = {
301
+ Records: [
302
+ createMockRecord({
303
+ eventID: '1',
304
+ eventSourceARN: 'arn:aws:dynamodb:us-east-1:123456789012:table/dev.cmp-service.tenant1/stream/ts',
305
+ }),
306
+ createMockRecord({
307
+ eventID: '2',
308
+ eventSourceARN: 'arn:aws:dynamodb:us-east-1:123456789012:table/dev.cmp-service.tenant2/stream/ts',
309
+ }),
310
+ ],
311
+ };
312
+ await handle(event, createMockContext());
313
+ expect(mockEventBusService.setTenantId).toHaveBeenCalledWith('tenant1');
314
+ expect(mockEventBusService.setTenantId).toHaveBeenCalledWith('tenant2');
315
+ expect(mockEventBusService.publishEvents).toHaveBeenCalledTimes(2);
316
+ });
317
+ it('should handle records without primary key', async () => {
318
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
319
+ logger: mockLogger,
320
+ eventBusService: mockEventBusService,
321
+ tableServiceIdentifier: 'cmp',
322
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
323
+ mappers: {},
324
+ extractTenantId: (arn, _identifier) => {
325
+ const tableName = arn.split('/')[1];
326
+ const parts = tableName.split('.');
327
+ return parts[parts.length - 1];
328
+ },
329
+ });
330
+ const event = {
331
+ Records: [createMockRecord({ dynamodb: { SequenceNumber: '111', SizeBytes: 0 } })],
332
+ };
333
+ const response = await handle(event, createMockContext());
334
+ expect(response.batchItemFailures).toHaveLength(0);
335
+ });
336
+ it('should log batch processing summary', async () => {
337
+ const mockMapper = jest.fn(async () => [{ detailType: 'component.change.create', detail: {} }]);
338
+ const handle = (0, EventStreamHandler_1.createEventStreamHandler)({
339
+ logger: mockLogger,
340
+ eventBusService: mockEventBusService,
341
+ tableServiceIdentifier: 'cmp',
342
+ entityTypePrefixMap: { 'cv#': 'componentVersion' },
343
+ mappers: { componentVersion: mockMapper },
344
+ extractTenantId: (arn, _identifier) => {
345
+ const tableName = arn.split('/')[1];
346
+ const parts = tableName.split('.');
347
+ return parts[parts.length - 1];
348
+ },
349
+ });
350
+ const event = {
351
+ Records: [createMockRecord()],
352
+ };
353
+ await handle(event, createMockContext());
354
+ const finalLog = mockLogger.info.mock.calls.find((call) => call[0] === 'Batch processing complete');
355
+ expect(finalLog).toBeDefined();
356
+ expect(finalLog[1]).toEqual({
357
+ totalRecords: 1,
358
+ failedRecords: 0,
359
+ service: 'cmp',
360
+ });
361
+ });
362
+ });
363
+ });
364
+ //# sourceMappingURL=EventStreamHandler.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventStreamHandler.spec.js","sourceRoot":"","sources":["../../src/stream/EventStreamHandler.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /*!
2
+ * @license
3
+ * Copyright Squiz Australia Pty Ltd. All Rights Reserved.
4
+ */
5
+ /**
6
+ * Extracts tenant ID from a DynamoDB stream ARN
7
+ *
8
+ * ARN format: arn:aws:dynamodb:region:account:table/tableName/stream/timestamp
9
+ * Table name format: {stackPrefix}.{tableServiceName}-service.{tenantId}
10
+ *
11
+ * @param arn - The event source ARN from the DynamoDB stream record
12
+ * @param tableServiceIdentifier - The service identifier (e.g., 'cmp', 'content') to validate in table name
13
+ * @returns The tenant ID extracted from the table name
14
+ * @throws Error if ARN or table name format is invalid
15
+ */
16
+ export declare function extractTenantIdFromArn(arn: string, tableServiceIdentifier: string): string;
17
+ /**
18
+ * Extracts string or number value from DynamoDB attribute format
19
+ *
20
+ * DynamoDB represents attributes as objects with type keys (e.g., { S: "value" }, { N: "123" })
21
+ * This helper extracts the actual value.
22
+ *
23
+ * @param value - The DynamoDB attribute value object
24
+ * @returns The extracted string value, or undefined if the attribute is empty
25
+ */
26
+ export declare function getDynamoValue(value?: {
27
+ S?: string;
28
+ N?: string;
29
+ }): string | undefined;
30
+ /**
31
+ * Determines the action type based on DynamoDB event name
32
+ *
33
+ * Maps DynamoDB stream event types to semantic action types suitable for event publishing.
34
+ *
35
+ * @param eventName - The DynamoDB stream event name (INSERT, MODIFY, REMOVE)
36
+ * @returns The corresponding action: 'create', 'update', or 'delete'
37
+ */
38
+ export declare function getActionType(eventName?: string): 'create' | 'update' | 'delete';
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /*!
3
+ * @license
4
+ * Copyright Squiz Australia Pty Ltd. All Rights Reserved.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.extractTenantIdFromArn = extractTenantIdFromArn;
8
+ exports.getDynamoValue = getDynamoValue;
9
+ exports.getActionType = getActionType;
10
+ /**
11
+ * Extracts tenant ID from a DynamoDB stream ARN
12
+ *
13
+ * ARN format: arn:aws:dynamodb:region:account:table/tableName/stream/timestamp
14
+ * Table name format: {stackPrefix}.{tableServiceName}-service.{tenantId}
15
+ *
16
+ * @param arn - The event source ARN from the DynamoDB stream record
17
+ * @param tableServiceIdentifier - The service identifier (e.g., 'cmp', 'content') to validate in table name
18
+ * @returns The tenant ID extracted from the table name
19
+ * @throws Error if ARN or table name format is invalid
20
+ */
21
+ function extractTenantIdFromArn(arn, tableServiceIdentifier) {
22
+ const tableName = arn.split('/')[1];
23
+ if (!tableName) {
24
+ throw new Error(`Invalid ARN format: ${arn}`);
25
+ }
26
+ const parts = tableName.split('.');
27
+ if (parts.length < 3 || parts[1] !== `${tableServiceIdentifier}-service`) {
28
+ throw new Error(`Invalid ${tableServiceIdentifier} table name format: ${tableName}. Expected format: {prefix}.${tableServiceIdentifier}-service.{tenantId}`);
29
+ }
30
+ return parts[parts.length - 1];
31
+ }
32
+ /**
33
+ * Extracts string or number value from DynamoDB attribute format
34
+ *
35
+ * DynamoDB represents attributes as objects with type keys (e.g., { S: "value" }, { N: "123" })
36
+ * This helper extracts the actual value.
37
+ *
38
+ * @param value - The DynamoDB attribute value object
39
+ * @returns The extracted string value, or undefined if the attribute is empty
40
+ */
41
+ function getDynamoValue(value) {
42
+ return (value === null || value === void 0 ? void 0 : value.S) || (value === null || value === void 0 ? void 0 : value.N);
43
+ }
44
+ /**
45
+ * Determines the action type based on DynamoDB event name
46
+ *
47
+ * Maps DynamoDB stream event types to semantic action types suitable for event publishing.
48
+ *
49
+ * @param eventName - The DynamoDB stream event name (INSERT, MODIFY, REMOVE)
50
+ * @returns The corresponding action: 'create', 'update', or 'delete'
51
+ */
52
+ function getActionType(eventName) {
53
+ if (eventName === 'INSERT')
54
+ return 'create';
55
+ if (eventName === 'REMOVE')
56
+ return 'delete';
57
+ return 'update';
58
+ }
59
+ //# sourceMappingURL=StreamUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamUtils.js","sourceRoot":"","sources":["../../src/stream/StreamUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAaH,wDAcC;AAWD,wCAEC;AAUD,sCAIC;AApDD;;;;;;;;;;GAUG;AACH,SAAgB,sBAAsB,CAAC,GAAW,EAAE,sBAA8B;IAChF,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,sBAAsB,UAAU,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CACb,WAAW,sBAAsB,uBAAuB,SAAS,+BAA+B,sBAAsB,qBAAqB,CAC5I,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAAC,KAAkC;IAC/D,OAAO,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,CAAC,MAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,CAAC,CAAA,CAAC;AAC9B,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,aAAa,CAAC,SAAkB;IAC9C,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,SAAS,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /*!
4
+ * @license
5
+ * Copyright Squiz Australia Pty Ltd. All Rights Reserved.
6
+ */
7
+ const StreamUtils_1 = require("./StreamUtils");
8
+ describe('StreamUtils', () => {
9
+ describe('extractTenantIdFromArn', () => {
10
+ it('should extract tenant ID from valid CMP table ARN', () => {
11
+ const arn = 'arn:aws:dynamodb:us-east-1:123456789012:table/dev.cmp-service.tenant123/stream/2024-01-01T00:00:00.000';
12
+ const tenantId = (0, StreamUtils_1.extractTenantIdFromArn)(arn, 'cmp');
13
+ expect(tenantId).toBe('tenant123');
14
+ });
15
+ it('should extract tenant ID from valid content table ARN', () => {
16
+ const arn = 'arn:aws:dynamodb:us-east-1:123456789012:table/prod.content-service.acme/stream/2024-01-01T00:00:00.000';
17
+ const tenantId = (0, StreamUtils_1.extractTenantIdFromArn)(arn, 'content');
18
+ expect(tenantId).toBe('acme');
19
+ });
20
+ it('should extract only the last segment as tenant ID', () => {
21
+ const arn = 'arn:aws:dynamodb:us-east-1:123456789012:table/dev.cmp-service.tenant123/stream/2024-01-01T00:00:00.000';
22
+ const tenantId = (0, StreamUtils_1.extractTenantIdFromArn)(arn, 'cmp');
23
+ expect(tenantId).toBe('tenant123');
24
+ });
25
+ it('should throw error for invalid ARN format', () => {
26
+ const invalidArn = 'not-a-valid-arn';
27
+ expect(() => (0, StreamUtils_1.extractTenantIdFromArn)(invalidArn, 'cmp')).toThrow('Invalid ARN format');
28
+ });
29
+ it('should throw error for invalid table name format', () => {
30
+ const arn = 'arn:aws:dynamodb:us-east-1:123456789012:table/invalid-table-name/stream/2024-01-01T00:00:00.000';
31
+ expect(() => (0, StreamUtils_1.extractTenantIdFromArn)(arn, 'cmp')).toThrow('Invalid cmp table name format');
32
+ });
33
+ it('should throw error when service identifier does not match', () => {
34
+ const arn = 'arn:aws:dynamodb:us-east-1:123456789012:table/dev.content-service.tenant123/stream/2024-01-01T00:00:00.000';
35
+ expect(() => (0, StreamUtils_1.extractTenantIdFromArn)(arn, 'cmp')).toThrow('Invalid cmp table name format');
36
+ });
37
+ it('should throw error for ARN with missing table name segment', () => {
38
+ const arn = 'arn:aws:dynamodb:us-east-1:123456789012:table//stream/2024-01-01T00:00:00.000';
39
+ expect(() => (0, StreamUtils_1.extractTenantIdFromArn)(arn, 'cmp')).toThrow('Invalid ARN format');
40
+ });
41
+ });
42
+ describe('getDynamoValue', () => {
43
+ it('should extract string value from DynamoDB attribute', () => {
44
+ const attr = { S: 'test-value' };
45
+ expect((0, StreamUtils_1.getDynamoValue)(attr)).toBe('test-value');
46
+ });
47
+ it('should extract number value from DynamoDB attribute', () => {
48
+ const attr = { N: '123' };
49
+ expect((0, StreamUtils_1.getDynamoValue)(attr)).toBe('123');
50
+ });
51
+ it('should prefer string value over number value', () => {
52
+ const attr = { S: 'string-value', N: '123' };
53
+ expect((0, StreamUtils_1.getDynamoValue)(attr)).toBe('string-value');
54
+ });
55
+ it('should return undefined when attribute is undefined', () => {
56
+ expect((0, StreamUtils_1.getDynamoValue)(undefined)).toBeUndefined();
57
+ });
58
+ it('should return undefined when both S and N are undefined', () => {
59
+ const attr = {};
60
+ expect((0, StreamUtils_1.getDynamoValue)(attr)).toBeUndefined();
61
+ });
62
+ it('should return undefined when attribute has no S or N property', () => {
63
+ const attr = { M: {} };
64
+ expect((0, StreamUtils_1.getDynamoValue)(attr)).toBeUndefined();
65
+ });
66
+ it('should handle empty string values by returning undefined', () => {
67
+ const attr = { S: '' };
68
+ expect((0, StreamUtils_1.getDynamoValue)(attr)).toBeUndefined();
69
+ });
70
+ });
71
+ describe('getActionType', () => {
72
+ it('should return create for INSERT events', () => {
73
+ expect((0, StreamUtils_1.getActionType)('INSERT')).toBe('create');
74
+ });
75
+ it('should return delete for REMOVE events', () => {
76
+ expect((0, StreamUtils_1.getActionType)('REMOVE')).toBe('delete');
77
+ });
78
+ it('should return update for MODIFY events', () => {
79
+ expect((0, StreamUtils_1.getActionType)('MODIFY')).toBe('update');
80
+ });
81
+ it('should return update for unknown event types', () => {
82
+ expect((0, StreamUtils_1.getActionType)('UNKNOWN')).toBe('update');
83
+ });
84
+ it('should return update when event name is undefined', () => {
85
+ expect((0, StreamUtils_1.getActionType)(undefined)).toBe('update');
86
+ });
87
+ it('should return update when event name is empty string', () => {
88
+ expect((0, StreamUtils_1.getActionType)('')).toBe('update');
89
+ });
90
+ });
91
+ });
92
+ //# sourceMappingURL=StreamUtils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StreamUtils.spec.js","sourceRoot":"","sources":["../../src/stream/StreamUtils.spec.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,+CAAsF;AAEtF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,GAAG,GACP,wGAAwG,CAAC;YAC3G,MAAM,QAAQ,GAAG,IAAA,oCAAsB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,GAAG,GACP,wGAAwG,CAAC;YAC3G,MAAM,QAAQ,GAAG,IAAA,oCAAsB,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,GAAG,GACP,wGAAwG,CAAC;YAC3G,MAAM,QAAQ,GAAG,IAAA,oCAAsB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAG,iBAAiB,CAAC;YACrC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,oCAAsB,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACxF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,GAAG,GAAG,iGAAiG,CAAC;YAC9G,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,oCAAsB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACnE,MAAM,GAAG,GACP,4GAA4G,CAAC;YAC/G,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,oCAAsB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;YACpE,MAAM,GAAG,GAAG,+EAA+E,CAAC;YAC5F,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,oCAAsB,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;YACjC,MAAM,CAAC,IAAA,4BAAc,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAA,4BAAc,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;YAC7C,MAAM,CAAC,IAAA,4BAAc,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,CAAC,IAAA,4BAAc,EAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,MAAM,CAAC,IAAA,4BAAc,EAAC,IAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;YACvE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,IAAA,4BAAc,EAAC,IAAW,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;YACvB,MAAM,CAAC,IAAA,4BAAc,EAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,IAAA,2BAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,IAAA,2BAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,IAAA,2BAAa,EAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,IAAA,2BAAa,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,CAAC,IAAA,2BAAa,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,CAAC,IAAA,2BAAa,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@squiz/dx-common-lib",
3
- "version": "1.72.0",
3
+ "version": "1.72.3",
4
4
  "description": "",
5
5
  "main": "lib/index.js",
6
6
  "private": false,
@@ -16,7 +16,7 @@
16
16
  "author": "",
17
17
  "license": "ISC",
18
18
  "dependencies": {
19
- "@aws-sdk/client-secrets-manager": "3.651.1",
19
+ "@aws-sdk/client-secrets-manager": "^3.946.0",
20
20
  "@squiz/dx-logger-lib": "^1.65.1",
21
21
  "archiver": "7.0.1",
22
22
  "escape-string-regexp": "4.0.0",
@@ -31,6 +31,7 @@
31
31
  "@types/jest": "28.1.8",
32
32
  "@types/lodash.clonedeep": "4.5.9",
33
33
  "@types/node": "22.10.5",
34
+ "aws-lambda": "^1.0.7",
34
35
  "dotenv": "16.6.1",
35
36
  "jest": "29.4.1",
36
37
  "ts-jest": "29.0.5",