wsp-ms-core 1.0.68 → 1.0.69
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/index.cjs +178 -40
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +63 -1
- package/dist/index.d.ts +63 -1
- package/dist/index.js +176 -40
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -42,11 +42,13 @@ __export(src_exports, {
|
|
|
42
42
|
ErrorManager: () => ErrorManager,
|
|
43
43
|
EventBus: () => EventBus,
|
|
44
44
|
EventBusMysqlRepository: () => EventBusMysqlRepository,
|
|
45
|
+
EventManager: () => EventManager,
|
|
45
46
|
ExchangeRates: () => ExchangeRates,
|
|
46
47
|
FatalError: () => FatalError,
|
|
47
48
|
HttpHealthCheckController: () => HttpHealthCheckController,
|
|
48
49
|
HttpNotFoundController: () => HttpNotFoundController,
|
|
49
50
|
InternalError: () => InternalError,
|
|
51
|
+
KafkaManager: () => KafkaManager,
|
|
50
52
|
Language: () => Language,
|
|
51
53
|
MysqlConnection: () => MysqlConnection,
|
|
52
54
|
MysqlConnector: () => MysqlConnector,
|
|
@@ -257,7 +259,7 @@ var _UUID = class _UUID extends ValueObject {
|
|
|
257
259
|
return { value: this.value };
|
|
258
260
|
}
|
|
259
261
|
static create(uuid) {
|
|
260
|
-
return new _UUID(uuid
|
|
262
|
+
return new _UUID(uuid ?? crypto.randomUUID());
|
|
261
263
|
}
|
|
262
264
|
static version(uuid) {
|
|
263
265
|
const m = /^[0-9a-f]{8}-[0-9a-f]{4}-([1-8])[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.exec(uuid);
|
|
@@ -270,9 +272,8 @@ var _UUID = class _UUID extends ValueObject {
|
|
|
270
272
|
return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(uuid);
|
|
271
273
|
}
|
|
272
274
|
static isValid(uuid, opts = {}) {
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
const allowNil = (_b = opts.allowNil) != null ? _b : false;
|
|
275
|
+
const allowed = opts.allowedVersions ?? [1, 2, 3, 4, 5, 6, 7, 8];
|
|
276
|
+
const allowNil = opts.allowNil ?? false;
|
|
276
277
|
if (allowNil && _UUID.isNil(uuid))
|
|
277
278
|
return true;
|
|
278
279
|
if (!_UUID.isRFCStyle(uuid))
|
|
@@ -381,7 +382,6 @@ var DomainEvent = class _DomainEvent {
|
|
|
381
382
|
this._errorMessage = error;
|
|
382
383
|
}
|
|
383
384
|
toPrimitives() {
|
|
384
|
-
var _a, _b, _c, _d, _e;
|
|
385
385
|
return {
|
|
386
386
|
eventUuid: this.eventUuid.value,
|
|
387
387
|
eventType: this.eventType,
|
|
@@ -392,14 +392,13 @@ var DomainEvent = class _DomainEvent {
|
|
|
392
392
|
payload: this.payload,
|
|
393
393
|
status: this.status.value,
|
|
394
394
|
attempts: this.attempts,
|
|
395
|
-
errorMessage:
|
|
396
|
-
publishedAt:
|
|
397
|
-
lastAttempt:
|
|
395
|
+
errorMessage: this.errorMessage ?? void 0,
|
|
396
|
+
publishedAt: this.publishedAt?.value ?? void 0,
|
|
397
|
+
lastAttempt: this.lastAttempt?.value ?? void 0,
|
|
398
398
|
createdAt: this.createdAt.value
|
|
399
399
|
};
|
|
400
400
|
}
|
|
401
401
|
static reconstitute(data) {
|
|
402
|
-
var _a;
|
|
403
402
|
return new _DomainEvent(
|
|
404
403
|
UUID.create(data.event_uuid),
|
|
405
404
|
String(data.event_type),
|
|
@@ -410,7 +409,7 @@ var DomainEvent = class _DomainEvent {
|
|
|
410
409
|
String(data.payload),
|
|
411
410
|
DomainEventStatus.create(data.status),
|
|
412
411
|
Number(data.attempts),
|
|
413
|
-
|
|
412
|
+
data.error_message ?? void 0,
|
|
414
413
|
data.published_at ? DateTime.create(data.published_at) : void 0,
|
|
415
414
|
data.last_attempt ? DateTime.create(data.last_attempt) : void 0,
|
|
416
415
|
data.created_at ? DateTime.create(data.created_at) : void 0
|
|
@@ -649,38 +648,33 @@ var _ErrorManager = class _ErrorManager {
|
|
|
649
648
|
return _ErrorManager.DEFAULT_MESSAGES[lang.value] || _ErrorManager.DEFAULT_MESSAGES[lang.base()] || "error";
|
|
650
649
|
}
|
|
651
650
|
onFatal(err, lang) {
|
|
652
|
-
|
|
653
|
-
(_a = this.logger) == null ? void 0 : _a.fatal(err.type, err.message);
|
|
651
|
+
this.logger?.fatal(err.type, err.message);
|
|
654
652
|
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
655
653
|
}
|
|
656
654
|
onInternal(err, lang) {
|
|
657
|
-
|
|
658
|
-
(_a = this.logger) == null ? void 0 : _a.error(err.type, err.message);
|
|
655
|
+
this.logger?.error(err.type, err.message);
|
|
659
656
|
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
660
657
|
}
|
|
661
658
|
onUsage(err, lang) {
|
|
662
|
-
var _a, _b, _c;
|
|
663
659
|
const tmpl = _ErrorManager.TEMPLATES.get(err.type);
|
|
664
660
|
if (!tmpl) {
|
|
665
|
-
|
|
661
|
+
this.logger?.error("TEMPLATE_NOT_FOUND", `${err.type}`);
|
|
666
662
|
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
667
663
|
}
|
|
668
664
|
const code = lang.value;
|
|
669
665
|
const base = lang.base();
|
|
670
|
-
const rawMsg =
|
|
666
|
+
const rawMsg = tmpl.languages[code] ?? tmpl.languages[base] ?? this.getDefaultMessage(lang);
|
|
671
667
|
return {
|
|
672
668
|
status: 400,
|
|
673
669
|
message: StringVars.parse(rawMsg, err.vars)
|
|
674
670
|
};
|
|
675
671
|
}
|
|
676
672
|
onUnknown(err, lang) {
|
|
677
|
-
|
|
678
|
-
(_a = this.logger) == null ? void 0 : _a.error("UNKNOWN_ERROR", err.message);
|
|
673
|
+
this.logger?.error("UNKNOWN_ERROR", err.message);
|
|
679
674
|
return { status: "ERROR", message: this.getDefaultMessage(lang) };
|
|
680
675
|
}
|
|
681
676
|
handle(err, lang) {
|
|
682
|
-
|
|
683
|
-
if (["local", "dev"].includes((_a = process.env.ENVIRONMENT) != null ? _a : "")) {
|
|
677
|
+
if (["local", "dev"].includes(process.env.ENVIRONMENT ?? "")) {
|
|
684
678
|
console.log(err);
|
|
685
679
|
}
|
|
686
680
|
if (err instanceof FatalError) {
|
|
@@ -918,14 +912,70 @@ var BasicUnitOfWorkFactory = class {
|
|
|
918
912
|
}
|
|
919
913
|
};
|
|
920
914
|
|
|
915
|
+
// src/infrastructure/contracts/EventManager.ts
|
|
916
|
+
var EventManager = class {
|
|
917
|
+
constructor(connection) {
|
|
918
|
+
this._connection = connection;
|
|
919
|
+
this._topics = [];
|
|
920
|
+
this._callbackList = {};
|
|
921
|
+
this._onStart = null;
|
|
922
|
+
this._onConnected = null;
|
|
923
|
+
this._onSubscribe = null;
|
|
924
|
+
this._onMessage = null;
|
|
925
|
+
this._onError = null;
|
|
926
|
+
this._onCrash = null;
|
|
927
|
+
this._onReconnect = null;
|
|
928
|
+
}
|
|
929
|
+
async execRoute(topic, message) {
|
|
930
|
+
if (this._callbackList[topic]) {
|
|
931
|
+
await this._callbackList[topic](message);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
async execCallback(callback, data) {
|
|
935
|
+
if (callback) {
|
|
936
|
+
await callback(data);
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
route(topic, callback) {
|
|
940
|
+
this._topics.push(topic);
|
|
941
|
+
this._callbackList[topic] = callback;
|
|
942
|
+
}
|
|
943
|
+
onStart(callback) {
|
|
944
|
+
this._onStart = callback;
|
|
945
|
+
}
|
|
946
|
+
onConnected(callback) {
|
|
947
|
+
this._onConnected = callback;
|
|
948
|
+
}
|
|
949
|
+
onSubscribe(callback) {
|
|
950
|
+
this._onSubscribe = callback;
|
|
951
|
+
}
|
|
952
|
+
onMessage(callback) {
|
|
953
|
+
this._onMessage = callback;
|
|
954
|
+
}
|
|
955
|
+
onError(callback) {
|
|
956
|
+
this._onError = callback;
|
|
957
|
+
}
|
|
958
|
+
onCrash(callback) {
|
|
959
|
+
this._onCrash = callback;
|
|
960
|
+
}
|
|
961
|
+
onReconnect(callback) {
|
|
962
|
+
this._onReconnect = callback;
|
|
963
|
+
}
|
|
964
|
+
get topics() {
|
|
965
|
+
return this._topics;
|
|
966
|
+
}
|
|
967
|
+
get callbackList() {
|
|
968
|
+
return this._callbackList;
|
|
969
|
+
}
|
|
970
|
+
};
|
|
971
|
+
|
|
921
972
|
// src/infrastructure/mysql/Mysql.ts
|
|
922
973
|
var import_promise = require("mysql2/promise");
|
|
923
974
|
var _MysqlConnector = class _MysqlConnector {
|
|
924
975
|
constructor(pool) {
|
|
925
|
-
|
|
926
|
-
this._pool = pool != null ? pool : (0, import_promise.createPool)({
|
|
976
|
+
this._pool = pool ?? (0, import_promise.createPool)({
|
|
927
977
|
host: process.env.DB_HOST,
|
|
928
|
-
port: Number(
|
|
978
|
+
port: Number(process.env.DB_PORT ?? 3306),
|
|
929
979
|
user: process.env.DB_USER,
|
|
930
980
|
password: process.env.DB_PASSWORD,
|
|
931
981
|
database: process.env.DB_DATABASE,
|
|
@@ -1038,7 +1088,6 @@ function toUtcDateTimeString(raw) {
|
|
|
1038
1088
|
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`;
|
|
1039
1089
|
}
|
|
1040
1090
|
function coerceScalar(key, v) {
|
|
1041
|
-
var _a;
|
|
1042
1091
|
if (v == null)
|
|
1043
1092
|
return void 0;
|
|
1044
1093
|
if (typeof v !== "string")
|
|
@@ -1059,7 +1108,7 @@ function coerceScalar(key, v) {
|
|
|
1059
1108
|
return n;
|
|
1060
1109
|
}
|
|
1061
1110
|
if (DATE_KEY_RE.test(key)) {
|
|
1062
|
-
return
|
|
1111
|
+
return toUtcDateTimeString(s) ?? s;
|
|
1063
1112
|
}
|
|
1064
1113
|
return s;
|
|
1065
1114
|
}
|
|
@@ -1086,8 +1135,7 @@ function hasHeader(headers, name) {
|
|
|
1086
1135
|
}
|
|
1087
1136
|
function adaptExpressRoute(Controller) {
|
|
1088
1137
|
return async (req, res, next) => {
|
|
1089
|
-
|
|
1090
|
-
const rawLangHeader = (_b = (_a = req.headers["accept-language"]) != null ? _a : req.headers["Accept-Language"]) != null ? _b : "es";
|
|
1138
|
+
const rawLangHeader = req.headers["accept-language"] ?? req.headers["Accept-Language"] ?? "es";
|
|
1091
1139
|
const rawLang = Array.isArray(rawLangHeader) ? rawLangHeader[0] : rawLangHeader || "";
|
|
1092
1140
|
const lang = rawLang.split(",")[0].split(";")[0].trim().toLowerCase();
|
|
1093
1141
|
const httpRequest = {
|
|
@@ -1135,7 +1183,7 @@ function adaptExpressRoute(Controller) {
|
|
|
1135
1183
|
res.status(statusCode).send(body);
|
|
1136
1184
|
return;
|
|
1137
1185
|
}
|
|
1138
|
-
res.status(statusCode).json(body
|
|
1186
|
+
res.status(statusCode).json(body ?? {});
|
|
1139
1187
|
} catch (err) {
|
|
1140
1188
|
next(err);
|
|
1141
1189
|
}
|
|
@@ -1143,9 +1191,8 @@ function adaptExpressRoute(Controller) {
|
|
|
1143
1191
|
}
|
|
1144
1192
|
function adaptExpressErrorHandler(errorManager) {
|
|
1145
1193
|
return (err, req, res, next) => {
|
|
1146
|
-
|
|
1147
|
-
const
|
|
1148
|
-
const rawLang = Array.isArray(raw) ? raw[0] : raw != null ? raw : "";
|
|
1194
|
+
const raw = req.headers["accept-language"] ?? req.headers["Accept-Language"] ?? "es";
|
|
1195
|
+
const rawLang = Array.isArray(raw) ? raw[0] : raw ?? "";
|
|
1149
1196
|
const langCode = rawLang.split(",")[0].split(";")[0].trim().toLowerCase();
|
|
1150
1197
|
const result = errorManager.handle(err, Language.create(langCode));
|
|
1151
1198
|
const statusCode = typeof result.status === "number" ? result.status : 500;
|
|
@@ -1159,7 +1206,6 @@ var EventBusMysqlRepository = class {
|
|
|
1159
1206
|
this.connection = connection;
|
|
1160
1207
|
}
|
|
1161
1208
|
eventToRowValues(e) {
|
|
1162
|
-
var _a, _b;
|
|
1163
1209
|
return [
|
|
1164
1210
|
e.eventUuid.value,
|
|
1165
1211
|
e.eventType,
|
|
@@ -1171,8 +1217,8 @@ var EventBusMysqlRepository = class {
|
|
|
1171
1217
|
e.status.value,
|
|
1172
1218
|
e.attempts,
|
|
1173
1219
|
e.errorMessage,
|
|
1174
|
-
|
|
1175
|
-
|
|
1220
|
+
e.publishedAt?.value,
|
|
1221
|
+
e.lastAttempt?.value,
|
|
1176
1222
|
e.createdAt.value
|
|
1177
1223
|
];
|
|
1178
1224
|
}
|
|
@@ -1186,8 +1232,7 @@ var EventBusMysqlRepository = class {
|
|
|
1186
1232
|
);
|
|
1187
1233
|
}
|
|
1188
1234
|
async update(event) {
|
|
1189
|
-
|
|
1190
|
-
const values = [event.status.value, event.attempts, event.errorMessage, (_a = event.publishedAt) == null ? void 0 : _a.value, (_b = event.lastAttempt) == null ? void 0 : _b.value, event.eventUuid.value];
|
|
1235
|
+
const values = [event.status.value, event.attempts, event.errorMessage, event.publishedAt?.value, event.lastAttempt?.value, event.eventUuid.value];
|
|
1191
1236
|
await this.connection.query(
|
|
1192
1237
|
`UPDATE events_outbox
|
|
1193
1238
|
SET status = ?,
|
|
@@ -1208,6 +1253,98 @@ var EventBusMysqlRepository = class {
|
|
|
1208
1253
|
}
|
|
1209
1254
|
};
|
|
1210
1255
|
|
|
1256
|
+
// src/infrastructure/kafka/KafkaManager.ts
|
|
1257
|
+
var import_kafkajs = require("kafkajs");
|
|
1258
|
+
var KafkaManager = class extends EventManager {
|
|
1259
|
+
constructor(connection) {
|
|
1260
|
+
super(connection);
|
|
1261
|
+
this.kafka = new import_kafkajs.Kafka({
|
|
1262
|
+
brokers: this._connection.brokers,
|
|
1263
|
+
ssl: true,
|
|
1264
|
+
sasl: {
|
|
1265
|
+
mechanism: "scram-sha-256",
|
|
1266
|
+
username: this._connection.userName,
|
|
1267
|
+
password: this._connection.password
|
|
1268
|
+
},
|
|
1269
|
+
logLevel: import_kafkajs.logLevel.ERROR
|
|
1270
|
+
});
|
|
1271
|
+
this.consumer = this.kafka.consumer({ groupId: process.env.KAFKA_GROUP || "default" });
|
|
1272
|
+
this.producer = this.kafka.producer();
|
|
1273
|
+
}
|
|
1274
|
+
async run(autocommit) {
|
|
1275
|
+
const __run = async () => {
|
|
1276
|
+
await this.execCallback(this._onStart, { message: `--- ${this.constructor.name} started ---` });
|
|
1277
|
+
await this.consumer.connect();
|
|
1278
|
+
await this.execCallback(this._onConnected, { message: `--- ${this.constructor.name} connected to ${this._connection.brokers} ---` });
|
|
1279
|
+
for (let topic of this._topics) {
|
|
1280
|
+
try {
|
|
1281
|
+
await this.consumer.subscribe({ topic, fromBeginning: true });
|
|
1282
|
+
await this.execCallback(this._onSubscribe, { message: `--- ${this.constructor.name} subscribed to ${topic} ---` });
|
|
1283
|
+
} catch (error) {
|
|
1284
|
+
await this.execCallback(this._onConnected, { message: `Error on subscribe to kafka topic: ${topic}` });
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
await this.consumer.run({
|
|
1288
|
+
autoCommit: autocommit,
|
|
1289
|
+
// @ts-ignore
|
|
1290
|
+
eachMessage: async ({ topic, partition, message, heartbeat }) => {
|
|
1291
|
+
try {
|
|
1292
|
+
await this.execCallback(this._onMessage, `[New message detected for ${topic}]: ${message.value?.toString()}`);
|
|
1293
|
+
const evt = JSON.parse(String(message.value?.toString()));
|
|
1294
|
+
await this.execRoute(topic, evt);
|
|
1295
|
+
const next = (BigInt(message.offset) + 1n).toString();
|
|
1296
|
+
await this.consumer.commitOffsets([{ topic, partition, offset: next }]);
|
|
1297
|
+
await heartbeat();
|
|
1298
|
+
} catch (error) {
|
|
1299
|
+
await this.execCallback(this._onError, error);
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
});
|
|
1303
|
+
};
|
|
1304
|
+
try {
|
|
1305
|
+
await __run();
|
|
1306
|
+
} catch (error) {
|
|
1307
|
+
await this.execCallback(this._onError, new InternalError(ErrorManager.APP_ERRORS.PROCESS, error.toString()));
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
async send(message) {
|
|
1311
|
+
if (!message.producer) {
|
|
1312
|
+
message.producer = process.env.NAME && process.env.ENVIRONMENT ? `${process.env.NAME}-${process.env.ENVIRONMENT}` : "unknown";
|
|
1313
|
+
}
|
|
1314
|
+
if (!message.date) {
|
|
1315
|
+
message.date = DateTime.now().value;
|
|
1316
|
+
}
|
|
1317
|
+
try {
|
|
1318
|
+
if (!this.producer) {
|
|
1319
|
+
throw new InternalError(ErrorManager.APP_ERRORS.PROCESS, "Producer not initialized");
|
|
1320
|
+
}
|
|
1321
|
+
await this.producer.connect();
|
|
1322
|
+
await this.producer.send({
|
|
1323
|
+
topic: message.topic,
|
|
1324
|
+
messages: [{ value: JSON.stringify({ producer: message.producer, data: message }) }]
|
|
1325
|
+
});
|
|
1326
|
+
await this.producer.disconnect();
|
|
1327
|
+
} catch (error) {
|
|
1328
|
+
await this.execCallback(this._onError, new InternalError(ErrorManager.APP_ERRORS.PROCESS, error.toString()));
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
async start(autocommit = false) {
|
|
1332
|
+
this.consumer.on(this.consumer.events.CRASH, async (error) => {
|
|
1333
|
+
await this.execCallback(this._onError, new InternalError(ErrorManager.APP_ERRORS.PROCESS, error.payload.error.stack));
|
|
1334
|
+
});
|
|
1335
|
+
await this.run(autocommit);
|
|
1336
|
+
}
|
|
1337
|
+
async pause() {
|
|
1338
|
+
}
|
|
1339
|
+
async restart() {
|
|
1340
|
+
await this.consumer.stop();
|
|
1341
|
+
await this.start();
|
|
1342
|
+
}
|
|
1343
|
+
async stop() {
|
|
1344
|
+
await this.consumer.stop();
|
|
1345
|
+
}
|
|
1346
|
+
};
|
|
1347
|
+
|
|
1211
1348
|
// src/utils/ExchangeRates.ts
|
|
1212
1349
|
var ExchangeRates = class _ExchangeRates extends BaseObject {
|
|
1213
1350
|
constructor(props) {
|
|
@@ -1252,11 +1389,10 @@ var ExchangeRates = class _ExchangeRates extends BaseObject {
|
|
|
1252
1389
|
return new _ExchangeRates(props);
|
|
1253
1390
|
}
|
|
1254
1391
|
static createFromPrimitives(data) {
|
|
1255
|
-
var _a, _b;
|
|
1256
1392
|
return _ExchangeRates.create({
|
|
1257
1393
|
base: Currency.create(data.base),
|
|
1258
|
-
rates:
|
|
1259
|
-
date: DateTime.create(
|
|
1394
|
+
rates: data.rates ?? [],
|
|
1395
|
+
date: DateTime.create(data.date ?? "")
|
|
1260
1396
|
});
|
|
1261
1397
|
}
|
|
1262
1398
|
};
|
|
@@ -1275,11 +1411,13 @@ var ExchangeRates = class _ExchangeRates extends BaseObject {
|
|
|
1275
1411
|
ErrorManager,
|
|
1276
1412
|
EventBus,
|
|
1277
1413
|
EventBusMysqlRepository,
|
|
1414
|
+
EventManager,
|
|
1278
1415
|
ExchangeRates,
|
|
1279
1416
|
FatalError,
|
|
1280
1417
|
HttpHealthCheckController,
|
|
1281
1418
|
HttpNotFoundController,
|
|
1282
1419
|
InternalError,
|
|
1420
|
+
KafkaManager,
|
|
1283
1421
|
Language,
|
|
1284
1422
|
MysqlConnection,
|
|
1285
1423
|
MysqlConnector,
|