@squiz/optimization-utils 1.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.
- package/dist/cloudflare/CloudflareKVHttpService.d.ts +11 -0
- package/dist/cloudflare/CloudflareKVHttpService.js +19 -0
- package/dist/cloudflare/CloudflareKVHttpService.js.map +1 -0
- package/dist/cloudflare/ImplCloudflareKVHttpService.d.ts +22 -0
- package/dist/cloudflare/ImplCloudflareKVHttpService.js +96 -0
- package/dist/cloudflare/ImplCloudflareKVHttpService.js.map +1 -0
- package/dist/config/ConfigurationLoader.d.ts +23 -0
- package/dist/config/ConfigurationLoader.js +99 -0
- package/dist/config/ConfigurationLoader.js.map +1 -0
- package/dist/date/DateManipulator.d.ts +6 -0
- package/dist/date/DateManipulator.js +21 -0
- package/dist/date/DateManipulator.js.map +1 -0
- package/dist/event/AggregateRoot.d.ts +4 -0
- package/dist/event/AggregateRoot.js +3 -0
- package/dist/event/AggregateRoot.js.map +1 -0
- package/dist/event/DomainEvent.d.ts +13 -0
- package/dist/event/DomainEvent.js +28 -0
- package/dist/event/DomainEvent.js.map +1 -0
- package/dist/event/DynamoDBEventMapper.d.ts +36 -0
- package/dist/event/DynamoDBEventMapper.js +55 -0
- package/dist/event/DynamoDBEventMapper.js.map +1 -0
- package/dist/event/EventHandler.d.ts +14 -0
- package/dist/event/EventHandler.js +43 -0
- package/dist/event/EventHandler.js.map +1 -0
- package/dist/exception/DomainException.d.ts +18 -0
- package/dist/exception/DomainException.js +41 -0
- package/dist/exception/DomainException.js.map +1 -0
- package/dist/httpClient/FetchHttpClient.d.ts +7 -0
- package/dist/httpClient/FetchHttpClient.js +86 -0
- package/dist/httpClient/FetchHttpClient.js.map +1 -0
- package/dist/httpClient/HttpClient.d.ts +25 -0
- package/dist/httpClient/HttpClient.js +45 -0
- package/dist/httpClient/HttpClient.js.map +1 -0
- package/dist/httpClient/HttpRequestBuilder.d.ts +22 -0
- package/dist/httpClient/HttpRequestBuilder.js +126 -0
- package/dist/httpClient/HttpRequestBuilder.js.map +1 -0
- package/dist/logger/Logger.d.ts +10 -0
- package/dist/logger/Logger.js +30 -0
- package/dist/logger/Logger.js.map +1 -0
- package/dist/logger/LoggerMessage.d.ts +27 -0
- package/dist/logger/LoggerMessage.js +94 -0
- package/dist/logger/LoggerMessage.js.map +1 -0
- package/dist/logger/RemoteLogger.d.ts +30 -0
- package/dist/logger/RemoteLogger.js +35 -0
- package/dist/logger/RemoteLogger.js.map +1 -0
- package/dist/logger/SquizRemoteLogger.d.ts +53 -0
- package/dist/logger/SquizRemoteLogger.js +128 -0
- package/dist/logger/SquizRemoteLogger.js.map +1 -0
- package/dist/package.d.ts +23 -0
- package/dist/package.js +40 -0
- package/dist/package.js.map +1 -0
- package/dist/scheduler/EventBridgeScheduler.d.ts +21 -0
- package/dist/scheduler/EventBridgeScheduler.js +131 -0
- package/dist/scheduler/EventBridgeScheduler.js.map +1 -0
- package/dist/scheduler/Scheduler.d.ts +21 -0
- package/dist/scheduler/Scheduler.js +17 -0
- package/dist/scheduler/Scheduler.js.map +1 -0
- package/dist/testing/mock.d.ts +12 -0
- package/dist/testing/mock.js +51 -0
- package/dist/testing/mock.js.map +1 -0
- package/dist/typesUtils/DynamoDB.d.ts +4 -0
- package/dist/typesUtils/DynamoDB.js +3 -0
- package/dist/typesUtils/DynamoDB.js.map +1 -0
- package/dist/typesUtils/utilities.d.ts +9 -0
- package/dist/typesUtils/utilities.js +3 -0
- package/dist/typesUtils/utilities.js.map +1 -0
- package/dist/validation/handleValidation.d.ts +2 -0
- package/dist/validation/handleValidation.js +11 -0
- package/dist/validation/handleValidation.js.map +1 -0
- package/dist/valueObject/TenantId.d.ts +10 -0
- package/dist/valueObject/TenantId.js +23 -0
- package/dist/valueObject/TenantId.js.map +1 -0
- package/package.json +26 -0
- package/src/cloudflare/CloudflareKVHttpService.ts +20 -0
- package/src/cloudflare/ImplCloudflareKVHttpService.ts +128 -0
- package/src/cloudflare/__tests__/ImplCloudflareKVHttpService.spec.ts +178 -0
- package/src/config/ConfigurationLoader.ts +72 -0
- package/src/config/__tests__/ConfigurationLoader.spec.ts +62 -0
- package/src/date/DateManipulator.ts +29 -0
- package/src/date/__tests__/DateManipulator.spec.ts +64 -0
- package/src/event/AggregateRoot.ts +5 -0
- package/src/event/DomainEvent.ts +52 -0
- package/src/event/DynamoDBEventMapper.ts +72 -0
- package/src/event/EventHandler.ts +57 -0
- package/src/event/__tests__/DynamoDBEventMapper.spec.ts +113 -0
- package/src/exception/DomainException.ts +34 -0
- package/src/httpClient/FetchHttpClient.ts +92 -0
- package/src/httpClient/HttpClient.ts +46 -0
- package/src/httpClient/HttpRequestBuilder.ts +120 -0
- package/src/httpClient/__tests__/FetchHttpClient.spec.ts +146 -0
- package/src/httpClient/__tests__/HttpClient.spec.ts +52 -0
- package/src/httpClient/__tests__/httpRequestBuilder.spec.ts +75 -0
- package/src/logger/Logger.ts +40 -0
- package/src/logger/LoggerMessage.ts +151 -0
- package/src/logger/RemoteLogger.ts +32 -0
- package/src/logger/SquizRemoteLogger.ts +157 -0
- package/src/logger/__tests__/LoggerMessage.spec.ts +133 -0
- package/src/logger/__tests__/SquizRemoteLogger.spec.ts +185 -0
- package/src/package.ts +23 -0
- package/src/scheduler/EventBridgeScheduler.ts +177 -0
- package/src/scheduler/Scheduler.ts +32 -0
- package/src/scheduler/__tests__/EventBridgeScheduler.spec.ts +310 -0
- package/src/testing/mock.ts +62 -0
- package/src/typesUtils/DynamoDB.ts +17 -0
- package/src/typesUtils/utilities.ts +11 -0
- package/src/validation/handleValidation.ts +13 -0
- package/src/valueObject/TenantId.ts +27 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,128 @@
|
|
|
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.SquizRemoteLogger = void 0;
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
const RemoteLogger_1 = require("./RemoteLogger");
|
|
15
|
+
const TenantId_1 = require("./../valueObject/TenantId");
|
|
16
|
+
const inversify_1 = require("inversify");
|
|
17
|
+
const Logger_1 = require("./Logger");
|
|
18
|
+
const HttpRequestBuilder_1 = require("./../httpClient/HttpRequestBuilder");
|
|
19
|
+
const LoggerMessage_1 = require("./LoggerMessage");
|
|
20
|
+
const HttpClient_1 = require("./../httpClient/HttpClient");
|
|
21
|
+
const CREATE_LOGS_REQUEST_BODY_DTO_SCHEMA = zod_1.z
|
|
22
|
+
.object({
|
|
23
|
+
level: zod_1.z.enum(['INFO', 'WARNING', 'ERROR']),
|
|
24
|
+
service: zod_1.z.string(),
|
|
25
|
+
timestamp: zod_1.z.string().datetime(),
|
|
26
|
+
host: zod_1.z.string().optional(),
|
|
27
|
+
userid: zod_1.z.string().optional(),
|
|
28
|
+
message: zod_1.z.string().optional(),
|
|
29
|
+
tags: zod_1.z.string().optional(),
|
|
30
|
+
traceid: zod_1.z.string().optional(),
|
|
31
|
+
})
|
|
32
|
+
.array();
|
|
33
|
+
let SquizRemoteLogger = class SquizRemoteLogger {
|
|
34
|
+
config;
|
|
35
|
+
logger;
|
|
36
|
+
httpRequestBuilderFactory;
|
|
37
|
+
constructor(config, logger, httpRequestBuilderFactory) {
|
|
38
|
+
this.config = config;
|
|
39
|
+
this.logger = logger;
|
|
40
|
+
this.httpRequestBuilderFactory = httpRequestBuilderFactory;
|
|
41
|
+
}
|
|
42
|
+
async info(log) {
|
|
43
|
+
await this.callApi(log.tenantId, [
|
|
44
|
+
await this.mapRemoteToRequestBody({
|
|
45
|
+
...log,
|
|
46
|
+
level: RemoteLogger_1.RemoteLogLevel.INFO,
|
|
47
|
+
}),
|
|
48
|
+
]);
|
|
49
|
+
}
|
|
50
|
+
async warn(log) {
|
|
51
|
+
await this.callApi(log.tenantId, [
|
|
52
|
+
await this.mapRemoteToRequestBody({
|
|
53
|
+
...log,
|
|
54
|
+
level: RemoteLogger_1.RemoteLogLevel.WARN,
|
|
55
|
+
}),
|
|
56
|
+
]);
|
|
57
|
+
}
|
|
58
|
+
async error(log) {
|
|
59
|
+
await this.callApi(log.tenantId, [
|
|
60
|
+
await this.mapRemoteToRequestBody({
|
|
61
|
+
...log,
|
|
62
|
+
level: RemoteLogger_1.RemoteLogLevel.ERROR,
|
|
63
|
+
}),
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
async log(logs) {
|
|
67
|
+
const logsGrouped = await logs.reduce(async (acc, log) => {
|
|
68
|
+
const resolvedAcc = await acc;
|
|
69
|
+
const tenantLogs = resolvedAcc[log.tenantId.valueOf()];
|
|
70
|
+
const mappedLog = await this.mapRemoteToRequestBody(log);
|
|
71
|
+
const mappedLogs = tenantLogs
|
|
72
|
+
? [...tenantLogs, mappedLog]
|
|
73
|
+
: [mappedLog];
|
|
74
|
+
return {
|
|
75
|
+
...resolvedAcc,
|
|
76
|
+
[log.tenantId.valueOf()]: mappedLogs,
|
|
77
|
+
};
|
|
78
|
+
}, Promise.resolve({}));
|
|
79
|
+
const entries = Object.entries(logsGrouped);
|
|
80
|
+
const promises = entries.map(async ([tenantId, logs]) => {
|
|
81
|
+
await this.callApi(new TenantId_1.TenantId(tenantId), logs);
|
|
82
|
+
});
|
|
83
|
+
await Promise.all(promises);
|
|
84
|
+
}
|
|
85
|
+
async mapRemoteToRequestBody({ tenantId, ...log }) {
|
|
86
|
+
const config = await this.config();
|
|
87
|
+
const logLevels = new Map([
|
|
88
|
+
[RemoteLogger_1.RemoteLogLevel.INFO, 'INFO'],
|
|
89
|
+
[RemoteLogger_1.RemoteLogLevel.WARN, 'WARNING'],
|
|
90
|
+
[RemoteLogger_1.RemoteLogLevel.ERROR, 'ERROR'],
|
|
91
|
+
]);
|
|
92
|
+
return {
|
|
93
|
+
...log,
|
|
94
|
+
timestamp: log.timestamp
|
|
95
|
+
? log.timestamp.toISOString()
|
|
96
|
+
: new Date().toISOString(),
|
|
97
|
+
level: logLevels.get(log.level),
|
|
98
|
+
service: config.serviceName,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async callApi(tenantId, logs) {
|
|
102
|
+
if (!logs.length) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const logMessage = (0, LoggerMessage_1.createLogMessage)(this, `tenantId: ${tenantId.valueOf()}`);
|
|
106
|
+
this.logger.debug(logMessage(`started receiving config`));
|
|
107
|
+
const config = await this.config();
|
|
108
|
+
this.logger.debug(logMessage(`finished receiving config`));
|
|
109
|
+
const url = new URL(config.createLogsPath + `/${tenantId.valueOf()}`, config.loggerServiceUrl);
|
|
110
|
+
this.logger.debug(logMessage(`started request to: ${url.toString()}`));
|
|
111
|
+
await this.httpRequestBuilderFactory
|
|
112
|
+
.create()
|
|
113
|
+
.url(url)
|
|
114
|
+
.method(HttpClient_1.HttpMethod.POST)
|
|
115
|
+
.applicationJson()
|
|
116
|
+
.authorizationByXApiKey(config.apiKey)
|
|
117
|
+
.body(logs)
|
|
118
|
+
.sendRequest();
|
|
119
|
+
this.logger.debug(logMessage(`finished request to: ${url.toString()}`));
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
exports.SquizRemoteLogger = SquizRemoteLogger;
|
|
123
|
+
exports.SquizRemoteLogger = SquizRemoteLogger = __decorate([
|
|
124
|
+
(0, inversify_1.injectable)(),
|
|
125
|
+
__metadata("design:paramtypes", [Function, Logger_1.Logger,
|
|
126
|
+
HttpRequestBuilder_1.HttpRequestBuilderFactory])
|
|
127
|
+
], SquizRemoteLogger);
|
|
128
|
+
//# sourceMappingURL=SquizRemoteLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SquizRemoteLogger.js","sourceRoot":"","sources":["../../src/logger/SquizRemoteLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * from './valueObject/TenantId';
|
|
2
|
+
export * from './validation/handleValidation';
|
|
3
|
+
export * from './typesUtils/utilities';
|
|
4
|
+
export * from './typesUtils/DynamoDB';
|
|
5
|
+
export * from './testing/mock';
|
|
6
|
+
export * from './scheduler/Scheduler';
|
|
7
|
+
export * from './scheduler/EventBridgeScheduler';
|
|
8
|
+
export * from './logger/SquizRemoteLogger';
|
|
9
|
+
export * from './logger/RemoteLogger';
|
|
10
|
+
export * from './logger/LoggerMessage';
|
|
11
|
+
export * from './logger/Logger';
|
|
12
|
+
export * from './httpClient/HttpRequestBuilder';
|
|
13
|
+
export * from './httpClient/HttpClient';
|
|
14
|
+
export * from './httpClient/FetchHttpClient';
|
|
15
|
+
export * from './exception/DomainException';
|
|
16
|
+
export * from './event/DynamoDBEventMapper';
|
|
17
|
+
export * from './event/DomainEvent';
|
|
18
|
+
export * from './event/AggregateRoot';
|
|
19
|
+
export * from './date/DateManipulator';
|
|
20
|
+
export * from './config/ConfigurationLoader';
|
|
21
|
+
export * from './cloudflare/ImplCloudflareKVHttpService';
|
|
22
|
+
export * from './cloudflare/CloudflareKVHttpService';
|
|
23
|
+
export * from './event/EventHandler';
|
package/dist/package.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./valueObject/TenantId"), exports);
|
|
18
|
+
__exportStar(require("./validation/handleValidation"), exports);
|
|
19
|
+
__exportStar(require("./typesUtils/utilities"), exports);
|
|
20
|
+
__exportStar(require("./typesUtils/DynamoDB"), exports);
|
|
21
|
+
__exportStar(require("./testing/mock"), exports);
|
|
22
|
+
__exportStar(require("./scheduler/Scheduler"), exports);
|
|
23
|
+
__exportStar(require("./scheduler/EventBridgeScheduler"), exports);
|
|
24
|
+
__exportStar(require("./logger/SquizRemoteLogger"), exports);
|
|
25
|
+
__exportStar(require("./logger/RemoteLogger"), exports);
|
|
26
|
+
__exportStar(require("./logger/LoggerMessage"), exports);
|
|
27
|
+
__exportStar(require("./logger/Logger"), exports);
|
|
28
|
+
__exportStar(require("./httpClient/HttpRequestBuilder"), exports);
|
|
29
|
+
__exportStar(require("./httpClient/HttpClient"), exports);
|
|
30
|
+
__exportStar(require("./httpClient/FetchHttpClient"), exports);
|
|
31
|
+
__exportStar(require("./exception/DomainException"), exports);
|
|
32
|
+
__exportStar(require("./event/DynamoDBEventMapper"), exports);
|
|
33
|
+
__exportStar(require("./event/DomainEvent"), exports);
|
|
34
|
+
__exportStar(require("./event/AggregateRoot"), exports);
|
|
35
|
+
__exportStar(require("./date/DateManipulator"), exports);
|
|
36
|
+
__exportStar(require("./config/ConfigurationLoader"), exports);
|
|
37
|
+
__exportStar(require("./cloudflare/ImplCloudflareKVHttpService"), exports);
|
|
38
|
+
__exportStar(require("./cloudflare/CloudflareKVHttpService"), exports);
|
|
39
|
+
__exportStar(require("./event/EventHandler"), exports);
|
|
40
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../src/package.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,gEAA8C;AAC9C,yDAAuC;AACvC,wDAAsC;AACtC,iDAA+B;AAC/B,wDAAsC;AACtC,mEAAiD;AACjD,6DAA2C;AAC3C,wDAAsC;AACtC,yDAAuC;AACvC,kDAAgC;AAChC,kEAAgD;AAChD,0DAAwC;AACxC,+DAA6C;AAC7C,8DAA4C;AAC5C,8DAA4C;AAC5C,sDAAoC;AACpC,wDAAsC;AACtC,yDAAuC;AACvC,+DAA6C;AAC7C,2EAAyD;AACzD,uEAAqD;AACrD,uDAAqC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SchedulerClient } from '@aws-sdk/client-scheduler';
|
|
2
|
+
import { DomainEvent } from '../event/DomainEvent';
|
|
3
|
+
import { ScheduleName, Scheduler, SchedulerOptions } from '../scheduler/Scheduler';
|
|
4
|
+
import { Logger } from '../logger/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
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
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 Logger_1 = require("../logger/Logger");
|
|
18
|
+
const LoggerMessage_1 = require("../logger/LoggerMessage");
|
|
19
|
+
const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
|
|
20
|
+
let EventBridgeScheduler = class EventBridgeScheduler {
|
|
21
|
+
config;
|
|
22
|
+
client;
|
|
23
|
+
logger;
|
|
24
|
+
constructor(config, client, logger) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.client = client;
|
|
27
|
+
this.logger = logger;
|
|
28
|
+
}
|
|
29
|
+
async schedule(domainEvent, options) {
|
|
30
|
+
const logMessage = (0, LoggerMessage_1.createLog)()
|
|
31
|
+
.attachEventName(domainEvent.name)
|
|
32
|
+
.create(this);
|
|
33
|
+
this.logger.debug(logMessage('started scheduling'));
|
|
34
|
+
// I putted here "the schedule attributes" because in that way we ensure that every PutItem command
|
|
35
|
+
// it will create always a new record in dynamoDB
|
|
36
|
+
const putItemCommand = {
|
|
37
|
+
TableName: this.config.eventTableName,
|
|
38
|
+
Item: {
|
|
39
|
+
...(0, DynamoDBEventMapper_1.eventToDynamoDB)(domainEvent),
|
|
40
|
+
// https://docs.aws.amazon.com/scheduler/latest/UserGuide/managing-schedule-context-attributes.html
|
|
41
|
+
...(0, util_dynamodb_1.marshall)({
|
|
42
|
+
eventId: '<aws.scheduler.execution-id>',
|
|
43
|
+
time: '<aws.scheduler.scheduled-time>',
|
|
44
|
+
}),
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
this.logger.debug(...logMessage('finished mapping to PutItemCommandInput'));
|
|
48
|
+
const scheduleName = this.createScheduleName(options.name);
|
|
49
|
+
const scheduleExpression = this.createScheduleExpression(options);
|
|
50
|
+
this.logger.debug(...logMessage(`started calling AWS Scheduler with ScheduleName: ` +
|
|
51
|
+
`${scheduleName}, ScheduleExpression: ${scheduleExpression}`));
|
|
52
|
+
await this._deleteSchedule(scheduleName, logMessage);
|
|
53
|
+
const command = new client_scheduler_1.CreateScheduleCommand({
|
|
54
|
+
Name: scheduleName,
|
|
55
|
+
GroupName: this.config.groupName,
|
|
56
|
+
ScheduleExpression: scheduleExpression,
|
|
57
|
+
ScheduleExpressionTimezone: 'UTC',
|
|
58
|
+
State: 'ENABLED',
|
|
59
|
+
FlexibleTimeWindow: {
|
|
60
|
+
Mode: client_scheduler_1.FlexibleTimeWindowMode.OFF,
|
|
61
|
+
},
|
|
62
|
+
ActionAfterCompletion: 'DELETE',
|
|
63
|
+
Target: {
|
|
64
|
+
Arn: 'arn:aws:scheduler:::aws-sdk:dynamodb:putItem',
|
|
65
|
+
Input: JSON.stringify(putItemCommand),
|
|
66
|
+
RoleArn: this.config.schedulerRole,
|
|
67
|
+
},
|
|
68
|
+
ClientToken: (0, crypto_1.randomUUID)(),
|
|
69
|
+
});
|
|
70
|
+
await this.client.send(command);
|
|
71
|
+
this.logger.debug(...logMessage('finished calling AWS Scheduler'));
|
|
72
|
+
}
|
|
73
|
+
createScheduleName(scheduleName) {
|
|
74
|
+
const truncateString = (str, maxLength) => str.length > maxLength ? str.substring(0, maxLength) : str;
|
|
75
|
+
const maxLengthOfScheduleName = 64;
|
|
76
|
+
return truncateString(scheduleName, maxLengthOfScheduleName);
|
|
77
|
+
}
|
|
78
|
+
createScheduleExpression(options) {
|
|
79
|
+
switch (options.type) {
|
|
80
|
+
case 'at': {
|
|
81
|
+
const dateString = options.value.toISOString().replace(/\..*/, '');
|
|
82
|
+
return `at(${dateString})`;
|
|
83
|
+
}
|
|
84
|
+
case 'cron':
|
|
85
|
+
return `cron(${options.value})`;
|
|
86
|
+
case 'rate':
|
|
87
|
+
return `rate(${options.value} ${options.unit})`;
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Passed unresolved ScheduleOption type.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async deleteSchedule(scheduleName) {
|
|
93
|
+
const logMessage = (0, LoggerMessage_1.createLog)()
|
|
94
|
+
.attachMetadata({ scheduleName })
|
|
95
|
+
.create(this);
|
|
96
|
+
return this._deleteSchedule(scheduleName, logMessage);
|
|
97
|
+
}
|
|
98
|
+
async _deleteSchedule(scheduleName, logMessage) {
|
|
99
|
+
const trimmedScheduleName = this.createScheduleName(scheduleName);
|
|
100
|
+
try {
|
|
101
|
+
this.logger.debug(...logMessage(`started getting schedule, scheduleName: ${trimmedScheduleName}`));
|
|
102
|
+
const getCommand = new client_scheduler_1.GetScheduleCommand({
|
|
103
|
+
GroupName: this.config.groupName,
|
|
104
|
+
Name: trimmedScheduleName,
|
|
105
|
+
});
|
|
106
|
+
await this.client.send(getCommand);
|
|
107
|
+
this.logger.debug(logMessage(`finished getting schedule, scheduleName: ${trimmedScheduleName}`));
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
if (e instanceof client_scheduler_1.ResourceNotFoundException) {
|
|
111
|
+
this.logger.debug(...logMessage(`the schedule does not exist, skipped deleting existing schedule, scheduleName: ${trimmedScheduleName}`));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
throw e;
|
|
115
|
+
}
|
|
116
|
+
this.logger.debug(...logMessage('started deleting schedule'));
|
|
117
|
+
const deleteCommand = new client_scheduler_1.DeleteScheduleCommand({
|
|
118
|
+
GroupName: this.config.groupName,
|
|
119
|
+
Name: trimmedScheduleName,
|
|
120
|
+
});
|
|
121
|
+
await this.client.send(deleteCommand);
|
|
122
|
+
this.logger.debug(...logMessage('finished deleting schedule'));
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
exports.EventBridgeScheduler = EventBridgeScheduler;
|
|
126
|
+
exports.EventBridgeScheduler = EventBridgeScheduler = __decorate([
|
|
127
|
+
(0, inversify_1.injectable)(),
|
|
128
|
+
__metadata("design:paramtypes", [Object, client_scheduler_1.SchedulerClient,
|
|
129
|
+
Logger_1.Logger])
|
|
130
|
+
], EventBridgeScheduler);
|
|
131
|
+
//# sourceMappingURL=EventBridgeScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventBridgeScheduler.js","sourceRoot":"","sources":["../../src/scheduler/EventBridgeScheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { HttpClient } from '../httpClient/HttpClient';
|
|
2
|
+
import { Logger } from '../logger/Logger';
|
|
3
|
+
import { RemoteLogger } from '../logger/RemoteLogger';
|
|
4
|
+
import { SchedulerClient } from '@aws-sdk/client-scheduler';
|
|
5
|
+
import { Scheduler } from '../scheduler/Scheduler';
|
|
6
|
+
export type FetchMock = jest.Mock<ReturnType<typeof fetch>, Parameters<typeof fetch>>;
|
|
7
|
+
export declare const createResponse: <T>(status: number, body?: T, headers?: Record<string, string>) => Response;
|
|
8
|
+
export declare const createHttpClientMock: () => HttpClient;
|
|
9
|
+
export declare const createLoggerMock: () => Logger;
|
|
10
|
+
export declare const createRemoteLoggerMock: () => RemoteLogger;
|
|
11
|
+
export declare const createSchedulerClientMock: () => SchedulerClient;
|
|
12
|
+
export declare const createSchedulerMock: () => Scheduler;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSchedulerMock = exports.createSchedulerClientMock = exports.createRemoteLoggerMock = exports.createLoggerMock = exports.createHttpClientMock = exports.createResponse = void 0;
|
|
4
|
+
const createResponse = (status, body, headers) => ({
|
|
5
|
+
status,
|
|
6
|
+
ok: status < 400,
|
|
7
|
+
headers: new Map(Object.entries(headers ?? {})),
|
|
8
|
+
json: async () => body,
|
|
9
|
+
text: async () => JSON.stringify(body),
|
|
10
|
+
});
|
|
11
|
+
exports.createResponse = createResponse;
|
|
12
|
+
const createHttpClientMock = () => {
|
|
13
|
+
return {
|
|
14
|
+
sendRequest: jest.fn(),
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
exports.createHttpClientMock = createHttpClientMock;
|
|
18
|
+
const createLoggerMock = () => {
|
|
19
|
+
return {
|
|
20
|
+
debug: jest.fn(),
|
|
21
|
+
error: jest.fn(),
|
|
22
|
+
info: jest.fn(),
|
|
23
|
+
log: jest.fn(),
|
|
24
|
+
verbose: jest.fn(),
|
|
25
|
+
warn: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.createLoggerMock = createLoggerMock;
|
|
29
|
+
const createRemoteLoggerMock = () => {
|
|
30
|
+
return {
|
|
31
|
+
log: jest.fn(),
|
|
32
|
+
info: jest.fn(),
|
|
33
|
+
warn: jest.fn(),
|
|
34
|
+
error: jest.fn(),
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
exports.createRemoteLoggerMock = createRemoteLoggerMock;
|
|
38
|
+
const createSchedulerClientMock = () => {
|
|
39
|
+
return {
|
|
40
|
+
send: jest.fn(),
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
exports.createSchedulerClientMock = createSchedulerClientMock;
|
|
44
|
+
const createSchedulerMock = () => {
|
|
45
|
+
return {
|
|
46
|
+
schedule: jest.fn(),
|
|
47
|
+
deleteSchedule: jest.fn(),
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
exports.createSchedulerMock = createSchedulerMock;
|
|
51
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":";;;AAWO,MAAM,cAAc,GAAG,CAC5B,MAAc,EACd,IAAQ,EACR,OAAgC,EACtB,EAAE,CACZ,CAAC;IACC,MAAM;IACN,EAAE,EAAE,MAAM,GAAG,GAAG;IAChB,OAAO,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAuB;IACrE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IACtB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;CACvC,CAAa,CAAC;AAXJ,QAAA,cAAc,kBAWV;AAEV,MAAM,oBAAoB,GAAG,GAAe,EAAE;IACnD,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;KACvB,CAAC;AACJ,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B;AAEK,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACd,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;QAClB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;KAChB,CAAC;AACJ,CAAC,CAAC;AATW,QAAA,gBAAgB,oBAS3B;AAEK,MAAM,sBAAsB,GAAG,GAAiB,EAAE;IACvD,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACf,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,sBAAsB,0BAOjC;AAEK,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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamoDB.js","sourceRoot":"","sources":["../../src/typesUtils/DynamoDB.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type MethodKeysOrNever<T> = {
|
|
2
|
+
[K in keyof T]: T[K] extends Function ? K : never;
|
|
3
|
+
};
|
|
4
|
+
export type MethodKeys<T> = MethodKeysOrNever<T>[keyof T];
|
|
5
|
+
export type ClassFields<T> = Omit<T, Exclude<MethodKeys<T>, undefined>>;
|
|
6
|
+
export type OverwriteValueOf<TInstance, DValueOfReturn> = Omit<TInstance, 'valueOf'> & {
|
|
7
|
+
valueOf(): DValueOfReturn;
|
|
8
|
+
};
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../src/typesUtils/utilities.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleValidation = handleValidation;
|
|
4
|
+
const DomainException_1 = require("../exception/DomainException");
|
|
5
|
+
function handleValidation(safeParseResult, errorMessage = 'Validation Failed') {
|
|
6
|
+
if (!safeParseResult.success) {
|
|
7
|
+
throw new DomainException_1.ValidationException(errorMessage, safeParseResult.error.issues);
|
|
8
|
+
}
|
|
9
|
+
return safeParseResult.data;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=handleValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handleValidation.js","sourceRoot":"","sources":["../../src/validation/handleValidation.ts"],"names":[],"mappings":";;AAGA,4CASC;AAXD,kEAAmE;AAEnE,SAAgB,gBAAgB,CAC9B,eAA0C,EAC1C,YAAY,GAAG,mBAAmB;IAElC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,qCAAmB,CAAC,YAAY,EAAE,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,eAAe,CAAC,IAAI,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const TENANT_ID_SCHEMA: z.ZodString;
|
|
3
|
+
export type TenantIdValue = z.infer<typeof TENANT_ID_SCHEMA>;
|
|
4
|
+
export declare class TenantId {
|
|
5
|
+
private readonly value;
|
|
6
|
+
static parse(data: unknown): TenantId;
|
|
7
|
+
constructor(value: TenantIdValue);
|
|
8
|
+
valueOf(): TenantIdValue;
|
|
9
|
+
equals(tenantId: TenantId): boolean;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TenantId = exports.TENANT_ID_SCHEMA = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const handleValidation_1 = require("../validation/handleValidation");
|
|
6
|
+
exports.TENANT_ID_SCHEMA = zod_1.z.string().min(1);
|
|
7
|
+
class TenantId {
|
|
8
|
+
value;
|
|
9
|
+
static parse(data) {
|
|
10
|
+
return new TenantId((0, handleValidation_1.handleValidation)(exports.TENANT_ID_SCHEMA.safeParse(data), 'The validation of tenant id failed'));
|
|
11
|
+
}
|
|
12
|
+
constructor(value) {
|
|
13
|
+
this.value = value;
|
|
14
|
+
}
|
|
15
|
+
valueOf() {
|
|
16
|
+
return this.value;
|
|
17
|
+
}
|
|
18
|
+
equals(tenantId) {
|
|
19
|
+
return this.value === tenantId.value;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.TenantId = TenantId;
|
|
23
|
+
//# sourceMappingURL=TenantId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TenantId.js","sourceRoot":"","sources":["../../src/valueObject/TenantId.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,qEAAkE;AAErD,QAAA,gBAAgB,GAAG,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAIlD,MAAa,QAAQ;IAUU;IAT7B,MAAM,CAAC,KAAK,CAAC,IAAa;QACxB,OAAO,IAAI,QAAQ,CACjB,IAAA,mCAAgB,EACd,wBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,EAChC,oCAAoC,CACrC,CACF,CAAC;IACJ,CAAC;IAED,YAA6B,KAAoB;QAApB,UAAK,GAAL,KAAK,CAAe;IAAG,CAAC;IAErD,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC;IACvC,CAAC;CACF;AAnBD,4BAmBC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@squiz/optimization-utils",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "dist/package.js",
|
|
6
|
+
"types": "dist/package.d.ts",
|
|
7
|
+
"repository": "https://gitlab.squiz.net/optimization/optimization-utils",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "rm -rf dist && tsc",
|
|
10
|
+
"build:check": "tsc --noEmit"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"node-fetch-commonjs": "^3.3.2",
|
|
14
|
+
"dotenv": "^16.4.5",
|
|
15
|
+
"@aws-sdk/client-dynamodb": "^3.614.0",
|
|
16
|
+
"@aws-sdk/client-scheduler": "^3.614.0",
|
|
17
|
+
"reflect-metadata": "^0.2.2",
|
|
18
|
+
"inversify": "^6.0.2",
|
|
19
|
+
"zod": "^3.23.8",
|
|
20
|
+
"aws-xray-sdk": "^3.6.0",
|
|
21
|
+
"winston": "^3.13.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {},
|
|
24
|
+
"author": "",
|
|
25
|
+
"license": "ISC"
|
|
26
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
}
|