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 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 != null ? uuid : crypto.randomUUID());
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
- var _a, _b;
274
- const allowed = (_a = opts.allowedVersions) != null ? _a : [1, 2, 3, 4, 5, 6, 7, 8];
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: (_a = this.errorMessage) != null ? _a : void 0,
396
- publishedAt: (_c = (_b = this.publishedAt) == null ? void 0 : _b.value) != null ? _c : void 0,
397
- lastAttempt: (_e = (_d = this.lastAttempt) == null ? void 0 : _d.value) != null ? _e : void 0,
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
- (_a = data.error_message) != null ? _a : void 0,
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
- var _a;
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
- var _a;
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
- (_a = this.logger) == null ? void 0 : _a.error("TEMPLATE_NOT_FOUND", `${err.type}`);
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 = (_c = (_b = tmpl.languages[code]) != null ? _b : tmpl.languages[base]) != null ? _c : this.getDefaultMessage(lang);
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
- var _a;
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
- var _a;
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
- var _a;
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((_a = process.env.DB_PORT) != null ? _a : 3306),
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 (_a = toUtcDateTimeString(s)) != null ? _a : s;
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
- var _a, _b;
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 != null ? 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
- var _a, _b;
1147
- const raw = (_b = (_a = req.headers["accept-language"]) != null ? _a : req.headers["Accept-Language"]) != null ? _b : "es";
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
- (_a = e.publishedAt) == null ? void 0 : _a.value,
1175
- (_b = e.lastAttempt) == null ? void 0 : _b.value,
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
- var _a, _b;
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: (_a = data.rates) != null ? _a : [],
1259
- date: DateTime.create((_b = data.date) != null ? _b : "")
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,