@squiz/optimization-utils 2.0.2 → 3.0.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.
Files changed (72) hide show
  1. package/dist/array/chunkify.d.ts +1 -0
  2. package/dist/array/chunkify.js +12 -0
  3. package/dist/array/chunkify.js.map +1 -0
  4. package/dist/array/uniqueWith.d.ts +1 -0
  5. package/dist/array/uniqueWith.js +6 -0
  6. package/dist/array/uniqueWith.js.map +1 -0
  7. package/dist/index.d.ts +3 -13
  8. package/dist/index.js +3 -13
  9. package/dist/index.js.map +1 -1
  10. package/dist/{typesUtils → types}/utilities.js.map +1 -1
  11. package/package.json +3 -16
  12. package/CHANGELOG.md +0 -43
  13. package/dist/cloudflare/CloudflareKVHttpService.d.ts +0 -11
  14. package/dist/cloudflare/CloudflareKVHttpService.js +0 -19
  15. package/dist/cloudflare/CloudflareKVHttpService.js.map +0 -1
  16. package/dist/cloudflare/ImplCloudflareKVHttpService.d.ts +0 -22
  17. package/dist/cloudflare/ImplCloudflareKVHttpService.js +0 -94
  18. package/dist/cloudflare/ImplCloudflareKVHttpService.js.map +0 -1
  19. package/dist/config/ConfigurationLoader.d.ts +0 -23
  20. package/dist/config/ConfigurationLoader.js +0 -98
  21. package/dist/config/ConfigurationLoader.js.map +0 -1
  22. package/dist/date/DateManipulator.d.ts +0 -6
  23. package/dist/date/DateManipulator.js +0 -21
  24. package/dist/date/DateManipulator.js.map +0 -1
  25. package/dist/event/AggregateRoot.d.ts +0 -4
  26. package/dist/event/AggregateRoot.js +0 -3
  27. package/dist/event/AggregateRoot.js.map +0 -1
  28. package/dist/event/DomainEvent.d.ts +0 -14
  29. package/dist/event/DomainEvent.js +0 -28
  30. package/dist/event/DomainEvent.js.map +0 -1
  31. package/dist/event/DynamoDBEventMapper.d.ts +0 -39
  32. package/dist/event/DynamoDBEventMapper.js +0 -58
  33. package/dist/event/DynamoDBEventMapper.js.map +0 -1
  34. package/dist/event/EventHandler.d.ts +0 -14
  35. package/dist/event/EventHandler.js +0 -43
  36. package/dist/event/EventHandler.js.map +0 -1
  37. package/dist/scheduler/EventBridgeScheduler.d.ts +0 -21
  38. package/dist/scheduler/EventBridgeScheduler.js +0 -130
  39. package/dist/scheduler/EventBridgeScheduler.js.map +0 -1
  40. package/dist/scheduler/Scheduler.d.ts +0 -21
  41. package/dist/scheduler/Scheduler.js +0 -17
  42. package/dist/scheduler/Scheduler.js.map +0 -1
  43. package/dist/testing/mock.d.ts +0 -4
  44. package/dist/testing/mock.js +0 -17
  45. package/dist/testing/mock.js.map +0 -1
  46. package/dist/typesUtils/DynamoDB.d.ts +0 -4
  47. package/dist/typesUtils/DynamoDB.js +0 -3
  48. package/dist/typesUtils/DynamoDB.js.map +0 -1
  49. package/src/cloudflare/CloudflareKVHttpService.ts +0 -20
  50. package/src/cloudflare/ImplCloudflareKVHttpService.ts +0 -129
  51. package/src/cloudflare/__tests__/ImplCloudflareKVHttpService.spec.ts +0 -178
  52. package/src/config/ConfigurationLoader.ts +0 -74
  53. package/src/config/__tests__/ConfigurationLoader.spec.ts +0 -62
  54. package/src/date/DateManipulator.ts +0 -29
  55. package/src/date/__tests__/DateManipulator.spec.ts +0 -64
  56. package/src/event/AggregateRoot.ts +0 -5
  57. package/src/event/DomainEvent.ts +0 -53
  58. package/src/event/DynamoDBEventMapper.ts +0 -75
  59. package/src/event/EventHandler.ts +0 -57
  60. package/src/event/__tests__/DynamoDBEventMapper.spec.ts +0 -121
  61. package/src/index.ts +0 -21
  62. package/src/object/__tests__/getProperty.spec.ts +0 -17
  63. package/src/object/getProperty.ts +0 -21
  64. package/src/scheduler/EventBridgeScheduler.ts +0 -172
  65. package/src/scheduler/Scheduler.ts +0 -32
  66. package/src/scheduler/__tests__/EventBridgeScheduler.spec.ts +0 -308
  67. package/src/testing/mock.ts +0 -15
  68. package/src/typesUtils/DynamoDB.ts +0 -17
  69. package/src/typesUtils/utilities.ts +0 -11
  70. package/tsconfig.json +0 -13
  71. /package/dist/{typesUtils → types}/utilities.d.ts +0 -0
  72. /package/dist/{typesUtils → types}/utilities.js +0 -0
