@xeno-js/core 1.0.0 → 1.1.1
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 +6 -7
- package/dist/index.cjs +416 -340
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +269 -192
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1504,30 +1504,30 @@ var init_logger_utils = __esm({
|
|
|
1504
1504
|
*/
|
|
1505
1505
|
async addLogger(container, opts) {
|
|
1506
1506
|
const loggerDependencies = [];
|
|
1507
|
-
const { Guards:
|
|
1508
|
-
if (!
|
|
1507
|
+
const { Guards: Guards47, LOG_LEVEL: LOG_LEVEL7, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
1508
|
+
if (!Guards47.isDefined(opts) || opts.console) {
|
|
1509
1509
|
const { ConsoleLogger: ConsoleLogger2 } = await Promise.resolve().then(() => (init_console_logger(), console_logger_exports));
|
|
1510
1510
|
loggerDependencies.push(new ConsoleLogger2(opts?.level));
|
|
1511
1511
|
}
|
|
1512
|
-
if (
|
|
1513
|
-
if (
|
|
1512
|
+
if (Guards47.isDefined(opts)) {
|
|
1513
|
+
if (Guards47.isDefined(opts.sentry.config)) {
|
|
1514
1514
|
const { SentryLoggerFactory: SentryLoggerFactory2 } = await Promise.resolve().then(() => (init_sentry_logger_factory(), sentry_logger_factory_exports));
|
|
1515
1515
|
loggerDependencies.push(new SentryLoggerFactory2().create(opts));
|
|
1516
1516
|
}
|
|
1517
|
-
if (
|
|
1517
|
+
if (Guards47.isDefined(opts.pino.config)) {
|
|
1518
1518
|
const { PinoLoggerFactory: PinoLoggerFactory2 } = await Promise.resolve().then(() => (init_pino_logger_factory(), pino_logger_factory_exports));
|
|
1519
1519
|
loggerDependencies.push(new PinoLoggerFactory2().create(opts));
|
|
1520
1520
|
}
|
|
1521
|
-
if (!
|
|
1521
|
+
if (!Guards47.isNullOrEmpty(opts.customLoggers)) {
|
|
1522
1522
|
const customLoggers = opts.customLoggers;
|
|
1523
1523
|
customLoggers.forEach((fn) => {
|
|
1524
|
-
if (
|
|
1524
|
+
if (Guards47.isDefined(fn)) loggerDependencies.push(fn(container));
|
|
1525
1525
|
});
|
|
1526
1526
|
}
|
|
1527
1527
|
}
|
|
1528
1528
|
const { BaseLogger } = await import("@xeno-js/shared");
|
|
1529
|
-
container.addSingleton(
|
|
1530
|
-
const context = c.resolve(
|
|
1529
|
+
container.addSingleton(TOKENS5.LOGGER, (c) => {
|
|
1530
|
+
const context = c.resolve(TOKENS5.CONTEXT_ACCESSOR);
|
|
1531
1531
|
return new BaseLogger(context, opts?.level ?? LOG_LEVEL7.DEBUG, loggerDependencies);
|
|
1532
1532
|
});
|
|
1533
1533
|
}
|
|
@@ -1688,25 +1688,25 @@ var init_cache_utils = __esm({
|
|
|
1688
1688
|
* @link https://github.com/xeno-js/xeno-js
|
|
1689
1689
|
*/
|
|
1690
1690
|
async addCache(container, opts) {
|
|
1691
|
-
const { Guards:
|
|
1692
|
-
if (!opts.inMemory && !
|
|
1691
|
+
const { Guards: Guards47, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
1692
|
+
if (!opts.inMemory && !Guards47.isDefined(opts.redis)) {
|
|
1693
1693
|
throw new Error(
|
|
1694
1694
|
"No cache strategies are configured. Please provide at least one cache strategy."
|
|
1695
1695
|
);
|
|
1696
1696
|
}
|
|
1697
1697
|
const { CacheKeyBuilder } = await import("@xeno-js/shared");
|
|
1698
1698
|
container.addSingleton(
|
|
1699
|
-
|
|
1700
|
-
(c) => new CacheKeyBuilder(c.resolve(
|
|
1699
|
+
TOKENS5.CACHE_KEY_BUILDER,
|
|
1700
|
+
(c) => new CacheKeyBuilder(c.resolve(TOKENS5.IDENTITY_ACCESSOR))
|
|
1701
1701
|
);
|
|
1702
|
-
if (opts.inMemory || !
|
|
1702
|
+
if (opts.inMemory || !Guards47.isDefined(opts.redis)) {
|
|
1703
1703
|
const { InMemoryCacheExtended: InMemoryCacheExtended2 } = await Promise.resolve().then(() => (init_inmemory_cache(), inmemory_cache_exports));
|
|
1704
|
-
container.addSingleton(
|
|
1704
|
+
container.addSingleton(TOKENS5.CACHE, () => new InMemoryCacheExtended2());
|
|
1705
1705
|
return;
|
|
1706
1706
|
}
|
|
1707
|
-
if (
|
|
1707
|
+
if (Guards47.isDefined(opts.redis)) {
|
|
1708
1708
|
const { RedisCacheFactory: RedisCacheFactory2 } = await Promise.resolve().then(() => (init_redis_cache_factory(), redis_cache_factory_exports));
|
|
1709
|
-
container.addSingleton(
|
|
1709
|
+
container.addSingleton(TOKENS5.CACHE, () => {
|
|
1710
1710
|
const config = opts.redis;
|
|
1711
1711
|
return new RedisCacheFactory2().create(config);
|
|
1712
1712
|
});
|
|
@@ -1852,6 +1852,73 @@ var init_concurrency = __esm({
|
|
|
1852
1852
|
}
|
|
1853
1853
|
});
|
|
1854
1854
|
|
|
1855
|
+
// src/infrastructure/services/cookies/cookies.service.ts
|
|
1856
|
+
var import_shared44, CookieHandler;
|
|
1857
|
+
var init_cookies_service = __esm({
|
|
1858
|
+
"src/infrastructure/services/cookies/cookies.service.ts"() {
|
|
1859
|
+
"use strict";
|
|
1860
|
+
import_shared44 = require("@xeno-js/shared");
|
|
1861
|
+
CookieHandler = class {
|
|
1862
|
+
constructor(contextAccessor, _config, _cookieOpts) {
|
|
1863
|
+
this.contextAccessor = contextAccessor;
|
|
1864
|
+
this._config = _config;
|
|
1865
|
+
this._cookieOpts = _cookieOpts;
|
|
1866
|
+
}
|
|
1867
|
+
contextAccessor;
|
|
1868
|
+
_config;
|
|
1869
|
+
_cookieOpts;
|
|
1870
|
+
getAll() {
|
|
1871
|
+
const network = this.contextAccessor.getNetworkContext();
|
|
1872
|
+
const req = network?.transport?.req;
|
|
1873
|
+
if (!import_shared44.Guards.isDefined(req) || import_shared44.Guards.isNullOrEmpty(req.headers.get("cookie"))) return [];
|
|
1874
|
+
return req.headers.get("cookie")?.split(";").map((cookie) => {
|
|
1875
|
+
const [name, ...rest] = cookie.split("=");
|
|
1876
|
+
return { name: name.trim(), value: rest.join("=") };
|
|
1877
|
+
}) ?? [];
|
|
1878
|
+
}
|
|
1879
|
+
setAll(cookies) {
|
|
1880
|
+
const network = this.contextAccessor.getNetworkContext();
|
|
1881
|
+
const res = network?.transport?.res;
|
|
1882
|
+
if (!import_shared44.Guards.isDefined(res)) return;
|
|
1883
|
+
const serializedCookies = cookies.map((c) => this.serialize(c));
|
|
1884
|
+
const existingSetCookie = res.headers.getSetCookie();
|
|
1885
|
+
res.headers.delete("Set-Cookie");
|
|
1886
|
+
for (const cookie of [...existingSetCookie, ...serializedCookies]) {
|
|
1887
|
+
res.headers.append("Set-Cookie", cookie);
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
serialize(cookie) {
|
|
1891
|
+
const safeName = encodeURIComponent(cookie.name);
|
|
1892
|
+
const safeValue = encodeURIComponent(cookie.value);
|
|
1893
|
+
let str = `${safeName}=${safeValue}`;
|
|
1894
|
+
const isProd = this._config.get("NODE_ENV") === "production";
|
|
1895
|
+
const defaultOptions = {
|
|
1896
|
+
path: this._cookieOpts.path,
|
|
1897
|
+
httpOnly: this._cookieOpts.httpOnly,
|
|
1898
|
+
secure: this._cookieOpts.secure ?? isProd,
|
|
1899
|
+
sameSite: this._cookieOpts.sameSite ?? "Lax"
|
|
1900
|
+
};
|
|
1901
|
+
const opts = { ...defaultOptions, ...cookie.options ?? {} };
|
|
1902
|
+
str += `; Path=${opts.path}`;
|
|
1903
|
+
if (import_shared44.Guards.isDefined(opts.maxAge)) str += `; Max-Age=${opts.maxAge}`;
|
|
1904
|
+
if (import_shared44.Guards.isDefined(opts.domain)) str += `; Domain=${opts.domain}`;
|
|
1905
|
+
if (import_shared44.Guards.isDefined(opts.sameSite)) str += `; SameSite=${opts.sameSite}`;
|
|
1906
|
+
if (opts.secure) str += `; Secure`;
|
|
1907
|
+
if (opts.httpOnly) str += `; HttpOnly`;
|
|
1908
|
+
return str;
|
|
1909
|
+
}
|
|
1910
|
+
};
|
|
1911
|
+
}
|
|
1912
|
+
});
|
|
1913
|
+
|
|
1914
|
+
// src/infrastructure/services/cookies/index.ts
|
|
1915
|
+
var init_cookies = __esm({
|
|
1916
|
+
"src/infrastructure/services/cookies/index.ts"() {
|
|
1917
|
+
"use strict";
|
|
1918
|
+
init_cookies_service();
|
|
1919
|
+
}
|
|
1920
|
+
});
|
|
1921
|
+
|
|
1855
1922
|
// src/infrastructure/services/crypto/crypto.service.ts
|
|
1856
1923
|
var EdgeCryptoService;
|
|
1857
1924
|
var init_crypto_service = __esm({
|
|
@@ -1900,11 +1967,11 @@ var init_crypto = __esm({
|
|
|
1900
1967
|
});
|
|
1901
1968
|
|
|
1902
1969
|
// src/infrastructure/services/csrf/csrf-token.service.ts
|
|
1903
|
-
var
|
|
1970
|
+
var import_shared45, CsrfTokenService;
|
|
1904
1971
|
var init_csrf_token_service = __esm({
|
|
1905
1972
|
"src/infrastructure/services/csrf/csrf-token.service.ts"() {
|
|
1906
1973
|
"use strict";
|
|
1907
|
-
|
|
1974
|
+
import_shared45 = require("@xeno-js/shared");
|
|
1908
1975
|
CsrfTokenService = class {
|
|
1909
1976
|
constructor(_secret, _cryptoService) {
|
|
1910
1977
|
this._secret = _secret;
|
|
@@ -1923,7 +1990,7 @@ var init_csrf_token_service = __esm({
|
|
|
1923
1990
|
if (separatorIndex <= 0) return false;
|
|
1924
1991
|
const nonce = token.slice(0, separatorIndex);
|
|
1925
1992
|
const signature = token.slice(separatorIndex + 1);
|
|
1926
|
-
if (
|
|
1993
|
+
if (import_shared45.Guards.isNullOrEmpty(nonce) || import_shared45.Guards.isNullOrEmpty(signature)) return false;
|
|
1927
1994
|
const expected = await this._cryptoService.hmacSha256(this._secret, `${subject}.${nonce}`);
|
|
1928
1995
|
const encoder = new TextEncoder();
|
|
1929
1996
|
const actualBuffer = encoder.encode(signature);
|
|
@@ -1944,11 +2011,11 @@ var init_csrf = __esm({
|
|
|
1944
2011
|
});
|
|
1945
2012
|
|
|
1946
2013
|
// src/infrastructure/services/extractors/extract-bearer.extractor.ts
|
|
1947
|
-
var
|
|
2014
|
+
var import_shared46, BearerTokenExtractor;
|
|
1948
2015
|
var init_extract_bearer_extractor = __esm({
|
|
1949
2016
|
"src/infrastructure/services/extractors/extract-bearer.extractor.ts"() {
|
|
1950
2017
|
"use strict";
|
|
1951
|
-
|
|
2018
|
+
import_shared46 = require("@xeno-js/shared");
|
|
1952
2019
|
BearerTokenExtractor = class {
|
|
1953
2020
|
constructor(_cookiePrefix) {
|
|
1954
2021
|
this._cookiePrefix = _cookiePrefix;
|
|
@@ -1956,14 +2023,14 @@ var init_extract_bearer_extractor = __esm({
|
|
|
1956
2023
|
_cookiePrefix;
|
|
1957
2024
|
extract(headers) {
|
|
1958
2025
|
const authHeader = headers.get("Authorization");
|
|
1959
|
-
if (
|
|
2026
|
+
if (import_shared46.Guards.isDefined(authHeader) && authHeader.toLowerCase().startsWith("bearer ")) {
|
|
1960
2027
|
return authHeader.substring(7);
|
|
1961
2028
|
}
|
|
1962
2029
|
const cookieHeader = headers.get("cookie");
|
|
1963
|
-
if (
|
|
2030
|
+
if (import_shared46.Guards.isDefined(cookieHeader)) {
|
|
1964
2031
|
const regex = new RegExp(`${this._cookiePrefix}=([^;]+)`);
|
|
1965
2032
|
const match = regex.exec(cookieHeader);
|
|
1966
|
-
if (!
|
|
2033
|
+
if (!import_shared46.Guards.isNullOrEmpty(match) && import_shared46.Guards.isDefined(match[1])) {
|
|
1967
2034
|
return match[1].trim();
|
|
1968
2035
|
}
|
|
1969
2036
|
}
|
|
@@ -1974,44 +2041,44 @@ var init_extract_bearer_extractor = __esm({
|
|
|
1974
2041
|
});
|
|
1975
2042
|
|
|
1976
2043
|
// src/infrastructure/services/extractors/extract-ssr-bearer.extractor.ts
|
|
1977
|
-
var
|
|
2044
|
+
var import_shared47, SupabaseSsrTokenExtractor;
|
|
1978
2045
|
var init_extract_ssr_bearer_extractor = __esm({
|
|
1979
2046
|
"src/infrastructure/services/extractors/extract-ssr-bearer.extractor.ts"() {
|
|
1980
2047
|
"use strict";
|
|
1981
|
-
|
|
2048
|
+
import_shared47 = require("@xeno-js/shared");
|
|
1982
2049
|
SupabaseSsrTokenExtractor = class {
|
|
1983
2050
|
extract(headers) {
|
|
1984
2051
|
const authHeader = headers.get("authorization");
|
|
1985
|
-
if (
|
|
2052
|
+
if (import_shared47.Guards.isDefined(authHeader) && authHeader.toLowerCase().startsWith("bearer ")) {
|
|
1986
2053
|
return authHeader.substring(7);
|
|
1987
2054
|
}
|
|
1988
2055
|
const cookieHeader = headers.get("cookie");
|
|
1989
|
-
if (
|
|
2056
|
+
if (import_shared47.Guards.isNullOrEmpty(cookieHeader)) return void 0;
|
|
1990
2057
|
const cookies = cookieHeader.split(";").map((c) => c.trim());
|
|
1991
2058
|
const tokenChunks = {};
|
|
1992
2059
|
let unchunkedToken;
|
|
1993
2060
|
for (const cookie of cookies) {
|
|
1994
2061
|
const [name, ...rest] = cookie.split("=");
|
|
1995
|
-
if (!
|
|
2062
|
+
if (!import_shared47.Guards.isDefined(name) || import_shared47.Guards.isNullOrEmpty(rest)) continue;
|
|
1996
2063
|
const value = decodeURIComponent(rest.join("="));
|
|
1997
|
-
if (
|
|
2064
|
+
if (import_shared47.Guards.isDefined(/^sb-[a-z0-9]+-auth-token$/.exec(name))) {
|
|
1998
2065
|
unchunkedToken = value;
|
|
1999
2066
|
} else {
|
|
2000
2067
|
const match = /^sb-[a-z0-9]+-auth-token\.(\d+)$/.exec(name);
|
|
2001
|
-
if (
|
|
2068
|
+
if (import_shared47.Guards.isDefined(match)) tokenChunks[parseInt(match[1], 10)] = value;
|
|
2002
2069
|
}
|
|
2003
2070
|
}
|
|
2004
2071
|
let fullTokenString = unchunkedToken;
|
|
2005
|
-
if (!
|
|
2072
|
+
if (!import_shared47.Guards.isDefined(fullTokenString) && Object.keys(tokenChunks).length > 0) {
|
|
2006
2073
|
const indices = Object.keys(tokenChunks).map(Number).sort((a, b) => a - b);
|
|
2007
2074
|
fullTokenString = indices.map((i) => tokenChunks[i]).join("");
|
|
2008
2075
|
}
|
|
2009
|
-
if (
|
|
2076
|
+
if (import_shared47.Guards.isNullOrEmpty(fullTokenString)) return void 0;
|
|
2010
2077
|
try {
|
|
2011
|
-
const parsed =
|
|
2012
|
-
if (
|
|
2078
|
+
const parsed = import_shared47.StringHelper.safeParse(fullTokenString);
|
|
2079
|
+
if (import_shared47.Guards.isDefined(parsed) && import_shared47.Guards.isObject(parsed) && "access_token" in parsed) {
|
|
2013
2080
|
const accessToken = parsed["access_token"];
|
|
2014
|
-
if (
|
|
2081
|
+
if (import_shared47.Guards.isString(accessToken)) return accessToken;
|
|
2015
2082
|
}
|
|
2016
2083
|
} catch {
|
|
2017
2084
|
return void 0;
|
|
@@ -2022,14 +2089,14 @@ var init_extract_ssr_bearer_extractor = __esm({
|
|
|
2022
2089
|
});
|
|
2023
2090
|
|
|
2024
2091
|
// src/infrastructure/services/extractors/http-cookie.extractor.ts
|
|
2025
|
-
var
|
|
2092
|
+
var import_shared48, HttpCookieExtractor;
|
|
2026
2093
|
var init_http_cookie_extractor = __esm({
|
|
2027
2094
|
"src/infrastructure/services/extractors/http-cookie.extractor.ts"() {
|
|
2028
2095
|
"use strict";
|
|
2029
|
-
|
|
2096
|
+
import_shared48 = require("@xeno-js/shared");
|
|
2030
2097
|
HttpCookieExtractor = class {
|
|
2031
2098
|
extract(cookie) {
|
|
2032
|
-
if (!
|
|
2099
|
+
if (!import_shared48.Guards.isDefined(cookie.header)) return void 0;
|
|
2033
2100
|
for (const rawCookie of cookie.header.split(";")) {
|
|
2034
2101
|
const separatorIndex = rawCookie.indexOf("=");
|
|
2035
2102
|
if (separatorIndex <= 0) continue;
|
|
@@ -2049,11 +2116,11 @@ var init_http_cookie_extractor = __esm({
|
|
|
2049
2116
|
});
|
|
2050
2117
|
|
|
2051
2118
|
// src/infrastructure/services/extractors/http-header.extractor.ts
|
|
2052
|
-
var
|
|
2119
|
+
var import_shared49, HttpHeaderExtractor;
|
|
2053
2120
|
var init_http_header_extractor = __esm({
|
|
2054
2121
|
"src/infrastructure/services/extractors/http-header.extractor.ts"() {
|
|
2055
2122
|
"use strict";
|
|
2056
|
-
|
|
2123
|
+
import_shared49 = require("@xeno-js/shared");
|
|
2057
2124
|
HttpHeaderExtractor = class {
|
|
2058
2125
|
/**
|
|
2059
2126
|
* @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.
|
|
@@ -2075,11 +2142,11 @@ var init_http_header_extractor = __esm({
|
|
|
2075
2142
|
_trustedIp;
|
|
2076
2143
|
_cookieName;
|
|
2077
2144
|
extract(headers) {
|
|
2078
|
-
const correlationId =
|
|
2079
|
-
const requestId =
|
|
2145
|
+
const correlationId = import_shared49.GuidHelper.parse(headers.get("x-correlation-id") ?? void 0);
|
|
2146
|
+
const requestId = import_shared49.GuidHelper.parse(headers.get("x-request-id") ?? void 0);
|
|
2080
2147
|
const token = this._bearerExtractor.extract(headers);
|
|
2081
2148
|
const clientIp = headers.get(this._trustedIp?.toLowerCase() ?? "x-forwarded-for") ?? headers.get("x-real-ip") ?? void 0;
|
|
2082
|
-
const spanId =
|
|
2149
|
+
const spanId = import_shared49.GuidHelper.parse(headers.get("x-span-id") ?? void 0);
|
|
2083
2150
|
const parentSpanId = headers.get("x-parent-span-id") ?? void 0;
|
|
2084
2151
|
const acceptHeader = headers.get("accept");
|
|
2085
2152
|
const contentTypeHeader = headers.get("content-type");
|
|
@@ -2096,9 +2163,9 @@ var init_http_header_extractor = __esm({
|
|
|
2096
2163
|
name: this._cookieName
|
|
2097
2164
|
});
|
|
2098
2165
|
const origin = headers.get("origin") ?? void 0;
|
|
2099
|
-
const cleanOrigin =
|
|
2166
|
+
const cleanOrigin = import_shared49.HttpHelper.sanitizeOriginUrl(origin);
|
|
2100
2167
|
const referer = headers.get("referer") ?? void 0;
|
|
2101
|
-
const cleanReferer =
|
|
2168
|
+
const cleanReferer = import_shared49.HttpHelper.sanitizeOriginUrl(referer);
|
|
2102
2169
|
const accept = acceptHeader === "*/*" ? void 0 : acceptHeader;
|
|
2103
2170
|
const formatIndicator = accept ?? contentTypeHeader ?? "application/json";
|
|
2104
2171
|
const metadata = {
|
|
@@ -2117,10 +2184,10 @@ var init_http_header_extractor = __esm({
|
|
|
2117
2184
|
referer: cleanReferer,
|
|
2118
2185
|
sequence: {
|
|
2119
2186
|
sequenceId,
|
|
2120
|
-
position:
|
|
2121
|
-
size:
|
|
2187
|
+
position: import_shared49.Guards.isDefined(position) ? import_shared49.MathHelper.toNumber(position) : void 0,
|
|
2188
|
+
size: import_shared49.Guards.isDefined(size) ? import_shared49.MathHelper.toNumber(size) : void 0
|
|
2122
2189
|
},
|
|
2123
|
-
expiration:
|
|
2190
|
+
expiration: import_shared49.Guards.isDefined(expiration) ? import_shared49.MathHelper.toNumber(expiration) : void 0
|
|
2124
2191
|
};
|
|
2125
2192
|
return metadata;
|
|
2126
2193
|
}
|
|
@@ -2140,18 +2207,18 @@ var init_extractors = __esm({
|
|
|
2140
2207
|
});
|
|
2141
2208
|
|
|
2142
2209
|
// src/infrastructure/services/resiliences/resilience.service.ts
|
|
2143
|
-
var
|
|
2210
|
+
var import_shared50, ServiceResilience;
|
|
2144
2211
|
var init_resilience_service = __esm({
|
|
2145
2212
|
"src/infrastructure/services/resiliences/resilience.service.ts"() {
|
|
2146
2213
|
"use strict";
|
|
2147
|
-
|
|
2214
|
+
import_shared50 = require("@xeno-js/shared");
|
|
2148
2215
|
ServiceResilience = class {
|
|
2149
2216
|
constructor(policy) {
|
|
2150
2217
|
this.policy = policy;
|
|
2151
2218
|
}
|
|
2152
2219
|
policy;
|
|
2153
2220
|
async execute(operation, signal) {
|
|
2154
|
-
|
|
2221
|
+
import_shared50.AppError.throwIfAborted(signal, "ServiceResilience.execute");
|
|
2155
2222
|
return this.policy.execute(() => operation(), signal);
|
|
2156
2223
|
}
|
|
2157
2224
|
};
|
|
@@ -2167,11 +2234,11 @@ var init_resiliences = __esm({
|
|
|
2167
2234
|
});
|
|
2168
2235
|
|
|
2169
2236
|
// src/infrastructure/services/resolver/utils/socket.utils.ts
|
|
2170
|
-
var
|
|
2237
|
+
var import_shared51, SocketIpExtractor;
|
|
2171
2238
|
var init_socket_utils = __esm({
|
|
2172
2239
|
"src/infrastructure/services/resolver/utils/socket.utils.ts"() {
|
|
2173
2240
|
"use strict";
|
|
2174
|
-
|
|
2241
|
+
import_shared51 = require("@xeno-js/shared");
|
|
2175
2242
|
SocketIpExtractor = Object.freeze({
|
|
2176
2243
|
/**
|
|
2177
2244
|
* @description Extracts the IP address of the remote socket from an incoming request.
|
|
@@ -2179,7 +2246,7 @@ var init_socket_utils = __esm({
|
|
|
2179
2246
|
* @returns The IP address of the remote socket, or undefined if not available.
|
|
2180
2247
|
*/
|
|
2181
2248
|
extract(req) {
|
|
2182
|
-
if (
|
|
2249
|
+
if (import_shared51.Guards.isDefined(req) && import_shared51.Guards.isObject(req)) {
|
|
2183
2250
|
const candidate = req;
|
|
2184
2251
|
return candidate.socket?.remoteAddress ?? candidate.connection?.remoteAddress;
|
|
2185
2252
|
}
|
|
@@ -2198,11 +2265,11 @@ var init_utils = __esm({
|
|
|
2198
2265
|
});
|
|
2199
2266
|
|
|
2200
2267
|
// src/infrastructure/services/resolver/client-ip.resolver.ts
|
|
2201
|
-
var
|
|
2268
|
+
var import_shared52, ClientIpResolver;
|
|
2202
2269
|
var init_client_ip_resolver = __esm({
|
|
2203
2270
|
"src/infrastructure/services/resolver/client-ip.resolver.ts"() {
|
|
2204
2271
|
"use strict";
|
|
2205
|
-
|
|
2272
|
+
import_shared52 = require("@xeno-js/shared");
|
|
2206
2273
|
init_utils();
|
|
2207
2274
|
ClientIpResolver = class {
|
|
2208
2275
|
constructor(_trustedProxies = []) {
|
|
@@ -2211,11 +2278,11 @@ var init_client_ip_resolver = __esm({
|
|
|
2211
2278
|
_trustedProxies;
|
|
2212
2279
|
resolve(req, clientIp) {
|
|
2213
2280
|
const socketIp = SocketIpExtractor.extract(req);
|
|
2214
|
-
if (!
|
|
2215
|
-
return !
|
|
2281
|
+
if (!import_shared52.Guards.isDefined(socketIp))
|
|
2282
|
+
return !import_shared52.Guards.isNullOrEmpty(clientIp) ? clientIp.split(",")[0].trim() : void 0;
|
|
2216
2283
|
const isTrustedProxy = this._trustedProxies.includes(socketIp);
|
|
2217
2284
|
if (!isTrustedProxy) return socketIp;
|
|
2218
|
-
if (
|
|
2285
|
+
if (import_shared52.Guards.isDefined(clientIp)) return clientIp.split(",")[0].trim();
|
|
2219
2286
|
return socketIp;
|
|
2220
2287
|
}
|
|
2221
2288
|
};
|
|
@@ -2237,6 +2304,7 @@ __export(services_exports, {
|
|
|
2237
2304
|
AllowOrigin: () => AllowOrigin,
|
|
2238
2305
|
BearerTokenExtractor: () => BearerTokenExtractor,
|
|
2239
2306
|
ClientIpResolver: () => ClientIpResolver,
|
|
2307
|
+
CookieHandler: () => CookieHandler,
|
|
2240
2308
|
CsrfTokenService: () => CsrfTokenService,
|
|
2241
2309
|
EdgeCryptoService: () => EdgeCryptoService,
|
|
2242
2310
|
HttpCookieExtractor: () => HttpCookieExtractor,
|
|
@@ -2251,6 +2319,7 @@ var init_services = __esm({
|
|
|
2251
2319
|
init_allow_methods();
|
|
2252
2320
|
init_allow_origins();
|
|
2253
2321
|
init_concurrency();
|
|
2322
|
+
init_cookies();
|
|
2254
2323
|
init_crypto();
|
|
2255
2324
|
init_csrf();
|
|
2256
2325
|
init_extractors();
|
|
@@ -2278,13 +2347,13 @@ var init_allow_method_factory = __esm({
|
|
|
2278
2347
|
});
|
|
2279
2348
|
|
|
2280
2349
|
// src/infrastructure/factories/axios.factory.ts
|
|
2281
|
-
var import_node_http, import_node_https,
|
|
2350
|
+
var import_node_http, import_node_https, import_shared53, import_axios, NodeAxiosFactory;
|
|
2282
2351
|
var init_axios_factory = __esm({
|
|
2283
2352
|
"src/infrastructure/factories/axios.factory.ts"() {
|
|
2284
2353
|
"use strict";
|
|
2285
2354
|
import_node_http = __toESM(require("http"), 1);
|
|
2286
2355
|
import_node_https = __toESM(require("https"), 1);
|
|
2287
|
-
|
|
2356
|
+
import_shared53 = require("@xeno-js/shared");
|
|
2288
2357
|
import_axios = __toESM(require("axios"), 1);
|
|
2289
2358
|
NodeAxiosFactory = class {
|
|
2290
2359
|
create(config) {
|
|
@@ -2311,18 +2380,18 @@ var init_axios_factory = __esm({
|
|
|
2311
2380
|
proxy: config.proxy,
|
|
2312
2381
|
withCredentials: config.withCredentials
|
|
2313
2382
|
});
|
|
2314
|
-
return new
|
|
2383
|
+
return new import_shared53.AxiosHttpClient(axiosInstance);
|
|
2315
2384
|
}
|
|
2316
2385
|
};
|
|
2317
2386
|
}
|
|
2318
2387
|
});
|
|
2319
2388
|
|
|
2320
2389
|
// src/infrastructure/factories/cockatiel-resilience.factory.ts
|
|
2321
|
-
var
|
|
2390
|
+
var import_shared54, import_cockatiel, CockatielResilienceFactory;
|
|
2322
2391
|
var init_cockatiel_resilience_factory = __esm({
|
|
2323
2392
|
"src/infrastructure/factories/cockatiel-resilience.factory.ts"() {
|
|
2324
2393
|
"use strict";
|
|
2325
|
-
|
|
2394
|
+
import_shared54 = require("@xeno-js/shared");
|
|
2326
2395
|
import_cockatiel = require("cockatiel");
|
|
2327
2396
|
init_resilience_service();
|
|
2328
2397
|
CockatielResilienceFactory = class {
|
|
@@ -2332,36 +2401,36 @@ var init_cockatiel_resilience_factory = __esm({
|
|
|
2332
2401
|
retry: {
|
|
2333
2402
|
attempts: this.checkConfigValue(
|
|
2334
2403
|
config.retry.attempts,
|
|
2335
|
-
|
|
2404
|
+
import_shared54.RESILIENCE_DEFAULTS.RETRY.ATTEMPTS,
|
|
2336
2405
|
message
|
|
2337
2406
|
),
|
|
2338
2407
|
baseDelayMs: this.checkConfigValue(
|
|
2339
2408
|
config.retry.baseDelayMs,
|
|
2340
|
-
|
|
2409
|
+
import_shared54.RESILIENCE_DEFAULTS.RETRY.BASE_DELAY_MS,
|
|
2341
2410
|
message
|
|
2342
2411
|
),
|
|
2343
2412
|
maxDelayMs: this.checkConfigValue(
|
|
2344
2413
|
config.retry.maxDelayMs,
|
|
2345
|
-
|
|
2414
|
+
import_shared54.RESILIENCE_DEFAULTS.RETRY.MAX_DELAY_MS,
|
|
2346
2415
|
message
|
|
2347
2416
|
)
|
|
2348
2417
|
},
|
|
2349
2418
|
circuitBreaker: {
|
|
2350
2419
|
consecutiveFailures: this.checkConfigValue(
|
|
2351
2420
|
config.circuitBreaker.consecutiveFailures,
|
|
2352
|
-
|
|
2421
|
+
import_shared54.RESILIENCE_DEFAULTS.CIRCUIT_BREAKER.CONSECUTIVE_FAILURES,
|
|
2353
2422
|
message
|
|
2354
2423
|
),
|
|
2355
2424
|
halfOpenTimeoutMs: this.checkConfigValue(
|
|
2356
2425
|
config.circuitBreaker.halfOpenTimeoutMs,
|
|
2357
|
-
|
|
2426
|
+
import_shared54.RESILIENCE_DEFAULTS.CIRCUIT_BREAKER.HALF_OPEN_TIMEOUT_MS,
|
|
2358
2427
|
message
|
|
2359
2428
|
)
|
|
2360
2429
|
},
|
|
2361
2430
|
bulkhead: {
|
|
2362
2431
|
maxConcurrent: this.checkConfigValue(
|
|
2363
2432
|
config.bulkhead.maxConcurrent,
|
|
2364
|
-
|
|
2433
|
+
import_shared54.RESILIENCE_DEFAULTS.BULKHEAD.MAX_CONCURRENT,
|
|
2365
2434
|
message
|
|
2366
2435
|
)
|
|
2367
2436
|
}
|
|
@@ -2387,13 +2456,13 @@ var init_cockatiel_resilience_factory = __esm({
|
|
|
2387
2456
|
return new ServiceResilience((0, import_cockatiel.wrap)(bulkheadPolicy, circuitBreakerPolicy, retryPolicy));
|
|
2388
2457
|
}
|
|
2389
2458
|
isTransientError(error) {
|
|
2390
|
-
if (!
|
|
2459
|
+
if (!import_shared54.Guards.isDefined(error) || !import_shared54.Guards.isObject(error)) return false;
|
|
2391
2460
|
let status;
|
|
2392
2461
|
let isNetworkError = false;
|
|
2393
|
-
if (error instanceof
|
|
2462
|
+
if (error instanceof import_shared54.AppError) {
|
|
2394
2463
|
status = error.status;
|
|
2395
2464
|
const cause = error.cause;
|
|
2396
|
-
if (
|
|
2465
|
+
if (import_shared54.Guards.isDefined(cause) && import_shared54.Guards.isString(cause.code)) {
|
|
2397
2466
|
isNetworkError = [
|
|
2398
2467
|
"ECONNABORTED",
|
|
2399
2468
|
"ECONNRESET",
|
|
@@ -2405,7 +2474,7 @@ var init_cockatiel_resilience_factory = __esm({
|
|
|
2405
2474
|
} else {
|
|
2406
2475
|
const err = error;
|
|
2407
2476
|
status = err.status;
|
|
2408
|
-
if (
|
|
2477
|
+
if (import_shared54.Guards.isString(err.code)) {
|
|
2409
2478
|
isNetworkError = [
|
|
2410
2479
|
"ECONNABORTED",
|
|
2411
2480
|
"ECONNRESET",
|
|
@@ -2416,30 +2485,30 @@ var init_cockatiel_resilience_factory = __esm({
|
|
|
2416
2485
|
}
|
|
2417
2486
|
}
|
|
2418
2487
|
if (isNetworkError) return true;
|
|
2419
|
-
if (
|
|
2488
|
+
if (import_shared54.Guards.isDefined(status)) return status === 408 || status >= 500 && status < 600;
|
|
2420
2489
|
return false;
|
|
2421
2490
|
}
|
|
2422
2491
|
isTransientAndIdempotent(error) {
|
|
2423
2492
|
if (!this.isTransientError(error)) return false;
|
|
2424
2493
|
let method;
|
|
2425
|
-
if (error instanceof
|
|
2494
|
+
if (error instanceof import_shared54.AppError) {
|
|
2426
2495
|
const cause = error.cause;
|
|
2427
|
-
if (
|
|
2496
|
+
if (import_shared54.Guards.isDefined(cause) && import_shared54.Guards.isDefined(cause.config) && import_shared54.Guards.isString(cause.config.method)) {
|
|
2428
2497
|
method = cause.config.method.toUpperCase();
|
|
2429
2498
|
}
|
|
2430
2499
|
} else {
|
|
2431
2500
|
const err = error;
|
|
2432
|
-
if (
|
|
2501
|
+
if (import_shared54.Guards.isDefined(err.config) && import_shared54.Guards.isString(err.config.method)) {
|
|
2433
2502
|
method = err.config.method.toUpperCase();
|
|
2434
2503
|
}
|
|
2435
2504
|
}
|
|
2436
|
-
if (
|
|
2505
|
+
if (import_shared54.Guards.isNullOrEmpty(method)) return false;
|
|
2437
2506
|
const idempotentMethods = ["GET", "PUT", "DELETE", "HEAD", "OPTIONS"];
|
|
2438
2507
|
return idempotentMethods.includes(method);
|
|
2439
2508
|
}
|
|
2440
2509
|
checkConfigValue(value, defaultValue, message) {
|
|
2441
|
-
if (
|
|
2442
|
-
|
|
2510
|
+
if (import_shared54.Guards.isDefined(value)) {
|
|
2511
|
+
import_shared54.Guards.throwIfNegative(value, message);
|
|
2443
2512
|
return value;
|
|
2444
2513
|
}
|
|
2445
2514
|
return defaultValue;
|
|
@@ -2471,11 +2540,11 @@ var init_db_client_factory = __esm({
|
|
|
2471
2540
|
});
|
|
2472
2541
|
|
|
2473
2542
|
// src/infrastructure/context/request-context.ts
|
|
2474
|
-
var
|
|
2543
|
+
var import_shared55, NodeRequestContext;
|
|
2475
2544
|
var init_request_context = __esm({
|
|
2476
2545
|
"src/infrastructure/context/request-context.ts"() {
|
|
2477
2546
|
"use strict";
|
|
2478
|
-
|
|
2547
|
+
import_shared55 = require("@xeno-js/shared");
|
|
2479
2548
|
NodeRequestContext = class {
|
|
2480
2549
|
/**
|
|
2481
2550
|
* @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.
|
|
@@ -2503,7 +2572,7 @@ var init_request_context = __esm({
|
|
|
2503
2572
|
}
|
|
2504
2573
|
updateIdentity(identity) {
|
|
2505
2574
|
const store = this._storage.getStore();
|
|
2506
|
-
if (
|
|
2575
|
+
if (import_shared55.Guards.isDefined(store) && import_shared55.Guards.isDefined(store.context)) {
|
|
2507
2576
|
store.context = Object.freeze({
|
|
2508
2577
|
...store.context,
|
|
2509
2578
|
identity: Object.freeze(identity)
|
|
@@ -2512,23 +2581,23 @@ var init_request_context = __esm({
|
|
|
2512
2581
|
}
|
|
2513
2582
|
getContext() {
|
|
2514
2583
|
const store = this._storage.getStore();
|
|
2515
|
-
if (!
|
|
2584
|
+
if (!import_shared55.Guards.isDefined(store)) return void 0;
|
|
2516
2585
|
const context = store.context;
|
|
2517
2586
|
return Object.freeze(context);
|
|
2518
2587
|
}
|
|
2519
2588
|
getIdentity() {
|
|
2520
2589
|
const store = this._storage.getStore();
|
|
2521
|
-
if (!
|
|
2590
|
+
if (!import_shared55.Guards.isDefined(store)) return void 0;
|
|
2522
2591
|
return Object.freeze(store.context?.identity);
|
|
2523
2592
|
}
|
|
2524
2593
|
getScope() {
|
|
2525
2594
|
const store = this._storage.getStore();
|
|
2526
|
-
if (!
|
|
2595
|
+
if (!import_shared55.Guards.isDefined(store)) return void 0;
|
|
2527
2596
|
return store.scope;
|
|
2528
2597
|
}
|
|
2529
2598
|
getNetworkContext() {
|
|
2530
2599
|
const store = this._storage.getStore();
|
|
2531
|
-
if (!
|
|
2600
|
+
if (!import_shared55.Guards.isDefined(store)) return void 0;
|
|
2532
2601
|
return Object.freeze(store.context?.network);
|
|
2533
2602
|
}
|
|
2534
2603
|
};
|
|
@@ -2601,37 +2670,37 @@ var init_sql_light_db_client_factory = __esm({
|
|
|
2601
2670
|
});
|
|
2602
2671
|
|
|
2603
2672
|
// src/infrastructure/factories/supabase.factory.ts
|
|
2604
|
-
var import_ssr,
|
|
2673
|
+
var import_ssr, import_shared56, SupabaseServerAuthFactory;
|
|
2605
2674
|
var init_supabase_factory = __esm({
|
|
2606
2675
|
"src/infrastructure/factories/supabase.factory.ts"() {
|
|
2607
2676
|
"use strict";
|
|
2608
2677
|
import_ssr = require("@supabase/ssr");
|
|
2609
|
-
|
|
2678
|
+
import_shared56 = require("@xeno-js/shared");
|
|
2679
|
+
init_services();
|
|
2610
2680
|
SupabaseServerAuthFactory = class {
|
|
2611
2681
|
create({
|
|
2612
2682
|
config,
|
|
2613
2683
|
container
|
|
2614
2684
|
}) {
|
|
2615
|
-
|
|
2616
|
-
throw new Error(
|
|
2617
|
-
"ISsrCookieHandler is required for @supabase/ssr initialization., Please provide it in the config object."
|
|
2618
|
-
);
|
|
2619
|
-
}
|
|
2620
|
-
const cookieService = config.ssrOpts(container);
|
|
2685
|
+
const cookieService = this._getCookieSsr(config.ssrOpts, container, config.cookieOpts);
|
|
2621
2686
|
const client = (0, import_ssr.createServerClient)(config.url, config.key, {
|
|
2622
2687
|
...config.opts,
|
|
2623
|
-
cookies:
|
|
2624
|
-
getAll() {
|
|
2625
|
-
return cookieService.getAll();
|
|
2626
|
-
},
|
|
2627
|
-
setAll(cookiesToSet) {
|
|
2628
|
-
cookieService.setAll(cookiesToSet);
|
|
2629
|
-
}
|
|
2630
|
-
}
|
|
2688
|
+
cookies: cookieService
|
|
2631
2689
|
});
|
|
2632
|
-
const mapper = new
|
|
2633
|
-
const sessionMapper = new
|
|
2634
|
-
return new
|
|
2690
|
+
const mapper = new import_shared56.SupabaseClaimsMapper();
|
|
2691
|
+
const sessionMapper = new import_shared56.SupabaseSessionMapper(mapper);
|
|
2692
|
+
return new import_shared56.SupabaseAuthService(client, mapper, sessionMapper, config);
|
|
2693
|
+
}
|
|
2694
|
+
_getCookieSsr(ssrOpts, container, config) {
|
|
2695
|
+
if (import_shared56.Guards.isDefined(ssrOpts)) {
|
|
2696
|
+
return ssrOpts(container);
|
|
2697
|
+
} else {
|
|
2698
|
+
return new CookieHandler(
|
|
2699
|
+
container.resolve(import_shared56.TOKENS.REQUEST_CONTEXT),
|
|
2700
|
+
container.resolve(import_shared56.TOKENS.CONFIGURATION_SERVICE),
|
|
2701
|
+
config
|
|
2702
|
+
);
|
|
2703
|
+
}
|
|
2635
2704
|
}
|
|
2636
2705
|
};
|
|
2637
2706
|
}
|
|
@@ -2642,11 +2711,11 @@ var user_context_factory_exports = {};
|
|
|
2642
2711
|
__export(user_context_factory_exports, {
|
|
2643
2712
|
UserContextFactory: () => UserContextFactory
|
|
2644
2713
|
});
|
|
2645
|
-
var
|
|
2714
|
+
var import_shared57, UserContextFactory;
|
|
2646
2715
|
var init_user_context_factory = __esm({
|
|
2647
2716
|
"src/infrastructure/factories/user-context.factory.ts"() {
|
|
2648
2717
|
"use strict";
|
|
2649
|
-
|
|
2718
|
+
import_shared57 = require("@xeno-js/shared");
|
|
2650
2719
|
UserContextFactory = class {
|
|
2651
2720
|
/**
|
|
2652
2721
|
* @description Constructs an instance of UserContextFactory.
|
|
@@ -2667,7 +2736,7 @@ var init_user_context_factory = __esm({
|
|
|
2667
2736
|
tenantId: void 0
|
|
2668
2737
|
};
|
|
2669
2738
|
const identity = this._identityFactory.getIdentity();
|
|
2670
|
-
if (
|
|
2739
|
+
if (import_shared57.Guards.isDefined(identity)) {
|
|
2671
2740
|
output.userId = identity.userId;
|
|
2672
2741
|
output.tenantId = identity.tenantId;
|
|
2673
2742
|
}
|
|
@@ -2678,14 +2747,14 @@ var init_user_context_factory = __esm({
|
|
|
2678
2747
|
});
|
|
2679
2748
|
|
|
2680
2749
|
// src/infrastructure/factories/zod-validator.factory.ts
|
|
2681
|
-
var
|
|
2750
|
+
var import_shared58, ZodValidatorFactory;
|
|
2682
2751
|
var init_zod_validator_factory = __esm({
|
|
2683
2752
|
"src/infrastructure/factories/zod-validator.factory.ts"() {
|
|
2684
2753
|
"use strict";
|
|
2685
|
-
|
|
2754
|
+
import_shared58 = require("@xeno-js/shared");
|
|
2686
2755
|
ZodValidatorFactory = class {
|
|
2687
2756
|
create(opts) {
|
|
2688
|
-
const validatorService = new
|
|
2757
|
+
const validatorService = new import_shared58.ZodValidatorService(/* @__PURE__ */ new Map(), opts.logger);
|
|
2689
2758
|
for (const [intentKey, schema] of Object.entries(opts.schemas)) {
|
|
2690
2759
|
validatorService.addSchema(intentKey, schema);
|
|
2691
2760
|
}
|
|
@@ -2753,28 +2822,28 @@ var init_auth_utils = __esm({
|
|
|
2753
2822
|
* @link https://github.com/xeno-js/xeno-js
|
|
2754
2823
|
*/
|
|
2755
2824
|
async addAuthZ(container, opts) {
|
|
2756
|
-
const { TOKENS:
|
|
2825
|
+
const { TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
2757
2826
|
const strategies = [];
|
|
2758
|
-
const { Guards:
|
|
2759
|
-
if (
|
|
2827
|
+
const { Guards: Guards47 } = await import("@xeno-js/shared");
|
|
2828
|
+
if (Guards47.isDefined(opts.policies)) {
|
|
2760
2829
|
const { PolicyRegistry: PolicyRegistry2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
2761
2830
|
const policyRegistry = opts.policies;
|
|
2762
2831
|
const registryInstance = new PolicyRegistry2();
|
|
2763
|
-
const ctxAccessor = container.resolve(
|
|
2832
|
+
const ctxAccessor = container.resolve(TOKENS5.CONTEXT_ACCESSOR);
|
|
2764
2833
|
const Policies = /* @__PURE__ */ new Set();
|
|
2765
2834
|
for (const [intent, policy] of Object.entries(policyRegistry)) {
|
|
2766
2835
|
const intentLower = intent.toLowerCase();
|
|
2767
2836
|
registryInstance.addPolicy(intentLower, policy);
|
|
2768
|
-
if (!
|
|
2837
|
+
if (!Guards47.isNullOrEmpty(policy.roles)) {
|
|
2769
2838
|
Policies.add("roles");
|
|
2770
2839
|
}
|
|
2771
|
-
if (!
|
|
2840
|
+
if (!Guards47.isNullOrEmpty(policy.permissions)) {
|
|
2772
2841
|
Policies.add("permissions");
|
|
2773
2842
|
}
|
|
2774
|
-
if (!
|
|
2843
|
+
if (!Guards47.isNullOrEmpty(policy.userId)) {
|
|
2775
2844
|
Policies.add("userId");
|
|
2776
2845
|
}
|
|
2777
|
-
if (!
|
|
2846
|
+
if (!Guards47.isNullOrEmpty(policy.tenantId)) {
|
|
2778
2847
|
Policies.add("tenantId");
|
|
2779
2848
|
}
|
|
2780
2849
|
}
|
|
@@ -2795,10 +2864,10 @@ var init_auth_utils = __esm({
|
|
|
2795
2864
|
strategies.push(new TenantAuthorizationStrategy2(registryInstance, ctxAccessor));
|
|
2796
2865
|
}
|
|
2797
2866
|
}
|
|
2798
|
-
if (!
|
|
2867
|
+
if (!Guards47.isNullOrEmpty(opts.customAuthorizationStrategy)) {
|
|
2799
2868
|
const customStrategies = opts.customAuthorizationStrategy;
|
|
2800
2869
|
customStrategies.forEach((strategyToken) => {
|
|
2801
|
-
if (
|
|
2870
|
+
if (Guards47.isDefined(strategyToken)) {
|
|
2802
2871
|
strategies.push(strategyToken(container));
|
|
2803
2872
|
}
|
|
2804
2873
|
});
|
|
@@ -2818,23 +2887,23 @@ var init_auth_utils = __esm({
|
|
|
2818
2887
|
* @link https://github.com/xeno-js/xeno-js
|
|
2819
2888
|
*/
|
|
2820
2889
|
async addAuthN(container, opts) {
|
|
2821
|
-
const { Guards:
|
|
2822
|
-
if (
|
|
2890
|
+
const { Guards: Guards47, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
2891
|
+
if (Guards47.isDefined(opts.customAuth)) {
|
|
2823
2892
|
const authService = opts.customAuth.authExtendedService();
|
|
2824
|
-
container.addScoped(
|
|
2893
|
+
container.addScoped(TOKENS5.AUTH_SERVICE, () => {
|
|
2825
2894
|
return authService;
|
|
2826
2895
|
});
|
|
2827
|
-
container.addSingleton(
|
|
2896
|
+
container.addSingleton(TOKENS5.BASE_AUTH_SERVICE, () => {
|
|
2828
2897
|
return authService;
|
|
2829
2898
|
});
|
|
2830
2899
|
} else {
|
|
2831
2900
|
const { SupabaseServerAuthFactory: SupabaseServerAuthFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
|
|
2832
2901
|
const factory = new SupabaseServerAuthFactory2();
|
|
2833
2902
|
const supabase = factory.create({ config: opts, container });
|
|
2834
|
-
container.addScoped(
|
|
2903
|
+
container.addScoped(TOKENS5.AUTH_SERVICE, () => {
|
|
2835
2904
|
return supabase;
|
|
2836
2905
|
});
|
|
2837
|
-
container.addSingleton(
|
|
2906
|
+
container.addSingleton(TOKENS5.BASE_AUTH_SERVICE, () => {
|
|
2838
2907
|
return supabase;
|
|
2839
2908
|
});
|
|
2840
2909
|
}
|
|
@@ -2929,12 +2998,12 @@ var unit_of_work_exports = {};
|
|
|
2929
2998
|
__export(unit_of_work_exports, {
|
|
2930
2999
|
UnitOfWork: () => UnitOfWork
|
|
2931
3000
|
});
|
|
2932
|
-
var
|
|
3001
|
+
var import_shared59, import_shared60, UnitOfWork;
|
|
2933
3002
|
var init_unit_of_work = __esm({
|
|
2934
3003
|
"src/infrastructure/transaction/unit-of-work.ts"() {
|
|
2935
3004
|
"use strict";
|
|
2936
|
-
import_shared58 = require("@xeno-js/shared");
|
|
2937
3005
|
import_shared59 = require("@xeno-js/shared");
|
|
3006
|
+
import_shared60 = require("@xeno-js/shared");
|
|
2938
3007
|
UnitOfWork = class {
|
|
2939
3008
|
/**
|
|
2940
3009
|
* Creates an instance of UnitOfWork.
|
|
@@ -2953,7 +3022,7 @@ var init_unit_of_work = __esm({
|
|
|
2953
3022
|
_dbContext;
|
|
2954
3023
|
_ttx;
|
|
2955
3024
|
async runInTransaction(callback, signal) {
|
|
2956
|
-
|
|
3025
|
+
import_shared59.AppError.throwIfAborted(signal, "UnitOfWork.runInTransaction");
|
|
2957
3026
|
return this._dbContext.transaction(async (tx) => {
|
|
2958
3027
|
this._ttx.state = tx;
|
|
2959
3028
|
try {
|
|
@@ -2965,9 +3034,9 @@ var init_unit_of_work = __esm({
|
|
|
2965
3034
|
});
|
|
2966
3035
|
}
|
|
2967
3036
|
async dispose() {
|
|
2968
|
-
if (
|
|
3037
|
+
if (import_shared60.Guards.isDefined(this._ttx.state)) {
|
|
2969
3038
|
try {
|
|
2970
|
-
if (
|
|
3039
|
+
if (import_shared60.Guards.hasMethod(this._ttx.state, "rollback")) {
|
|
2971
3040
|
await this._ttx.state.rollback();
|
|
2972
3041
|
}
|
|
2973
3042
|
} finally {
|
|
@@ -2990,7 +3059,7 @@ var init_db_module = __esm({
|
|
|
2990
3059
|
"use strict";
|
|
2991
3060
|
DbModule = class {
|
|
2992
3061
|
async configure(container, opts) {
|
|
2993
|
-
const { Guards:
|
|
3062
|
+
const { Guards: Guards47, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
2994
3063
|
const { DbUtils: DbUtils2 } = await Promise.resolve().then(() => (init_db_utils(), db_utils_exports));
|
|
2995
3064
|
const db = opts.enableSqlLite ? await DbUtils2.addSqlLite(opts) : await DbUtils2.addDbClient(opts);
|
|
2996
3065
|
const { TransactionState: TransactionState2 } = await Promise.resolve().then(() => (init_transaction_state(), transaction_state_exports));
|
|
@@ -2998,16 +3067,16 @@ var init_db_module = __esm({
|
|
|
2998
3067
|
return new TransactionState2();
|
|
2999
3068
|
});
|
|
3000
3069
|
const { UnitOfWork: UnitOfWork2 } = await Promise.resolve().then(() => (init_unit_of_work(), unit_of_work_exports));
|
|
3001
|
-
container.addScoped(
|
|
3070
|
+
container.addScoped(TOKENS5.UNIT_OF_WORK, (c) => {
|
|
3002
3071
|
const ttx = c.resolve("TRANSACTION_STATE");
|
|
3003
3072
|
return new UnitOfWork2(db, ttx);
|
|
3004
3073
|
});
|
|
3005
|
-
container.addScoped(
|
|
3074
|
+
container.addScoped(TOKENS5.DB_CONTEXT, (c) => {
|
|
3006
3075
|
const ttx = c.resolve("TRANSACTION_STATE");
|
|
3007
3076
|
return new Proxy(db, {
|
|
3008
3077
|
get(_target, prop, receiver) {
|
|
3009
3078
|
const activeState = ttx.state;
|
|
3010
|
-
if (
|
|
3079
|
+
if (Guards47.isDefined(activeState)) {
|
|
3011
3080
|
if (prop === "transaction") {
|
|
3012
3081
|
return activeState.transaction.bind(activeState);
|
|
3013
3082
|
}
|
|
@@ -3044,14 +3113,14 @@ var init_http_utils = __esm({
|
|
|
3044
3113
|
*/
|
|
3045
3114
|
async addAxios(container, opts) {
|
|
3046
3115
|
const { NodeAxiosFactory: NodeAxiosFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
|
|
3047
|
-
const { Guards:
|
|
3048
|
-
if (!
|
|
3116
|
+
const { Guards: Guards47 } = await import("@xeno-js/shared");
|
|
3117
|
+
if (!Guards47.isDefined(opts.token)) {
|
|
3049
3118
|
throw new Error("HttpConfig.token is required and must be defined.");
|
|
3050
3119
|
}
|
|
3051
3120
|
container.addSingleton(opts.token, () => {
|
|
3052
3121
|
const factory = new NodeAxiosFactory2();
|
|
3053
3122
|
const instance = factory.create(opts.client);
|
|
3054
|
-
if (!
|
|
3123
|
+
if (!Guards47.hasMethod(instance, "get") || !Guards47.hasMethod(instance, "post") || !Guards47.hasMethod(instance, "put") || !Guards47.hasMethod(instance, "patch") || !Guards47.hasMethod(instance, "delete")) {
|
|
3055
3124
|
throw new Error(
|
|
3056
3125
|
"The created HTTP client instance does not implement the required methods of IHttpClient."
|
|
3057
3126
|
);
|
|
@@ -3070,9 +3139,9 @@ var init_http_utils = __esm({
|
|
|
3070
3139
|
* @link https://github.com/xeno-js/xeno-js
|
|
3071
3140
|
*/
|
|
3072
3141
|
async addResilience(container, opts) {
|
|
3073
|
-
const { TOKENS:
|
|
3142
|
+
const { TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
3074
3143
|
const { CockatielResilienceFactory: CockatielResilienceFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
|
|
3075
|
-
container.addSingleton(
|
|
3144
|
+
container.addSingleton(TOKENS5.RESILIENCE_CLIENT, () => {
|
|
3076
3145
|
const factory = new CockatielResilienceFactory2();
|
|
3077
3146
|
return factory.create(opts);
|
|
3078
3147
|
});
|
|
@@ -3121,22 +3190,22 @@ var init_validation_utils = __esm({
|
|
|
3121
3190
|
* @link https://github.com/xeno-js/xeno-js
|
|
3122
3191
|
*/
|
|
3123
3192
|
async addValidation(container, opts, logger) {
|
|
3124
|
-
const { Guards:
|
|
3125
|
-
if (!
|
|
3193
|
+
const { Guards: Guards47, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
3194
|
+
if (!Guards47.isDefined(opts.zod) && Guards47.isNullOrEmpty(opts.customValidationStrategy)) {
|
|
3126
3195
|
return;
|
|
3127
3196
|
}
|
|
3128
3197
|
const validationStrategies = [];
|
|
3129
|
-
if (
|
|
3198
|
+
if (Guards47.isDefined(opts.zod)) {
|
|
3130
3199
|
const config = opts.zod;
|
|
3131
3200
|
const { ZodValidatorFactory: ZodValidatorFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
|
|
3132
3201
|
const { SchemaValidationStrategy: SchemaValidationStrategy2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
3133
3202
|
const validatorService = new ZodValidatorFactory2().create({ ...config, logger });
|
|
3134
|
-
container.addSingleton(
|
|
3203
|
+
container.addSingleton(TOKENS5.VALIDATOR_SERVICE, () => validatorService);
|
|
3135
3204
|
validationStrategies.push(new SchemaValidationStrategy2(validatorService));
|
|
3136
3205
|
}
|
|
3137
|
-
if (!
|
|
3206
|
+
if (!Guards47.isNullOrEmpty(opts.customValidationStrategy)) {
|
|
3138
3207
|
for (const strategyToken of opts.customValidationStrategy) {
|
|
3139
|
-
if (
|
|
3208
|
+
if (Guards47.isDefined(strategyToken)) validationStrategies.push(strategyToken(container));
|
|
3140
3209
|
}
|
|
3141
3210
|
}
|
|
3142
3211
|
const { ValidationPipeline: ValidationPipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
@@ -3147,11 +3216,11 @@ var init_validation_utils = __esm({
|
|
|
3147
3216
|
});
|
|
3148
3217
|
|
|
3149
3218
|
// src/infrastructure/idempotency/idempotency-store.ts
|
|
3150
|
-
var
|
|
3219
|
+
var import_shared61, IdempotencyStore;
|
|
3151
3220
|
var init_idempotency_store = __esm({
|
|
3152
3221
|
"src/infrastructure/idempotency/idempotency-store.ts"() {
|
|
3153
3222
|
"use strict";
|
|
3154
|
-
|
|
3223
|
+
import_shared61 = require("@xeno-js/shared");
|
|
3155
3224
|
IdempotencyStore = class {
|
|
3156
3225
|
/**
|
|
3157
3226
|
* @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.
|
|
@@ -3173,31 +3242,31 @@ var init_idempotency_store = __esm({
|
|
|
3173
3242
|
async acquireLock(requestId, ttlSeconds) {
|
|
3174
3243
|
const key = this._cacheKeyBuilder.buildContextualKey(`command:${requestId}`);
|
|
3175
3244
|
return await this._cache.setIfAbsent(
|
|
3176
|
-
`${
|
|
3177
|
-
|
|
3245
|
+
`${import_shared61.IDEMPOTENCY_CONSTANTS.LOCK_KEY_PREFIX}${key}`,
|
|
3246
|
+
import_shared61.IDEMPOTENCY_CONSTANTS.LOCKED_VALUE,
|
|
3178
3247
|
ttlSeconds
|
|
3179
3248
|
);
|
|
3180
3249
|
}
|
|
3181
3250
|
async hasBeenProcessed(commandId) {
|
|
3182
3251
|
const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
|
|
3183
|
-
return await this._cache.has(`${
|
|
3252
|
+
return await this._cache.has(`${import_shared61.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`);
|
|
3184
3253
|
}
|
|
3185
3254
|
async markAsProcessed(commandId, payload, ttlSeconds) {
|
|
3186
3255
|
const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
|
|
3187
3256
|
await this._cache.set(
|
|
3188
|
-
`${
|
|
3257
|
+
`${import_shared61.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`,
|
|
3189
3258
|
payload,
|
|
3190
3259
|
ttlSeconds
|
|
3191
3260
|
);
|
|
3192
3261
|
}
|
|
3193
3262
|
async getPayload(commandId) {
|
|
3194
3263
|
const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
|
|
3195
|
-
const payload = await this._cache.get(`${
|
|
3264
|
+
const payload = await this._cache.get(`${import_shared61.IDEMPOTENCY_CONSTANTS.PROCESSED_KEY_PREFIX}${key}`);
|
|
3196
3265
|
return payload;
|
|
3197
3266
|
}
|
|
3198
3267
|
async releaseLock(commandId) {
|
|
3199
3268
|
const key = this._cacheKeyBuilder.buildContextualKey(`command:${commandId}`);
|
|
3200
|
-
await this._cache.remove(`${
|
|
3269
|
+
await this._cache.remove(`${import_shared61.IDEMPOTENCY_CONSTANTS.LOCK_KEY_PREFIX}${key}`);
|
|
3201
3270
|
}
|
|
3202
3271
|
};
|
|
3203
3272
|
}
|
|
@@ -3236,16 +3305,16 @@ var init_pipeline_utils = __esm({
|
|
|
3236
3305
|
* @link https://github.com/xeno-js/xeno-js
|
|
3237
3306
|
*/
|
|
3238
3307
|
async addCommand(container, opts) {
|
|
3239
|
-
const { Guards:
|
|
3308
|
+
const { Guards: Guards47, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
3240
3309
|
const pipelines = [];
|
|
3241
|
-
if (
|
|
3310
|
+
if (Guards47.isDefined(opts.idempotency)) {
|
|
3242
3311
|
const { IdempotencyStore: IdempotencyStore2 } = await Promise.resolve().then(() => (init_idempotency(), idempotency_exports));
|
|
3243
3312
|
const imdStore = new IdempotencyStore2(
|
|
3244
|
-
container.resolve(
|
|
3245
|
-
container.resolve(
|
|
3313
|
+
container.resolve(TOKENS5.CACHE),
|
|
3314
|
+
container.resolve(TOKENS5.CACHE_KEY_BUILDER)
|
|
3246
3315
|
);
|
|
3247
3316
|
const { IdempotencyPipeline: IdempotencyPipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
3248
|
-
const requestContext = container.resolve(
|
|
3317
|
+
const requestContext = container.resolve(TOKENS5.NETWORK_CONTEXT_ACCESSOR);
|
|
3249
3318
|
const config = opts.idempotency;
|
|
3250
3319
|
pipelines.push(
|
|
3251
3320
|
new IdempotencyPipeline2(
|
|
@@ -3256,7 +3325,7 @@ var init_pipeline_utils = __esm({
|
|
|
3256
3325
|
)
|
|
3257
3326
|
);
|
|
3258
3327
|
}
|
|
3259
|
-
if (
|
|
3328
|
+
if (Guards47.isDefined(opts.concurrency)) {
|
|
3260
3329
|
const { ConcurrencyRetryPipeline: ConcurrencyRetryPipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
3261
3330
|
const config = opts.concurrency;
|
|
3262
3331
|
pipelines.push(new ConcurrencyRetryPipeline2(config?.maxRetries, config?.delayConfig));
|
|
@@ -3274,12 +3343,12 @@ var init_pipeline_utils = __esm({
|
|
|
3274
3343
|
* @link https://github.com/xeno-js/xeno-js
|
|
3275
3344
|
*/
|
|
3276
3345
|
async addQuery(container) {
|
|
3277
|
-
const { TOKENS:
|
|
3346
|
+
const { TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
3278
3347
|
const { QueryCachingPipeline: QueryCachingPipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
3279
3348
|
return new QueryCachingPipeline2(
|
|
3280
|
-
container.resolve(
|
|
3281
|
-
container.resolve(
|
|
3282
|
-
container.resolve(
|
|
3349
|
+
container.resolve(TOKENS5.CACHE),
|
|
3350
|
+
container.resolve(TOKENS5.CACHE_KEY_BUILDER),
|
|
3351
|
+
container.resolve(TOKENS5.LOGGER)
|
|
3283
3352
|
);
|
|
3284
3353
|
}
|
|
3285
3354
|
});
|
|
@@ -3297,11 +3366,11 @@ var init_cqrs_module = __esm({
|
|
|
3297
3366
|
"use strict";
|
|
3298
3367
|
CqrsModule = class {
|
|
3299
3368
|
async configure(container, opts) {
|
|
3300
|
-
const { TOKENS:
|
|
3301
|
-
const logger = container.resolve(
|
|
3369
|
+
const { TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
3370
|
+
const logger = container.resolve(TOKENS5.LOGGER);
|
|
3302
3371
|
const { Mediator: Mediator2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
3303
|
-
container.addSingleton(
|
|
3304
|
-
const serviceScopeAccessor = c.resolve(
|
|
3372
|
+
container.addSingleton(TOKENS5.MEDIATOR, (c) => {
|
|
3373
|
+
const serviceScopeAccessor = c.resolve(TOKENS5.SERVICE_SCOPE_ACCESSOR);
|
|
3305
3374
|
return new Mediator2(serviceScopeAccessor);
|
|
3306
3375
|
});
|
|
3307
3376
|
const { ExceptionPipeline: ExceptionPipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
@@ -3313,24 +3382,24 @@ var init_cqrs_module = __esm({
|
|
|
3313
3382
|
new LoggingPipeline2(logger),
|
|
3314
3383
|
new PerformancePipeline2(logger, thresholdMs)
|
|
3315
3384
|
];
|
|
3316
|
-
const { Guards:
|
|
3317
|
-
if (
|
|
3385
|
+
const { Guards: Guards47 } = await import("@xeno-js/shared");
|
|
3386
|
+
if (Guards47.isDefined(opts.authorization.policies) || Guards47.isDefined(opts.authorization.customAuthorizationStrategy)) {
|
|
3318
3387
|
const { AuthUtils: AuthUtils2 } = await Promise.resolve().then(() => (init_auth_utils(), auth_utils_exports));
|
|
3319
3388
|
const authPipelines = await AuthUtils2.addAuthZ(container, opts.authorization);
|
|
3320
3389
|
pipelines.push(authPipelines);
|
|
3321
3390
|
}
|
|
3322
|
-
if (
|
|
3391
|
+
if (Guards47.isDefined(opts.validation.zod) || Guards47.isDefined(opts.validation.customValidationStrategy)) {
|
|
3323
3392
|
const { ValidationUtils: ValidationUtils2 } = await Promise.resolve().then(() => (init_validation_utils(), validation_utils_exports));
|
|
3324
3393
|
const validationPipelines = await ValidationUtils2.addValidation(
|
|
3325
3394
|
container,
|
|
3326
3395
|
opts.validation,
|
|
3327
3396
|
logger
|
|
3328
3397
|
);
|
|
3329
|
-
if (
|
|
3398
|
+
if (Guards47.isDefined(validationPipelines)) pipelines.push(validationPipelines);
|
|
3330
3399
|
}
|
|
3331
3400
|
const commandPipelines = [...pipelines];
|
|
3332
3401
|
const queryPipelines = [...pipelines];
|
|
3333
|
-
if (
|
|
3402
|
+
if (Guards47.isDefined(opts.commandBus.idempotency) || Guards47.isDefined(opts.commandBus.concurrency)) {
|
|
3334
3403
|
const { PipelineUtils: PipelineUtils2 } = await Promise.resolve().then(() => (init_pipeline_utils(), pipeline_utils_exports));
|
|
3335
3404
|
const newCommandPipelines = await PipelineUtils2.addCommand(container, opts.commandBus);
|
|
3336
3405
|
commandPipelines.push(...newCommandPipelines);
|
|
@@ -3341,10 +3410,10 @@ var init_cqrs_module = __esm({
|
|
|
3341
3410
|
queryPipelines.push(newQueryPipelines);
|
|
3342
3411
|
}
|
|
3343
3412
|
const { CompositePipeline: CompositePipeline2 } = await Promise.resolve().then(() => (init_application(), application_exports));
|
|
3344
|
-
container.addSingleton(
|
|
3413
|
+
container.addSingleton(TOKENS5.COMMAND_PIPELINES_BEHAVIOR, () => {
|
|
3345
3414
|
return new CompositePipeline2(commandPipelines);
|
|
3346
3415
|
});
|
|
3347
|
-
container.addSingleton(
|
|
3416
|
+
container.addSingleton(TOKENS5.QUERY_PIPELINES_BEHAVIOR, () => {
|
|
3348
3417
|
return new CompositePipeline2(queryPipelines);
|
|
3349
3418
|
});
|
|
3350
3419
|
}
|
|
@@ -3353,11 +3422,11 @@ var init_cqrs_module = __esm({
|
|
|
3353
3422
|
});
|
|
3354
3423
|
|
|
3355
3424
|
// src/presentation/controllers/base.controller.ts
|
|
3356
|
-
var
|
|
3425
|
+
var import_shared62, BaseController;
|
|
3357
3426
|
var init_base_controller = __esm({
|
|
3358
3427
|
"src/presentation/controllers/base.controller.ts"() {
|
|
3359
3428
|
"use strict";
|
|
3360
|
-
|
|
3429
|
+
import_shared62 = require("@xeno-js/shared");
|
|
3361
3430
|
BaseController = class {
|
|
3362
3431
|
/**
|
|
3363
3432
|
* Constructs a new instance of the BaseController class.
|
|
@@ -3389,7 +3458,7 @@ var init_base_controller = __esm({
|
|
|
3389
3458
|
* @link https://github.com/xeno-js/xeno-js
|
|
3390
3459
|
*/
|
|
3391
3460
|
ok(data, status = 200, meta = {}, headers = {}) {
|
|
3392
|
-
return
|
|
3461
|
+
return import_shared62.HttpHelper.success(data, status, meta, headers);
|
|
3393
3462
|
}
|
|
3394
3463
|
/**
|
|
3395
3464
|
* Helper to automatically map a failed Result (from the CQRS pipeline)
|
|
@@ -3407,7 +3476,7 @@ var init_base_controller = __esm({
|
|
|
3407
3476
|
fail(error, details = void 0, headers = {}) {
|
|
3408
3477
|
const context = this._requestContext.getContext();
|
|
3409
3478
|
const customHeaders = error["header"];
|
|
3410
|
-
return
|
|
3479
|
+
return import_shared62.HttpHelper.error(
|
|
3411
3480
|
{
|
|
3412
3481
|
success: false,
|
|
3413
3482
|
error: {
|
|
@@ -3416,9 +3485,9 @@ var init_base_controller = __esm({
|
|
|
3416
3485
|
path: context?.network.path,
|
|
3417
3486
|
details: details ?? error.message
|
|
3418
3487
|
},
|
|
3419
|
-
correlationId: context?.tracing.correlationId ??
|
|
3420
|
-
requestId: context?.network.requestId ??
|
|
3421
|
-
spanId: context?.tracing.spanId ??
|
|
3488
|
+
correlationId: context?.tracing.correlationId ?? import_shared62.GuidHelper.generate(),
|
|
3489
|
+
requestId: context?.network.requestId ?? import_shared62.GuidHelper.generate(),
|
|
3490
|
+
spanId: context?.tracing.spanId ?? import_shared62.GuidHelper.generate(),
|
|
3422
3491
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3423
3492
|
},
|
|
3424
3493
|
error.status,
|
|
@@ -3473,11 +3542,11 @@ var init_controllers = __esm({
|
|
|
3473
3542
|
});
|
|
3474
3543
|
|
|
3475
3544
|
// src/presentation/middlewares/allow-method.middleware.ts
|
|
3476
|
-
var
|
|
3545
|
+
var import_shared63, MethodCheckMiddleware;
|
|
3477
3546
|
var init_allow_method_middleware = __esm({
|
|
3478
3547
|
"src/presentation/middlewares/allow-method.middleware.ts"() {
|
|
3479
3548
|
"use strict";
|
|
3480
|
-
|
|
3549
|
+
import_shared63 = require("@xeno-js/shared");
|
|
3481
3550
|
MethodCheckMiddleware = class {
|
|
3482
3551
|
constructor(_requestContext, _allowMethod) {
|
|
3483
3552
|
this._requestContext = _requestContext;
|
|
@@ -3489,21 +3558,21 @@ var init_allow_method_middleware = __esm({
|
|
|
3489
3558
|
const isAllowed = this._allowMethod.check(req.path, req.method);
|
|
3490
3559
|
if (!isAllowed) {
|
|
3491
3560
|
const { network, tracing } = this._requestContext.getContext() ?? {};
|
|
3492
|
-
return
|
|
3561
|
+
return import_shared63.HttpHelper.error(
|
|
3493
3562
|
{
|
|
3494
3563
|
success: false,
|
|
3495
3564
|
error: {
|
|
3496
|
-
code:
|
|
3497
|
-
message:
|
|
3565
|
+
code: import_shared63.ERROR_CODES.NOT_ALLOWED,
|
|
3566
|
+
message: import_shared63.ERROR_CODE_MESSAGES[import_shared63.ERROR_CODES.NOT_ALLOWED],
|
|
3498
3567
|
details: `Operation blocked by allow method middleware`,
|
|
3499
3568
|
path: req.path
|
|
3500
3569
|
},
|
|
3501
|
-
correlationId: tracing?.correlationId ??
|
|
3502
|
-
requestId: network?.requestId ??
|
|
3503
|
-
spanId: tracing?.spanId ??
|
|
3570
|
+
correlationId: tracing?.correlationId ?? import_shared63.GuidHelper.generate(),
|
|
3571
|
+
requestId: network?.requestId ?? import_shared63.GuidHelper.generate(),
|
|
3572
|
+
spanId: tracing?.spanId ?? import_shared63.GuidHelper.generate(),
|
|
3504
3573
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3505
3574
|
},
|
|
3506
|
-
|
|
3575
|
+
import_shared63.STATUS_CODES.NOT_ALLOWED,
|
|
3507
3576
|
{
|
|
3508
3577
|
Allow: this._allowMethod.getMethods(req.path)
|
|
3509
3578
|
}
|
|
@@ -3516,11 +3585,11 @@ var init_allow_method_middleware = __esm({
|
|
|
3516
3585
|
});
|
|
3517
3586
|
|
|
3518
3587
|
// src/presentation/middlewares/allow-origin.middleware.ts
|
|
3519
|
-
var
|
|
3588
|
+
var import_shared64, AllowOriginMiddleware;
|
|
3520
3589
|
var init_allow_origin_middleware = __esm({
|
|
3521
3590
|
"src/presentation/middlewares/allow-origin.middleware.ts"() {
|
|
3522
3591
|
"use strict";
|
|
3523
|
-
|
|
3592
|
+
import_shared64 = require("@xeno-js/shared");
|
|
3524
3593
|
AllowOriginMiddleware = class {
|
|
3525
3594
|
constructor(_allowOrigin, _requestContext, _logger) {
|
|
3526
3595
|
this._allowOrigin = _allowOrigin;
|
|
@@ -3535,21 +3604,21 @@ var init_allow_origin_middleware = __esm({
|
|
|
3535
3604
|
const origin = network?.origin;
|
|
3536
3605
|
if (!this._allowOrigin.isAllowed(origin)) {
|
|
3537
3606
|
this._logger.warn(`Access denied by AllowOrigin policy for origin: ${origin ?? "unknown"}`);
|
|
3538
|
-
return
|
|
3607
|
+
return import_shared64.HttpHelper.error(
|
|
3539
3608
|
{
|
|
3540
3609
|
success: false,
|
|
3541
3610
|
error: {
|
|
3542
|
-
code:
|
|
3543
|
-
message:
|
|
3611
|
+
code: import_shared64.ERROR_CODES.FORBIDDEN,
|
|
3612
|
+
message: import_shared64.ERROR_CODE_MESSAGES[import_shared64.ERROR_CODES.FORBIDDEN],
|
|
3544
3613
|
details: `The origin '${origin ?? "unknown"}' is not allowed to access this resource.`,
|
|
3545
3614
|
path: req.path
|
|
3546
3615
|
},
|
|
3547
|
-
correlationId: tracing?.correlationId ??
|
|
3548
|
-
requestId: network?.requestId ??
|
|
3549
|
-
spanId: tracing?.spanId ??
|
|
3616
|
+
correlationId: tracing?.correlationId ?? import_shared64.GuidHelper.generate(),
|
|
3617
|
+
requestId: network?.requestId ?? import_shared64.GuidHelper.generate(),
|
|
3618
|
+
spanId: tracing?.spanId ?? import_shared64.GuidHelper.generate(),
|
|
3550
3619
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3551
3620
|
},
|
|
3552
|
-
|
|
3621
|
+
import_shared64.STATUS_CODES.FORBIDDEN
|
|
3553
3622
|
);
|
|
3554
3623
|
}
|
|
3555
3624
|
return next();
|
|
@@ -3559,11 +3628,11 @@ var init_allow_origin_middleware = __esm({
|
|
|
3559
3628
|
});
|
|
3560
3629
|
|
|
3561
3630
|
// src/presentation/middlewares/auth.middleware.ts
|
|
3562
|
-
var
|
|
3631
|
+
var import_shared65, AuthenticationMiddleware;
|
|
3563
3632
|
var init_auth_middleware = __esm({
|
|
3564
3633
|
"src/presentation/middlewares/auth.middleware.ts"() {
|
|
3565
3634
|
"use strict";
|
|
3566
|
-
|
|
3635
|
+
import_shared65 = require("@xeno-js/shared");
|
|
3567
3636
|
AuthenticationMiddleware = class {
|
|
3568
3637
|
constructor(_requestContext, _tokenExtractor, _gateKeeper, _logger) {
|
|
3569
3638
|
this._requestContext = _requestContext;
|
|
@@ -3584,7 +3653,7 @@ var init_auth_middleware = __esm({
|
|
|
3584
3653
|
`Authentication failed for request on path: ${req.path}. Code: ${error.code}. Error: ${error}`
|
|
3585
3654
|
);
|
|
3586
3655
|
const { network, tracing } = this._requestContext.getContext() ?? {};
|
|
3587
|
-
return
|
|
3656
|
+
return import_shared65.HttpHelper.error(
|
|
3588
3657
|
{
|
|
3589
3658
|
success: false,
|
|
3590
3659
|
error: {
|
|
@@ -3593,12 +3662,12 @@ var init_auth_middleware = __esm({
|
|
|
3593
3662
|
details: `[Authentication Error] Failed to authenticate request on path: ${req.path}`,
|
|
3594
3663
|
path: req.path
|
|
3595
3664
|
},
|
|
3596
|
-
correlationId: tracing?.correlationId ??
|
|
3597
|
-
requestId: network?.requestId ??
|
|
3598
|
-
spanId: tracing?.spanId ??
|
|
3665
|
+
correlationId: tracing?.correlationId ?? import_shared65.GuidHelper.generate(),
|
|
3666
|
+
requestId: network?.requestId ?? import_shared65.GuidHelper.generate(),
|
|
3667
|
+
spanId: tracing?.spanId ?? import_shared65.GuidHelper.generate(),
|
|
3599
3668
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3600
3669
|
},
|
|
3601
|
-
error.status ??
|
|
3670
|
+
error.status ?? import_shared65.STATUS_CODES.UNAUTHORIZED,
|
|
3602
3671
|
{ "Content-Type": [network?.formatIndicator ?? "application/json"] }
|
|
3603
3672
|
);
|
|
3604
3673
|
}
|
|
@@ -3633,11 +3702,11 @@ var init_composite_middleware = __esm({
|
|
|
3633
3702
|
});
|
|
3634
3703
|
|
|
3635
3704
|
// src/presentation/middlewares/cors.middleware.ts
|
|
3636
|
-
var
|
|
3705
|
+
var import_shared66, CORSMiddleware;
|
|
3637
3706
|
var init_cors_middleware = __esm({
|
|
3638
3707
|
"src/presentation/middlewares/cors.middleware.ts"() {
|
|
3639
3708
|
"use strict";
|
|
3640
|
-
|
|
3709
|
+
import_shared66 = require("@xeno-js/shared");
|
|
3641
3710
|
CORSMiddleware = class {
|
|
3642
3711
|
constructor(_requestContext, _withCredentials = "false") {
|
|
3643
3712
|
this._requestContext = _requestContext;
|
|
@@ -3649,7 +3718,7 @@ var init_cors_middleware = __esm({
|
|
|
3649
3718
|
const { network } = this._requestContext.getContext() ?? {};
|
|
3650
3719
|
const origin = network?.origin;
|
|
3651
3720
|
const response = await next();
|
|
3652
|
-
if (
|
|
3721
|
+
if (import_shared66.Guards.isDefined(origin))
|
|
3653
3722
|
response.headers = {
|
|
3654
3723
|
...response.headers ?? {},
|
|
3655
3724
|
"Access-Control-Allow-Origin": origin,
|
|
@@ -3663,11 +3732,11 @@ var init_cors_middleware = __esm({
|
|
|
3663
3732
|
});
|
|
3664
3733
|
|
|
3665
3734
|
// src/presentation/middlewares/csrf.middleware.ts
|
|
3666
|
-
var
|
|
3735
|
+
var import_shared67, CsrfMiddleware;
|
|
3667
3736
|
var init_csrf_middleware = __esm({
|
|
3668
3737
|
"src/presentation/middlewares/csrf.middleware.ts"() {
|
|
3669
3738
|
"use strict";
|
|
3670
|
-
|
|
3739
|
+
import_shared67 = require("@xeno-js/shared");
|
|
3671
3740
|
CsrfMiddleware = class {
|
|
3672
3741
|
constructor(_requestContext, _csrfTokenService) {
|
|
3673
3742
|
this._requestContext = _requestContext;
|
|
@@ -3682,64 +3751,64 @@ var init_csrf_middleware = __esm({
|
|
|
3682
3751
|
const { network, tracing, identity } = this._requestContext.getContext() ?? {};
|
|
3683
3752
|
const headerToken = network?.csrf;
|
|
3684
3753
|
const cookieToken = network?.csrfCookie;
|
|
3685
|
-
if (!
|
|
3686
|
-
return
|
|
3754
|
+
if (!import_shared67.Guards.isDefined(headerToken) || !import_shared67.Guards.isDefined(cookieToken)) {
|
|
3755
|
+
return import_shared67.HttpHelper.error(
|
|
3687
3756
|
{
|
|
3688
3757
|
success: false,
|
|
3689
3758
|
error: {
|
|
3690
|
-
code:
|
|
3691
|
-
message:
|
|
3759
|
+
code: import_shared67.ERROR_CODES.FORBIDDEN,
|
|
3760
|
+
message: import_shared67.ERROR_CODE_MESSAGES[import_shared67.ERROR_CODES.FORBIDDEN],
|
|
3692
3761
|
details: "CSRF token missing",
|
|
3693
3762
|
path: req.path
|
|
3694
3763
|
},
|
|
3695
|
-
correlationId: tracing?.correlationId ??
|
|
3696
|
-
requestId: network?.requestId ??
|
|
3697
|
-
spanId: tracing?.spanId ??
|
|
3764
|
+
correlationId: tracing?.correlationId ?? import_shared67.GuidHelper.generate(),
|
|
3765
|
+
requestId: network?.requestId ?? import_shared67.GuidHelper.generate(),
|
|
3766
|
+
spanId: tracing?.spanId ?? import_shared67.GuidHelper.generate(),
|
|
3698
3767
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3699
3768
|
},
|
|
3700
|
-
|
|
3769
|
+
import_shared67.STATUS_CODES.FORBIDDEN,
|
|
3701
3770
|
{
|
|
3702
3771
|
"Content-Type": [network?.formatIndicator ?? "application/json"]
|
|
3703
3772
|
}
|
|
3704
3773
|
);
|
|
3705
3774
|
}
|
|
3706
3775
|
if (headerToken !== cookieToken) {
|
|
3707
|
-
return
|
|
3776
|
+
return import_shared67.HttpHelper.error(
|
|
3708
3777
|
{
|
|
3709
3778
|
success: false,
|
|
3710
3779
|
error: {
|
|
3711
|
-
code:
|
|
3712
|
-
message:
|
|
3780
|
+
code: import_shared67.ERROR_CODES.FORBIDDEN,
|
|
3781
|
+
message: import_shared67.ERROR_CODE_MESSAGES[import_shared67.ERROR_CODES.FORBIDDEN],
|
|
3713
3782
|
details: "CSRF token mismatch",
|
|
3714
3783
|
path: req.path
|
|
3715
3784
|
},
|
|
3716
|
-
correlationId: tracing?.correlationId ??
|
|
3717
|
-
requestId: network?.requestId ??
|
|
3718
|
-
spanId: tracing?.spanId ??
|
|
3785
|
+
correlationId: tracing?.correlationId ?? import_shared67.GuidHelper.generate(),
|
|
3786
|
+
requestId: network?.requestId ?? import_shared67.GuidHelper.generate(),
|
|
3787
|
+
spanId: tracing?.spanId ?? import_shared67.GuidHelper.generate(),
|
|
3719
3788
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3720
3789
|
},
|
|
3721
|
-
|
|
3790
|
+
import_shared67.STATUS_CODES.FORBIDDEN,
|
|
3722
3791
|
{
|
|
3723
3792
|
"Content-Type": [network?.formatIndicator ?? "application/json"]
|
|
3724
3793
|
}
|
|
3725
3794
|
);
|
|
3726
3795
|
}
|
|
3727
|
-
if (!
|
|
3728
|
-
return
|
|
3796
|
+
if (!import_shared67.Guards.isDefined(identity?.userId) || !await this._csrfTokenService.validate(headerToken, identity?.userId)) {
|
|
3797
|
+
return import_shared67.HttpHelper.error(
|
|
3729
3798
|
{
|
|
3730
3799
|
success: false,
|
|
3731
3800
|
error: {
|
|
3732
|
-
code:
|
|
3733
|
-
message:
|
|
3801
|
+
code: import_shared67.ERROR_CODES.FORBIDDEN,
|
|
3802
|
+
message: import_shared67.ERROR_CODE_MESSAGES[import_shared67.ERROR_CODES.FORBIDDEN],
|
|
3734
3803
|
details: "CSRF token invalid",
|
|
3735
3804
|
path: req.path
|
|
3736
3805
|
},
|
|
3737
|
-
correlationId: tracing?.correlationId ??
|
|
3738
|
-
requestId: network?.requestId ??
|
|
3739
|
-
spanId: tracing?.spanId ??
|
|
3806
|
+
correlationId: tracing?.correlationId ?? import_shared67.GuidHelper.generate(),
|
|
3807
|
+
requestId: network?.requestId ?? import_shared67.GuidHelper.generate(),
|
|
3808
|
+
spanId: tracing?.spanId ?? import_shared67.GuidHelper.generate(),
|
|
3740
3809
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3741
3810
|
},
|
|
3742
|
-
|
|
3811
|
+
import_shared67.STATUS_CODES.FORBIDDEN,
|
|
3743
3812
|
{
|
|
3744
3813
|
"Content-Type": [network?.formatIndicator ?? "application/json"]
|
|
3745
3814
|
}
|
|
@@ -3753,11 +3822,11 @@ var init_csrf_middleware = __esm({
|
|
|
3753
3822
|
});
|
|
3754
3823
|
|
|
3755
3824
|
// src/presentation/middlewares/csrf-cookie.middleware.ts
|
|
3756
|
-
var
|
|
3825
|
+
var import_shared68, CsrfCookieMiddleware;
|
|
3757
3826
|
var init_csrf_cookie_middleware = __esm({
|
|
3758
3827
|
"src/presentation/middlewares/csrf-cookie.middleware.ts"() {
|
|
3759
3828
|
"use strict";
|
|
3760
|
-
|
|
3829
|
+
import_shared68 = require("@xeno-js/shared");
|
|
3761
3830
|
CsrfCookieMiddleware = class {
|
|
3762
3831
|
constructor(_requestContext, _csrfTokenService, _csrf) {
|
|
3763
3832
|
this._requestContext = _requestContext;
|
|
@@ -3772,8 +3841,8 @@ var init_csrf_cookie_middleware = __esm({
|
|
|
3772
3841
|
const context = this._requestContext.getContext();
|
|
3773
3842
|
const identity = context?.identity;
|
|
3774
3843
|
const network = context?.network;
|
|
3775
|
-
if (!
|
|
3776
|
-
if (
|
|
3844
|
+
if (!import_shared68.Guards.isDefined(identity?.userId)) return response;
|
|
3845
|
+
if (import_shared68.Guards.isDefined(network?.csrfCookie)) return response;
|
|
3777
3846
|
const token = await this._csrfTokenService.generate(identity.userId);
|
|
3778
3847
|
const cookieName = this._csrf.cookieName ?? "__Host-xeno-csrf";
|
|
3779
3848
|
const maxAge = this._csrf.cookieMaxAgeSeconds ?? 3600;
|
|
@@ -3791,11 +3860,11 @@ var init_csrf_cookie_middleware = __esm({
|
|
|
3791
3860
|
});
|
|
3792
3861
|
|
|
3793
3862
|
// src/presentation/middlewares/options.middleware.ts
|
|
3794
|
-
var
|
|
3863
|
+
var import_shared69, OptionsMiddleware;
|
|
3795
3864
|
var init_options_middleware = __esm({
|
|
3796
3865
|
"src/presentation/middlewares/options.middleware.ts"() {
|
|
3797
3866
|
"use strict";
|
|
3798
|
-
|
|
3867
|
+
import_shared69 = require("@xeno-js/shared");
|
|
3799
3868
|
OptionsMiddleware = class {
|
|
3800
3869
|
constructor(_requestContext, _alloewMethod, _allowHeaders = [], _withCredentials = "false") {
|
|
3801
3870
|
this._requestContext = _requestContext;
|
|
@@ -3812,14 +3881,14 @@ var init_options_middleware = __esm({
|
|
|
3812
3881
|
const network = this._requestContext.getNetworkContext();
|
|
3813
3882
|
const origin = network?.origin;
|
|
3814
3883
|
const headers = {};
|
|
3815
|
-
if (
|
|
3884
|
+
if (import_shared69.Guards.isDefined(origin)) {
|
|
3816
3885
|
headers["Access-Control-Allow-Origin"] = origin;
|
|
3817
3886
|
headers["Access-Control-Allow-Credentials"] = this._withCredentials;
|
|
3818
3887
|
headers["Vary"] = "Origin";
|
|
3819
3888
|
}
|
|
3820
3889
|
headers["Access-Control-Allow-Methods"] = this._alloewMethod.getMethods(req.path);
|
|
3821
3890
|
headers["Access-Control-Allow-Headers"] = this._allowHeaders.join(", ");
|
|
3822
|
-
return
|
|
3891
|
+
return import_shared69.HttpHelper.success(null, import_shared69.STATUS_CODES.NO_CONTENT, {}, headers);
|
|
3823
3892
|
}
|
|
3824
3893
|
return await next();
|
|
3825
3894
|
}
|
|
@@ -3828,11 +3897,11 @@ var init_options_middleware = __esm({
|
|
|
3828
3897
|
});
|
|
3829
3898
|
|
|
3830
3899
|
// src/presentation/middlewares/rate-limiter.middleware.ts
|
|
3831
|
-
var
|
|
3900
|
+
var import_shared70, RateLimitMiddleware;
|
|
3832
3901
|
var init_rate_limiter_middleware = __esm({
|
|
3833
3902
|
"src/presentation/middlewares/rate-limiter.middleware.ts"() {
|
|
3834
3903
|
"use strict";
|
|
3835
|
-
|
|
3904
|
+
import_shared70 = require("@xeno-js/shared");
|
|
3836
3905
|
RateLimitMiddleware = class {
|
|
3837
3906
|
constructor(_ctxAccessor, _cache, _keyBuilder, _logger, _opts) {
|
|
3838
3907
|
this._ctxAccessor = _ctxAccessor;
|
|
@@ -3849,22 +3918,22 @@ var init_rate_limiter_middleware = __esm({
|
|
|
3849
3918
|
async execute(req, _res, next) {
|
|
3850
3919
|
const cacheKey = this._keyBuilder.buildRateLimitKey(req.path);
|
|
3851
3920
|
const { network, tracing } = this._ctxAccessor.getContext() ?? {};
|
|
3852
|
-
if (!
|
|
3853
|
-
return
|
|
3921
|
+
if (!import_shared70.Guards.isDefined(cacheKey))
|
|
3922
|
+
return import_shared70.HttpHelper.error(
|
|
3854
3923
|
{
|
|
3855
3924
|
success: false,
|
|
3856
3925
|
error: {
|
|
3857
|
-
code:
|
|
3858
|
-
message:
|
|
3926
|
+
code: import_shared70.ERROR_CODES.SYSTEM_ERROR,
|
|
3927
|
+
message: import_shared70.ERROR_CODE_MESSAGES[import_shared70.ERROR_CODES.SYSTEM_ERROR],
|
|
3859
3928
|
details: `Bad Request: Unable to identify client context for rate limiting.`,
|
|
3860
3929
|
path: req.path
|
|
3861
3930
|
},
|
|
3862
|
-
correlationId: tracing?.correlationId ??
|
|
3863
|
-
requestId: network?.requestId ??
|
|
3864
|
-
spanId: tracing?.spanId ??
|
|
3931
|
+
correlationId: tracing?.correlationId ?? import_shared70.GuidHelper.generate(),
|
|
3932
|
+
requestId: network?.requestId ?? import_shared70.GuidHelper.generate(),
|
|
3933
|
+
spanId: tracing?.spanId ?? import_shared70.GuidHelper.generate(),
|
|
3865
3934
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3866
3935
|
},
|
|
3867
|
-
|
|
3936
|
+
import_shared70.STATUS_CODES.SERVICE_UNAVAILABLE,
|
|
3868
3937
|
{
|
|
3869
3938
|
"Content-Type": [network?.formatIndicator ?? "application/json"],
|
|
3870
3939
|
"Retry-After": [String(this._opts.windowSeconds)]
|
|
@@ -3873,21 +3942,21 @@ var init_rate_limiter_middleware = __esm({
|
|
|
3873
3942
|
const currentHits = await this._cache.increment(cacheKey, this._opts.windowSeconds);
|
|
3874
3943
|
if (currentHits > this._opts.maxRequests) {
|
|
3875
3944
|
this._logger.warn(`[RateLimit] key ${cacheKey} has been blocked on ${req.path}`);
|
|
3876
|
-
return
|
|
3945
|
+
return import_shared70.HttpHelper.error(
|
|
3877
3946
|
{
|
|
3878
3947
|
success: false,
|
|
3879
3948
|
error: {
|
|
3880
|
-
code:
|
|
3881
|
-
message:
|
|
3949
|
+
code: import_shared70.ERROR_CODES.TOO_MANY_REQUESTS,
|
|
3950
|
+
message: import_shared70.ERROR_CODE_MESSAGES[import_shared70.ERROR_CODES.TOO_MANY_REQUESTS],
|
|
3882
3951
|
details: `Rate limit exceeded.`,
|
|
3883
3952
|
path: req.path
|
|
3884
3953
|
},
|
|
3885
|
-
correlationId: tracing?.correlationId ??
|
|
3886
|
-
requestId: network?.requestId ??
|
|
3887
|
-
spanId: tracing?.spanId ??
|
|
3954
|
+
correlationId: tracing?.correlationId ?? import_shared70.GuidHelper.generate(),
|
|
3955
|
+
requestId: network?.requestId ?? import_shared70.GuidHelper.generate(),
|
|
3956
|
+
spanId: tracing?.spanId ?? import_shared70.GuidHelper.generate(),
|
|
3888
3957
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
3889
3958
|
},
|
|
3890
|
-
|
|
3959
|
+
import_shared70.STATUS_CODES.TOO_MANY_REQUESTS,
|
|
3891
3960
|
{
|
|
3892
3961
|
"Content-Type": [network?.formatIndicator ?? "application/json"],
|
|
3893
3962
|
"Retry-After": [String(this._opts.windowSeconds)]
|
|
@@ -3902,8 +3971,8 @@ var init_rate_limiter_middleware = __esm({
|
|
|
3902
3971
|
|
|
3903
3972
|
// src/presentation/mappers/context.mapper.ts
|
|
3904
3973
|
function _buildMessagingContext(meta) {
|
|
3905
|
-
const hasSequenceData =
|
|
3906
|
-
const hasMessagingData = hasSequenceData ||
|
|
3974
|
+
const hasSequenceData = import_shared71.Guards.isDefined(meta.sequence?.sequenceId) || import_shared71.Guards.isDefined(meta.sequence?.position) || import_shared71.Guards.isDefined(meta.sequence?.size);
|
|
3975
|
+
const hasMessagingData = hasSequenceData || import_shared71.Guards.isDefined(meta.expiration) || import_shared71.Guards.isDefined(meta.returnAddress);
|
|
3907
3976
|
const messaging = hasMessagingData ? {
|
|
3908
3977
|
returnAddress: meta.returnAddress,
|
|
3909
3978
|
expiration: meta.expiration,
|
|
@@ -3911,11 +3980,11 @@ function _buildMessagingContext(meta) {
|
|
|
3911
3980
|
} : void 0;
|
|
3912
3981
|
return messaging;
|
|
3913
3982
|
}
|
|
3914
|
-
var
|
|
3983
|
+
var import_shared71, ContextMapper;
|
|
3915
3984
|
var init_context_mapper = __esm({
|
|
3916
3985
|
"src/presentation/mappers/context.mapper.ts"() {
|
|
3917
3986
|
"use strict";
|
|
3918
|
-
|
|
3987
|
+
import_shared71 = require("@xeno-js/shared");
|
|
3919
3988
|
ContextMapper = Object.freeze({
|
|
3920
3989
|
/**
|
|
3921
3990
|
* @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.
|
|
@@ -3959,11 +4028,11 @@ var init_context_mapper = __esm({
|
|
|
3959
4028
|
});
|
|
3960
4029
|
|
|
3961
4030
|
// src/presentation/middlewares/request.middleware.ts
|
|
3962
|
-
var
|
|
4031
|
+
var import_shared72, RequestContextMiddleware;
|
|
3963
4032
|
var init_request_middleware = __esm({
|
|
3964
4033
|
"src/presentation/middlewares/request.middleware.ts"() {
|
|
3965
4034
|
"use strict";
|
|
3966
|
-
|
|
4035
|
+
import_shared72 = require("@xeno-js/shared");
|
|
3967
4036
|
init_context_mapper();
|
|
3968
4037
|
RequestContextMiddleware = class {
|
|
3969
4038
|
/**
|
|
@@ -3988,8 +4057,8 @@ var init_request_middleware = __esm({
|
|
|
3988
4057
|
_resolver;
|
|
3989
4058
|
_logger;
|
|
3990
4059
|
async execute(req, res, next) {
|
|
3991
|
-
const correlationId =
|
|
3992
|
-
const requestId =
|
|
4060
|
+
const correlationId = import_shared72.GuidHelper.generate();
|
|
4061
|
+
const requestId = import_shared72.GuidHelper.generate();
|
|
3993
4062
|
const spanId = correlationId;
|
|
3994
4063
|
const formatIndicator = "application/json";
|
|
3995
4064
|
try {
|
|
@@ -4005,7 +4074,7 @@ var init_request_middleware = __esm({
|
|
|
4005
4074
|
};
|
|
4006
4075
|
const tmpContext = ContextMapper.map({
|
|
4007
4076
|
metadata,
|
|
4008
|
-
identity:
|
|
4077
|
+
identity: import_shared72.GUEST,
|
|
4009
4078
|
path: req.path,
|
|
4010
4079
|
transport: { req, res }
|
|
4011
4080
|
});
|
|
@@ -4017,12 +4086,12 @@ var init_request_middleware = __esm({
|
|
|
4017
4086
|
return result;
|
|
4018
4087
|
} catch (error) {
|
|
4019
4088
|
this._logger.error("RequestContextMiddleware encountered an error", error);
|
|
4020
|
-
return
|
|
4089
|
+
return import_shared72.HttpHelper.error(
|
|
4021
4090
|
{
|
|
4022
4091
|
success: false,
|
|
4023
4092
|
error: {
|
|
4024
|
-
code:
|
|
4025
|
-
message:
|
|
4093
|
+
code: import_shared72.ERROR_CODES.SYSTEM_ERROR,
|
|
4094
|
+
message: import_shared72.ERROR_CODE_MESSAGES[import_shared72.ERROR_CODES.SYSTEM_ERROR],
|
|
4026
4095
|
details: `[Fatal System Error] Exception caught during request handling on path: ${req.path}`,
|
|
4027
4096
|
path: req.path
|
|
4028
4097
|
},
|
|
@@ -4031,7 +4100,7 @@ var init_request_middleware = __esm({
|
|
|
4031
4100
|
spanId,
|
|
4032
4101
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
4033
4102
|
},
|
|
4034
|
-
|
|
4103
|
+
import_shared72.STATUS_CODES.INTERNAL_SERVER_ERROR,
|
|
4035
4104
|
{ "Content-Type": [formatIndicator] }
|
|
4036
4105
|
);
|
|
4037
4106
|
}
|
|
@@ -4081,11 +4150,11 @@ var init_presentation = __esm({
|
|
|
4081
4150
|
});
|
|
4082
4151
|
|
|
4083
4152
|
// src/infrastructure/cache/rate-limit-key-builder.cache.ts
|
|
4084
|
-
var
|
|
4153
|
+
var import_shared73, RateLimitKeyBuilder;
|
|
4085
4154
|
var init_rate_limit_key_builder_cache = __esm({
|
|
4086
4155
|
"src/infrastructure/cache/rate-limit-key-builder.cache.ts"() {
|
|
4087
4156
|
"use strict";
|
|
4088
|
-
|
|
4157
|
+
import_shared73 = require("@xeno-js/shared");
|
|
4089
4158
|
RateLimitKeyBuilder = class {
|
|
4090
4159
|
constructor(_contextAccessor) {
|
|
4091
4160
|
this._contextAccessor = _contextAccessor;
|
|
@@ -4096,12 +4165,12 @@ var init_rate_limit_key_builder_cache = __esm({
|
|
|
4096
4165
|
const tenantId = ctx?.identity?.tenantId;
|
|
4097
4166
|
const userId = ctx?.identity?.userId;
|
|
4098
4167
|
const clientIp = ctx?.network?.clientIp;
|
|
4099
|
-
if (!
|
|
4168
|
+
if (!import_shared73.Guards.isNullOrEmpty(tenantId) && !import_shared73.Guards.isNullOrEmpty(userId))
|
|
4100
4169
|
return `ratelimit:tenant:${tenantId}:user:${userId}:${resource}`;
|
|
4101
|
-
if (!
|
|
4170
|
+
if (!import_shared73.Guards.isNullOrEmpty(tenantId) && !import_shared73.Guards.isNullOrEmpty(clientIp))
|
|
4102
4171
|
return `ratelimit:tenant:${tenantId}:ip:${clientIp}:${resource}`;
|
|
4103
|
-
if (!
|
|
4104
|
-
if (!
|
|
4172
|
+
if (!import_shared73.Guards.isNullOrEmpty(userId)) return `ratelimit:user:${userId}:${resource}`;
|
|
4173
|
+
if (!import_shared73.Guards.isNullOrEmpty(clientIp)) return `ratelimit:ip:${clientIp}:${resource}`;
|
|
4105
4174
|
return void 0;
|
|
4106
4175
|
}
|
|
4107
4176
|
};
|
|
@@ -4135,7 +4204,7 @@ var init_middleware_module = __esm({
|
|
|
4135
4204
|
"use strict";
|
|
4136
4205
|
MiddlewareModule = class {
|
|
4137
4206
|
async configure(container, opts) {
|
|
4138
|
-
const { Guards:
|
|
4207
|
+
const { Guards: Guards47, TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
4139
4208
|
const { HttpCookieExtractor: HttpCookieExtractor2 } = await Promise.resolve().then(() => (init_services(), services_exports));
|
|
4140
4209
|
const { HttpHeaderExtractor: HttpHeaderExtractor2 } = await Promise.resolve().then(() => (init_services(), services_exports));
|
|
4141
4210
|
const tokenExtractor = await this._getTokenExtractor(
|
|
@@ -4144,7 +4213,7 @@ var init_middleware_module = __esm({
|
|
|
4144
4213
|
opts.customTokenExtractor
|
|
4145
4214
|
);
|
|
4146
4215
|
container.addSingleton(
|
|
4147
|
-
|
|
4216
|
+
TOKENS5.SERVICE_EXTRACTOR,
|
|
4148
4217
|
() => new HttpHeaderExtractor2(
|
|
4149
4218
|
tokenExtractor,
|
|
4150
4219
|
new HttpCookieExtractor2(),
|
|
@@ -4154,18 +4223,18 @@ var init_middleware_module = __esm({
|
|
|
4154
4223
|
);
|
|
4155
4224
|
const { ClientIpResolver: ClientIpResolver2 } = await Promise.resolve().then(() => (init_services(), services_exports));
|
|
4156
4225
|
const middlewares = [];
|
|
4157
|
-
const requestContext = container.resolve(
|
|
4158
|
-
const logger = container.resolve(
|
|
4226
|
+
const requestContext = container.resolve(TOKENS5.REQUEST_CONTEXT);
|
|
4227
|
+
const logger = container.resolve(TOKENS5.LOGGER);
|
|
4159
4228
|
const { RequestContextMiddleware: RequestContextMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
|
|
4160
4229
|
middlewares.push(
|
|
4161
4230
|
new RequestContextMiddleware2(
|
|
4162
4231
|
requestContext,
|
|
4163
|
-
container.resolve(
|
|
4232
|
+
container.resolve(TOKENS5.SERVICE_EXTRACTOR),
|
|
4164
4233
|
new ClientIpResolver2(opts.trustedProxies),
|
|
4165
4234
|
logger
|
|
4166
4235
|
)
|
|
4167
4236
|
);
|
|
4168
|
-
if (!
|
|
4237
|
+
if (!Guards47.isNullOrEmpty(opts.allowOrigins)) {
|
|
4169
4238
|
if (opts.withCredentials && opts.allowOrigins.includes("*"))
|
|
4170
4239
|
throw new Error(
|
|
4171
4240
|
"Wildcard CORS origin is not allowed when withCredentials is set to true in addHttpCore"
|
|
@@ -4191,7 +4260,7 @@ var init_middleware_module = __esm({
|
|
|
4191
4260
|
const { CORSMiddleware: CORSMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
|
|
4192
4261
|
middlewares.push(new CORSMiddleware2(requestContext, withCredentials));
|
|
4193
4262
|
}
|
|
4194
|
-
if (
|
|
4263
|
+
if (Guards47.isDefined(opts.routeRegistry)) {
|
|
4195
4264
|
const { MethodCheckMiddleware: MethodCheckMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
|
|
4196
4265
|
middlewares.push(new MethodCheckMiddleware2(requestContext, allowMethod));
|
|
4197
4266
|
}
|
|
@@ -4213,31 +4282,31 @@ var init_middleware_module = __esm({
|
|
|
4213
4282
|
new AuthenticationMiddleware2(
|
|
4214
4283
|
requestContext,
|
|
4215
4284
|
tokenExtractor,
|
|
4216
|
-
new GateKeeper2(container.resolve(
|
|
4285
|
+
new GateKeeper2(container.resolve(TOKENS5.BASE_AUTH_SERVICE), new ClaimsIdentityMapper2()),
|
|
4217
4286
|
logger
|
|
4218
4287
|
)
|
|
4219
4288
|
);
|
|
4220
4289
|
}
|
|
4221
|
-
if (
|
|
4290
|
+
if (Guards47.isDefined(opts.rateLimite.maxRequests) || Guards47.isDefined(opts.rateLimite.windowSeconds)) {
|
|
4222
4291
|
const maxRequests = opts.rateLimite.maxRequests ?? 30;
|
|
4223
|
-
|
|
4224
|
-
|
|
4292
|
+
Guards47.throwIfNegative(maxRequests, "MaxRequests must be positive");
|
|
4293
|
+
Guards47.throwIfNotInteger(maxRequests, "MaxRequests must be an integer");
|
|
4225
4294
|
const windowSeconds = opts.rateLimite.windowSeconds ?? 30;
|
|
4226
|
-
|
|
4227
|
-
|
|
4295
|
+
Guards47.throwIfNegative(windowSeconds, "WindowSeconds must be positive");
|
|
4296
|
+
Guards47.throwIfNotInteger(windowSeconds, "WindowSeconds must be an integer");
|
|
4228
4297
|
const { RateLimitKeyBuilder: RateLimitKeyBuilder2 } = await Promise.resolve().then(() => (init_cache(), cache_exports));
|
|
4229
4298
|
const { RateLimitMiddleware: RateLimitMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
|
|
4230
4299
|
middlewares.push(
|
|
4231
4300
|
new RateLimitMiddleware2(
|
|
4232
4301
|
requestContext,
|
|
4233
|
-
container.resolve(
|
|
4302
|
+
container.resolve(TOKENS5.CACHE),
|
|
4234
4303
|
new RateLimitKeyBuilder2(requestContext),
|
|
4235
4304
|
logger,
|
|
4236
4305
|
{ maxRequests, windowSeconds }
|
|
4237
4306
|
)
|
|
4238
4307
|
);
|
|
4239
4308
|
}
|
|
4240
|
-
if (
|
|
4309
|
+
if (Guards47.isDefined(opts.csrf)) {
|
|
4241
4310
|
const csrf = opts.csrf;
|
|
4242
4311
|
const { EdgeCryptoService: EdgeCryptoService2 } = await Promise.resolve().then(() => (init_services(), services_exports));
|
|
4243
4312
|
container.addSingleton("CRYPTO_SERVICE", () => new EdgeCryptoService2());
|
|
@@ -4257,13 +4326,13 @@ var init_middleware_module = __esm({
|
|
|
4257
4326
|
middlewares.push(new CsrfMiddleware2(requestContext, container.resolve("CSRF_TOKEN_SERVICE")));
|
|
4258
4327
|
}
|
|
4259
4328
|
const { CompositeMiddleware: CompositeMiddleware2 } = await Promise.resolve().then(() => (init_presentation(), presentation_exports));
|
|
4260
|
-
container.addSingleton(
|
|
4329
|
+
container.addSingleton(TOKENS5.MIDDLEWARE, () => {
|
|
4261
4330
|
return new CompositeMiddleware2(middlewares);
|
|
4262
4331
|
});
|
|
4263
4332
|
}
|
|
4264
4333
|
async _getTokenExtractor(isSSR, cookieName, customTokenExtractor) {
|
|
4265
|
-
const { Guards:
|
|
4266
|
-
if (
|
|
4334
|
+
const { Guards: Guards47 } = await import("@xeno-js/shared");
|
|
4335
|
+
if (Guards47.isDefined(customTokenExtractor)) return customTokenExtractor();
|
|
4267
4336
|
if (isSSR) {
|
|
4268
4337
|
const { SupabaseSsrTokenExtractor: SupabaseSsrTokenExtractor2 } = await Promise.resolve().then(() => (init_services(), services_exports));
|
|
4269
4338
|
return new SupabaseSsrTokenExtractor2();
|
|
@@ -4273,8 +4342,8 @@ var init_middleware_module = __esm({
|
|
|
4273
4342
|
}
|
|
4274
4343
|
}
|
|
4275
4344
|
async _getAllowMethod(configure, opts) {
|
|
4276
|
-
const { Guards:
|
|
4277
|
-
if (!configure || !
|
|
4345
|
+
const { Guards: Guards47 } = await import("@xeno-js/shared");
|
|
4346
|
+
if (!configure || !Guards47.isDefined(opts)) return void 0;
|
|
4278
4347
|
const { AllowMethodFactory: AllowMethodFactory2 } = await Promise.resolve().then(() => (init_factories(), factories_exports));
|
|
4279
4348
|
return new AllowMethodFactory2().create(opts);
|
|
4280
4349
|
}
|
|
@@ -4293,17 +4362,17 @@ var init_context_module = __esm({
|
|
|
4293
4362
|
"use strict";
|
|
4294
4363
|
ContextModule = class {
|
|
4295
4364
|
async configure(container) {
|
|
4296
|
-
const { TOKENS:
|
|
4365
|
+
const { TOKENS: TOKENS5 } = await import("@xeno-js/shared");
|
|
4297
4366
|
const { ServiceScopeFactory: ServiceScopeFactory2 } = await Promise.resolve().then(() => (init_service_scope_factory(), service_scope_factory_exports));
|
|
4298
4367
|
const { NodeRequestContextFactory: NodeRequestContextFactory2 } = await Promise.resolve().then(() => (init_request_context_factory(), request_context_factory_exports));
|
|
4299
4368
|
const requestContext = new NodeRequestContextFactory2(
|
|
4300
4369
|
new ServiceScopeFactory2(container)
|
|
4301
4370
|
).create();
|
|
4302
|
-
container.addSingleton(
|
|
4303
|
-
container.addSingleton(
|
|
4304
|
-
container.addSingleton(
|
|
4305
|
-
container.addSingleton(
|
|
4306
|
-
container.addSingleton(
|
|
4371
|
+
container.addSingleton(TOKENS5.REQUEST_CONTEXT, () => requestContext);
|
|
4372
|
+
container.addSingleton(TOKENS5.CONTEXT_ACCESSOR, () => requestContext);
|
|
4373
|
+
container.addSingleton(TOKENS5.IDENTITY_ACCESSOR, () => requestContext);
|
|
4374
|
+
container.addSingleton(TOKENS5.SERVICE_SCOPE_ACCESSOR, () => requestContext);
|
|
4375
|
+
container.addSingleton(TOKENS5.NETWORK_CONTEXT_ACCESSOR, () => requestContext);
|
|
4307
4376
|
const { UserContextFactory: UserContextFactory2 } = await Promise.resolve().then(() => (init_user_context_factory(), user_context_factory_exports));
|
|
4308
4377
|
container.addSingleton("USER_CONTEXT_FACTORY", () => {
|
|
4309
4378
|
return new UserContextFactory2(requestContext);
|
|
@@ -4321,7 +4390,7 @@ __export(index_exports, {
|
|
|
4321
4390
|
BaseController: () => BaseController,
|
|
4322
4391
|
BaseHandler: () => BaseHandler,
|
|
4323
4392
|
BasePostgresSqlDataSource: () => BasePostgresSqlDataSource,
|
|
4324
|
-
BaseQuery: () =>
|
|
4393
|
+
BaseQuery: () => import_shared80.Query,
|
|
4325
4394
|
BaseSqliteSqlDataSource: () => BaseSqliteSqlDataSource,
|
|
4326
4395
|
ContainerUtils: () => ContainerUtils,
|
|
4327
4396
|
ReadDao: () => ReadDao,
|
|
@@ -4333,7 +4402,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
4333
4402
|
init_application();
|
|
4334
4403
|
|
|
4335
4404
|
// src/infrastructure/builder/app.builder.ts
|
|
4336
|
-
var
|
|
4405
|
+
var import_shared74 = require("@xeno-js/shared");
|
|
4337
4406
|
|
|
4338
4407
|
// src/infrastructure/configuration/configuration.ts
|
|
4339
4408
|
var import_shared32 = require("@xeno-js/shared");
|
|
@@ -4612,13 +4681,14 @@ var AppBuilder = class {
|
|
|
4612
4681
|
constructor(container) {
|
|
4613
4682
|
this._container = container ?? new ServiceContainer();
|
|
4614
4683
|
this._container.addSingleton(
|
|
4615
|
-
|
|
4684
|
+
import_shared74.TOKENS.CONFIGURATION_SERVICE,
|
|
4616
4685
|
() => new EnvironmentConfigurationService()
|
|
4617
4686
|
);
|
|
4618
|
-
this._configuration = this._container.resolve(
|
|
4687
|
+
this._configuration = this._container.resolve(import_shared74.TOKENS.CONFIGURATION_SERVICE);
|
|
4619
4688
|
this._middlewareConfig.allowOrigins?.push(
|
|
4620
4689
|
this._configuration.get("APP_URL") ?? `http://localhost:${this._configuration.getNumber("PORT", 3e3)}`
|
|
4621
4690
|
);
|
|
4691
|
+
this.addContext();
|
|
4622
4692
|
}
|
|
4623
4693
|
// --- Module Configurations ---
|
|
4624
4694
|
_modules = [];
|
|
@@ -4664,7 +4734,13 @@ var AppBuilder = class {
|
|
|
4664
4734
|
redirectTo: "",
|
|
4665
4735
|
storageOpts: { type: "memory", cookieOpts: void 0, storage: void 0 },
|
|
4666
4736
|
ssrOpts: void 0,
|
|
4667
|
-
customAuth: void 0
|
|
4737
|
+
customAuth: void 0,
|
|
4738
|
+
cookieOpts: {
|
|
4739
|
+
path: "/",
|
|
4740
|
+
httpOnly: true,
|
|
4741
|
+
sameSite: "lax",
|
|
4742
|
+
secure: true
|
|
4743
|
+
}
|
|
4668
4744
|
};
|
|
4669
4745
|
_httpConfig = {
|
|
4670
4746
|
dataSourceToken: void 0,
|
|
@@ -4685,7 +4761,7 @@ var AppBuilder = class {
|
|
|
4685
4761
|
resilience: { retry: {}, circuitBreaker: {}, bulkhead: {} }
|
|
4686
4762
|
};
|
|
4687
4763
|
_loggerConfig = {
|
|
4688
|
-
level:
|
|
4764
|
+
level: import_shared74.LOG_LEVEL.DEBUG,
|
|
4689
4765
|
console: true,
|
|
4690
4766
|
sentry: { config: void 0 },
|
|
4691
4767
|
pino: { config: void 0 },
|
|
@@ -4743,7 +4819,7 @@ var AppBuilder = class {
|
|
|
4743
4819
|
* @link https://github.com/xeno-js/xeno-js
|
|
4744
4820
|
*/
|
|
4745
4821
|
addLogger(setupAction) {
|
|
4746
|
-
if (
|
|
4822
|
+
if (import_shared74.Guards.isDefined(setupAction)) setupAction(this._loggerConfig, this._configuration);
|
|
4747
4823
|
if (this._isLoggerModuleQueued) return this;
|
|
4748
4824
|
this._isLoggerModuleQueued = true;
|
|
4749
4825
|
this._modules.push({
|
|
@@ -4768,7 +4844,7 @@ var AppBuilder = class {
|
|
|
4768
4844
|
* @link https://github.com/xeno-js/xeno-js
|
|
4769
4845
|
*/
|
|
4770
4846
|
addCache(setupAction) {
|
|
4771
|
-
if (
|
|
4847
|
+
if (import_shared74.Guards.isDefined(setupAction)) setupAction(this._config, this._configuration);
|
|
4772
4848
|
if (this._isCacheModuleQueued) return this;
|
|
4773
4849
|
this._isCacheModuleQueued = true;
|
|
4774
4850
|
this._modules.push({
|
|
@@ -4871,7 +4947,7 @@ var AppBuilder = class {
|
|
|
4871
4947
|
* @link https://github.com/xeno-js/xeno-js
|
|
4872
4948
|
*/
|
|
4873
4949
|
addPipeline(setupAction) {
|
|
4874
|
-
if (
|
|
4950
|
+
if (import_shared74.Guards.isDefined(setupAction)) {
|
|
4875
4951
|
setupAction(this._pipelineConfig, this._configuration);
|
|
4876
4952
|
}
|
|
4877
4953
|
this._queuePipelineModule();
|
|
@@ -4992,7 +5068,7 @@ var AppBuilder = class {
|
|
|
4992
5068
|
console.error(`\u{1F449} Module: **${queued.name}**`);
|
|
4993
5069
|
console.error(`\u{1F4DD} Reason: ${errorMessage}
|
|
4994
5070
|
`);
|
|
4995
|
-
if (error instanceof Error &&
|
|
5071
|
+
if (error instanceof Error && import_shared74.Guards.isDefined(error.stack)) {
|
|
4996
5072
|
console.error(error.stack);
|
|
4997
5073
|
}
|
|
4998
5074
|
throw new Error(`Bootstrap failed at [${queued.name}]: ${errorMessage}`, { cause: error });
|
|
@@ -5120,7 +5196,7 @@ var BaseSqliteSqlDataSource = class {
|
|
|
5120
5196
|
};
|
|
5121
5197
|
|
|
5122
5198
|
// src/infrastructure/datasources/remote.datasource.ts
|
|
5123
|
-
var
|
|
5199
|
+
var import_shared75 = require("@xeno-js/shared");
|
|
5124
5200
|
|
|
5125
5201
|
// src/infrastructure/index.ts
|
|
5126
5202
|
init_factories();
|
|
@@ -5148,8 +5224,8 @@ init_pipeline_utils();
|
|
|
5148
5224
|
init_validation_utils();
|
|
5149
5225
|
|
|
5150
5226
|
// src/infrastructure/repositories/read-dao.ts
|
|
5151
|
-
var import_shared75 = require("@xeno-js/shared");
|
|
5152
5227
|
var import_shared76 = require("@xeno-js/shared");
|
|
5228
|
+
var import_shared77 = require("@xeno-js/shared");
|
|
5153
5229
|
var ReadDao = class {
|
|
5154
5230
|
/**
|
|
5155
5231
|
* Constructs a new ReadDao instance.
|
|
@@ -5169,23 +5245,23 @@ var ReadDao = class {
|
|
|
5169
5245
|
_dataSource;
|
|
5170
5246
|
_mapper;
|
|
5171
5247
|
async findById(id, ctx, signal) {
|
|
5172
|
-
|
|
5248
|
+
import_shared76.AppError.throwIfAborted(signal, "ReadDao.findById");
|
|
5173
5249
|
const result = await this._dataSource.findById(id, ctx, signal);
|
|
5174
|
-
if (
|
|
5250
|
+
if (import_shared77.Guards.isNullOrEmpty(result)) return import_shared76.Result.ok();
|
|
5175
5251
|
const entity = this._mapper.toEntity(result);
|
|
5176
|
-
return
|
|
5252
|
+
return import_shared76.Result.ok(entity);
|
|
5177
5253
|
}
|
|
5178
5254
|
async findAll(ctx, signal) {
|
|
5179
|
-
|
|
5255
|
+
import_shared76.AppError.throwIfAborted(signal, "ReadDao.findAll");
|
|
5180
5256
|
const results = await this._dataSource.findAll(ctx, signal);
|
|
5181
5257
|
const entities = results.map((result) => this._mapper.toEntity(result));
|
|
5182
|
-
return
|
|
5258
|
+
return import_shared76.Result.ok(entities);
|
|
5183
5259
|
}
|
|
5184
5260
|
};
|
|
5185
5261
|
|
|
5186
5262
|
// src/infrastructure/repositories/repository.ts
|
|
5187
|
-
var import_shared77 = require("@xeno-js/shared");
|
|
5188
5263
|
var import_shared78 = require("@xeno-js/shared");
|
|
5264
|
+
var import_shared79 = require("@xeno-js/shared");
|
|
5189
5265
|
var Repository = class {
|
|
5190
5266
|
/**
|
|
5191
5267
|
* Constructs a new Repository instance.
|
|
@@ -5205,35 +5281,35 @@ var Repository = class {
|
|
|
5205
5281
|
_dataSource;
|
|
5206
5282
|
_mapper;
|
|
5207
5283
|
async findById(id, ctx, signal) {
|
|
5208
|
-
|
|
5284
|
+
import_shared78.AppError.throwIfAborted(signal, "Repository.findById");
|
|
5209
5285
|
const result = await this._dataSource.findById(id, ctx, signal);
|
|
5210
|
-
if (
|
|
5286
|
+
if (import_shared79.Guards.isNullOrEmpty(result)) return import_shared78.Result.ok();
|
|
5211
5287
|
const entity = this._mapper.toEntity(result);
|
|
5212
|
-
return
|
|
5288
|
+
return import_shared78.Result.ok(entity);
|
|
5213
5289
|
}
|
|
5214
5290
|
async findAll(ctx, signal) {
|
|
5215
|
-
|
|
5291
|
+
import_shared78.AppError.throwIfAborted(signal, "Repository.findAll");
|
|
5216
5292
|
const results = await this._dataSource.findAll(ctx, signal);
|
|
5217
5293
|
const entities = results.map((result) => this._mapper.toEntity(result));
|
|
5218
|
-
return
|
|
5294
|
+
return import_shared78.Result.ok(entities);
|
|
5219
5295
|
}
|
|
5220
5296
|
async save(entity, signal) {
|
|
5221
5297
|
const dto = this._mapper.toDto(entity);
|
|
5222
|
-
|
|
5298
|
+
import_shared78.AppError.throwIfAborted(signal, "Repository.save");
|
|
5223
5299
|
await this._dataSource.insert(dto, signal);
|
|
5224
|
-
return
|
|
5300
|
+
return import_shared78.Result.ok();
|
|
5225
5301
|
}
|
|
5226
5302
|
async delete(entity, ctx, signal) {
|
|
5227
5303
|
const dto = this._mapper.toDto(entity);
|
|
5228
|
-
|
|
5304
|
+
import_shared78.AppError.throwIfAborted(signal, "Repository.delete");
|
|
5229
5305
|
await this._dataSource.delete(dto, ctx, signal);
|
|
5230
|
-
return
|
|
5306
|
+
return import_shared78.Result.ok();
|
|
5231
5307
|
}
|
|
5232
5308
|
async update(id, entity, ctx, signal) {
|
|
5233
5309
|
const dto = this._mapper.toPartialDto(entity);
|
|
5234
|
-
|
|
5310
|
+
import_shared78.AppError.throwIfAborted(signal, "Repository.update");
|
|
5235
5311
|
await this._dataSource.update(id, dto, ctx, signal);
|
|
5236
|
-
return
|
|
5312
|
+
return import_shared78.Result.ok();
|
|
5237
5313
|
}
|
|
5238
5314
|
};
|
|
5239
5315
|
|
|
@@ -5251,7 +5327,7 @@ __reExport(drizzle_types_exports, require("drizzle-orm"));
|
|
|
5251
5327
|
__reExport(index_exports, drizzle_types_exports, module.exports);
|
|
5252
5328
|
init_presentation();
|
|
5253
5329
|
__reExport(index_exports, require("@xeno-js/shared"), module.exports);
|
|
5254
|
-
var
|
|
5330
|
+
var import_shared80 = require("@xeno-js/shared");
|
|
5255
5331
|
// Annotate the CommonJS export names for ESM import in node:
|
|
5256
5332
|
0 && (module.exports = {
|
|
5257
5333
|
AppBuilder,
|