@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/README.md +2 -2
- package/dist/index.cjs +671 -306
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +153 -4
- package/dist/index.d.ts +153 -4
- package/dist/index.js +521 -156
- package/dist/index.js.map +1 -1
- package/package.json +32 -32
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
|
-
|
|
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:
|
|
1514
|
-
if (!
|
|
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 (
|
|
1521
|
-
if (
|
|
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 (
|
|
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 (!
|
|
1536
|
+
if (!Guards45.isNullOrEmpty(opts.customLoggers)) {
|
|
1538
1537
|
const customLoggers = opts.customLoggers;
|
|
1539
1538
|
customLoggers.forEach((f) => {
|
|
1540
|
-
if (
|
|
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
|
|
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
|
-
|
|
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 (!
|
|
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 =
|
|
1590
|
-
const ttlOption =
|
|
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 =
|
|
1595
|
-
const ttlOption =
|
|
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
|
|
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
|
-
|
|
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 (
|
|
1671
|
+
if (import_shared41.Guards.isDefined(password)) {
|
|
1644
1672
|
redisOptions.password = password;
|
|
1645
1673
|
}
|
|
1646
|
-
if (
|
|
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:
|
|
1685
|
-
if (!opts.inMemory && !
|
|
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 || !
|
|
1696
|
-
const {
|
|
1697
|
-
container.addSingleton(TOKENS4.CACHE, () => new
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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 (!
|
|
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
|
|
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
|
-
|
|
1970
|
+
import_shared45 = require("@xeno-js/shared");
|
|
1843
1971
|
BearerTokenExtractor = class {
|
|
1844
1972
|
extract(headers) {
|
|
1845
|
-
const authHeader =
|
|
1846
|
-
if (!
|
|
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 =
|
|
1853
|
-
if (
|
|
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 (!
|
|
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
|
|
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
|
-
|
|
1998
|
+
import_shared46 = require("@xeno-js/shared");
|
|
1871
1999
|
SupabaseSsrTokenExtractor = class {
|
|
1872
2000
|
extract(headers) {
|
|
1873
|
-
const authHeader =
|
|
1874
|
-
if (
|
|
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 =
|
|
1878
|
-
if (
|
|
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 (!
|
|
2012
|
+
if (!import_shared46.Guards.isDefined(name) || import_shared46.Guards.isNullOrEmpty(rest)) continue;
|
|
1885
2013
|
const value = decodeURIComponent(rest.join("="));
|
|
1886
|
-
if (
|
|
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 (
|
|
2018
|
+
if (import_shared46.Guards.isDefined(match)) tokenChunks[parseInt(match[1], 10)] = value;
|
|
1891
2019
|
}
|
|
1892
2020
|
}
|
|
1893
2021
|
let fullTokenString = unchunkedToken;
|
|
1894
|
-
if (!
|
|
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 (
|
|
2026
|
+
if (import_shared46.Guards.isNullOrEmpty(fullTokenString)) return void 0;
|
|
1899
2027
|
try {
|
|
1900
|
-
const parsed =
|
|
1901
|
-
if (
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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 =
|
|
1937
|
-
const requestId =
|
|
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 =
|
|
1940
|
-
const spanId =
|
|
1941
|
-
const parentSpanId =
|
|
1942
|
-
const acceptHeader =
|
|
1943
|
-
const contentTypeHeader =
|
|
1944
|
-
const userAgent =
|
|
1945
|
-
const returnAddress =
|
|
1946
|
-
const sequenceId =
|
|
1947
|
-
const position =
|
|
1948
|
-
const size =
|
|
1949
|
-
const expiration =
|
|
1950
|
-
const csrf =
|
|
1951
|
-
const
|
|
1952
|
-
const
|
|
1953
|
-
|
|
1954
|
-
|
|
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:
|
|
1973
|
-
size:
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
2311
|
+
import_shared52 = require("@xeno-js/shared");
|
|
2068
2312
|
import_axios = __toESM(require("axios"), 1);
|
|
2069
|
-
NodeAxiosFactory = class extends
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2359
|
+
import_shared53.RESILIENCE_DEFAULTS.RETRY.ATTEMPTS,
|
|
2116
2360
|
message
|
|
2117
2361
|
),
|
|
2118
2362
|
baseDelayMs: this.checkConfigValue(
|
|
2119
2363
|
config.retry.baseDelayMs,
|
|
2120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (!
|
|
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
|
|
2417
|
+
if (error instanceof import_shared53.AppError) {
|
|
2174
2418
|
status = error.status;
|
|
2175
2419
|
const cause = error.cause;
|
|
2176
|
-
if (
|
|
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 (
|
|
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 (
|
|
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
|
|
2451
|
+
if (error instanceof import_shared53.AppError) {
|
|
2208
2452
|
const cause = error.cause;
|
|
2209
|
-
if (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
2224
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
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,
|
|
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
|
-
|
|
2635
|
+
import_shared55 = require("@xeno-js/shared");
|
|
2392
2636
|
SupabaseServerAuthFactory = class {
|
|
2393
2637
|
create({
|
|
2394
2638
|
config,
|
|
2395
2639
|
container
|
|
2396
2640
|
}) {
|
|
2397
|
-
if (!
|
|
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
|
|
2413
|
-
const sessionMapper = new
|
|
2414
|
-
return new
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
2713
|
+
import_shared57 = require("@xeno-js/shared");
|
|
2470
2714
|
ZodValidatorFactory = class {
|
|
2471
2715
|
create(opts) {
|
|
2472
|
-
const validatorService = new
|
|
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:
|
|
2544
|
-
if (
|
|
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 (!
|
|
2797
|
+
if (!Guards45.isNullOrEmpty(policy.roles)) {
|
|
2554
2798
|
Policies.add("roles");
|
|
2555
2799
|
}
|
|
2556
|
-
if (!
|
|
2800
|
+
if (!Guards45.isNullOrEmpty(policy.permissions)) {
|
|
2557
2801
|
Policies.add("permissions");
|
|
2558
2802
|
}
|
|
2559
|
-
if (!
|
|
2803
|
+
if (!Guards45.isNullOrEmpty(policy.userId)) {
|
|
2560
2804
|
Policies.add("userId");
|
|
2561
2805
|
}
|
|
2562
|
-
if (!
|
|
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 (!
|
|
2855
|
+
if (!Guards45.isNullOrEmpty(opts.customAuthorizationStrategy)) {
|
|
2612
2856
|
const customStrategies = opts.customAuthorizationStrategy;
|
|
2613
2857
|
customStrategies.forEach((strategyToken, index) => {
|
|
2614
|
-
if (
|
|
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
|
|
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
|
-
|
|
2761
|
-
|
|
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
|
-
|
|
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 (
|
|
3036
|
+
if (import_shared59.Guards.isDefined(this._ttx.state)) {
|
|
2793
3037
|
try {
|
|
2794
|
-
if (
|
|
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:
|
|
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 (
|
|
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:
|
|
2872
|
-
if (!
|
|
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 (!
|
|
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:
|
|
2906
|
-
if (
|
|
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:
|
|
2967
|
-
if (!
|
|
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 (
|
|
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 (!
|
|
3230
|
+
if (!Guards45.isNullOrEmpty(opts.customValidationStrategy)) {
|
|
2987
3231
|
for (const strategyToken of opts.customValidationStrategy) {
|
|
2988
|
-
if (
|
|
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
|
|
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
|
-
|
|
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
|
-
`${
|
|
3040
|
-
|
|
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(`${
|
|
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
|
-
`${
|
|
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(`${
|
|
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(`${
|
|
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:
|
|
3092
|
-
if (
|
|
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 (
|
|
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:
|
|
3193
|
-
if (
|
|
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 (
|
|
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 ((
|
|
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 (
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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 ??
|
|
3311
|
-
requestId: context?.network.requestId ??
|
|
3312
|
-
spanId: context?.tracing.spanId ??
|
|
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
|
|
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
|
-
|
|
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
|
|
3627
|
+
return import_shared62.HttpHelper.error(
|
|
3384
3628
|
{
|
|
3385
3629
|
success: false,
|
|
3386
3630
|
error: {
|
|
3387
|
-
code:
|
|
3388
|
-
message:
|
|
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 ??
|
|
3393
|
-
requestId: network?.requestId ??
|
|
3394
|
-
spanId: tracing?.spanId ??
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
3670
|
+
return import_shared63.HttpHelper.error(
|
|
3427
3671
|
{
|
|
3428
3672
|
success: false,
|
|
3429
3673
|
error: {
|
|
3430
|
-
code:
|
|
3431
|
-
message:
|
|
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 ??
|
|
3436
|
-
requestId: network?.requestId ??
|
|
3437
|
-
spanId: tracing?.spanId ??
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 ??
|
|
3485
|
-
requestId: network?.requestId ??
|
|
3486
|
-
spanId: tracing?.spanId ??
|
|
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 ??
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
-
|
|
3800
|
+
import_shared66 = require("@xeno-js/shared");
|
|
3557
3801
|
CsrfMiddleware = class {
|
|
3558
|
-
constructor(_requestContext,
|
|
3802
|
+
constructor(_requestContext, _csrfTokenService) {
|
|
3559
3803
|
this._requestContext = _requestContext;
|
|
3560
|
-
this.
|
|
3804
|
+
this._csrfTokenService = _csrfTokenService;
|
|
3561
3805
|
}
|
|
3562
3806
|
_requestContext;
|
|
3563
|
-
|
|
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
|
-
|
|
3575
|
-
|
|
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:
|
|
3580
|
-
message:
|
|
3581
|
-
details: "CSRF
|
|
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 ??
|
|
3585
|
-
requestId: network?.requestId ??
|
|
3586
|
-
spanId: tracing?.spanId ??
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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,
|
|
3625
|
-
return
|
|
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
|
|
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
|
-
|
|
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,
|
|
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.
|
|
3655
|
-
if (currentHits
|
|
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
|
|
3986
|
+
return import_shared69.HttpHelper.error(
|
|
3658
3987
|
{
|
|
3659
3988
|
success: false,
|
|
3660
3989
|
error: {
|
|
3661
|
-
code:
|
|
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 ??
|
|
3667
|
-
requestId: network?.requestId ??
|
|
3668
|
-
spanId: tracing?.spanId ??
|
|
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 =
|
|
3688
|
-
const hasMessagingData = hasSequenceData ||
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
3771
|
-
const requestId =
|
|
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:
|
|
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
|
|
4130
|
+
return import_shared71.HttpHelper.error(
|
|
3798
4131
|
{
|
|
3799
4132
|
success: false,
|
|
3800
4133
|
error: {
|
|
3801
|
-
code:
|
|
3802
|
-
message:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 (!
|
|
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 (
|
|
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
|
-
|
|
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),
|
|
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 (
|
|
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
|
-
|
|
3956
|
-
|
|
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
|
-
|
|
3959
|
-
|
|
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: () =>
|
|
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
|
|
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
|
-
|
|
4683
|
+
import_shared73.TOKENS.CONFIGURATION_SERVICE,
|
|
4331
4684
|
() => new EnvironmentConfigurationService()
|
|
4332
4685
|
);
|
|
4333
|
-
this._configuration = this._container.resolve(
|
|
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
|
-
|
|
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:
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 &&
|
|
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
|
|
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
|
|
4846
|
-
var
|
|
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
|
-
|
|
5222
|
+
import_shared75.AppError.throwIfAborted(signal, "ReadDao.findById");
|
|
4867
5223
|
const result = await this._dataSource.findById(id, ctx, signal);
|
|
4868
|
-
if (
|
|
5224
|
+
if (import_shared76.Guards.isNullOrEmpty(result)) return import_shared75.Result.ok();
|
|
4869
5225
|
const entity = this._mapper.toEntity(result);
|
|
4870
|
-
return
|
|
5226
|
+
return import_shared75.Result.ok(entity);
|
|
4871
5227
|
}
|
|
4872
5228
|
async findAll(ctx, signal) {
|
|
4873
|
-
|
|
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
|
|
5232
|
+
return import_shared75.Result.ok(entities);
|
|
4877
5233
|
}
|
|
4878
5234
|
};
|
|
4879
5235
|
|
|
4880
5236
|
// src/infrastructure/repositories/repository.ts
|
|
4881
|
-
var
|
|
4882
|
-
var
|
|
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
|
-
|
|
5258
|
+
import_shared77.AppError.throwIfAborted(signal, "Repository.findById");
|
|
4903
5259
|
const result = await this._dataSource.findById(id, ctx, signal);
|
|
4904
|
-
if (
|
|
5260
|
+
if (import_shared78.Guards.isNullOrEmpty(result)) return import_shared77.Result.ok();
|
|
4905
5261
|
const entity = this._mapper.toEntity(result);
|
|
4906
|
-
return
|
|
5262
|
+
return import_shared77.Result.ok(entity);
|
|
4907
5263
|
}
|
|
4908
5264
|
async findAll(ctx, signal) {
|
|
4909
|
-
|
|
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
|
|
5268
|
+
return import_shared77.Result.ok(entities);
|
|
4913
5269
|
}
|
|
4914
5270
|
async save(entity, signal) {
|
|
4915
5271
|
const dto = this._mapper.toDto(entity);
|
|
4916
|
-
|
|
5272
|
+
import_shared77.AppError.throwIfAborted(signal, "Repository.save");
|
|
4917
5273
|
await this._dataSource.insert(dto, signal);
|
|
4918
|
-
return
|
|
5274
|
+
return import_shared77.Result.ok();
|
|
4919
5275
|
}
|
|
4920
5276
|
async delete(entity, ctx, signal) {
|
|
4921
5277
|
const dto = this._mapper.toDto(entity);
|
|
4922
|
-
|
|
5278
|
+
import_shared77.AppError.throwIfAborted(signal, "Repository.delete");
|
|
4923
5279
|
await this._dataSource.delete(dto, ctx, signal);
|
|
4924
|
-
return
|
|
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
|
-
|
|
5284
|
+
import_shared77.AppError.throwIfAborted(signal, "Repository.update");
|
|
4929
5285
|
await this._dataSource.update(id, dto, ctx, signal);
|
|
4930
|
-
return
|
|
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
|
|
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
|