@@ -1,58 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toEventFromPlain = exports.toEventFromDynamoDb = exports.eventToDynamoDB = void 0;
4
- const DomainEvent_1 = require("./DomainEvent");
5
- const zod_1 = require("zod");
6
- const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
7
- const DateManipulator_1 = require("../date/DateManipulator");
8
- const notEmptyString = zod_1.z.string().min(1);
9
- const EVENT_DYNAMO_DB_MODEL_SCHEMA = zod_1.z.object({
10
- eventId: notEmptyString,
11
- name: notEmptyString,
12
- detail: zod_1.z.object({}).catchall(zod_1.z.any()),
13
- time: zod_1.z.string().datetime(),
14
- version: notEmptyString,
15
- ttl: zod_1.z.number(),
16
- entityId: zod_1.z.string(),
17
- });
18
- const eventToDynamoDB = (event) => {
19
- const timestampPlus30Days = (0, DateManipulator_1.DateManipulator)(event.time)
20
- .addDays(30)
21
- .valueOf()
22
- .getTime();
23
- const dynamoDBModel = {
24
- eventId: event.eventId,
25
- name: event.name,
26
- detail: JSON.parse(JSON.stringify(event.detail)),
27
- time: event.time.toISOString(),
28
- version: event.version,
29
- ttl: timestampPlus30Days / 1000,
30
- entityId: event.entityId,
31
- };
32
- return (0, util_dynamodb_1.marshall)(dynamoDBModel, {
33
- removeUndefinedValues: true,
34
- });
35
- };
36
- exports.eventToDynamoDB = eventToDynamoDB;
37
- const toEventFromDynamoDb = (dynamoItem) => {
38
- const unmarshalled = (0, util_dynamodb_1.unmarshall)(dynamoItem);
39
- return (0, exports.toEventFromPlain)(unmarshalled);
40
- };
41
- exports.toEventFromDynamoDb = toEventFromDynamoDb;
42
- const toEventFromPlain = (plainObject) => {
43
- const dynamoDBModel = EVENT_DYNAMO_DB_MODEL_SCHEMA.omit({ ttl: true }).parse(plainObject);
44
- const eventType = (0, DomainEvent_1.getDomainEventType)(dynamoDBModel.name);
45
- if (!eventType) {
46
- throw new Error(`Cannot map the event "${dynamoDBModel.name}" because does not exist`);
47
- }
48
- return Object.assign(new eventType({}), {
49
- eventId: dynamoDBModel.eventId,
50
- detail: dynamoDBModel.detail,
51
- time: new Date(dynamoDBModel.time),
52
- version: dynamoDBModel.version,
53
- name: dynamoDBModel.name,
54
- entityId: dynamoDBModel.entityId,
55
- });
56
- };
57
- exports.toEventFromPlain = toEventFromPlain;
58
- //# sourceMappingURL=DynamoDBEventMapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DynamoDBEventMapper.js","sourceRoot":"","sources":["../../src/event/DynamoDBEventMapper.ts"],"names":[],"mappings":";;;AAAA,+CAAgE;AAChE,6BAAwB;AAExB,0DAA8D;AAE9D,6DAA0D;AAE1D,MAAM,cAAc,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,4BAA4B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,cAAc;IACvB,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,OAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAC,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,cAAc;IACvB,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE;IACf,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAKI,MAAM,eAAe,GAAG,CAC7B,KAAkB,EACU,EAAE;IAC9B,MAAM,mBAAmB,GAAG,IAAA,iCAAe,EAAC,KAAK,CAAC,IAAI,CAAC;SACpD,OAAO,CAAC,EAAE,CAAC;SACX,OAAO,EAAE;SACT,OAAO,EAAE,CAAC;IAEb,MAAM,aAAa,GAAuB;QACxC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,EAAE,mBAAmB,GAAG,IAAI;QAC/B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC;IAEF,OAAO,IAAA,wBAAQ,EAAC,aAAa,EAAE;QAC7B,qBAAqB,EAAE,IAAI;KAC5B,CAA+B,CAAC;AACnC,CAAC,CAAC;AArBW,QAAA,eAAe,mBAqB1B;AAEK,MAAM,mBAAmB,GAAG,CACjC,UAA0C,EACnC,EAAE;IACT,MAAM,YAAY,GAAG,IAAA,0BAAU,EAAC,UAAU,CAAC,CAAC;IAE5C,OAAO,IAAA,wBAAgB,EAAC,YAAY,CAAC,CAAC;AACxC,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B;AAEK,MAAM,gBAAgB,GAAG,CAC9B,WAAoC,EAC7B,EAAE;IACT,MAAM,aAAa,GAAG,4BAA4B,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAC1E,WAAW,CACZ,CAAC;IACF,MAAM,SAAS,GAAG,IAAA,gCAAkB,EAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAEzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,yBAAyB,aAAa,CAAC,IAAI,0BAA0B,CACtE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,EAAE;QACtC,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,MAAM,EAAE,aAAa,CAAC,MAAM;QAC5B,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAClC,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,IAAI,EAAE,aAAa,CAAC,IAAI;QACxB,QAAQ,EAAE,aAAa,CAAC,QAAQ;KACjC,CAAU,CAAC;AACd,CAAC,CAAC;AAtBW,QAAA,gBAAgB,oBAsB3B"}
@@ -1,14 +0,0 @@
1
- import { DomainEvent } from './DomainEvent';
2
- export declare abstract class EventHandler<TEvent extends DomainEvent = DomainEvent> {
3
- abstract execute(event: TEvent): Promise<void>;
4
- }
5
- type Constructor = new (...args: Array<any>) => any;
6
- type EventConstructor = Constructor;
7
- type EventHandlerConstructor = Constructor;
8
- type EventHandlerMetadata = Array<{
9
- eventHandler: EventHandlerConstructor;
10
- event: EventConstructor;
11
- }>;
12
- export declare function getEventHandlerMetadata(): EventHandlerMetadata;
13
- export declare function AsEventHandler(event: EventConstructor): ClassDecorator;
14
- export {};
@@ -1,43 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.EventHandler = void 0;
10
- exports.getEventHandlerMetadata = getEventHandlerMetadata;
11
- exports.AsEventHandler = AsEventHandler;
12
- const inversify_1 = require("inversify");
13
- let EventHandler = class EventHandler {
14
- };
15
- exports.EventHandler = EventHandler;
16
- exports.EventHandler = EventHandler = __decorate([
17
- (0, inversify_1.injectable)()
18
- ], EventHandler);
19
- const EVENT_HANDLER_SYMBOL = Symbol();
20
- function getEventHandlerMetadata() {
21
- return Reflect.getMetadata(EVENT_HANDLER_SYMBOL, Object) ?? [];
22
- }
23
- function setEventHandlerMetadata({ event, eventHandler, }) {
24
- const metadata = getEventHandlerMetadata();
25
- const handlerExists = metadata.find((m) => m.eventHandler.name === eventHandler.name);
26
- if (handlerExists) {
27
- throw new Error(`The EventHandler has been used two times: ${eventHandler.name}. The EventHandler has to have uniq name`);
28
- }
29
- const newMetadata = [
30
- ...getEventHandlerMetadata(),
31
- { eventHandler, event },
32
- ];
33
- Reflect.defineMetadata(EVENT_HANDLER_SYMBOL, newMetadata, Object);
34
- }
35
- function AsEventHandler(event) {
36
- return (target) => {
37
- setEventHandlerMetadata({
38
- event,
39
- eventHandler: target,
40
- });
41
- };
42
- }
43
- //# sourceMappingURL=EventHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventHandler.js","sourceRoot":"","sources":["../../src/event/EventHandler.ts"],"names":[],"mappings":";;;;;;;;;AAmBA,0DAEC;AA4BD,wCAOC;AAxDD,yCAAuC;AAIhC,IAAe,YAAY,GAA3B,MAAe,YAAY;CAEjC,CAAA;AAFqB,oCAAY;uBAAZ,YAAY;IADjC,IAAA,sBAAU,GAAE;GACS,YAAY,CAEjC;AAWD,MAAM,oBAAoB,GAAG,MAAM,EAAE,CAAC;AAEtC,SAAgB,uBAAuB;IACrC,OAAO,OAAO,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,uBAAuB,CAAC,EAC/B,KAAK,EACL,YAAY,GAIb;IACC,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,YAAY,CAAC,IAAI,CACjD,CAAC;IAEF,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,6CAA6C,YAAY,CAAC,IAAI,0CAA0C,CACzG,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAyB;QACxC,GAAG,uBAAuB,EAAE;QAC5B,EAAE,YAAY,EAAE,KAAK,EAAE;KACxB,CAAC;IAEF,OAAO,CAAC,cAAc,CAAC,oBAAoB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,cAAc,CAAC,KAAuB;IACpD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,uBAAuB,CAAC;YACtB,KAAK;YACL,YAAY,EAAE,MAA4C;SAC3D,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -1,21 +0,0 @@
1
- import { SchedulerClient } from '@aws-sdk/client-scheduler';
2
- import { DomainEvent } from '../event/DomainEvent';
3
- import { ScheduleName, Scheduler, SchedulerOptions } from './Scheduler';
4
- import { Logger } from '@squiz/optimization-logger';
5
- export type EventBridgeSchedulerConfig = {
6
- region: string;
7
- groupName: string;
8
- eventTableName: string;
9
- schedulerRole: string;
10
- };
11
- export declare class EventBridgeScheduler implements Scheduler {
12
- private readonly config;
13
- private readonly client;
14
- private readonly logger;
15
- constructor(config: EventBridgeSchedulerConfig, client: SchedulerClient, logger: Logger);
16
- schedule(domainEvent: DomainEvent, options: SchedulerOptions): Promise<void>;
17
- private createScheduleName;
18
- private createScheduleExpression;
19
- deleteSchedule(scheduleName: ScheduleName): Promise<void>;
20
- private _deleteSchedule;
21
- }
@@ -1,130 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.EventBridgeScheduler = void 0;
13
- const inversify_1 = require("inversify");
14
- const client_scheduler_1 = require("@aws-sdk/client-scheduler");
15
- const DynamoDBEventMapper_1 = require("../event/DynamoDBEventMapper");
16
- const crypto_1 = require("crypto");
17
- const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
18
- const optimization_logger_1 = require("@squiz/optimization-logger");
19
- let EventBridgeScheduler = class EventBridgeScheduler {
20
- config;
21
- client;
22
- logger;
23
- constructor(config, client, logger) {
24
- this.config = config;
25
- this.client = client;
26
- this.logger = logger;
27
- }
28
- async schedule(domainEvent, options) {
29
- const logMessage = (0, optimization_logger_1.createLog)()
30
- .attachEventName(domainEvent.name)
31
- .create(this);
32
- this.logger.debug(...logMessage('started scheduling'));
33
- // I putted here "the schedule attributes" because in that way we ensure that every PutItem command
34
- // it will create always a new record in dynamoDB
35
- const putItemCommand = {
36
- TableName: this.config.eventTableName,
37
- Item: {
38
- ...(0, DynamoDBEventMapper_1.eventToDynamoDB)(domainEvent),
39
- // https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-schedule-context-attributes.html
40
- ...(0, util_dynamodb_1.marshall)({
41
- eventId: '<aws.scheduler.execution-id>',
42
- time: '<aws.scheduler.scheduled-time>',
43
- }),
44
- },
45
- };
46
- this.logger.debug(...logMessage('finished mapping to PutItemCommandInput'));
47
- const scheduleName = this.createScheduleName(options.name);
48
- const scheduleExpression = this.createScheduleExpression(options);
49
- this.logger.debug(...logMessage(`started calling AWS Scheduler with ScheduleName: ` +
50
- `${scheduleName}, ScheduleExpression: ${scheduleExpression}`));
51
- await this._deleteSchedule(scheduleName, logMessage);
52
- const command = new client_scheduler_1.CreateScheduleCommand({
53
- Name: scheduleName,
54
- GroupName: this.config.groupName,
55
- ScheduleExpression: scheduleExpression,
56
- ScheduleExpressionTimezone: 'UTC',
57
- State: 'ENABLED',
58
- FlexibleTimeWindow: {
59
- Mode: client_scheduler_1.FlexibleTimeWindowMode.OFF,
60
- },
61
- ActionAfterCompletion: 'DELETE',
62
- Target: {
63
- Arn: 'arn:aws:scheduler:::aws-sdk:dynamodb:putItem',
64
- Input: JSON.stringify(putItemCommand),
65
- RoleArn: this.config.schedulerRole,
66
- },
67
- ClientToken: (0, crypto_1.randomUUID)(),
68
- });
69
- await this.client.send(command);
70
- this.logger.debug(...logMessage('finished calling AWS Scheduler'));
71
- }
72
- createScheduleName(scheduleName) {
73
- const truncateString = (str, maxLength) => str.length > maxLength ? str.substring(0, maxLength) : str;
74
- const maxLengthOfScheduleName = 64;
75
- return truncateString(scheduleName, maxLengthOfScheduleName);
76
- }
77
- createScheduleExpression(options) {
78
- switch (options.type) {
79
- case 'at': {
80
- const dateString = options.value.toISOString().replace(/\..*/, '');
81
- return `at(${dateString})`;
82
- }
83
- case 'cron':
84
- return `cron(${options.value})`;
85
- case 'rate':
86
- return `rate(${options.value} ${options.unit})`;
87
- default:
88
- throw new Error(`Passed unresolved ScheduleOption type.`);
89
- }
90
- }
91
- async deleteSchedule(scheduleName) {
92
- const logMessage = (0, optimization_logger_1.createLog)()
93
- .attachMetadata({ scheduleName })
94
- .create(this);
95
- return this._deleteSchedule(scheduleName, logMessage);
96
- }
97
- async _deleteSchedule(scheduleName, logMessage) {
98
- const trimmedScheduleName = this.createScheduleName(scheduleName);
99
- try {
100
- this.logger.debug(...logMessage(`started getting schedule, scheduleName: ${trimmedScheduleName}`));
101
- const getCommand = new client_scheduler_1.GetScheduleCommand({
102
- GroupName: this.config.groupName,
103
- Name: trimmedScheduleName,
104
- });
105
- await this.client.send(getCommand);
106
- this.logger.debug(...logMessage(`finished getting schedule, scheduleName: ${trimmedScheduleName}`));
107
- }
108
- catch (e) {
109
- if (e instanceof client_scheduler_1.ResourceNotFoundException) {
110
- this.logger.debug(...logMessage(`the schedule does not exist, skipped deleting existing schedule, scheduleName: ${trimmedScheduleName}`));
111
- return;
112
- }
113
- throw e;
114
- }
115
- this.logger.debug(...logMessage('started deleting schedule'));
116
- const deleteCommand = new client_scheduler_1.DeleteScheduleCommand({
117
- GroupName: this.config.groupName,
118
- Name: trimmedScheduleName,
119
- });
120
- await this.client.send(deleteCommand);
121
- this.logger.debug(...logMessage('finished deleting schedule'));
122
- }
123
- };
124
- exports.EventBridgeScheduler = EventBridgeScheduler;
125
- exports.EventBridgeScheduler = EventBridgeScheduler = __decorate([
126
- (0, inversify_1.injectable)(),
127
- __metadata("design:paramtypes", [Object, client_scheduler_1.SchedulerClient,
128
- optimization_logger_1.Logger])
129
- ], EventBridgeScheduler);
130
- //# sourceMappingURL=EventBridgeScheduler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EventBridgeScheduler.js","sourceRoot":"","sources":["../../src/scheduler/EventBridgeScheduler.ts"],"names":[],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import { DomainEvent } from './../event/DomainEvent';
2
- export type CronExpression = `${string} ${string} ${string} ${string} ${string} ${string}`;
3
- export type RateUnit = 'minutes' | 'hours' | 'days';
4
- export type ScheduleName = string;
5
- export type SchedulerOptions = ({
6
- type: 'at';
7
- value: Date;
8
- } | {
9
- type: 'cron';
10
- value: CronExpression;
11
- } | {
12
- type: 'rate';
13
- value: number;
14
- unit: RateUnit;
15
- }) & {
16
- name: ScheduleName;
17
- };
18
- export declare abstract class Scheduler {
19
- abstract schedule(domainEvent: DomainEvent, options: SchedulerOptions): Promise<void>;
20
- abstract deleteSchedule(scheduleName: ScheduleName): Promise<void>;
21
- }
@@ -1,17 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.Scheduler = void 0;
10
- const inversify_1 = require("inversify");
11
- let Scheduler = class Scheduler {
12
- };
13
- exports.Scheduler = Scheduler;
14
- exports.Scheduler = Scheduler = __decorate([
15
- (0, inversify_1.injectable)()
16
- ], Scheduler);
17
- //# sourceMappingURL=Scheduler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/scheduler/Scheduler.ts"],"names":[],"mappings":";;;;;;;;;AACA,yCAAuC;AAuBhC,IAAe,SAAS,GAAxB,MAAe,SAAS;CAO9B,CAAA;AAPqB,8BAAS;oBAAT,SAAS;IAD9B,IAAA,sBAAU,GAAE;GACS,SAAS,CAO9B"}
@@ -1,4 +0,0 @@
1
- import { SchedulerClient } from '@aws-sdk/client-scheduler';
2
- import { Scheduler } from '../scheduler/Scheduler';
3
- export declare const createSchedulerClientMock: () => SchedulerClient;
4
- export declare const createSchedulerMock: () => Scheduler;
@@ -1,17 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createSchedulerMock = exports.createSchedulerClientMock = void 0;
4
- const createSchedulerClientMock = () => {
5
- return {
6
- send: jest.fn(),
7
- };
8
- };
9
- exports.createSchedulerClientMock = createSchedulerClientMock;
10
- const createSchedulerMock = () => {
11
- return {
12
- schedule: jest.fn(),
13
- deleteSchedule: jest.fn(),
14
- };
15
- };
16
- exports.createSchedulerMock = createSchedulerMock;
17
- //# sourceMappingURL=mock.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":";;;AAGO,MAAM,yBAAyB,GAAG,GAAoB,EAAE;IAC7D,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;KACc,CAAC;AAClC,CAAC,CAAC;AAJW,QAAA,yBAAyB,6BAIpC;AAEK,MAAM,mBAAmB,GAAG,GAAc,EAAE;IACjD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE;QACnB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;KAC1B,CAAC;AACJ,CAAC,CAAC;AALW,QAAA,mBAAmB,uBAK9B"}
@@ -1,4 +0,0 @@
1
- import { AttributeValue } from '@aws-sdk/client-dynamodb';
2
- export type MarshalledResult<T> = {
3
- [K in keyof T]: T[K] extends string ? AttributeValue.SMember : T[K] extends number ? AttributeValue.NMember : T[K] extends Record<string, unknown> ? AttributeValue.MMember : T[K] extends Array<unknown> ? AttributeValue.LMember : T[K] extends boolean ? AttributeValue.BOOLMember : T[K] extends undefined ? Partial<T[K]> : never;
4
- };
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=DynamoDB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DynamoDB.js","sourceRoot":"","sources":["../../src/typesUtils/DynamoDB.ts"],"names":[],"mappings":""}
@@ -1,20 +0,0 @@
1
- import { injectable } from 'inversify';
2
-
3
- export type CloudflareKey = string;
4
-
5
- export type BatchValueData<T> = Array<{
6
- key: CloudflareKey;
7
- value: T;
8
- }>;
9
-
10
- // https://developers.cloudflare.com/api/operations/workers-kv-namespace-write-multiple-key-value-pairs
11
- export const MAX_BATCH_DATA_ITEMS = 10_000;
12
-
13
- @injectable()
14
- export abstract class CloudflareKVHttpService<TSchema> {
15
- abstract getValues(key: CloudflareKey): Promise<TSchema>;
16
-
17
- abstract putBulk(batchData: BatchValueData<TSchema>): Promise<void>;
18
-
19
- abstract deleteBulk(keys: Array<CloudflareKey>): Promise<void>;
20
- }
@@ -1,129 +0,0 @@
1
- import { injectable } from 'inversify';
2
- import { inspect } from 'util';
3
- import {
4
- BatchValueData,
5
- CloudflareKey,
6
- CloudflareKVHttpService,
7
- MAX_BATCH_DATA_ITEMS,
8
- } from './CloudflareKVHttpService';
9
- import { ZodType } from 'zod';
10
- import {
11
- HttpRequestBuilderFactory,
12
- HttpMethod,
13
- } from '@squiz/optimization-http-client';
14
- import { createLog, Logger } from '@squiz/optimization-logger';
15
-
16
- export type CloudflareConfig = {
17
- domain: string;
18
- accountId: string;
19
- namespace: string;
20
- apiKey: string;
21
- };
22
- export type CloudflareConfigProvider = () => Promise<CloudflareConfig>;
23
-
24
- @injectable()
25
- export class ImplCloudflareKVHttpService<TSchema>
26
- implements CloudflareKVHttpService<TSchema>
27
- {
28
- constructor(
29
- private readonly cloudflareConfigProvider: CloudflareConfigProvider,
30
- private readonly httpRequestBuilderFactory: HttpRequestBuilderFactory,
31
- private readonly logger: Logger,
32
- private readonly schema: TSchema extends ZodType ? TSchema : never,
33
- ) {}
34
-
35
- async getValues(key: string): Promise<TSchema> {
36
- const response = await this.callApi({
37
- path: `/values/${key}`,
38
- method: HttpMethod.GET,
39
- handleNotFoundAsEmpty: true,
40
- });
41
-
42
- return this.schema.parse(
43
- typeof response === 'string' ? JSON.parse(response) : {},
44
- );
45
- }
46
-
47
- async putBulk(batchData: BatchValueData<TSchema>): Promise<void> {
48
- if (!batchData.length) {
49
- return;
50
- }
51
-
52
- if (batchData.length > MAX_BATCH_DATA_ITEMS) {
53
- throw new Error(
54
- `The max items count has been exceeded. The max items count is ${MAX_BATCH_DATA_ITEMS}`,
55
- );
56
- }
57
-
58
- await this.callApi({
59
- method: HttpMethod.PUT,
60
- body: batchData.map((data) => ({
61
- ...data,
62
- value: JSON.stringify(data.value),
63
- })),
64
- path: `/bulk`,
65
- });
66
- }
67
-
68
- async deleteBulk(keys: Array<CloudflareKey>): Promise<void> {
69
- if (!keys.length) {
70
- return;
71
- }
72
-
73
- await this.callApi({
74
- method: HttpMethod.DELETE,
75
- body: keys,
76
- path: `/bulk`,
77
- });
78
- }
79
-
80
- private async callApi({
81
- path,
82
- body,
83
- method,
84
- handleNotFoundAsEmpty = false,
85
- }: {
86
- path: '/bulk' | `/values/${string}`;
87
- method: HttpMethod;
88
- body?: Record<string, string> | Array<unknown>;
89
- handleNotFoundAsEmpty?: boolean;
90
- }): Promise<unknown | undefined> {
91
- const config = await this.cloudflareConfigProvider();
92
- const baseUrl =
93
- `https://${config.domain}/client/v4/accounts/` +
94
- `${config.accountId}/storage/kv/namespaces/` +
95
- `${config.namespace}`;
96
- const url = baseUrl + path;
97
-
98
- const logMessage = createLog()
99
- .attachMetadata({ path, method, url })
100
- .create(this);
101
-
102
- this.logger.debug(...logMessage('started calling http endpoint'));
103
- this.logger.debug(
104
- ...logMessage(`the request body: ${inspect(body, { depth: 4 })}`),
105
- );
106
- const httpBuilder = this.httpRequestBuilderFactory
107
- .create()
108
- .url(url)
109
- .method(method)
110
- .body(body)
111
- .applicationJson()
112
- .authorizationByBearer(config.apiKey);
113
-
114
- handleNotFoundAsEmpty && httpBuilder.handleNotFound();
115
-
116
- const response = await httpBuilder.sendRequest();
117
-
118
- this.logger.debug(...logMessage('finished calling http endpoint'));
119
- this.logger.debug(
120
- ...logMessage(
121
- `returned type: ${typeof response.body}, type: returned: ${inspect(
122
- response.body,
123
- { depth: 4 },
124
- )}`,
125
- ),
126
- );
127
- return response.body;
128
- }
129
- }