@xeno-js/core 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1366,8 +1366,7 @@ var init_sentry_logger_factory = __esm({
1366
1366
  dsn: sentryConfig.dsn,
1367
1367
  environment: env,
1368
1368
  tracesSampleRate: env === "production" ? 0.1 : 1,
1369
- sendDefaultPii: false,
1370
- integrations: [new Sentry.Integrations.Http({ tracing: true })],
1369
+ integrations: [Sentry.httpIntegration()],
1371
1370
  beforeSend(event, hint) {
1372
1371
  const error = hint.originalException;
1373
1372
  if (error instanceof Error && error.name === "ZodError") {
@@ -1510,15 +1509,15 @@ var init_logger_utils = __esm({
1510
1509
  */
1511
1510
  async addLogger(container, opts) {
1512
1511
  const loggerDependencies = [];
1513
- const { Guards: Guards39, LOG_LEVEL: LOG_LEVEL7, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
1514
- if (!Guards39.isDefined(opts) || opts.console) {
1512
+ const { Guards: Guards45, LOG_LEVEL: LOG_LEVEL7, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
1513
+ if (!Guards45.isDefined(opts) || opts.console) {
1515
1514
  const { ConsoleLogger: ConsoleLogger2 } = await Promise.resolve().then(() => (init_console_logger(), console_logger_exports));
1516
1515
  container.addSingleton(TOKENS4.CONSOLE_LOGGER, () => new ConsoleLogger2(opts?.level));
1517
1516
  loggerDependencies.push(TOKENS4.CONSOLE_LOGGER);
1518
1517
  }
1519
1518
  const customLoggerFactories = [];
1520
- if (Guards39.isDefined(opts)) {
1521
- if (Guards39.isDefined(opts.sentry.config)) {
1519
+ if (Guards45.isDefined(opts)) {
1520
+ if (Guards45.isDefined(opts.sentry.config)) {
1522
1521
  const { SentryLoggerFactory: SentryLoggerFactory2 } = await Promise.resolve().then(() => (init_sentry_logger_factory(), sentry_logger_factory_exports));
1523
1522
  container.addSingleton(TOKENS4.SENTRY_LOGGER, () => {
1524
1523
  const factory = new SentryLoggerFactory2();
@@ -1526,7 +1525,7 @@ var init_logger_utils = __esm({
1526
1525
  });
1527
1526
  loggerDependencies.push(TOKENS4.SENTRY_LOGGER);
1528
1527
  }
1529
- if (Guards39.isDefined(opts.pino.config)) {
1528
+ if (Guards45.isDefined(opts.pino.config)) {
1530
1529
  const { PinoLoggerFactory: PinoLoggerFactory2 } = await Promise.resolve().then(() => (init_pino_logger_factory(), pino_logger_factory_exports));
1531
1530
  container.addSingleton(TOKENS4.PINO_LOGGER, () => {
1532
1531
  const factory = new PinoLoggerFactory2();
@@ -1534,10 +1533,10 @@ var init_logger_utils = __esm({
1534
1533
  });
1535
1534
  loggerDependencies.push(TOKENS4.PINO_LOGGER);
1536
1535
  }
1537
- if (!Guards39.isNullOrEmpty(opts.customLoggers)) {
1536
+ if (!Guards45.isNullOrEmpty(opts.customLoggers)) {
1538
1537
  const customLoggers = opts.customLoggers;
1539
1538
  customLoggers.forEach((f) => {
1540
- if (Guards39.isDefined(f)) {
1539
+ if (Guards45.isDefined(f)) {
1541
1540
  customLoggerFactories.push(f);
1542
1541
  }
1543
1542
  });
@@ -1557,12 +1556,34 @@ var init_logger_utils = __esm({
1557
1556
  }
1558
1557
  });
1559
1558
 
1559
+ // src/infrastructure/cache/inmemory.cache.ts
1560
+ var inmemory_cache_exports = {};
1561
+ __export(inmemory_cache_exports, {
1562
+ InMemoryCacheExtended: () => InMemoryCacheExtended
1563
+ });
1564
+ var import_shared39, InMemoryCacheExtended;
1565
+ var init_inmemory_cache = __esm({
1566
+ "src/infrastructure/cache/inmemory.cache.ts"() {
1567
+ "use strict";
1568
+ import_shared39 = require("@xeno-js/shared");
1569
+ InMemoryCacheExtended = class extends import_shared39.InMemoryCache {
1570
+ async increment(key, ttlSeconds) {
1571
+ const current = await this.get(key) ?? 0;
1572
+ const next = Number(current) + 1;
1573
+ const ttl = import_shared39.Guards.isDefined(ttlSeconds) ? Number(ttlSeconds) : 60;
1574
+ await this.set(key, next, ttl);
1575
+ return next;
1576
+ }
1577
+ };
1578
+ }
1579
+ });
1580
+
1560
1581
  // src/infrastructure/cache/redis.cache.ts
1561
- var import_shared39, RedisCache;
1582
+ var import_shared40, RedisCache;
1562
1583
  var init_redis_cache = __esm({
1563
1584
  "src/infrastructure/cache/redis.cache.ts"() {
1564
1585
  "use strict";
1565
- import_shared39 = require("@xeno-js/shared");
1586
+ import_shared40 = require("@xeno-js/shared");
1566
1587
  RedisCache = class {
1567
1588
  /**
1568
1589
  * @description Constructs a new instance of the RedisCache class, which takes an instance of the Redis client as a parameter. This client is used to perform caching operations such as setting, getting, and removing values from the Redis database. The constructor initializes the RedisCache with the provided Redis client, allowing it to interact with the Redis server for all caching operations defined in the ICache interface.
@@ -1578,21 +1599,28 @@ var init_redis_cache = __esm({
1578
1599
  this._redisClient = _redisClient;
1579
1600
  }
1580
1601
  _redisClient;
1602
+ async increment(key, ttlSeconds) {
1603
+ const multi = this._redisClient.multi();
1604
+ multi.incr(key);
1605
+ multi.expire(key, ttlSeconds ?? 60);
1606
+ const results = await multi.exec();
1607
+ return results?.[0]?.[1] ?? 1;
1608
+ }
1581
1609
  async get(key) {
1582
1610
  const value = await this._redisClient.get(key);
1583
- if (!import_shared39.Guards.isDefined(value)) {
1611
+ if (!import_shared40.Guards.isDefined(value)) {
1584
1612
  return void 0;
1585
1613
  }
1586
1614
  return JSON.parse(value);
1587
1615
  }
1588
1616
  async set(key, value, ttl) {
1589
- const stringValue = import_shared39.StringHelper.safeStringify(value);
1590
- const ttlOption = import_shared39.Guards.isDefined(ttl) ? ttl : 86400;
1617
+ const stringValue = import_shared40.StringHelper.safeStringify(value);
1618
+ const ttlOption = import_shared40.Guards.isDefined(ttl) ? ttl : 86400;
1591
1619
  await this._redisClient.set(key, stringValue, "EX", ttlOption);
1592
1620
  }
1593
1621
  async setIfAbsent(key, value, ttl) {
1594
- const stringValue = import_shared39.StringHelper.safeStringify(value);
1595
- const ttlOption = import_shared39.Guards.isDefined(ttl) ? ttl : 300;
1622
+ const stringValue = import_shared40.StringHelper.safeStringify(value);
1623
+ const ttlOption = import_shared40.Guards.isDefined(ttl) ? ttl : 300;
1596
1624
  const result = await this._redisClient.set(key, stringValue, "EX", ttlOption, "NX");
1597
1625
  return result === "OK";
1598
1626
  }
@@ -1615,11 +1643,11 @@ var redis_cache_factory_exports = {};
1615
1643
  __export(redis_cache_factory_exports, {
1616
1644
  RedisCacheFactory: () => RedisCacheFactory
1617
1645
  });
1618
- var import_shared40, import_ioredis, RedisCacheFactory;
1646
+ var import_shared41, import_ioredis, RedisCacheFactory;
1619
1647
  var init_redis_cache_factory = __esm({
1620
1648
  "src/infrastructure/factories/redis-cache.factory.ts"() {
1621
1649
  "use strict";
1622
- import_shared40 = require("@xeno-js/shared");
1650
+ import_shared41 = require("@xeno-js/shared");
1623
1651
  import_ioredis = require("ioredis");
1624
1652
  init_redis_cache();
1625
1653
  RedisCacheFactory = class {
@@ -1640,10 +1668,10 @@ var init_redis_cache_factory = __esm({
1640
1668
  return delay;
1641
1669
  }
1642
1670
  };
1643
- if (import_shared40.Guards.isDefined(password)) {
1671
+ if (import_shared41.Guards.isDefined(password)) {
1644
1672
  redisOptions.password = password;
1645
1673
  }
1646
- if (import_shared40.Guards.isDefined(username)) {
1674
+ if (import_shared41.Guards.isDefined(username)) {
1647
1675
  redisOptions.username = username;
1648
1676
  }
1649
1677
  if (useTls) {
@@ -1681,8 +1709,8 @@ var init_cache_utils = __esm({
1681
1709
  * @link https://github.com/xeno-js/xeno-js
1682
1710
  */
1683
1711
  async addCache(container, opts) {
1684
- const { Guards: Guards39, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
1685
- if (!opts.inMemory && !Guards39.isDefined(opts.redis)) {
1712
+ const { Guards: Guards45, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
1713
+ if (!opts.inMemory && !Guards45.isDefined(opts.redis)) {
1686
1714
  throw new Error(
1687
1715
  "No cache strategies are configured. Please provide at least one cache strategy."
1688
1716
  );
@@ -1692,12 +1720,12 @@ var init_cache_utils = __esm({
1692
1720
  TOKENS4.CACHE_KEY_BUILDER,
1693
1721
  (c) => new CacheKeyBuilder(c.resolve(TOKENS4.IDENTITY_ACCESSOR))
1694
1722
  );
1695
- if (opts.inMemory || !Guards39.isDefined(opts.redis)) {
1696
- const { InMemoryCache } = await import("@xeno-js/shared");
1697
- container.addSingleton(TOKENS4.CACHE, () => new InMemoryCache());
1723
+ if (opts.inMemory || !Guards45.isDefined(opts.redis)) {
1724
+ const { InMemoryCacheExtended: InMemoryCacheExtended2 } = await Promise.resolve().then(() => (init_inmemory_cache(), inmemory_cache_exports));
1725
+ container.addSingleton(TOKENS4.CACHE, () => new InMemoryCacheExtended2());
1698
1726
  return;
1699
1727
  }
1700
- if (Guards39.isDefined(opts.redis)) {
1728
+ if (Guards45.isDefined(opts.redis)) {
1701
1729
  const { RedisCacheFactory: RedisCacheFactory2 } = await Promise.resolve().then(() => (init_redis_cache_factory(), redis_cache_factory_exports));
1702
1730
  container.addSingleton(TOKENS4.CACHE, () => {
1703
1731
  const config = opts.redis;
@@ -1710,11 +1738,11 @@ var init_cache_utils = __esm({
1710
1738
  });
1711
1739
 
1712
1740
  // src/infrastructure/services/allow_methods/allow-method.service.ts
1713
- var import_shared41, AllowMethodRegistry;
1741
+ var import_shared42, AllowMethodRegistry;
1714
1742
  var init_allow_method_service = __esm({
1715
1743
  "src/infrastructure/services/allow_methods/allow-method.service.ts"() {
1716
1744
  "use strict";
1717
- import_shared41 = require("@xeno-js/shared");
1745
+ import_shared42 = require("@xeno-js/shared");
1718
1746
  AllowMethodRegistry = class {
1719
1747
  _staticRoutes = /* @__PURE__ */ new Map();
1720
1748
  _dynamicRoutes = [];
@@ -1730,7 +1758,7 @@ var init_allow_method_service = __esm({
1730
1758
  check(path, method) {
1731
1759
  const cleanPath = this.normalizePath(path.split("?")[0].split("#")[0]);
1732
1760
  const staticMethods = this._staticRoutes.get(cleanPath);
1733
- if (import_shared41.Guards.isDefined(staticMethods)) return staticMethods.includes(method);
1761
+ if (import_shared42.Guards.isDefined(staticMethods)) return staticMethods.includes(method);
1734
1762
  for (const route of this._dynamicRoutes) {
1735
1763
  if (route.pattern.test(cleanPath)) return route.methods.includes(method);
1736
1764
  }
@@ -1767,18 +1795,18 @@ var init_allow_methods = __esm({
1767
1795
  });
1768
1796
 
1769
1797
  // src/infrastructure/services/allow_origins/allow-origin.http.ts
1770
- var import_shared42, AllowOrigin;
1798
+ var import_shared43, AllowOrigin;
1771
1799
  var init_allow_origin_http = __esm({
1772
1800
  "src/infrastructure/services/allow_origins/allow-origin.http.ts"() {
1773
1801
  "use strict";
1774
- import_shared42 = require("@xeno-js/shared");
1802
+ import_shared43 = require("@xeno-js/shared");
1775
1803
  AllowOrigin = class {
1776
1804
  constructor(_list) {
1777
1805
  this._list = _list;
1778
1806
  }
1779
1807
  _list;
1780
1808
  isAllowed(origin) {
1781
- if (import_shared42.Guards.isNullOrEmpty(origin)) return true;
1809
+ if (import_shared43.Guards.isNullOrEmpty(origin)) return true;
1782
1810
  const cleanOrigin = origin.trim().toLowerCase();
1783
1811
  for (const pattern of this._list) {
1784
1812
  const cleanPattern = pattern.trim().toLowerCase();
@@ -1788,7 +1816,7 @@ var init_allow_origin_http = __esm({
1788
1816
  const domainSuffix = cleanPattern.substring(1);
1789
1817
  if (cleanOrigin.endsWith(domainSuffix)) {
1790
1818
  const prefix = cleanOrigin.slice(0, cleanOrigin.length - domainSuffix.length);
1791
- if (!import_shared42.Guards.isNullOrEmpty(prefix) && !prefix.includes(".")) return true;
1819
+ if (!import_shared43.Guards.isNullOrEmpty(prefix) && !prefix.includes(".")) return true;
1792
1820
  }
1793
1821
  }
1794
1822
  }
@@ -1834,25 +1862,125 @@ var init_concurrency = __esm({
1834
1862
  }
1835
1863
  });
1836
1864
 
1865
+ // src/infrastructure/services/crypto/crypto.service.ts
1866
+ var EdgeCryptoService;
1867
+ var init_crypto_service = __esm({
1868
+ "src/infrastructure/services/crypto/crypto.service.ts"() {
1869
+ "use strict";
1870
+ EdgeCryptoService = class {
1871
+ randomBytes(size) {
1872
+ const buffer = new Uint8Array(size);
1873
+ crypto.getRandomValues(buffer);
1874
+ return buffer;
1875
+ }
1876
+ async hmacSha256(secret, data) {
1877
+ const encoder = new TextEncoder();
1878
+ const keyData = encoder.encode(secret);
1879
+ const messageData = encoder.encode(data);
1880
+ const cryptoKey = await crypto.subtle.importKey(
1881
+ "raw",
1882
+ keyData,
1883
+ { name: "HMAC", hash: "SHA-256" },
1884
+ false,
1885
+ ["sign"]
1886
+ );
1887
+ const signature = await crypto.subtle.sign("HMAC", cryptoKey, messageData);
1888
+ return btoa(String.fromCharCode(...new Uint8Array(signature))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
1889
+ }
1890
+ timingSafeEqual(a, b) {
1891
+ if (a.length !== b.length) {
1892
+ return false;
1893
+ }
1894
+ let mismatch = 0;
1895
+ for (let i = 0; i < a.length; i++) {
1896
+ mismatch |= a[i] ^ b[i];
1897
+ }
1898
+ return mismatch === 0;
1899
+ }
1900
+ };
1901
+ }
1902
+ });
1903
+
1904
+ // src/infrastructure/services/crypto/index.ts
1905
+ var init_crypto = __esm({
1906
+ "src/infrastructure/services/crypto/index.ts"() {
1907
+ "use strict";
1908
+ init_crypto_service();
1909
+ }
1910
+ });
1911
+
1912
+ // src/infrastructure/services/csrf/csrf-token.service.ts
1913
+ var import_shared44, CsrfTokenService;
1914
+ var init_csrf_token_service = __esm({
1915
+ "src/infrastructure/services/csrf/csrf-token.service.ts"() {
1916
+ "use strict";
1917
+ import_shared44 = require("@xeno-js/shared");
1918
+ CsrfTokenService = class {
1919
+ constructor(_secret, _cryptoService) {
1920
+ this._secret = _secret;
1921
+ this._cryptoService = _cryptoService;
1922
+ }
1923
+ _secret;
1924
+ _cryptoService;
1925
+ async generate(subject) {
1926
+ const randomBuffer = this._cryptoService.randomBytes(32);
1927
+ const nonce = btoa(String.fromCharCode(...randomBuffer)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
1928
+ const signature = await this._cryptoService.hmacSha256(
1929
+ this._secret,
1930
+ `${subject}.${nonce}`
1931
+ );
1932
+ return `${nonce}.${signature}`;
1933
+ }
1934
+ async validate(token, subject) {
1935
+ const separatorIndex = token.indexOf(".");
1936
+ if (separatorIndex <= 0)
1937
+ return false;
1938
+ const nonce = token.slice(0, separatorIndex);
1939
+ const signature = token.slice(separatorIndex + 1);
1940
+ if (import_shared44.Guards.isNullOrEmpty(nonce) || import_shared44.Guards.isNullOrEmpty(signature))
1941
+ return false;
1942
+ const expected = await this._cryptoService.hmacSha256(
1943
+ this._secret,
1944
+ `${subject}.${nonce}`
1945
+ );
1946
+ const encoder = new TextEncoder();
1947
+ const actualBuffer = encoder.encode(signature);
1948
+ const expectedBuffer = encoder.encode(expected);
1949
+ if (actualBuffer.length !== expectedBuffer.length)
1950
+ return false;
1951
+ return this._cryptoService.timingSafeEqual(actualBuffer, expectedBuffer);
1952
+ }
1953
+ };
1954
+ }
1955
+ });
1956
+
1957
+ // src/infrastructure/services/csrf/index.ts
1958
+ var init_csrf = __esm({
1959
+ "src/infrastructure/services/csrf/index.ts"() {
1960
+ "use strict";
1961
+ init_csrf_token_service();
1962
+ }
1963
+ });
1964
+
1837
1965
  // src/infrastructure/services/extractors/extract-bearer.extractor.ts
1838
- var import_shared43, BearerTokenExtractor;
1966
+ var import_shared45, BearerTokenExtractor;
1839
1967
  var init_extract_bearer_extractor = __esm({
1840
1968
  "src/infrastructure/services/extractors/extract-bearer.extractor.ts"() {
1841
1969
  "use strict";
1842
- import_shared43 = require("@xeno-js/shared");
1970
+ import_shared45 = require("@xeno-js/shared");
1843
1971
  BearerTokenExtractor = class {
1844
1972
  extract(headers) {
1845
- const authHeader = import_shared43.StringHelper.getSingleValue(headers["authorization"]);
1846
- if (!import_shared43.Guards.isDefined(authHeader)) {
1973
+ const authHeader = import_shared45.StringHelper.getSingleValue(headers["authorization"]);
1974
+ if (!import_shared45.Guards.isDefined(authHeader)) {
1847
1975
  return void 0;
1848
1976
  }
1849
1977
  if (authHeader.toLowerCase().startsWith("bearer ")) {
1850
1978
  return authHeader.substring(7);
1851
1979
  }
1852
- const cookieHeader = import_shared43.StringHelper.getSingleValue(headers["cookie"]);
1853
- if (import_shared43.Guards.isDefined(cookieHeader)) {
1980
+ const cookieHeader = import_shared45.StringHelper.getSingleValue(headers["cookie"]);
1981
+ if (import_shared45.Guards.isDefined(cookieHeader)) {
1854
1982
  const match = /sb-access-token=([^;]+)/.exec(cookieHeader);
1855
- if (!import_shared43.Guards.isNullOrEmpty(match) && import_shared43.Guards.isDefined(match[1])) {
1983
+ if (!import_shared45.Guards.isNullOrEmpty(match) && import_shared45.Guards.isDefined(match[1])) {
1856
1984
  return match[1].trim();
1857
1985
  }
1858
1986
  }
@@ -1863,44 +1991,44 @@ var init_extract_bearer_extractor = __esm({
1863
1991
  });
1864
1992
 
1865
1993
  // src/infrastructure/services/extractors/extract-ssr-bearer.extractor.ts
1866
- var import_shared44, SupabaseSsrTokenExtractor;
1994
+ var import_shared46, SupabaseSsrTokenExtractor;
1867
1995
  var init_extract_ssr_bearer_extractor = __esm({
1868
1996
  "src/infrastructure/services/extractors/extract-ssr-bearer.extractor.ts"() {
1869
1997
  "use strict";
1870
- import_shared44 = require("@xeno-js/shared");
1998
+ import_shared46 = require("@xeno-js/shared");
1871
1999
  SupabaseSsrTokenExtractor = class {
1872
2000
  extract(headers) {
1873
- const authHeader = import_shared44.StringHelper.getSingleValue(headers["authorization"]);
1874
- if (import_shared44.Guards.isDefined(authHeader) && authHeader.toLowerCase().startsWith("bearer ")) {
2001
+ const authHeader = import_shared46.StringHelper.getSingleValue(headers["authorization"]);
2002
+ if (import_shared46.Guards.isDefined(authHeader) && authHeader.toLowerCase().startsWith("bearer ")) {
1875
2003
  return authHeader.substring(7);
1876
2004
  }
1877
- const cookieHeader = import_shared44.StringHelper.getSingleValue(headers["cookie"]);
1878
- if (import_shared44.Guards.isNullOrEmpty(cookieHeader)) return void 0;
2005
+ const cookieHeader = import_shared46.StringHelper.getSingleValue(headers["cookie"]);
2006
+ if (import_shared46.Guards.isNullOrEmpty(cookieHeader)) return void 0;
1879
2007
  const cookies = cookieHeader.split(";").map((c) => c.trim());
1880
2008
  const tokenChunks = {};
1881
2009
  let unchunkedToken;
1882
2010
  for (const cookie of cookies) {
1883
2011
  const [name, ...rest] = cookie.split("=");
1884
- if (!import_shared44.Guards.isDefined(name) || import_shared44.Guards.isNullOrEmpty(rest)) continue;
2012
+ if (!import_shared46.Guards.isDefined(name) || import_shared46.Guards.isNullOrEmpty(rest)) continue;
1885
2013
  const value = decodeURIComponent(rest.join("="));
1886
- if (import_shared44.Guards.isDefined(/^sb-[a-z0-9]+-auth-token$/.exec(name))) {
2014
+ if (import_shared46.Guards.isDefined(/^sb-[a-z0-9]+-auth-token$/.exec(name))) {
1887
2015
  unchunkedToken = value;
1888
2016
  } else {
1889
2017
  const match = /^sb-[a-z0-9]+-auth-token\.(\d+)$/.exec(name);
1890
- if (import_shared44.Guards.isDefined(match)) tokenChunks[parseInt(match[1], 10)] = value;
2018
+ if (import_shared46.Guards.isDefined(match)) tokenChunks[parseInt(match[1], 10)] = value;
1891
2019
  }
1892
2020
  }
1893
2021
  let fullTokenString = unchunkedToken;
1894
- if (!import_shared44.Guards.isDefined(fullTokenString) && Object.keys(tokenChunks).length > 0) {
2022
+ if (!import_shared46.Guards.isDefined(fullTokenString) && Object.keys(tokenChunks).length > 0) {
1895
2023
  const indices = Object.keys(tokenChunks).map(Number).sort((a, b) => a - b);
1896
2024
  fullTokenString = indices.map((i) => tokenChunks[i]).join("");
1897
2025
  }
1898
- if (import_shared44.Guards.isNullOrEmpty(fullTokenString)) return void 0;
2026
+ if (import_shared46.Guards.isNullOrEmpty(fullTokenString)) return void 0;
1899
2027
  try {
1900
- const parsed = import_shared44.StringHelper.safeParse(fullTokenString);
1901
- if (import_shared44.Guards.isDefined(parsed) && import_shared44.Guards.isObject(parsed) && "access_token" in parsed) {
2028
+ const parsed = import_shared46.StringHelper.safeParse(fullTokenString);
2029
+ if (import_shared46.Guards.isDefined(parsed) && import_shared46.Guards.isObject(parsed) && "access_token" in parsed) {
1902
2030
  const accessToken = parsed["access_token"];
1903
- if (import_shared44.Guards.isString(accessToken)) return accessToken;
2031
+ if (import_shared46.Guards.isString(accessToken)) return accessToken;
1904
2032
  }
1905
2033
  } catch {
1906
2034
  return void 0;
@@ -1910,12 +2038,42 @@ var init_extract_ssr_bearer_extractor = __esm({
1910
2038
  }
1911
2039
  });
1912
2040
 
2041
+ // src/infrastructure/services/extractors/http-cookie.extractor.ts
2042
+ var import_shared47, HttpCookieExtractor;
2043
+ var init_http_cookie_extractor = __esm({
2044
+ "src/infrastructure/services/extractors/http-cookie.extractor.ts"() {
2045
+ "use strict";
2046
+ import_shared47 = require("@xeno-js/shared");
2047
+ HttpCookieExtractor = class {
2048
+ extract(cookie) {
2049
+ if (!import_shared47.Guards.isDefined(cookie.header))
2050
+ return void 0;
2051
+ for (const rawCookie of cookie.header.split(";")) {
2052
+ const separatorIndex = rawCookie.indexOf("=");
2053
+ if (separatorIndex <= 0)
2054
+ continue;
2055
+ const name = rawCookie.slice(0, separatorIndex).trim();
2056
+ if (name !== cookie.name)
2057
+ continue;
2058
+ const value = rawCookie.slice(separatorIndex + 1).trim();
2059
+ try {
2060
+ return decodeURIComponent(value);
2061
+ } catch {
2062
+ return void 0;
2063
+ }
2064
+ }
2065
+ return void 0;
2066
+ }
2067
+ };
2068
+ }
2069
+ });
2070
+
1913
2071
  // src/infrastructure/services/extractors/http-header.extractor.ts
1914
- var import_shared45, HttpHeaderExtractor;
2072
+ var import_shared48, HttpHeaderExtractor;
1915
2073
  var init_http_header_extractor = __esm({
1916
2074
  "src/infrastructure/services/extractors/http-header.extractor.ts"() {
1917
2075
  "use strict";
1918
- import_shared45 = require("@xeno-js/shared");
2076
+ import_shared48 = require("@xeno-js/shared");
1919
2077
  HttpHeaderExtractor = class {
1920
2078
  /**
1921
2079
  * @description Constructor for HttpHeaderExtractor. It takes an instance of IServiceExtractor for extracting Bearer tokens, allowing for separation of concerns and adherence to the Single Responsibility Principle (SRP). This design enables the HttpHeaderExtractor to focus on general header extraction while delegating the specific logic of Bearer token extraction to a dedicated extractor, promoting code reusability and maintainability.
@@ -1926,32 +2084,43 @@ var init_http_header_extractor = __esm({
1926
2084
  * @since 2025-09-30
1927
2085
  * @link https://github.com/xeno-js/xeno-js
1928
2086
  */
1929
- constructor(_bearerExtractor, _trustedIp) {
2087
+ constructor(_bearerExtractor, _cookieExtractor, _trustedIp, _cookieName) {
1930
2088
  this._bearerExtractor = _bearerExtractor;
2089
+ this._cookieExtractor = _cookieExtractor;
1931
2090
  this._trustedIp = _trustedIp;
2091
+ this._cookieName = _cookieName;
1932
2092
  }
1933
2093
  _bearerExtractor;
2094
+ _cookieExtractor;
1934
2095
  _trustedIp;
2096
+ _cookieName;
1935
2097
  extract(headers) {
1936
- const correlationId = import_shared45.GuidHelper.parse(import_shared45.StringHelper.getSingleValue(headers["x-correlation-id"]));
1937
- const requestId = import_shared45.GuidHelper.parse(import_shared45.StringHelper.getSingleValue(headers["x-request-id"]));
2098
+ const correlationId = import_shared48.GuidHelper.parse(import_shared48.StringHelper.getSingleValue(headers["x-correlation-id"]));
2099
+ const requestId = import_shared48.GuidHelper.parse(import_shared48.StringHelper.getSingleValue(headers["x-request-id"]));
1938
2100
  const token = this._bearerExtractor.extract(headers);
1939
- const clientIp = import_shared45.StringHelper.getSingleValue(headers[this._trustedIp?.toLowerCase() ?? "x-forwarded-for"]) ?? import_shared45.StringHelper.getSingleValue(headers["x-real-ip"]);
1940
- const spanId = import_shared45.GuidHelper.parse(import_shared45.StringHelper.getSingleValue(headers["x-span-id"]));
1941
- const parentSpanId = import_shared45.StringHelper.getSingleValue(headers["x-parent-span-id"]);
1942
- const acceptHeader = import_shared45.StringHelper.getSingleValue(headers["accept"]);
1943
- const contentTypeHeader = import_shared45.StringHelper.getSingleValue(headers["content-type"]);
1944
- const userAgent = import_shared45.StringHelper.getSingleValue(headers["user-agent"]);
1945
- const returnAddress = import_shared45.StringHelper.getSingleValue(headers["x-return-address"]);
1946
- const sequenceId = import_shared45.StringHelper.getSingleValue(headers["x-sequence-id"]);
1947
- const position = import_shared45.StringHelper.getSingleValue(headers["x-sequence-position"]);
1948
- const size = import_shared45.StringHelper.getSingleValue(headers["x-sequence-size"]);
1949
- const expiration = import_shared45.StringHelper.getSingleValue(headers["x-expiration"]);
1950
- const csrf = import_shared45.StringHelper.getSingleValue(headers["x-requested-with"]);
1951
- const origin = import_shared45.StringHelper.getSingleValue(headers["origin"]);
1952
- const cleanOrigin = import_shared45.HttpHelper.sanitizeOriginUrl(origin);
1953
- const referer = import_shared45.StringHelper.getSingleValue(headers["referer"]);
1954
- const cleanReferer = import_shared45.HttpHelper.sanitizeOriginUrl(referer);
2101
+ const clientIp = import_shared48.StringHelper.getSingleValue(headers[this._trustedIp?.toLowerCase() ?? "x-forwarded-for"]) ?? import_shared48.StringHelper.getSingleValue(headers["x-real-ip"]);
2102
+ const spanId = import_shared48.GuidHelper.parse(import_shared48.StringHelper.getSingleValue(headers["x-span-id"]));
2103
+ const parentSpanId = import_shared48.StringHelper.getSingleValue(headers["x-parent-span-id"]);
2104
+ const acceptHeader = import_shared48.StringHelper.getSingleValue(headers["accept"]);
2105
+ const contentTypeHeader = import_shared48.StringHelper.getSingleValue(headers["content-type"]);
2106
+ const userAgent = import_shared48.StringHelper.getSingleValue(headers["user-agent"]);
2107
+ const returnAddress = import_shared48.StringHelper.getSingleValue(headers["x-return-address"]);
2108
+ const sequenceId = import_shared48.StringHelper.getSingleValue(headers["x-sequence-id"]);
2109
+ const position = import_shared48.StringHelper.getSingleValue(headers["x-sequence-position"]);
2110
+ const size = import_shared48.StringHelper.getSingleValue(headers["x-sequence-size"]);
2111
+ const expiration = import_shared48.StringHelper.getSingleValue(headers["x-expiration"]);
2112
+ const csrf = import_shared48.StringHelper.getSingleValue(headers["x-csrf-token"]);
2113
+ const cookieHeader = import_shared48.StringHelper.getSingleValue(headers["cookie"]);
2114
+ const csrfCookie = this._cookieExtractor.extract(
2115
+ {
2116
+ header: cookieHeader,
2117
+ name: this._cookieName
2118
+ }
2119
+ );
2120
+ const origin = import_shared48.StringHelper.getSingleValue(headers["origin"]);
2121
+ const cleanOrigin = import_shared48.HttpHelper.sanitizeOriginUrl(origin);
2122
+ const referer = import_shared48.StringHelper.getSingleValue(headers["referer"]);
2123
+ const cleanReferer = import_shared48.HttpHelper.sanitizeOriginUrl(referer);
1955
2124
  const accept = acceptHeader === "*/*" ? void 0 : acceptHeader;
1956
2125
  const formatIndicator = accept ?? contentTypeHeader ?? "application/json";
1957
2126
  const metadata = {
@@ -1965,14 +2134,15 @@ var init_http_header_extractor = __esm({
1965
2134
  userAgent,
1966
2135
  returnAddress,
1967
2136
  csrf,
2137
+ csrfCookie,
1968
2138
  origin: cleanOrigin,
1969
2139
  referer: cleanReferer,
1970
2140
  sequence: {
1971
2141
  sequenceId,
1972
- position: import_shared45.Guards.isDefined(position) ? import_shared45.MathHelper.toNumber(position) : void 0,
1973
- size: import_shared45.Guards.isDefined(size) ? import_shared45.MathHelper.toNumber(size) : void 0
2142
+ position: import_shared48.Guards.isDefined(position) ? import_shared48.MathHelper.toNumber(position) : void 0,
2143
+ size: import_shared48.Guards.isDefined(size) ? import_shared48.MathHelper.toNumber(size) : void 0
1974
2144
  },
1975
- expiration: import_shared45.Guards.isDefined(expiration) ? import_shared45.MathHelper.toNumber(expiration) : void 0
2145
+ expiration: import_shared48.Guards.isDefined(expiration) ? import_shared48.MathHelper.toNumber(expiration) : void 0
1976
2146
  };
1977
2147
  return metadata;
1978
2148
  }
@@ -1986,23 +2156,24 @@ var init_extractors = __esm({
1986
2156
  "use strict";
1987
2157
  init_extract_bearer_extractor();
1988
2158
  init_extract_ssr_bearer_extractor();
2159
+ init_http_cookie_extractor();
1989
2160
  init_http_header_extractor();
1990
2161
  }
1991
2162
  });
1992
2163
 
1993
2164
  // src/infrastructure/services/resiliences/resilience.service.ts
1994
- var import_shared46, ServiceResilience;
2165
+ var import_shared49, ServiceResilience;
1995
2166
  var init_resilience_service = __esm({
1996
2167
  "src/infrastructure/services/resiliences/resilience.service.ts"() {
1997
2168
  "use strict";
1998
- import_shared46 = require("@xeno-js/shared");
2169
+ import_shared49 = require("@xeno-js/shared");
1999
2170
  ServiceResilience = class {
2000
2171
  constructor(policy) {
2001
2172
  this.policy = policy;
2002
2173
  }
2003
2174
  policy;
2004
2175
  async execute(operation, signal) {
2005
- import_shared46.AppError.throwIfAborted(signal, "ServiceResilience.execute");
2176
+ import_shared49.AppError.throwIfAborted(signal, "ServiceResilience.execute");
2006
2177
  return this.policy.execute(() => operation(), signal);
2007
2178
  }
2008
2179
  };
@@ -2017,12 +2188,82 @@ var init_resiliences = __esm({
2017
2188
  }
2018
2189
  });
2019
2190
 
2191
+ // src/infrastructure/services/resolver/utils/socket.utils.ts
2192
+ var import_shared50, SocketIpExtractor;
2193
+ var init_socket_utils = __esm({
2194
+ "src/infrastructure/services/resolver/utils/socket.utils.ts"() {
2195
+ "use strict";
2196
+ import_shared50 = require("@xeno-js/shared");
2197
+ SocketIpExtractor = Object.freeze({
2198
+ /**
2199
+ * @description Extracts the IP address of the remote socket from an incoming request.
2200
+ * @param req The incoming request object.
2201
+ * @returns The IP address of the remote socket, or undefined if not available.
2202
+ */
2203
+ extract(req) {
2204
+ if (import_shared50.Guards.isDefined(req) && import_shared50.Guards.isObject(req)) {
2205
+ const candidate = req;
2206
+ return candidate.socket?.remoteAddress ?? candidate.connection?.remoteAddress;
2207
+ }
2208
+ return void 0;
2209
+ }
2210
+ });
2211
+ }
2212
+ });
2213
+
2214
+ // src/infrastructure/services/resolver/utils/index.ts
2215
+ var init_utils = __esm({
2216
+ "src/infrastructure/services/resolver/utils/index.ts"() {
2217
+ "use strict";
2218
+ init_socket_utils();
2219
+ }
2220
+ });
2221
+
2222
+ // src/infrastructure/services/resolver/client-ip.resolver.ts
2223
+ var import_shared51, ClientIpResolver;
2224
+ var init_client_ip_resolver = __esm({
2225
+ "src/infrastructure/services/resolver/client-ip.resolver.ts"() {
2226
+ "use strict";
2227
+ import_shared51 = require("@xeno-js/shared");
2228
+ init_utils();
2229
+ ClientIpResolver = class {
2230
+ constructor(_trustedProxies = []) {
2231
+ this._trustedProxies = _trustedProxies;
2232
+ }
2233
+ _trustedProxies;
2234
+ resolve(req, clientIp) {
2235
+ const socketIp = SocketIpExtractor.extract(req);
2236
+ if (!import_shared51.Guards.isDefined(socketIp))
2237
+ return !import_shared51.Guards.isNullOrEmpty(clientIp) ? clientIp.split(",")[0].trim() : void 0;
2238
+ const isTrustedProxy = this._trustedProxies.includes(socketIp);
2239
+ if (!isTrustedProxy)
2240
+ return socketIp;
2241
+ if (import_shared51.Guards.isDefined(clientIp))
2242
+ return clientIp.split(",")[0].trim();
2243
+ return socketIp;
2244
+ }
2245
+ };
2246
+ }
2247
+ });
2248
+
2249
+ // src/infrastructure/services/resolver/index.ts
2250
+ var init_resolver = __esm({
2251
+ "src/infrastructure/services/resolver/index.ts"() {
2252
+ "use strict";
2253
+ init_client_ip_resolver();
2254
+ }
2255
+ });
2256
+
2020
2257
  // src/infrastructure/services/index.ts
2021
2258
  var services_exports = {};
2022
2259
  __export(services_exports, {
2023
2260
  AllowMethodRegistry: () => AllowMethodRegistry,
2024
2261
  AllowOrigin: () => AllowOrigin,
2025
2262
  BearerTokenExtractor: () => BearerTokenExtractor,
2263
+ ClientIpResolver: () => ClientIpResolver,
2264
+ CsrfTokenService: () => CsrfTokenService,
2265
+ EdgeCryptoService: () => EdgeCryptoService,
2266
+ HttpCookieExtractor: () => HttpCookieExtractor,
2026
2267
  HttpHeaderExtractor: () => HttpHeaderExtractor,
2027
2268
  PLimitConcurrencyService: () => PLimitConcurrencyService,
2028
2269
  ServiceResilience: () => ServiceResilience,
@@ -2034,8 +2275,11 @@ var init_services = __esm({
2034
2275
  init_allow_methods();
2035
2276
  init_allow_origins();
2036
2277
  init_concurrency();
2278
+ init_crypto();
2279
+ init_csrf();
2037
2280
  init_extractors();
2038
2281
  init_resiliences();
2282
+ init_resolver();
2039
2283
  }
2040
2284
  });
2041
2285
 
@@ -2058,15 +2302,15 @@ var init_allow_method_factory = __esm({
2058
2302
  });
2059
2303
 
2060
2304
  // src/infrastructure/factories/axios.factory.ts
2061
- var import_node_http, import_node_https, import_shared47, import_axios, NodeAxiosFactory;
2305
+ var import_node_http, import_node_https, import_shared52, import_axios, NodeAxiosFactory;
2062
2306
  var init_axios_factory = __esm({
2063
2307
  "src/infrastructure/factories/axios.factory.ts"() {
2064
2308
  "use strict";
2065
2309
  import_node_http = __toESM(require("http"), 1);
2066
2310
  import_node_https = __toESM(require("https"), 1);
2067
- import_shared47 = require("@xeno-js/shared");
2311
+ import_shared52 = require("@xeno-js/shared");
2068
2312
  import_axios = __toESM(require("axios"), 1);
2069
- NodeAxiosFactory = class extends import_shared47.AxiosFactory {
2313
+ NodeAxiosFactory = class extends import_shared52.AxiosFactory {
2070
2314
  create(config) {
2071
2315
  const isKeepAlive = config.keepAlive ?? true;
2072
2316
  const maxSockets = config.maxSockets ?? 100;
@@ -2091,18 +2335,18 @@ var init_axios_factory = __esm({
2091
2335
  proxy: config.proxy,
2092
2336
  withCredentials: config.withCredentials
2093
2337
  });
2094
- return new import_shared47.AxiosHttpClient(axiosInstance);
2338
+ return new import_shared52.AxiosHttpClient(axiosInstance);
2095
2339
  }
2096
2340
  };
2097
2341
  }
2098
2342
  });
2099
2343
 
2100
2344
  // src/infrastructure/factories/cockatiel-resilience.factory.ts
2101
- var import_shared48, import_cockatiel, CockatielResilienceFactory;
2345
+ var import_shared53, import_cockatiel, CockatielResilienceFactory;
2102
2346
  var init_cockatiel_resilience_factory = __esm({
2103
2347
  "src/infrastructure/factories/cockatiel-resilience.factory.ts"() {
2104
2348
  "use strict";
2105
- import_shared48 = require("@xeno-js/shared");
2349
+ import_shared53 = require("@xeno-js/shared");
2106
2350
  import_cockatiel = require("cockatiel");
2107
2351
  init_resilience_service();
2108
2352
  CockatielResilienceFactory = class {
@@ -2112,36 +2356,36 @@ var init_cockatiel_resilience_factory = __esm({
2112
2356
  retry: {
2113
2357
  attempts: this.checkConfigValue(
2114
2358
  config.retry.attempts,
2115
- import_shared48.RESILIENCE_DEFAULTS.RETRY.ATTEMPTS,
2359
+ import_shared53.RESILIENCE_DEFAULTS.RETRY.ATTEMPTS,
2116
2360
  message
2117
2361
  ),
2118
2362
  baseDelayMs: this.checkConfigValue(
2119
2363
  config.retry.baseDelayMs,
2120
- import_shared48.RESILIENCE_DEFAULTS.RETRY.BASE_DELAY_MS,
2364
+ import_shared53.RESILIENCE_DEFAULTS.RETRY.BASE_DELAY_MS,
2121
2365
  message
2122
2366
  ),
2123
2367
  maxDelayMs: this.checkConfigValue(
2124
2368
  config.retry.maxDelayMs,
2125
- import_shared48.RESILIENCE_DEFAULTS.RETRY.MAX_DELAY_MS,
2369
+ import_shared53.RESILIENCE_DEFAULTS.RETRY.MAX_DELAY_MS,
2126
2370
  message
2127
2371
  )
2128
2372
  },
2129
2373
  circuitBreaker: {
2130
2374
  consecutiveFailures: this.checkConfigValue(
2131
2375
  config.circuitBreaker.consecutiveFailures,
2132
- import_shared48.RESILIENCE_DEFAULTS.CIRCUIT_BREAKER.CONSECUTIVE_FAILURES,
2376
+ import_shared53.RESILIENCE_DEFAULTS.CIRCUIT_BREAKER.CONSECUTIVE_FAILURES,
2133
2377
  message
2134
2378
  ),
2135
2379
  halfOpenTimeoutMs: this.checkConfigValue(
2136
2380
  config.circuitBreaker.halfOpenTimeoutMs,
2137
- import_shared48.RESILIENCE_DEFAULTS.CIRCUIT_BREAKER.HALF_OPEN_TIMEOUT_MS,
2381
+ import_shared53.RESILIENCE_DEFAULTS.CIRCUIT_BREAKER.HALF_OPEN_TIMEOUT_MS,
2138
2382
  message
2139
2383
  )
2140
2384
  },
2141
2385
  bulkhead: {
2142
2386
  maxConcurrent: this.checkConfigValue(
2143
2387
  config.bulkhead.maxConcurrent,
2144
- import_shared48.RESILIENCE_DEFAULTS.BULKHEAD.MAX_CONCURRENT,
2388
+ import_shared53.RESILIENCE_DEFAULTS.BULKHEAD.MAX_CONCURRENT,
2145
2389
  message
2146
2390
  )
2147
2391
  }
@@ -2167,13 +2411,13 @@ var init_cockatiel_resilience_factory = __esm({
2167
2411
  return new ServiceResilience((0, import_cockatiel.wrap)(bulkheadPolicy, circuitBreakerPolicy, retryPolicy));
2168
2412
  }
2169
2413
  isTransientError(error) {
2170
- if (!import_shared48.Guards.isDefined(error) || !import_shared48.Guards.isObject(error)) return false;
2414
+ if (!import_shared53.Guards.isDefined(error) || !import_shared53.Guards.isObject(error)) return false;
2171
2415
  let status;
2172
2416
  let isNetworkError = false;
2173
- if (error instanceof import_shared48.AppError) {
2417
+ if (error instanceof import_shared53.AppError) {
2174
2418
  status = error.status;
2175
2419
  const cause = error.cause;
2176
- if (import_shared48.Guards.isDefined(cause) && import_shared48.Guards.isString(cause.code)) {
2420
+ if (import_shared53.Guards.isDefined(cause) && import_shared53.Guards.isString(cause.code)) {
2177
2421
  isNetworkError = [
2178
2422
  "ECONNABORTED",
2179
2423
  "ECONNRESET",
@@ -2185,7 +2429,7 @@ var init_cockatiel_resilience_factory = __esm({
2185
2429
  } else {
2186
2430
  const err = error;
2187
2431
  status = err.status;
2188
- if (import_shared48.Guards.isString(err.code)) {
2432
+ if (import_shared53.Guards.isString(err.code)) {
2189
2433
  isNetworkError = [
2190
2434
  "ECONNABORTED",
2191
2435
  "ECONNRESET",
@@ -2196,7 +2440,7 @@ var init_cockatiel_resilience_factory = __esm({
2196
2440
  }
2197
2441
  }
2198
2442
  if (isNetworkError) return true;
2199
- if (import_shared48.Guards.isDefined(status)) {
2443
+ if (import_shared53.Guards.isDefined(status)) {
2200
2444
  return status === 408 || status === 429 || status >= 500 && status < 600;
2201
2445
  }
2202
2446
  return false;
@@ -2204,24 +2448,24 @@ var init_cockatiel_resilience_factory = __esm({
2204
2448
  isTransientAndIdempotent(error) {
2205
2449
  if (!this.isTransientError(error)) return false;
2206
2450
  let method;
2207
- if (error instanceof import_shared48.AppError) {
2451
+ if (error instanceof import_shared53.AppError) {
2208
2452
  const cause = error.cause;
2209
- if (import_shared48.Guards.isDefined(cause) && import_shared48.Guards.isDefined(cause.config) && import_shared48.Guards.isString(cause.config.method)) {
2453
+ if (import_shared53.Guards.isDefined(cause) && import_shared53.Guards.isDefined(cause.config) && import_shared53.Guards.isString(cause.config.method)) {
2210
2454
  method = cause.config.method.toUpperCase();
2211
2455
  }
2212
2456
  } else {
2213
2457
  const err = error;
2214
- if (import_shared48.Guards.isDefined(err.config) && import_shared48.Guards.isString(err.config.method)) {
2458
+ if (import_shared53.Guards.isDefined(err.config) && import_shared53.Guards.isString(err.config.method)) {
2215
2459
  method = err.config.method.toUpperCase();
2216
2460
  }
2217
2461
  }
2218
- if (import_shared48.Guards.isNullOrEmpty(method)) return false;
2462
+ if (import_shared53.Guards.isNullOrEmpty(method)) return false;
2219
2463
  const idempotentMethods = ["GET", "PUT", "DELETE", "HEAD", "OPTIONS"];
2220
2464
  return idempotentMethods.includes(method);
2221
2465
  }
2222
2466
  checkConfigValue(value, defaultValue, message) {
2223
- if (import_shared48.Guards.isDefined(value)) {
2224
- import_shared48.Guards.throwIfNegative(value, message);
2467
+ if (import_shared53.Guards.isDefined(value)) {
2468
+ import_shared53.Guards.throwIfNegative(value, message);
2225
2469
  return value;
2226
2470
  }
2227
2471
  return defaultValue;
@@ -2253,11 +2497,11 @@ var init_db_client_factory = __esm({
2253
2497
  });
2254
2498
 
2255
2499
  // src/infrastructure/context/request-context.ts
2256
- var import_shared49, NodeRequestContext;
2500
+ var import_shared54, NodeRequestContext;
2257
2501
  var init_request_context = __esm({
2258
2502
  "src/infrastructure/context/request-context.ts"() {
2259
2503
  "use strict";
2260
- import_shared49 = require("@xeno-js/shared");
2504
+ import_shared54 = require("@xeno-js/shared");
2261
2505
  NodeRequestContext = class {
2262
2506
  /**
2263
2507
  * @description Constructs a new instance of the NodeRequestContext class, which requires an instance of AsyncLocalStorage to manage the request context. The AsyncLocalStorage instance is used to create and access the context for each request, allowing for the storage of identity information and other relevant data that needs to be accessible across asynchronous operations. This constructor initializes the NodeRequestContext with the provided AsyncLocalStorage, enabling it to implement the methods defined in the IRequestContext interface for managing request-specific context data.
@@ -2285,7 +2529,7 @@ var init_request_context = __esm({
2285
2529
  }
2286
2530
  updateIdentity(identity) {
2287
2531
  const store = this._storage.getStore();
2288
- if (import_shared49.Guards.isDefined(store) && import_shared49.Guards.isDefined(store.context)) {
2532
+ if (import_shared54.Guards.isDefined(store) && import_shared54.Guards.isDefined(store.context)) {
2289
2533
  store.context = Object.freeze({
2290
2534
  ...store.context,
2291
2535
  identity: Object.freeze(identity)
@@ -2294,23 +2538,23 @@ var init_request_context = __esm({
2294
2538
  }
2295
2539
  getContext() {
2296
2540
  const store = this._storage.getStore();
2297
- if (!import_shared49.Guards.isDefined(store)) return void 0;
2541
+ if (!import_shared54.Guards.isDefined(store)) return void 0;
2298
2542
  const context = store.context;
2299
2543
  return Object.freeze(context);
2300
2544
  }
2301
2545
  getIdentity() {
2302
2546
  const store = this._storage.getStore();
2303
- if (!import_shared49.Guards.isDefined(store)) return void 0;
2547
+ if (!import_shared54.Guards.isDefined(store)) return void 0;
2304
2548
  return Object.freeze(store.context?.identity);
2305
2549
  }
2306
2550
  getScope() {
2307
2551
  const store = this._storage.getStore();
2308
- if (!import_shared49.Guards.isDefined(store)) return void 0;
2552
+ if (!import_shared54.Guards.isDefined(store)) return void 0;
2309
2553
  return store.scope;
2310
2554
  }
2311
2555
  getNetworkContext() {
2312
2556
  const store = this._storage.getStore();
2313
- if (!import_shared49.Guards.isDefined(store)) return void 0;
2557
+ if (!import_shared54.Guards.isDefined(store)) return void 0;
2314
2558
  return Object.freeze(store.context?.network);
2315
2559
  }
2316
2560
  };
@@ -2383,18 +2627,18 @@ var init_sql_light_db_client_factory = __esm({
2383
2627
  });
2384
2628
 
2385
2629
  // src/infrastructure/factories/supabase.factory.ts
2386
- var import_ssr, import_shared50, SupabaseServerAuthFactory;
2630
+ var import_ssr, import_shared55, SupabaseServerAuthFactory;
2387
2631
  var init_supabase_factory = __esm({
2388
2632
  "src/infrastructure/factories/supabase.factory.ts"() {
2389
2633
  "use strict";
2390
2634
  import_ssr = require("@supabase/ssr");
2391
- import_shared50 = require("@xeno-js/shared");
2635
+ import_shared55 = require("@xeno-js/shared");
2392
2636
  SupabaseServerAuthFactory = class {
2393
2637
  create({
2394
2638
  config,
2395
2639
  container
2396
2640
  }) {
2397
- if (!import_shared50.Guards.isDefined(config.ssrOpts)) {
2641
+ if (!import_shared55.Guards.isDefined(config.ssrOpts)) {
2398
2642
  throw new Error("ISsrCookieHandler is required for @supabase/ssr initialization.");
2399
2643
  }
2400
2644
  const cookieService = config.ssrOpts(container);
@@ -2409,9 +2653,9 @@ var init_supabase_factory = __esm({
2409
2653
  }
2410
2654
  }
2411
2655
  });
2412
- const mapper = new import_shared50.SupabaseClaimsMapper();
2413
- const sessionMapper = new import_shared50.SupabaseSessionMapper(mapper);
2414
- return new import_shared50.SupabaseAuthService(client, mapper, sessionMapper, config);
2656
+ const mapper = new import_shared55.SupabaseClaimsMapper();
2657
+ const sessionMapper = new import_shared55.SupabaseSessionMapper(mapper);
2658
+ return new import_shared55.SupabaseAuthService(client, mapper, sessionMapper, config);
2415
2659
  }
2416
2660
  };
2417
2661
  }
@@ -2422,11 +2666,11 @@ var user_context_factory_exports = {};
2422
2666
  __export(user_context_factory_exports, {
2423
2667
  UserContextFactory: () => UserContextFactory
2424
2668
  });
2425
- var import_shared51, UserContextFactory;
2669
+ var import_shared56, UserContextFactory;
2426
2670
  var init_user_context_factory = __esm({
2427
2671
  "src/infrastructure/factories/user-context.factory.ts"() {
2428
2672
  "use strict";
2429
- import_shared51 = require("@xeno-js/shared");
2673
+ import_shared56 = require("@xeno-js/shared");
2430
2674
  UserContextFactory = class {
2431
2675
  /**
2432
2676
  * @description Constructs an instance of UserContextFactory.
@@ -2447,7 +2691,7 @@ var init_user_context_factory = __esm({
2447
2691
  tenantId: void 0
2448
2692
  };
2449
2693
  const identity = this._identityFactory.getIdentity();
2450
- if (import_shared51.Guards.isDefined(identity)) {
2694
+ if (import_shared56.Guards.isDefined(identity)) {
2451
2695
  output.userId = identity.userId;
2452
2696
  output.tenantId = identity.tenantId;
2453
2697
  }
@@ -2462,14 +2706,14 @@ var zod_validator_factory_exports = {};
2462
2706
  __export(zod_validator_factory_exports, {
2463
2707
  ZodValidatorFactory: () => ZodValidatorFactory
2464
2708
  });
2465
- var import_shared52, ZodValidatorFactory;
2709
+ var import_shared57, ZodValidatorFactory;
2466
2710
  var init_zod_validator_factory = __esm({
2467
2711
  "src/infrastructure/factories/zod-validator.factory.ts"() {
2468
2712
  "use strict";
2469
- import_shared52 = require("@xeno-js/shared");
2713
+ import_shared57 = require("@xeno-js/shared");
2470
2714
  ZodValidatorFactory = class {
2471
2715
  create(opts) {
2472
- const validatorService = new import_shared52.ZodValidatorService(/* @__PURE__ */ new Map(), opts.logger);
2716
+ const validatorService = new import_shared57.ZodValidatorService(/* @__PURE__ */ new Map(), opts.logger);
2473
2717
  for (const [intentKey, schema] of Object.entries(opts.schemas)) {
2474
2718
  validatorService.addSchema(intentKey, schema);
2475
2719
  }
@@ -2540,8 +2784,8 @@ var init_auth_utils = __esm({
2540
2784
  const { TOKENS: TOKENS4 } = await import("@xeno-js/shared");
2541
2785
  const pipelines = [];
2542
2786
  const strategies = [];
2543
- const { Guards: Guards39 } = await import("@xeno-js/shared");
2544
- if (Guards39.isDefined(opts.policies)) {
2787
+ const { Guards: Guards45 } = await import("@xeno-js/shared");
2788
+ if (Guards45.isDefined(opts.policies)) {
2545
2789
  const { PolicyRegistry: PolicyRegistry2 } = await Promise.resolve().then(() => (init_application(), application_exports));
2546
2790
  container.addSingleton(TOKENS4.POLICY_REGISTRY, () => new PolicyRegistry2());
2547
2791
  const policyRegistry = opts.policies;
@@ -2550,16 +2794,16 @@ var init_auth_utils = __esm({
2550
2794
  for (const [intent, policy] of Object.entries(policyRegistry)) {
2551
2795
  const intentLower = intent.toLowerCase();
2552
2796
  registryInstance.addPolicy(intentLower, policy);
2553
- if (!Guards39.isNullOrEmpty(policy.roles)) {
2797
+ if (!Guards45.isNullOrEmpty(policy.roles)) {
2554
2798
  Policies.add("roles");
2555
2799
  }
2556
- if (!Guards39.isNullOrEmpty(policy.permissions)) {
2800
+ if (!Guards45.isNullOrEmpty(policy.permissions)) {
2557
2801
  Policies.add("permissions");
2558
2802
  }
2559
- if (!Guards39.isNullOrEmpty(policy.userId)) {
2803
+ if (!Guards45.isNullOrEmpty(policy.userId)) {
2560
2804
  Policies.add("userId");
2561
2805
  }
2562
- if (!Guards39.isNullOrEmpty(policy.tenantId)) {
2806
+ if (!Guards45.isNullOrEmpty(policy.tenantId)) {
2563
2807
  Policies.add("tenantId");
2564
2808
  }
2565
2809
  }
@@ -2608,10 +2852,10 @@ var init_auth_utils = __esm({
2608
2852
  strategies.push(TOKENS4.TENANT_AUTHORIZATION_PIPELINE);
2609
2853
  }
2610
2854
  }
2611
- if (!Guards39.isNullOrEmpty(opts.customAuthorizationStrategy)) {
2855
+ if (!Guards45.isNullOrEmpty(opts.customAuthorizationStrategy)) {
2612
2856
  const customStrategies = opts.customAuthorizationStrategy;
2613
2857
  customStrategies.forEach((strategyToken, index) => {
2614
- if (Guards39.isDefined(strategyToken)) {
2858
+ if (Guards45.isDefined(strategyToken)) {
2615
2859
  const token = `CUSTOM_AUTHORIZATION_STRATEGY_${index}`;
2616
2860
  container.addSingleton(token, (c) => {
2617
2861
  return strategyToken(c);
@@ -2753,12 +2997,12 @@ var unit_of_work_exports = {};
2753
2997
  __export(unit_of_work_exports, {
2754
2998
  UnitOfWork: () => UnitOfWork
2755
2999
  });
2756
- var import_shared53, import_shared54, UnitOfWork;
3000
+ var import_shared58, import_shared59, UnitOfWork;
2757
3001
  var init_unit_of_work = __esm({
2758
3002
  "src/infrastructure/transaction/unit-of-work.ts"() {
2759
3003
  "use strict";
2760
- import_shared53 = require("@xeno-js/shared");
2761
- import_shared54 = require("@xeno-js/shared");
3004
+ import_shared58 = require("@xeno-js/shared");
3005
+ import_shared59 = require("@xeno-js/shared");
2762
3006
  UnitOfWork = class {
2763
3007
  /**
2764
3008
  * Creates an instance of UnitOfWork.
@@ -2777,7 +3021,7 @@ var init_unit_of_work = __esm({
2777
3021
  _dbContext;
2778
3022
  _ttx;
2779
3023
  async runInTransaction(callback, signal) {
2780
- import_shared53.AppError.throwIfAborted(signal, "UnitOfWork.runInTransaction");
3024
+ import_shared58.AppError.throwIfAborted(signal, "UnitOfWork.runInTransaction");
2781
3025
  return this._dbContext.transaction(async (tx) => {
2782
3026
  this._ttx.state = tx;
2783
3027
  try {
@@ -2789,9 +3033,9 @@ var init_unit_of_work = __esm({
2789
3033
  });
2790
3034
  }
2791
3035
  async dispose() {
2792
- if (import_shared54.Guards.isDefined(this._ttx.state)) {
3036
+ if (import_shared59.Guards.isDefined(this._ttx.state)) {
2793
3037
  try {
2794
- if (import_shared54.Guards.hasMethod(this._ttx.state, "rollback")) {
3038
+ if (import_shared59.Guards.hasMethod(this._ttx.state, "rollback")) {
2795
3039
  await this._ttx.state.rollback();
2796
3040
  }
2797
3041
  } finally {
@@ -2814,7 +3058,7 @@ var init_db_module = __esm({
2814
3058
  "use strict";
2815
3059
  DbModule = class {
2816
3060
  async configure(container, opts) {
2817
- const { Guards: Guards39, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
3061
+ const { Guards: Guards45, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
2818
3062
  const { DbUtils: DbUtils2 } = await Promise.resolve().then(() => (init_db_utils(), db_utils_exports));
2819
3063
  const db = opts.enableSqlLite ? await DbUtils2.addSqlLite(opts) : await DbUtils2.addDbClient(opts);
2820
3064
  const { TransactionState: TransactionState2 } = await Promise.resolve().then(() => (init_transaction_state(), transaction_state_exports));
@@ -2831,7 +3075,7 @@ var init_db_module = __esm({
2831
3075
  return new Proxy(db, {
2832
3076
  get(_target, prop, receiver) {
2833
3077
  const activeState = ttx.state;
2834
- if (Guards39.isDefined(activeState)) {
3078
+ if (Guards45.isDefined(activeState)) {
2835
3079
  if (prop === "transaction") {
2836
3080
  return activeState.transaction.bind(activeState);
2837
3081
  }
@@ -2868,14 +3112,14 @@ var init_http_utils = __esm({
2868
3112
  */
2869
3113
  async addAxios(container, opts) {
2870
3114
  const { NodeAxiosFactory: NodeAxiosFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
2871
- const { Guards: Guards39 } = await import("@xeno-js/shared");
2872
- if (!Guards39.isDefined(opts.token)) {
3115
+ const { Guards: Guards45 } = await import("@xeno-js/shared");
3116
+ if (!Guards45.isDefined(opts.token)) {
2873
3117
  throw new Error("HttpConfig.token is required and must be defined.");
2874
3118
  }
2875
3119
  container.addSingleton(opts.token, () => {
2876
3120
  const factory = new NodeAxiosFactory2();
2877
3121
  const instance = factory.create(opts.client);
2878
- if (!Guards39.hasMethod(instance, "get") || !Guards39.hasMethod(instance, "post") || !Guards39.hasMethod(instance, "put") || !Guards39.hasMethod(instance, "patch") || !Guards39.hasMethod(instance, "delete")) {
3122
+ if (!Guards45.hasMethod(instance, "get") || !Guards45.hasMethod(instance, "post") || !Guards45.hasMethod(instance, "put") || !Guards45.hasMethod(instance, "patch") || !Guards45.hasMethod(instance, "delete")) {
2879
3123
  throw new Error(
2880
3124
  "The created HTTP client instance does not implement the required methods of IHttpClient."
2881
3125
  );
@@ -2902,8 +3146,8 @@ var init_http_utils = __esm({
2902
3146
  });
2903
3147
  },
2904
3148
  async addAllowOrigin(container, opts) {
2905
- const { Guards: Guards39 } = await import("@xeno-js/shared");
2906
- if (Guards39.isNullOrEmpty(opts)) throw new Error("At least an allow origin must be passed");
3149
+ const { Guards: Guards45 } = await import("@xeno-js/shared");
3150
+ if (Guards45.isNullOrEmpty(opts)) throw new Error("At least an allow origin must be passed");
2907
3151
  const { TOKENS: TOKENS4 } = await import("@xeno-js/shared");
2908
3152
  const { AllowOrigin: AllowOrigin2 } = await Promise.resolve().then(() => (init_services(), services_exports));
2909
3153
  const allowOrigin = [];
@@ -2963,13 +3207,13 @@ var init_validation_utils = __esm({
2963
3207
  * @link https://github.com/xeno-js/xeno-js
2964
3208
  */
2965
3209
  async addValidation(container, opts, logger) {
2966
- const { Guards: Guards39, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
2967
- if (!Guards39.isDefined(opts.zod) && Guards39.isNullOrEmpty(opts.customValidationStrategy)) {
3210
+ const { Guards: Guards45, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
3211
+ if (!Guards45.isDefined(opts.zod) && Guards45.isNullOrEmpty(opts.customValidationStrategy)) {
2968
3212
  return [];
2969
3213
  }
2970
3214
  const pipelines = [];
2971
3215
  const validationStrategies = [];
2972
- if (Guards39.isDefined(opts.zod)) {
3216
+ if (Guards45.isDefined(opts.zod)) {
2973
3217
  const config = opts.zod;
2974
3218
  const { ZodValidatorFactory: ZodValidatorFactory2 } = await Promise.resolve().then(() => (init_zod_validator_factory(), zod_validator_factory_exports));
2975
3219
  container.addSingleton(TOKENS4.ZOD_VALIDATOR, () => {
@@ -2983,9 +3227,9 @@ var init_validation_utils = __esm({
2983
3227
  validationStrategies.push(TOKENS4.SCHEMA_VALIDATION_STRATEGY);
2984
3228
  }
2985
3229
  const customValidationFactory = [];
2986
- if (!Guards39.isNullOrEmpty(opts.customValidationStrategy)) {
3230
+ if (!Guards45.isNullOrEmpty(opts.customValidationStrategy)) {
2987
3231
  for (const strategyToken of opts.customValidationStrategy) {
2988
- if (Guards39.isDefined(strategyToken)) {
3232
+ if (Guards45.isDefined(strategyToken)) {
2989
3233
  customValidationFactory.push(strategyToken);
2990
3234
  }
2991
3235
  }
@@ -3010,11 +3254,11 @@ var idempotency_store_exports = {};
3010
3254
  __export(idempotency_store_exports, {
3011
3255
  IdempotencyStore: () => IdempotencyStore
3012
3256
  });
3013
- var import_shared55, IdempotencyStore;
3257
+ var import_shared60, IdempotencyStore;
3014
3258
  var init_idempotency_store = __esm({
3015
3259
  "src/infrastructure/idempotency/idempotency-store.ts"() {
3016
3260
  "use strict";
3017
- import_shared55 = require("@xeno-js/shared");
3261
+ import_shared60 = require("@xeno-js/shared");
3018
3262
  IdempotencyStore = class {
3019
3263
  /**
3020
3264
  * @description Constructs a new instance of IdempotencyStore, accepting an instance of ICache for accessing the caching system and an instance of IIdentityAccessor for obtaining the user's identity context. The IdempotencyStore uses the caching system to manage locks and results of idempotent commands, ensuring that commands with the same ID are processed only once. The identity context is used to build contextual keys, allowing for more granular management of idempotent commands in multi-tenant scenarios.
@@ -3036,31 +3280,31 @@ var init_idempotency_store = __esm({
3036
3280
  async acquireLock(requestId, ttlSeconds) {
3037
3281
  const key = this._cacheKeyBuilder.buildContextualKey(`command:${requestId}`);
3038
3282
  return await this._cache.setIfAbsent(
3039
- `${import_shared55.IDEMPOTENCY_CONSTANTS.LOCK_KEY_PREFIX}${key}`,
3040
- import_shared55.IDEMPOTENCY_CONSTANTS.LOCKED_VALUE,
3283
+ `${import_shared60.IDEMPOTENCY_CONSTANTS.LOCK_KEY_PREFIX}${key}`,
3284
+ import_shared60.IDEMPOTENCY_CONSTANTS.LOCKED_VALUE,
3041
3285
  ttlSeconds
3042
3286
  );
3043
3287
  }
3044
3288
  async hasBeenProcessed(commandId) {
3045
3289
  const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
3046
- return await this._cache.has(`${import_shared55.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`);
3290
+ return await this._cache.has(`${import_shared60.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`);
3047
3291
  }
3048
3292
  async markAsProcessed(commandId, payload, ttlSeconds) {
3049
3293
  const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
3050
3294
  await this._cache.set(
3051
- `${import_shared55.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`,
3295
+ `${import_shared60.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`,
3052
3296
  payload,
3053
3297
  ttlSeconds
3054
3298
  );
3055
3299
  }
3056
3300
  async getPayload(commandId) {
3057
3301
  const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
3058
- const payload = await this._cache.get(`${import_shared55.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`);
3302
+ const payload = await this._cache.get(`${import_shared60.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`);
3059
3303
  return payload;
3060
3304
  }
3061
3305
  async releaseLock(commandId) {
3062
3306
  const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
3063
- await this._cache.remove(`${import_shared55.IDEMPOTENCY_CONSTANTS.LOCK_KEY_PREFIX}${key}`);
3307
+ await this._cache.remove(`${import_shared60.IDEMPOTENCY_CONSTANTS.LOCK_KEY_PREFIX}${key}`);
3064
3308
  }
3065
3309
  };
3066
3310
  }
@@ -3088,8 +3332,8 @@ var init_pipeline_utils = __esm({
3088
3332
  */
3089
3333
  async addCommand(container, opts) {
3090
3334
  const pipelines = [];
3091
- const { Guards: Guards39, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
3092
- if (Guards39.isDefined(opts.idempotency)) {
3335
+ const { Guards: Guards45, TOKENS: TOKENS4 } = await import("@xeno-js/shared");
3336
+ if (Guards45.isDefined(opts.idempotency)) {
3093
3337
  const { IdempotencyStore: IdempotencyStore2 } = await Promise.resolve().then(() => (init_idempotency_store(), idempotency_store_exports));
3094
3338
  container.addSingleton(
3095
3339
  TOKENS4.IDEMPOTENCY_STORE,
@@ -3109,7 +3353,7 @@ var init_pipeline_utils = __esm({
3109
3353
  });
3110
3354
  pipelines.push(TOKENS4.IDEMPOTENCY_PIPELINE);
3111
3355
  }
3112
- if (Guards39.isDefined(opts.concurrency)) {
3356
+ if (Guards45.isDefined(opts.concurrency)) {
3113
3357
  const { ConcurrencyRetryPipeline: ConcurrencyRetryPipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
3114
3358
  container.addSingleton(TOKENS4.CONCURRENCY_RETRY_PIPELINE, () => {
3115
3359
  const config = opts.concurrency;
@@ -3189,13 +3433,13 @@ var init_cqrs_module = __esm({
3189
3433
  return new PerformancePipeline2(logger, thresholdMs);
3190
3434
  });
3191
3435
  pipelines.push(TOKENS4.PERFORMANCE_PIPELINE);
3192
- const { Guards: Guards39 } = await import("@xeno-js/shared");
3193
- if (Guards39.isDefined(opts.authorization.policies) || Guards39.isDefined(opts.authorization.customAuthorizationStrategy)) {
3436
+ const { Guards: Guards45 } = await import("@xeno-js/shared");
3437
+ if (Guards45.isDefined(opts.authorization.policies) || Guards45.isDefined(opts.authorization.customAuthorizationStrategy)) {
3194
3438
  const { AuthUtils: AuthUtils2 } = await Promise.resolve().then(() => (init_auth_utils(), auth_utils_exports));
3195
3439
  const authPipelines = await AuthUtils2.addAuthZ(container, opts.authorization);
3196
3440
  pipelines.push(...authPipelines);
3197
3441
  }
3198
- if (Guards39.isDefined(opts.validation.zod) || Guards39.isDefined(opts.validation.customValidationStrategy)) {
3442
+ if (Guards45.isDefined(opts.validation.zod) || Guards45.isDefined(opts.validation.customValidationStrategy)) {
3199
3443
  const { ValidationUtils: ValidationUtils2 } = await Promise.resolve().then(() => (init_validation_utils(), validation_utils_exports));
3200
3444
  const logger = container.resolve(TOKENS4.LOGGER);
3201
3445
  const validationPipelines = await ValidationUtils2.addValidation(
@@ -3207,11 +3451,11 @@ var init_cqrs_module = __esm({
3207
3451
  }
3208
3452
  const commandPipelines = pipelines;
3209
3453
  const queryPipelines = pipelines;
3210
- if ((Guards39.isDefined(opts.commandBus.idempotency) || opts.queryBus.isEnabled) && opts.isCache) {
3454
+ if ((Guards45.isDefined(opts.commandBus.idempotency) || opts.queryBus.isEnabled) && opts.isCache) {
3211
3455
  const { CacheUtils: CacheUtils2 } = await Promise.resolve().then(() => (init_cache_utils(), cache_utils_exports));
3212
3456
  await CacheUtils2.addCache(container, { inMemory: true, redis: void 0 });
3213
3457
  }
3214
- if (Guards39.isDefined(opts.commandBus.idempotency) || Guards39.isDefined(opts.commandBus.concurrency)) {
3458
+ if (Guards45.isDefined(opts.commandBus.idempotency) || Guards45.isDefined(opts.commandBus.concurrency)) {
3215
3459
  const { PipelineUtils: PipelineUtils2 } = await Promise.resolve().then(() => (init_pipeline_utils(), pipeline_utils_exports));
3216
3460
  const newCommandPipelines = await PipelineUtils2.addCommand(container, {
3217
3461
  ...opts.commandBus,
@@ -3244,11 +3488,11 @@ var init_cqrs_module = __esm({
3244
3488
  });
3245
3489
 
3246
3490
  // src/presentation/controllers/base.controller.ts
3247
- var import_shared56, BaseController;
3491
+ var import_shared61, BaseController;
3248
3492
  var init_base_controller = __esm({
3249
3493
  "src/presentation/controllers/base.controller.ts"() {
3250
3494
  "use strict";
3251
- import_shared56 = require("@xeno-js/shared");
3495
+ import_shared61 = require("@xeno-js/shared");
3252
3496
  BaseController = class {
3253
3497
  /**
3254
3498
  * Constructs a new instance of the BaseController class.
@@ -3280,7 +3524,7 @@ var init_base_controller = __esm({
3280
3524
  * @link https://github.com/xeno-js/xeno-js
3281
3525
  */
3282
3526
  ok(data, status = 200, meta = {}, headers = {}) {
3283
- return import_shared56.HttpHelper.success(data, status, meta, headers);
3527
+ return import_shared61.HttpHelper.success(data, status, meta, headers);
3284
3528
  }
3285
3529
  /**
3286
3530
  * Helper to automatically map a failed Result (from the CQRS pipeline)
@@ -3298,7 +3542,7 @@ var init_base_controller = __esm({
3298
3542
  fail(error, details = void 0, headers = {}) {
3299
3543
  const context = this._requestContext.getContext();
3300
3544
  const customHeaders = error["header"];
3301
- return import_shared56.HttpHelper.error(
3545
+ return import_shared61.HttpHelper.error(
3302
3546
  {
3303
3547
  success: false,
3304
3548
  error: {
@@ -3307,9 +3551,9 @@ var init_base_controller = __esm({
3307
3551
  path: context?.network.path,
3308
3552
  details: details ?? error.message
3309
3553
  },
3310
- correlationId: context?.tracing.correlationId ?? import_shared56.GuidHelper.generate(),
3311
- requestId: context?.network.requestId ?? import_shared56.GuidHelper.generate(),
3312
- spanId: context?.tracing.spanId ?? import_shared56.GuidHelper.generate(),
3554
+ correlationId: context?.tracing.correlationId ?? import_shared61.GuidHelper.generate(),
3555
+ requestId: context?.network.requestId ?? import_shared61.GuidHelper.generate(),
3556
+ spanId: context?.tracing.spanId ?? import_shared61.GuidHelper.generate(),
3313
3557
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3314
3558
  },
3315
3559
  error.status,
@@ -3364,11 +3608,11 @@ var init_controllers = __esm({
3364
3608
  });
3365
3609
 
3366
3610
  // src/presentation/middlewares/allow-method.middleware.ts
3367
- var import_shared57, MethodCheckMiddleware;
3611
+ var import_shared62, MethodCheckMiddleware;
3368
3612
  var init_allow_method_middleware = __esm({
3369
3613
  "src/presentation/middlewares/allow-method.middleware.ts"() {
3370
3614
  "use strict";
3371
- import_shared57 = require("@xeno-js/shared");
3615
+ import_shared62 = require("@xeno-js/shared");
3372
3616
  MethodCheckMiddleware = class {
3373
3617
  constructor(_requestContext, _allowMethod) {
3374
3618
  this._requestContext = _requestContext;
@@ -3380,21 +3624,21 @@ var init_allow_method_middleware = __esm({
3380
3624
  const isAllowed = this._allowMethod.check(req.path, req.method);
3381
3625
  if (!isAllowed) {
3382
3626
  const { network, tracing } = this._requestContext.getContext() ?? {};
3383
- return import_shared57.HttpHelper.error(
3627
+ return import_shared62.HttpHelper.error(
3384
3628
  {
3385
3629
  success: false,
3386
3630
  error: {
3387
- code: import_shared57.ERROR_CODES.NOT_ALLOWED,
3388
- message: import_shared57.ERROR_CODE_MESSAGES[import_shared57.ERROR_CODES.NOT_ALLOWED],
3631
+ code: import_shared62.ERROR_CODES.NOT_ALLOWED,
3632
+ message: import_shared62.ERROR_CODE_MESSAGES[import_shared62.ERROR_CODES.NOT_ALLOWED],
3389
3633
  details: `Operation blocked by allow method middleware`,
3390
3634
  path: req.path
3391
3635
  },
3392
- correlationId: tracing?.correlationId ?? import_shared57.GuidHelper.generate(),
3393
- requestId: network?.requestId ?? import_shared57.GuidHelper.generate(),
3394
- spanId: tracing?.spanId ?? import_shared57.GuidHelper.generate(),
3636
+ correlationId: tracing?.correlationId ?? import_shared62.GuidHelper.generate(),
3637
+ requestId: network?.requestId ?? import_shared62.GuidHelper.generate(),
3638
+ spanId: tracing?.spanId ?? import_shared62.GuidHelper.generate(),
3395
3639
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3396
3640
  },
3397
- import_shared57.STATUS_CODES.NOT_ALLOWED
3641
+ import_shared62.STATUS_CODES.NOT_ALLOWED
3398
3642
  );
3399
3643
  }
3400
3644
  return await next();
@@ -3404,11 +3648,11 @@ var init_allow_method_middleware = __esm({
3404
3648
  });
3405
3649
 
3406
3650
  // src/presentation/middlewares/allow-origin.middleware.ts
3407
- var import_shared58, AllowOriginMiddleware;
3651
+ var import_shared63, AllowOriginMiddleware;
3408
3652
  var init_allow_origin_middleware = __esm({
3409
3653
  "src/presentation/middlewares/allow-origin.middleware.ts"() {
3410
3654
  "use strict";
3411
- import_shared58 = require("@xeno-js/shared");
3655
+ import_shared63 = require("@xeno-js/shared");
3412
3656
  AllowOriginMiddleware = class {
3413
3657
  constructor(_allowOrigin, _requestContext, _logger) {
3414
3658
  this._allowOrigin = _allowOrigin;
@@ -3423,21 +3667,21 @@ var init_allow_origin_middleware = __esm({
3423
3667
  const origin = network?.origin;
3424
3668
  if (!this._allowOrigin.isAllowed(origin)) {
3425
3669
  this._logger.warn(`Access denied by AllowOrigin policy for origin: ${origin ?? "unknown"}`);
3426
- return import_shared58.HttpHelper.error(
3670
+ return import_shared63.HttpHelper.error(
3427
3671
  {
3428
3672
  success: false,
3429
3673
  error: {
3430
- code: import_shared58.ERROR_CODES.FORBIDDEN,
3431
- message: import_shared58.ERROR_CODE_MESSAGES[import_shared58.ERROR_CODES.FORBIDDEN],
3674
+ code: import_shared63.ERROR_CODES.FORBIDDEN,
3675
+ message: import_shared63.ERROR_CODE_MESSAGES[import_shared63.ERROR_CODES.FORBIDDEN],
3432
3676
  details: `The origin '${origin ?? "unknown"}' is not allowed to access this resource.`,
3433
3677
  path: req.path
3434
3678
  },
3435
- correlationId: tracing?.correlationId ?? import_shared58.GuidHelper.generate(),
3436
- requestId: network?.requestId ?? import_shared58.GuidHelper.generate(),
3437
- spanId: tracing?.spanId ?? import_shared58.GuidHelper.generate(),
3679
+ correlationId: tracing?.correlationId ?? import_shared63.GuidHelper.generate(),
3680
+ requestId: network?.requestId ?? import_shared63.GuidHelper.generate(),
3681
+ spanId: tracing?.spanId ?? import_shared63.GuidHelper.generate(),
3438
3682
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3439
3683
  },
3440
- import_shared58.STATUS_CODES.FORBIDDEN
3684
+ import_shared63.STATUS_CODES.FORBIDDEN
3441
3685
  );
3442
3686
  }
3443
3687
  return next();
@@ -3447,11 +3691,11 @@ var init_allow_origin_middleware = __esm({
3447
3691
  });
3448
3692
 
3449
3693
  // src/presentation/middlewares/auth.middleware.ts
3450
- var import_shared59, AuthenticationMiddleware;
3694
+ var import_shared64, AuthenticationMiddleware;
3451
3695
  var init_auth_middleware = __esm({
3452
3696
  "src/presentation/middlewares/auth.middleware.ts"() {
3453
3697
  "use strict";
3454
- import_shared59 = require("@xeno-js/shared");
3698
+ import_shared64 = require("@xeno-js/shared");
3455
3699
  AuthenticationMiddleware = class {
3456
3700
  constructor(_requestContext, _tokenExtractor, _gateKeeper, _logger) {
3457
3701
  this._requestContext = _requestContext;
@@ -3472,7 +3716,7 @@ var init_auth_middleware = __esm({
3472
3716
  `Authentication failed for request on path: ${req.path}. Code: ${error.code}. Error: ${error}`
3473
3717
  );
3474
3718
  const { network, tracing } = this._requestContext.getContext() ?? {};
3475
- return import_shared59.HttpHelper.error(
3719
+ return import_shared64.HttpHelper.error(
3476
3720
  {
3477
3721
  success: false,
3478
3722
  error: {
@@ -3481,12 +3725,12 @@ var init_auth_middleware = __esm({
3481
3725
  details: `[Authentication Error] Failed to authenticate request on path: ${req.path}`,
3482
3726
  path: req.path
3483
3727
  },
3484
- correlationId: tracing?.correlationId ?? import_shared59.GuidHelper.generate(),
3485
- requestId: network?.requestId ?? import_shared59.GuidHelper.generate(),
3486
- spanId: tracing?.spanId ?? import_shared59.GuidHelper.generate(),
3728
+ correlationId: tracing?.correlationId ?? import_shared64.GuidHelper.generate(),
3729
+ requestId: network?.requestId ?? import_shared64.GuidHelper.generate(),
3730
+ spanId: tracing?.spanId ?? import_shared64.GuidHelper.generate(),
3487
3731
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3488
3732
  },
3489
- error.status ?? import_shared59.STATUS_CODES.UNAUTHORIZED,
3733
+ error.status ?? import_shared64.STATUS_CODES.UNAUTHORIZED,
3490
3734
  { "Content-Type": [network?.formatIndicator ?? "application/json"] }
3491
3735
  );
3492
3736
  }
@@ -3521,11 +3765,11 @@ var init_composite_middleware = __esm({
3521
3765
  });
3522
3766
 
3523
3767
  // src/presentation/middlewares/cors.middleware.ts
3524
- var import_shared60, CORSMiddleware;
3768
+ var import_shared65, CORSMiddleware;
3525
3769
  var init_cors_middleware = __esm({
3526
3770
  "src/presentation/middlewares/cors.middleware.ts"() {
3527
3771
  "use strict";
3528
- import_shared60 = require("@xeno-js/shared");
3772
+ import_shared65 = require("@xeno-js/shared");
3529
3773
  CORSMiddleware = class {
3530
3774
  constructor(_requestContext) {
3531
3775
  this._requestContext = _requestContext;
@@ -3535,7 +3779,7 @@ var init_cors_middleware = __esm({
3535
3779
  const { network } = this._requestContext.getContext() ?? {};
3536
3780
  const origin = network?.origin;
3537
3781
  const response = await next();
3538
- if (import_shared60.Guards.isDefined(origin))
3782
+ if (import_shared65.Guards.isDefined(origin))
3539
3783
  response.headers = {
3540
3784
  ...response.headers ?? {},
3541
3785
  "Access-Control-Allow-Origin": origin,
@@ -3549,44 +3793,86 @@ var init_cors_middleware = __esm({
3549
3793
  });
3550
3794
 
3551
3795
  // src/presentation/middlewares/csrf.middleware.ts
3552
- var import_shared61, CsrfMiddleware;
3796
+ var import_shared66, CsrfMiddleware;
3553
3797
  var init_csrf_middleware = __esm({
3554
3798
  "src/presentation/middlewares/csrf.middleware.ts"() {
3555
3799
  "use strict";
3556
- import_shared61 = require("@xeno-js/shared");
3800
+ import_shared66 = require("@xeno-js/shared");
3557
3801
  CsrfMiddleware = class {
3558
- constructor(_requestContext, _csrf) {
3802
+ constructor(_requestContext, _csrfTokenService) {
3559
3803
  this._requestContext = _requestContext;
3560
- this._csrf = _csrf;
3804
+ this._csrfTokenService = _csrfTokenService;
3561
3805
  }
3562
3806
  _requestContext;
3563
- _csrf;
3564
- /**
3565
- * @param requestContext Dati base della richiesta (metodo, path)
3566
- * @param headers Header HTTP della richiesta
3567
- * @param next Funzione delegata per passare al middleware successivo
3568
- */
3807
+ _csrfTokenService;
3569
3808
  async execute(req, _headers, next) {
3570
3809
  const method = req.method.toUpperCase();
3571
3810
  const isStateChanging = ["POST", "PUT", "DELETE", "PATCH"].includes(method);
3572
3811
  if (isStateChanging) {
3573
- const { network, tracing } = this._requestContext.getContext() ?? {};
3574
- if (!import_shared61.Guards.isDefined(network?.csrf) || network.csrf.toLowerCase() !== this._csrf.toLowerCase()) {
3575
- return import_shared61.HttpHelper.error(
3812
+ const { network, tracing, identity } = this._requestContext.getContext() ?? {};
3813
+ const headerToken = network?.csrf;
3814
+ const cookieToken = network?.csrfCookie;
3815
+ if (!import_shared66.Guards.isDefined(headerToken) || !import_shared66.Guards.isDefined(cookieToken)) {
3816
+ return import_shared66.HttpHelper.error(
3817
+ {
3818
+ success: false,
3819
+ error: {
3820
+ code: import_shared66.ERROR_CODES.FORBIDDEN,
3821
+ message: import_shared66.ERROR_CODE_MESSAGES[import_shared66.ERROR_CODES.FORBIDDEN],
3822
+ details: "CSRF token missing",
3823
+ path: req.path
3824
+ },
3825
+ correlationId: tracing?.correlationId ?? import_shared66.GuidHelper.generate(),
3826
+ requestId: network?.requestId ?? import_shared66.GuidHelper.generate(),
3827
+ spanId: tracing?.spanId ?? import_shared66.GuidHelper.generate(),
3828
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
3829
+ },
3830
+ import_shared66.STATUS_CODES.FORBIDDEN,
3831
+ {
3832
+ "Content-Type": [network?.formatIndicator ?? "application/json"]
3833
+ }
3834
+ );
3835
+ }
3836
+ if (headerToken !== cookieToken) {
3837
+ return import_shared66.HttpHelper.error(
3838
+ {
3839
+ success: false,
3840
+ error: {
3841
+ code: import_shared66.ERROR_CODES.FORBIDDEN,
3842
+ message: import_shared66.ERROR_CODE_MESSAGES[import_shared66.ERROR_CODES.FORBIDDEN],
3843
+ details: "CSRF token mismatch",
3844
+ path: req.path
3845
+ },
3846
+ correlationId: tracing?.correlationId ?? import_shared66.GuidHelper.generate(),
3847
+ requestId: network?.requestId ?? import_shared66.GuidHelper.generate(),
3848
+ spanId: tracing?.spanId ?? import_shared66.GuidHelper.generate(),
3849
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
3850
+ },
3851
+ import_shared66.STATUS_CODES.FORBIDDEN,
3852
+ {
3853
+ "Content-Type": [network?.formatIndicator ?? "application/json"]
3854
+ }
3855
+ );
3856
+ }
3857
+ if (!import_shared66.Guards.isDefined(identity?.userId) || !await this._csrfTokenService.validate(
3858
+ headerToken,
3859
+ identity?.userId
3860
+ )) {
3861
+ return import_shared66.HttpHelper.error(
3576
3862
  {
3577
3863
  success: false,
3578
3864
  error: {
3579
- code: import_shared61.ERROR_CODES.FORBIDDEN,
3580
- message: import_shared61.ERROR_CODE_MESSAGES[import_shared61.ERROR_CODES.FORBIDDEN],
3581
- details: "CSRF header is missing or invalid",
3865
+ code: import_shared66.ERROR_CODES.FORBIDDEN,
3866
+ message: import_shared66.ERROR_CODE_MESSAGES[import_shared66.ERROR_CODES.FORBIDDEN],
3867
+ details: "CSRF token invalid",
3582
3868
  path: req.path
3583
3869
  },
3584
- correlationId: tracing?.correlationId ?? import_shared61.GuidHelper.generate(),
3585
- requestId: network?.requestId ?? import_shared61.GuidHelper.generate(),
3586
- spanId: tracing?.spanId ?? import_shared61.GuidHelper.generate(),
3870
+ correlationId: tracing?.correlationId ?? import_shared66.GuidHelper.generate(),
3871
+ requestId: network?.requestId ?? import_shared66.GuidHelper.generate(),
3872
+ spanId: tracing?.spanId ?? import_shared66.GuidHelper.generate(),
3587
3873
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3588
3874
  },
3589
- import_shared61.STATUS_CODES.FORBIDDEN,
3875
+ import_shared66.STATUS_CODES.FORBIDDEN,
3590
3876
  {
3591
3877
  "Content-Type": [network?.formatIndicator ?? "application/json"]
3592
3878
  }
@@ -3599,12 +3885,55 @@ var init_csrf_middleware = __esm({
3599
3885
  }
3600
3886
  });
3601
3887
 
3888
+ // src/presentation/middlewares/csrf-cookie.middleware.ts
3889
+ var import_shared67, CsrfCookieMiddleware;
3890
+ var init_csrf_cookie_middleware = __esm({
3891
+ "src/presentation/middlewares/csrf-cookie.middleware.ts"() {
3892
+ "use strict";
3893
+ import_shared67 = require("@xeno-js/shared");
3894
+ CsrfCookieMiddleware = class {
3895
+ constructor(_requestContext, _csrfTokenService, _csrf) {
3896
+ this._requestContext = _requestContext;
3897
+ this._csrfTokenService = _csrfTokenService;
3898
+ this._csrf = _csrf;
3899
+ }
3900
+ _requestContext;
3901
+ _csrfTokenService;
3902
+ _csrf;
3903
+ async execute(_req, _headers, next) {
3904
+ const response = await next();
3905
+ const context = this._requestContext.getContext();
3906
+ const identity = context?.identity;
3907
+ const network = context?.network;
3908
+ if (!import_shared67.Guards.isDefined(identity?.userId))
3909
+ return response;
3910
+ if (import_shared67.Guards.isDefined(network?.csrfCookie))
3911
+ return response;
3912
+ const token = await this._csrfTokenService.generate(identity.userId);
3913
+ const cookieName = this._csrf.cookieName ?? "__Host-xeno-csrf";
3914
+ const maxAge = this._csrf.cookieMaxAgeSeconds ?? 3600;
3915
+ const sameSite = this._csrf.sameSite ?? "lax";
3916
+ const cookie = `${cookieName}=${encodeURIComponent(token)}; Path=/; Secure; SameSite=${sameSite}; Max-Age=${maxAge}`;
3917
+ const existingCookies = response.headers["Set-Cookie"];
3918
+ response.headers = {
3919
+ ...response.headers ?? {},
3920
+ "Set-Cookie": [
3921
+ ...existingCookies ?? [],
3922
+ cookie
3923
+ ]
3924
+ };
3925
+ return response;
3926
+ }
3927
+ };
3928
+ }
3929
+ });
3930
+
3602
3931
  // src/presentation/middlewares/options.middleware.ts
3603
- var import_shared62, OptionsMiddleware;
3932
+ var import_shared68, OptionsMiddleware;
3604
3933
  var init_options_middleware = __esm({
3605
3934
  "src/presentation/middlewares/options.middleware.ts"() {
3606
3935
  "use strict";
3607
- import_shared62 = require("@xeno-js/shared");
3936
+ import_shared68 = require("@xeno-js/shared");
3608
3937
  OptionsMiddleware = class {
3609
3938
  constructor(_requestContext) {
3610
3939
  this._requestContext = _requestContext;
@@ -3615,14 +3944,14 @@ var init_options_middleware = __esm({
3615
3944
  const network = this._requestContext.getNetworkContext();
3616
3945
  const origin = network?.origin;
3617
3946
  const headers = {};
3618
- if (import_shared62.Guards.isDefined(origin)) {
3947
+ if (import_shared68.Guards.isDefined(origin)) {
3619
3948
  headers["Access-Control-Allow-Origin"] = origin;
3620
3949
  headers["Access-Control-Allow-Credentials"] = "true";
3621
3950
  headers["Vary"] = "Origin";
3622
3951
  }
3623
- headers["Access-Control-Allow-Methods"] = "POST,GET,PUT,DELETE,OPTIONS";
3624
- headers["Access-Control-Allow-Headers"] = "X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Type, Authorization, X-Correlation-Id";
3625
- return import_shared62.HttpHelper.success(null, import_shared62.STATUS_CODES.NO_CONTENT, {}, headers);
3952
+ headers["Access-Control-Allow-Methods"] = "POST,GET,PUT,PATCH,DELETE,OPTIONS";
3953
+ headers["Access-Control-Allow-Headers"] = "X-CSRF-Token, Accept, Accept-Version, Content-Type, Authorization, X-Correlation-Id";
3954
+ return import_shared68.HttpHelper.success(null, import_shared68.STATUS_CODES.NO_CONTENT, {}, headers);
3626
3955
  }
3627
3956
  return await next();
3628
3957
  }
@@ -3631,11 +3960,11 @@ var init_options_middleware = __esm({
3631
3960
  });
3632
3961
 
3633
3962
  // src/presentation/middlewares/rate-limiter.middleware.ts
3634
- var import_shared63, RateLimitMiddleware;
3963
+ var import_shared69, RateLimitMiddleware;
3635
3964
  var init_rate_limiter_middleware = __esm({
3636
3965
  "src/presentation/middlewares/rate-limiter.middleware.ts"() {
3637
3966
  "use strict";
3638
- import_shared63 = require("@xeno-js/shared");
3967
+ import_shared69 = require("@xeno-js/shared");
3639
3968
  RateLimitMiddleware = class {
3640
3969
  constructor(_ctxAccessor, _cache, _logger, _opts) {
3641
3970
  this._ctxAccessor = _ctxAccessor;
@@ -3647,25 +3976,25 @@ var init_rate_limiter_middleware = __esm({
3647
3976
  _cache;
3648
3977
  _logger;
3649
3978
  _opts;
3650
- async execute(req, headers, next) {
3979
+ async execute(req, _headers, next) {
3651
3980
  const { network, tracing } = this._ctxAccessor.getContext() ?? {};
3652
3981
  const clientIp = network?.clientIp;
3653
3982
  const cacheKey = `rate_limit:${clientIp}`;
3654
- const currentHits = await this._cache.get(cacheKey) ?? 0;
3655
- if (currentHits >= this._opts.maxRequests) {
3983
+ const currentHits = await this._cache.increment(cacheKey, this._opts.windowSeconds);
3984
+ if (currentHits > this._opts.maxRequests) {
3656
3985
  this._logger.warn(`[RateLimit] IP ${clientIp} blocked on ${req.path}`);
3657
- return import_shared63.HttpHelper.error(
3986
+ return import_shared69.HttpHelper.error(
3658
3987
  {
3659
3988
  success: false,
3660
3989
  error: {
3661
- code: import_shared63.ERROR_CODES.TOO_MANY_REQUESTS,
3990
+ code: import_shared69.ERROR_CODES.TOO_MANY_REQUESTS,
3662
3991
  message: "Rate limit exceeded.",
3663
3992
  details: `IP ${clientIp} throttled.`,
3664
3993
  path: req.path
3665
3994
  },
3666
- correlationId: tracing?.correlationId ?? import_shared63.GuidHelper.generate(),
3667
- requestId: network?.requestId ?? import_shared63.GuidHelper.generate(),
3668
- spanId: tracing?.spanId ?? import_shared63.GuidHelper.generate(),
3995
+ correlationId: tracing?.correlationId ?? import_shared69.GuidHelper.generate(),
3996
+ requestId: network?.requestId ?? import_shared69.GuidHelper.generate(),
3997
+ spanId: tracing?.spanId ?? import_shared69.GuidHelper.generate(),
3669
3998
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3670
3999
  },
3671
4000
  429,
@@ -3675,7 +4004,6 @@ var init_rate_limiter_middleware = __esm({
3675
4004
  }
3676
4005
  );
3677
4006
  }
3678
- await this._cache.set(cacheKey, currentHits + 1, this._opts.windowSeconds);
3679
4007
  return next();
3680
4008
  }
3681
4009
  };
@@ -3684,8 +4012,8 @@ var init_rate_limiter_middleware = __esm({
3684
4012
 
3685
4013
  // src/presentation/mappers/context.mapper.ts
3686
4014
  function _buildMessagingContext(meta) {
3687
- const hasSequenceData = import_shared64.Guards.isDefined(meta.sequence?.sequenceId) || import_shared64.Guards.isDefined(meta.sequence?.position) || import_shared64.Guards.isDefined(meta.sequence?.size);
3688
- const hasMessagingData = hasSequenceData || import_shared64.Guards.isDefined(meta.expiration) || import_shared64.Guards.isDefined(meta.returnAddress);
4015
+ const hasSequenceData = import_shared70.Guards.isDefined(meta.sequence?.sequenceId) || import_shared70.Guards.isDefined(meta.sequence?.position) || import_shared70.Guards.isDefined(meta.sequence?.size);
4016
+ const hasMessagingData = hasSequenceData || import_shared70.Guards.isDefined(meta.expiration) || import_shared70.Guards.isDefined(meta.returnAddress);
3689
4017
  const messaging = hasMessagingData ? {
3690
4018
  returnAddress: meta.returnAddress,
3691
4019
  expiration: meta.expiration,
@@ -3693,11 +4021,11 @@ function _buildMessagingContext(meta) {
3693
4021
  } : void 0;
3694
4022
  return messaging;
3695
4023
  }
3696
- var import_shared64, ContextMapper;
4024
+ var import_shared70, ContextMapper;
3697
4025
  var init_context_mapper = __esm({
3698
4026
  "src/presentation/mappers/context.mapper.ts"() {
3699
4027
  "use strict";
3700
- import_shared64 = require("@xeno-js/shared");
4028
+ import_shared70 = require("@xeno-js/shared");
3701
4029
  ContextMapper = Object.freeze({
3702
4030
  /**
3703
4031
  * @description Maps to RequestContext. It extracts relevant information from the object, such as correlation ID, request ID, authentication token, client IP, user agent, format indicator, and messaging context (if available). The method constructs a RequestContext object that encapsulates all this information, providing a structured representation of the request context for further processing in the application.
@@ -3717,6 +4045,7 @@ var init_context_mapper = __esm({
3717
4045
  path,
3718
4046
  transport,
3719
4047
  csrf: metadata.csrf,
4048
+ csrfCookie: metadata.csrfCookie,
3720
4049
  origin: metadata.origin
3721
4050
  };
3722
4051
  const tracing = {
@@ -3740,11 +4069,11 @@ var init_context_mapper = __esm({
3740
4069
  });
3741
4070
 
3742
4071
  // src/presentation/middlewares/request.middleware.ts
3743
- var import_shared65, RequestContextMiddleware;
4072
+ var import_shared71, RequestContextMiddleware;
3744
4073
  var init_request_middleware = __esm({
3745
4074
  "src/presentation/middlewares/request.middleware.ts"() {
3746
4075
  "use strict";
3747
- import_shared65 = require("@xeno-js/shared");
4076
+ import_shared71 = require("@xeno-js/shared");
3748
4077
  init_context_mapper();
3749
4078
  RequestContextMiddleware = class {
3750
4079
  /**
@@ -3758,23 +4087,27 @@ var init_request_middleware = __esm({
3758
4087
  * @since 2025-09-30
3759
4088
  * @link https://github.com/xeno-js/xeno-js
3760
4089
  */
3761
- constructor(_requestContext, _extractor, _logger) {
4090
+ constructor(_requestContext, _extractor, _resolver, _logger) {
3762
4091
  this._requestContext = _requestContext;
3763
4092
  this._extractor = _extractor;
4093
+ this._resolver = _resolver;
3764
4094
  this._logger = _logger;
3765
4095
  }
3766
4096
  _requestContext;
3767
4097
  _extractor;
4098
+ _resolver;
3768
4099
  _logger;
3769
4100
  async execute(req, headers, next) {
3770
- const correlationId = import_shared65.GuidHelper.generate();
3771
- const requestId = import_shared65.GuidHelper.generate();
4101
+ const correlationId = import_shared71.GuidHelper.generate();
4102
+ const requestId = import_shared71.GuidHelper.generate();
3772
4103
  const spanId = correlationId;
3773
4104
  const formatIndicator = "application/json";
3774
4105
  try {
3775
4106
  const meta = this._extractor.extract(headers);
4107
+ const clientIp = this._resolver.resolve(req.transport.req, meta.clientIp);
3776
4108
  const metadata = {
3777
4109
  ...meta,
4110
+ clientIp,
3778
4111
  correlationId: meta.correlationId ?? correlationId,
3779
4112
  requestId: meta.requestId ?? requestId,
3780
4113
  spanId: meta.spanId ?? spanId,
@@ -3782,7 +4115,7 @@ var init_request_middleware = __esm({
3782
4115
  };
3783
4116
  const tmpContext = ContextMapper.map({
3784
4117
  metadata,
3785
- identity: import_shared65.GUEST,
4118
+ identity: import_shared71.GUEST,
3786
4119
  path: req.path,
3787
4120
  transport: req.transport
3788
4121
  });
@@ -3794,12 +4127,12 @@ var init_request_middleware = __esm({
3794
4127
  return result;
3795
4128
  } catch (error) {
3796
4129
  this._logger.error("RequestContextMiddleware encountered an error", error);
3797
- return import_shared65.HttpHelper.error(
4130
+ return import_shared71.HttpHelper.error(
3798
4131
  {
3799
4132
  success: false,
3800
4133
  error: {
3801
- code: import_shared65.ERROR_CODES.SYSTEM_ERROR,
3802
- message: import_shared65.ERROR_CODE_MESSAGES[import_shared65.ERROR_CODES.SYSTEM_ERROR],
4134
+ code: import_shared71.ERROR_CODES.SYSTEM_ERROR,
4135
+ message: import_shared71.ERROR_CODE_MESSAGES[import_shared71.ERROR_CODES.SYSTEM_ERROR],
3803
4136
  details: `[Fatal System Error] Exception caught during request handling on path: ${req.path}`,
3804
4137
  path: req.path
3805
4138
  },
@@ -3808,7 +4141,7 @@ var init_request_middleware = __esm({
3808
4141
  spanId,
3809
4142
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
3810
4143
  },
3811
- import_shared65.STATUS_CODES.INTERNAL_SERVER_ERROR,
4144
+ import_shared71.STATUS_CODES.INTERNAL_SERVER_ERROR,
3812
4145
  { "Content-Type": [formatIndicator] }
3813
4146
  );
3814
4147
  }
@@ -3827,6 +4160,7 @@ var init_middlewares = __esm({
3827
4160
  init_composite_middleware();
3828
4161
  init_cors_middleware();
3829
4162
  init_csrf_middleware();
4163
+ init_csrf_cookie_middleware();
3830
4164
  init_options_middleware();
3831
4165
  init_rate_limiter_middleware();
3832
4166
  init_request_middleware();
@@ -3841,6 +4175,7 @@ __export(presentation_exports, {
3841
4175
  BaseController: () => BaseController,
3842
4176
  CORSMiddleware: () => CORSMiddleware,
3843
4177
  CompositeMiddleware: () => CompositeMiddleware,
4178
+ CsrfCookieMiddleware: () => CsrfCookieMiddleware,
3844
4179
  CsrfMiddleware: () => CsrfMiddleware,
3845
4180
  MethodCheckMiddleware: () => MethodCheckMiddleware,
3846
4181
  OptionsMiddleware: () => OptionsMiddleware,
@@ -3860,11 +4195,11 @@ var middleware_module_exports = {};
3860
4195
  __export(middleware_module_exports, {
3861
4196
  MiddlewareModule: () => MiddlewareModule
3862
4197
  });
3863
- var import_shared66, MiddlewareModule;
4198
+ var import_shared72, MiddlewareModule;
3864
4199
  var init_middleware_module = __esm({
3865
4200
  "src/infrastructure/modules/middleware.module.ts"() {
3866
4201
  "use strict";
3867
- import_shared66 = require("@xeno-js/shared");
4202
+ import_shared72 = require("@xeno-js/shared");
3868
4203
  MiddlewareModule = class {
3869
4204
  async configure(container, opts) {
3870
4205
  const { TOKENS: TOKENS4 } = await import("@xeno-js/shared");
@@ -3879,15 +4214,19 @@ var init_middleware_module = __esm({
3879
4214
  const { BearerTokenExtractor: BearerTokenExtractor2 } = await Promise.resolve().then(() => (init_services(), services_exports));
3880
4215
  container.addSingleton(TOKENS4.BEARER_TOKEN_EXTRACTOR, () => new BearerTokenExtractor2());
3881
4216
  }
4217
+ const { HttpCookieExtractor: HttpCookieExtractor2 } = await Promise.resolve().then(() => (init_services(), services_exports));
4218
+ container.addSingleton("COOKIE_EXTRACTOR", () => new HttpCookieExtractor2());
3882
4219
  const { HttpHeaderExtractor: HttpHeaderExtractor2 } = await Promise.resolve().then(() => (init_services(), services_exports));
3883
4220
  container.addSingleton(
3884
4221
  TOKENS4.SERVICE_EXTRACTOR,
3885
- (c) => new HttpHeaderExtractor2(c.resolve(TOKENS4.BEARER_TOKEN_EXTRACTOR), opts.trustedIpHeader)
4222
+ (c) => new HttpHeaderExtractor2(c.resolve(TOKENS4.BEARER_TOKEN_EXTRACTOR), c.resolve("COOKIE_EXTRACTOR"), opts.trustedIpHeader, opts.csrf?.cookieName ?? "__Host-xeno-csrf")
3886
4223
  );
3887
4224
  if (!opts.isLogger) {
3888
4225
  const { LoggerUtils: LoggerUtils2 } = await Promise.resolve().then(() => (init_logger_utils(), logger_utils_exports));
3889
4226
  await LoggerUtils2.addLogger(container, void 0);
3890
4227
  }
4228
+ const { ClientIpResolver: ClientIpResolver2 } = await Promise.resolve().then(() => (init_services(), services_exports));
4229
+ container.addSingleton("IP_RESOLVER", () => new ClientIpResolver2(opts.trustedProxies));
3891
4230
  const middlewares = [TOKENS4.REQUEST_CONTEXT_MIDDLEWARE];
3892
4231
  const { RequestContextMiddleware: RequestContextMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
3893
4232
  container.addSingleton(
@@ -3895,6 +4234,7 @@ var init_middleware_module = __esm({
3895
4234
  (c) => new RequestContextMiddleware2(
3896
4235
  c.resolve(TOKENS4.REQUEST_CONTEXT),
3897
4236
  c.resolve(TOKENS4.SERVICE_EXTRACTOR),
4237
+ c.resolve("IP_RESOLVER"),
3898
4238
  c.resolve(TOKENS4.LOGGER)
3899
4239
  )
3900
4240
  );
@@ -3906,7 +4246,9 @@ var init_middleware_module = __esm({
3906
4246
  );
3907
4247
  middlewares.push(TOKENS4.OPTIONS_MIDDLEWARE);
3908
4248
  }
3909
- if (!import_shared66.Guards.isNullOrEmpty(opts.allowOrigins)) {
4249
+ if (!import_shared72.Guards.isNullOrEmpty(opts.allowOrigins)) {
4250
+ if (import_shared72.Guards.isDefined(opts.httpConfig.withCredentials) && opts.allowOrigins.includes("*"))
4251
+ throw new Error("Wildcard CORS origin is not allowed when withCredentials is set to true");
3910
4252
  const { AllowOrigin: AllowOrigin2 } = await Promise.resolve().then(() => (init_services(), services_exports));
3911
4253
  container.addSingleton("ALLOW_ORIGIN", () => {
3912
4254
  return new AllowOrigin2(opts.allowOrigins);
@@ -3928,7 +4270,7 @@ var init_middleware_module = __esm({
3928
4270
  });
3929
4271
  middlewares.push(TOKENS4.CORS_MIDDLEWARE);
3930
4272
  }
3931
- if (import_shared66.Guards.isDefined(opts.routeRegistry)) {
4273
+ if (import_shared72.Guards.isDefined(opts.routeRegistry)) {
3932
4274
  const registry = opts.routeRegistry;
3933
4275
  const { AllowMethodFactory: AllowMethodFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
3934
4276
  container.addSingleton(TOKENS4.ALLOW_METHOD, () => new AllowMethodFactory2().create(registry));
@@ -3942,21 +4284,42 @@ var init_middleware_module = __esm({
3942
4284
  );
3943
4285
  middlewares.push(TOKENS4.METHOD_CHECK_MIDDLEWARE);
3944
4286
  }
3945
- if (import_shared66.Guards.isDefined(opts.csrf)) {
4287
+ const { AuthenticationMiddleware: AuthenticationMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
4288
+ container.addSingleton(TOKENS4.AUTH_MIDDLEWARE, (c) => {
4289
+ return new AuthenticationMiddleware2(
4290
+ c.resolve(TOKENS4.REQUEST_CONTEXT),
4291
+ c.resolve(TOKENS4.BEARER_TOKEN_EXTRACTOR),
4292
+ c.resolve(TOKENS4.GATE_KEEPER),
4293
+ c.resolve(TOKENS4.LOGGER)
4294
+ );
4295
+ });
4296
+ middlewares.push(TOKENS4.AUTH_MIDDLEWARE);
4297
+ if (import_shared72.Guards.isDefined(opts.csrf)) {
3946
4298
  const csrf = opts.csrf;
4299
+ const { CsrfTokenService: CsrfTokenService2 } = await Promise.resolve().then(() => (init_services(), services_exports));
4300
+ container.addSingleton("CSRF_TOKEN_SERVICE", (c) => {
4301
+ return new CsrfTokenService2(
4302
+ csrf.secret,
4303
+ c.resolve("CRYPTO_SERVICE")
4304
+ );
4305
+ });
4306
+ const { CsrfCookieMiddleware: CsrfCookieMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
4307
+ container.addSingleton("CSRF_COOKIE_MIDDLEWARE", (c) => {
4308
+ return new CsrfCookieMiddleware2(c.resolve(TOKENS4.REQUEST_CONTEXT), c.resolve("CSRF_TOKEN_SERVICE"), csrf);
4309
+ });
3947
4310
  const { CsrfMiddleware: CsrfMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
3948
4311
  container.addSingleton(TOKENS4.CSRF_MIDDLEWARE, (c) => {
3949
- return new CsrfMiddleware2(c.resolve(TOKENS4.REQUEST_CONTEXT), csrf);
4312
+ return new CsrfMiddleware2(c.resolve(TOKENS4.REQUEST_CONTEXT), c.resolve("CSRF_TOKEN_SERVICE"));
3950
4313
  });
3951
4314
  middlewares.push(TOKENS4.CSRF_MIDDLEWARE);
3952
4315
  }
3953
- if (import_shared66.Guards.isDefined(opts.rateLimite.maxRequests) || import_shared66.Guards.isDefined(opts.rateLimite.windowSeconds)) {
4316
+ if (import_shared72.Guards.isDefined(opts.rateLimite.maxRequests) || import_shared72.Guards.isDefined(opts.rateLimite.windowSeconds)) {
3954
4317
  const maxRequests = opts.rateLimite.maxRequests ?? 30;
3955
- import_shared66.Guards.throwIfNegative(maxRequests, "MaxRequests must be positive");
3956
- import_shared66.Guards.throwIfNotInteger(maxRequests, "MaxRequests must be an integer");
4318
+ import_shared72.Guards.throwIfNegative(maxRequests, "MaxRequests must be positive");
4319
+ import_shared72.Guards.throwIfNotInteger(maxRequests, "MaxRequests must be an integer");
3957
4320
  const windowSeconds = opts.rateLimite.windowSeconds ?? 30;
3958
- import_shared66.Guards.throwIfNegative(windowSeconds, "WindowSeconds must be positive");
3959
- import_shared66.Guards.throwIfNotInteger(windowSeconds, "WindowSeconds must be an integer");
4321
+ import_shared72.Guards.throwIfNegative(windowSeconds, "WindowSeconds must be positive");
4322
+ import_shared72.Guards.throwIfNotInteger(windowSeconds, "WindowSeconds must be an integer");
3960
4323
  if (!opts.isCache) {
3961
4324
  const { CacheUtils: CacheUtils2 } = await Promise.resolve().then(() => (init_cache_utils(), cache_utils_exports));
3962
4325
  await CacheUtils2.addCache(container, { inMemory: true, redis: void 0 });
@@ -3975,16 +4338,6 @@ var init_middleware_module = __esm({
3975
4338
  });
3976
4339
  middlewares.push(TOKENS4.RATE_LIMITER_MIDDLEWARE);
3977
4340
  }
3978
- const { AuthenticationMiddleware: AuthenticationMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
3979
- container.addSingleton(TOKENS4.AUTH_MIDDLEWARE, (c) => {
3980
- return new AuthenticationMiddleware2(
3981
- c.resolve(TOKENS4.REQUEST_CONTEXT),
3982
- c.resolve(TOKENS4.BEARER_TOKEN_EXTRACTOR),
3983
- c.resolve(TOKENS4.GATE_KEEPER),
3984
- c.resolve(TOKENS4.LOGGER)
3985
- );
3986
- });
3987
- middlewares.push(TOKENS4.AUTH_MIDDLEWARE);
3988
4341
  const { CompositeMiddleware: CompositeMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
3989
4342
  container.addSingleton(TOKENS4.MIDDLEWARE, (c) => {
3990
4343
  const resolvedMiddleware = middlewares.map(
@@ -4044,7 +4397,7 @@ __export(index_exports, {
4044
4397
  BaseAuthorizationStrategy: () => BaseAuthorizationStrategy,
4045
4398
  BaseController: () => BaseController,
4046
4399
  BaseHandler: () => BaseHandler,
4047
- BaseQuery: () => import_shared73.Query,
4400
+ BaseQuery: () => import_shared79.Query,
4048
4401
  ContainerUtils: () => ContainerUtils,
4049
4402
  ReadDao: () => ReadDao,
4050
4403
  Repository: () => Repository,
@@ -4055,7 +4408,7 @@ module.exports = __toCommonJS(index_exports);
4055
4408
  init_application();
4056
4409
 
4057
4410
  // src/infrastructure/builder/app.builder.ts
4058
- var import_shared67 = require("@xeno-js/shared");
4411
+ var import_shared73 = require("@xeno-js/shared");
4059
4412
 
4060
4413
  // src/infrastructure/configuration/configuration.ts
4061
4414
  var import_shared32 = require("@xeno-js/shared");
@@ -4327,10 +4680,11 @@ var AppBuilder = class {
4327
4680
  constructor(container) {
4328
4681
  this._container = container ?? new ServiceContainer();
4329
4682
  this._container.addSingleton(
4330
- import_shared67.TOKENS.CONFIGURATION_SERVICE,
4683
+ import_shared73.TOKENS.CONFIGURATION_SERVICE,
4331
4684
  () => new EnvironmentConfigurationService()
4332
4685
  );
4333
- this._configuration = this._container.resolve(import_shared67.TOKENS.CONFIGURATION_SERVICE);
4686
+ this._configuration = this._container.resolve(import_shared73.TOKENS.CONFIGURATION_SERVICE);
4687
+ this._middlewareConfig.allowOrigins?.push(this._configuration.get("APP_URL") ?? `http://localhost:${this._configuration.getNumber("PORT", 3e3)}`);
4334
4688
  }
4335
4689
  // --- Module Configurations ---
4336
4690
  _modules = [];
@@ -4362,7 +4716,8 @@ var AppBuilder = class {
4362
4716
  optionsMiddleware: false,
4363
4717
  routeRegistry: void 0,
4364
4718
  trustedIpHeader: void 0,
4365
- allowOrigins: ["*"],
4719
+ trustedProxies: [],
4720
+ allowOrigins: [],
4366
4721
  cors: true
4367
4722
  };
4368
4723
  _httpConfig = {
@@ -4439,13 +4794,13 @@ var AppBuilder = class {
4439
4794
  if (this._isLoggerModuleQueued) return this;
4440
4795
  this._isLoggerModuleQueued = true;
4441
4796
  const config = {
4442
- level: import_shared67.LOG_LEVEL.DEBUG,
4797
+ level: import_shared73.LOG_LEVEL.DEBUG,
4443
4798
  console: true,
4444
4799
  sentry: { config: void 0 },
4445
4800
  pino: { config: void 0 },
4446
4801
  customLoggers: void 0
4447
4802
  };
4448
- if (import_shared67.Guards.isDefined(setupAction) && import_shared67.Guards.isDefined(config))
4803
+ if (import_shared73.Guards.isDefined(setupAction) && import_shared73.Guards.isDefined(config))
4449
4804
  setupAction(config, this._configuration);
4450
4805
  this._modules.push({
4451
4806
  priority: 3,
@@ -4471,7 +4826,7 @@ var AppBuilder = class {
4471
4826
  addCache(setupAction) {
4472
4827
  if (this._isCacheModuleQueued) return this;
4473
4828
  this._isCacheModuleQueued = true;
4474
- if (import_shared67.Guards.isDefined(setupAction)) setupAction(this._config, this._configuration);
4829
+ if (import_shared73.Guards.isDefined(setupAction)) setupAction(this._config, this._configuration);
4475
4830
  this._modules.push({
4476
4831
  priority: 3,
4477
4832
  name: "CacheModule",
@@ -4580,7 +4935,7 @@ var AppBuilder = class {
4580
4935
  * @link https://github.com/xeno-js/xeno-js
4581
4936
  */
4582
4937
  addPipeline(setupAction) {
4583
- if (import_shared67.Guards.isDefined(setupAction)) {
4938
+ if (import_shared73.Guards.isDefined(setupAction)) {
4584
4939
  setupAction(this._pipelineConfig, this._configuration);
4585
4940
  }
4586
4941
  this._queuePipelineModule();
@@ -4714,7 +5069,7 @@ var AppBuilder = class {
4714
5069
  console.error(`\u{1F449} Module: **${queued.name}**`);
4715
5070
  console.error(`\u{1F4DD} Reason: ${errorMessage}
4716
5071
  `);
4717
- if (error instanceof Error && import_shared67.Guards.isDefined(error.stack)) {
5072
+ if (error instanceof Error && import_shared73.Guards.isDefined(error.stack)) {
4718
5073
  console.error(error.stack);
4719
5074
  }
4720
5075
  throw new Error(`Bootstrap failed at [${queued.name}]: ${errorMessage}`, { cause: error });
@@ -4776,7 +5131,8 @@ var AppBuilder = class {
4776
5131
  ...this._middlewareConfig,
4777
5132
  isAuth: this._isAuthModuleQueued,
4778
5133
  isLogger: this._isLoggerModuleQueued,
4779
- isCache: this._isCacheModuleQueued || this._isPipelineModuleQueued
5134
+ isCache: this._isCacheModuleQueued || this._isPipelineModuleQueued,
5135
+ httpConfig: this._httpConfig.http.client
4780
5136
  });
4781
5137
  }
4782
5138
  });
@@ -4812,7 +5168,7 @@ init_redis_cache();
4812
5168
  init_request_context();
4813
5169
 
4814
5170
  // src/infrastructure/datasources/remote.datasource.ts
4815
- var import_shared68 = require("@xeno-js/shared");
5171
+ var import_shared74 = require("@xeno-js/shared");
4816
5172
 
4817
5173
  // src/infrastructure/index.ts
4818
5174
  init_factories();
@@ -4842,8 +5198,8 @@ init_pipeline_utils();
4842
5198
  init_validation_utils();
4843
5199
 
4844
5200
  // src/infrastructure/repositories/read-dao.ts
4845
- var import_shared69 = require("@xeno-js/shared");
4846
- var import_shared70 = require("@xeno-js/shared");
5201
+ var import_shared75 = require("@xeno-js/shared");
5202
+ var import_shared76 = require("@xeno-js/shared");
4847
5203
  var ReadDao = class {
4848
5204
  /**
4849
5205
  * Constructs a new ReadDao instance.
@@ -4863,23 +5219,23 @@ var ReadDao = class {
4863
5219
  _dataSource;
4864
5220
  _mapper;
4865
5221
  async findById(id, ctx, signal) {
4866
- import_shared69.AppError.throwIfAborted(signal, "ReadDao.findById");
5222
+ import_shared75.AppError.throwIfAborted(signal, "ReadDao.findById");
4867
5223
  const result = await this._dataSource.findById(id, ctx, signal);
4868
- if (import_shared70.Guards.isNullOrEmpty(result)) return import_shared69.Result.ok();
5224
+ if (import_shared76.Guards.isNullOrEmpty(result)) return import_shared75.Result.ok();
4869
5225
  const entity = this._mapper.toEntity(result);
4870
- return import_shared69.Result.ok(entity);
5226
+ return import_shared75.Result.ok(entity);
4871
5227
  }
4872
5228
  async findAll(ctx, signal) {
4873
- import_shared69.AppError.throwIfAborted(signal, "ReadDao.findAll");
5229
+ import_shared75.AppError.throwIfAborted(signal, "ReadDao.findAll");
4874
5230
  const results = await this._dataSource.findAll(ctx, signal);
4875
5231
  const entities = results.map((result) => this._mapper.toEntity(result));
4876
- return import_shared69.Result.ok(entities);
5232
+ return import_shared75.Result.ok(entities);
4877
5233
  }
4878
5234
  };
4879
5235
 
4880
5236
  // src/infrastructure/repositories/repository.ts
4881
- var import_shared71 = require("@xeno-js/shared");
4882
- var import_shared72 = require("@xeno-js/shared");
5237
+ var import_shared77 = require("@xeno-js/shared");
5238
+ var import_shared78 = require("@xeno-js/shared");
4883
5239
  var Repository = class {
4884
5240
  /**
4885
5241
  * Constructs a new Repository instance.
@@ -4899,35 +5255,35 @@ var Repository = class {
4899
5255
  _dataSource;
4900
5256
  _mapper;
4901
5257
  async findById(id, ctx, signal) {
4902
- import_shared71.AppError.throwIfAborted(signal, "Repository.findById");
5258
+ import_shared77.AppError.throwIfAborted(signal, "Repository.findById");
4903
5259
  const result = await this._dataSource.findById(id, ctx, signal);
4904
- if (import_shared72.Guards.isNullOrEmpty(result)) return import_shared71.Result.ok();
5260
+ if (import_shared78.Guards.isNullOrEmpty(result)) return import_shared77.Result.ok();
4905
5261
  const entity = this._mapper.toEntity(result);
4906
- return import_shared71.Result.ok(entity);
5262
+ return import_shared77.Result.ok(entity);
4907
5263
  }
4908
5264
  async findAll(ctx, signal) {
4909
- import_shared71.AppError.throwIfAborted(signal, "Repository.findAll");
5265
+ import_shared77.AppError.throwIfAborted(signal, "Repository.findAll");
4910
5266
  const results = await this._dataSource.findAll(ctx, signal);
4911
5267
  const entities = results.map((result) => this._mapper.toEntity(result));
4912
- return import_shared71.Result.ok(entities);
5268
+ return import_shared77.Result.ok(entities);
4913
5269
  }
4914
5270
  async save(entity, signal) {
4915
5271
  const dto = this._mapper.toDto(entity);
4916
- import_shared71.AppError.throwIfAborted(signal, "Repository.save");
5272
+ import_shared77.AppError.throwIfAborted(signal, "Repository.save");
4917
5273
  await this._dataSource.insert(dto, signal);
4918
- return import_shared71.Result.ok();
5274
+ return import_shared77.Result.ok();
4919
5275
  }
4920
5276
  async delete(entity, ctx, signal) {
4921
5277
  const dto = this._mapper.toDto(entity);
4922
- import_shared71.AppError.throwIfAborted(signal, "Repository.delete");
5278
+ import_shared77.AppError.throwIfAborted(signal, "Repository.delete");
4923
5279
  await this._dataSource.delete(dto, ctx, signal);
4924
- return import_shared71.Result.ok();
5280
+ return import_shared77.Result.ok();
4925
5281
  }
4926
5282
  async update(id, entity, ctx, signal) {
4927
5283
  const dto = this._mapper.toPartialDto(entity);
4928
- import_shared71.AppError.throwIfAborted(signal, "Repository.update");
5284
+ import_shared77.AppError.throwIfAborted(signal, "Repository.update");
4929
5285
  await this._dataSource.update(id, dto, ctx, signal);
4930
- return import_shared71.Result.ok();
5286
+ return import_shared77.Result.ok();
4931
5287
  }
4932
5288
  };
4933
5289
 
@@ -4945,7 +5301,7 @@ __reExport(drizzle_types_exports, require("drizzle-orm"));
4945
5301
  __reExport(index_exports, drizzle_types_exports, module.exports);
4946
5302
  init_presentation();
4947
5303
  __reExport(index_exports, require("@xeno-js/shared"), module.exports);
4948
- var import_shared73 = require("@xeno-js/shared");
5304
+ var import_shared79 = require("@xeno-js/shared");
4949
5305
  // Annotate the CommonJS export names for ESM import in node:
4950
5306
  0 && (module.exports = {
4951
5307
  AppBuilder,
@@ -4960,4 +5316,13 @@ var import_shared73 = require("@xeno-js/shared");
4960
5316
  SupabaseServerAuthFactory,
4961
5317
  ...require("@xeno-js/shared")
4962
5318
  });
5319
+ /**
5320
+ * @description The CsrfCookieMiddleware class implements the IMiddleware interface, providing a concrete implementation for handling CSRF token validation and cookie management. It checks the incoming request for a valid CSRF token and sets a CSRF cookie if necessary.
5321
+ *
5322
+ * @author Xeno
5323
+ * @version 1.0.0
5324
+ * @since 2025-09-30
5325
+ * @link https://github.com/xeno-js/xeno-js
5326
+ * @license MIT
5327
+ */
4963
5328
  //# sourceMappingURL=index.cjs.map