@exyconn/common 2.0.0 → 2.3.2
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 +864 -261
- package/dist/{index-BLltj-zN.d.ts → client/hooks/index.d.mts} +1 -195
- package/dist/{index-CIUdLBjA.d.mts → client/hooks/index.d.ts} +1 -195
- package/dist/client/hooks/index.js +2276 -0
- package/dist/client/hooks/index.js.map +1 -0
- package/dist/client/hooks/index.mjs +2217 -0
- package/dist/client/hooks/index.mjs.map +1 -0
- package/dist/client/index.d.mts +4 -1
- package/dist/client/index.d.ts +4 -1
- package/dist/client/index.js +2693 -19
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +2634 -21
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/web/index.d.mts +1461 -0
- package/dist/client/web/index.d.ts +1461 -0
- package/dist/client/web/index.js +2681 -0
- package/dist/client/web/index.js.map +1 -0
- package/dist/client/web/index.mjs +2618 -0
- package/dist/client/web/index.mjs.map +1 -0
- package/dist/data/brand-identity.d.mts +149 -0
- package/dist/data/brand-identity.d.ts +149 -0
- package/dist/data/brand-identity.js +235 -0
- package/dist/data/brand-identity.js.map +1 -0
- package/dist/data/brand-identity.mjs +220 -0
- package/dist/data/brand-identity.mjs.map +1 -0
- package/dist/data/countries.d.mts +61 -0
- package/dist/data/countries.d.ts +61 -0
- package/dist/data/countries.js +987 -0
- package/dist/data/countries.js.map +1 -0
- package/dist/data/countries.mjs +971 -0
- package/dist/data/countries.mjs.map +1 -0
- package/dist/data/currencies.d.mts +19 -0
- package/dist/data/currencies.d.ts +19 -0
- package/dist/data/currencies.js +162 -0
- package/dist/data/currencies.js.map +1 -0
- package/dist/data/currencies.mjs +153 -0
- package/dist/data/currencies.mjs.map +1 -0
- package/dist/data/index.d.mts +7 -0
- package/dist/data/index.d.ts +7 -0
- package/dist/data/index.js +2087 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/index.mjs +1948 -0
- package/dist/data/index.mjs.map +1 -0
- package/dist/data/phone-codes.d.mts +15 -0
- package/dist/data/phone-codes.d.ts +15 -0
- package/dist/data/phone-codes.js +219 -0
- package/dist/data/phone-codes.js.map +1 -0
- package/dist/data/phone-codes.mjs +211 -0
- package/dist/data/phone-codes.mjs.map +1 -0
- package/dist/data/regex.d.mts +287 -0
- package/dist/data/regex.d.ts +287 -0
- package/dist/data/regex.js +306 -0
- package/dist/data/regex.js.map +1 -0
- package/dist/data/regex.mjs +208 -0
- package/dist/data/regex.mjs.map +1 -0
- package/dist/data/timezones.d.mts +16 -0
- package/dist/data/timezones.d.ts +16 -0
- package/dist/data/timezones.js +98 -0
- package/dist/data/timezones.js.map +1 -0
- package/dist/data/timezones.mjs +89 -0
- package/dist/data/timezones.mjs.map +1 -0
- package/dist/index-01hoqibP.d.ts +119 -0
- package/dist/index-D3yCCjBZ.d.mts +119 -0
- package/dist/index-D9a9oxQy.d.ts +305 -0
- package/dist/index-DKn4raO7.d.ts +222 -0
- package/dist/index-DuxL84IW.d.mts +305 -0
- package/dist/index-NS8dS0p9.d.mts +222 -0
- package/dist/index-Nqm5_lwT.d.ts +188 -0
- package/dist/index-jBi3V6e5.d.mts +188 -0
- package/dist/index.d.mts +21 -729
- package/dist/index.d.ts +21 -729
- package/dist/index.js +3470 -97
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3457 -104
- package/dist/index.mjs.map +1 -1
- package/dist/server/configs/index.d.mts +602 -0
- package/dist/server/configs/index.d.ts +602 -0
- package/dist/server/configs/index.js +707 -0
- package/dist/server/configs/index.js.map +1 -0
- package/dist/server/configs/index.mjs +665 -0
- package/dist/server/configs/index.mjs.map +1 -0
- package/dist/server/index.d.mts +3 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.js +699 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +662 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/config/index.d.mts +40 -0
- package/dist/shared/config/index.d.ts +40 -0
- package/dist/shared/config/index.js +58 -0
- package/dist/shared/config/index.js.map +1 -0
- package/dist/shared/config/index.mjs +51 -0
- package/dist/shared/config/index.mjs.map +1 -0
- package/dist/shared/constants/index.d.mts +593 -0
- package/dist/shared/constants/index.d.ts +593 -0
- package/dist/shared/constants/index.js +391 -0
- package/dist/shared/constants/index.js.map +1 -0
- package/dist/shared/constants/index.mjs +360 -0
- package/dist/shared/constants/index.mjs.map +1 -0
- package/dist/shared/index.d.mts +5 -1
- package/dist/shared/index.d.ts +5 -1
- package/dist/shared/types/index.d.mts +140 -0
- package/dist/shared/types/index.d.ts +140 -0
- package/dist/shared/types/index.js +4 -0
- package/dist/shared/types/index.js.map +1 -0
- package/dist/shared/types/index.mjs +3 -0
- package/dist/shared/types/index.mjs.map +1 -0
- package/dist/shared/utils/index.d.mts +255 -0
- package/dist/shared/utils/index.d.ts +255 -0
- package/dist/shared/utils/index.js +623 -0
- package/dist/shared/utils/index.js.map +1 -0
- package/dist/shared/utils/index.mjs +324 -0
- package/dist/shared/utils/index.mjs.map +1 -0
- package/dist/shared/validation/index.d.mts +258 -0
- package/dist/shared/validation/index.d.ts +258 -0
- package/dist/shared/validation/index.js +185 -0
- package/dist/shared/validation/index.js.map +1 -0
- package/dist/shared/validation/index.mjs +172 -0
- package/dist/shared/validation/index.mjs.map +1 -0
- package/package.json +151 -56
- package/dist/index-DEzgM15j.d.ts +0 -67
- package/dist/index-DNFVgQx8.d.ts +0 -1375
- package/dist/index-DbV04Dx8.d.mts +0 -67
- package/dist/index-DfqEP6Oe.d.mts +0 -1375
package/dist/server/index.js
CHANGED
|
@@ -6,6 +6,7 @@ var path = require('path');
|
|
|
6
6
|
var mongoose = require('mongoose');
|
|
7
7
|
var jwt = require('jsonwebtoken');
|
|
8
8
|
var fs = require('fs');
|
|
9
|
+
var rateLimit = require('express-rate-limit');
|
|
9
10
|
|
|
10
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
12
|
|
|
@@ -14,6 +15,7 @@ var DailyRotateFile__default = /*#__PURE__*/_interopDefault(DailyRotateFile);
|
|
|
14
15
|
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
15
16
|
var mongoose__default = /*#__PURE__*/_interopDefault(mongoose);
|
|
16
17
|
var jwt__default = /*#__PURE__*/_interopDefault(jwt);
|
|
18
|
+
var rateLimit__default = /*#__PURE__*/_interopDefault(rateLimit);
|
|
17
19
|
|
|
18
20
|
// src/server/enums/status.ts
|
|
19
21
|
var StatusCode = /* @__PURE__ */ ((StatusCode2) => {
|
|
@@ -720,20 +722,710 @@ var packageCheckServer = {
|
|
|
720
722
|
print: printPackageCheckSummary
|
|
721
723
|
};
|
|
722
724
|
|
|
725
|
+
// src/server/configs/cors.config.ts
|
|
726
|
+
var DEFAULT_CORS_CONFIG = {
|
|
727
|
+
productionOrigins: [],
|
|
728
|
+
developmentOrigins: [
|
|
729
|
+
"http://localhost:3000",
|
|
730
|
+
"http://localhost:4000",
|
|
731
|
+
"http://localhost:5000",
|
|
732
|
+
"http://localhost:5173",
|
|
733
|
+
"http://localhost:8080",
|
|
734
|
+
"http://127.0.0.1:3000",
|
|
735
|
+
"http://127.0.0.1:4000",
|
|
736
|
+
"http://127.0.0.1:5000",
|
|
737
|
+
"http://127.0.0.1:5173",
|
|
738
|
+
"http://127.0.0.1:8080"
|
|
739
|
+
],
|
|
740
|
+
allowedSubdomains: [],
|
|
741
|
+
originPatterns: [],
|
|
742
|
+
allowNoOrigin: true,
|
|
743
|
+
allowAllInDev: true,
|
|
744
|
+
credentials: true,
|
|
745
|
+
methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"],
|
|
746
|
+
allowedHeaders: [
|
|
747
|
+
"Content-Type",
|
|
748
|
+
"Authorization",
|
|
749
|
+
"X-Requested-With",
|
|
750
|
+
"Accept",
|
|
751
|
+
"Origin",
|
|
752
|
+
"X-API-Key",
|
|
753
|
+
"X-Organization-Id",
|
|
754
|
+
"X-Request-Id"
|
|
755
|
+
],
|
|
756
|
+
exposedHeaders: [
|
|
757
|
+
"Content-Range",
|
|
758
|
+
"X-Content-Range",
|
|
759
|
+
"X-Total-Count",
|
|
760
|
+
"X-Request-Id"
|
|
761
|
+
],
|
|
762
|
+
maxAge: 86400
|
|
763
|
+
// 24 hours
|
|
764
|
+
};
|
|
765
|
+
var createCorsOptions = (config = {}) => {
|
|
766
|
+
const finalConfig = { ...DEFAULT_CORS_CONFIG, ...config };
|
|
767
|
+
const {
|
|
768
|
+
productionOrigins,
|
|
769
|
+
developmentOrigins,
|
|
770
|
+
allowedSubdomains,
|
|
771
|
+
originPatterns,
|
|
772
|
+
allowNoOrigin,
|
|
773
|
+
allowAllInDev,
|
|
774
|
+
customValidator,
|
|
775
|
+
credentials,
|
|
776
|
+
methods,
|
|
777
|
+
allowedHeaders,
|
|
778
|
+
exposedHeaders,
|
|
779
|
+
maxAge
|
|
780
|
+
} = finalConfig;
|
|
781
|
+
const allOrigins = /* @__PURE__ */ new Set([...productionOrigins, ...developmentOrigins]);
|
|
782
|
+
const originHandler = (origin, callback) => {
|
|
783
|
+
if (!origin) {
|
|
784
|
+
callback(null, allowNoOrigin);
|
|
785
|
+
return;
|
|
786
|
+
}
|
|
787
|
+
if (allOrigins.has(origin)) {
|
|
788
|
+
callback(null, true);
|
|
789
|
+
return;
|
|
790
|
+
}
|
|
791
|
+
if (allowedSubdomains.some((subdomain) => origin.endsWith(subdomain))) {
|
|
792
|
+
callback(null, true);
|
|
793
|
+
return;
|
|
794
|
+
}
|
|
795
|
+
if (originPatterns.some((pattern) => pattern.test(origin))) {
|
|
796
|
+
callback(null, true);
|
|
797
|
+
return;
|
|
798
|
+
}
|
|
799
|
+
if (customValidator && customValidator(origin)) {
|
|
800
|
+
callback(null, true);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
if (process.env.NODE_ENV !== "production" && allowAllInDev) {
|
|
804
|
+
callback(null, true);
|
|
805
|
+
return;
|
|
806
|
+
}
|
|
807
|
+
if (process.env.NODE_ENV === "production") {
|
|
808
|
+
callback(new Error(`Origin ${origin} not allowed by CORS`));
|
|
809
|
+
return;
|
|
810
|
+
}
|
|
811
|
+
callback(null, true);
|
|
812
|
+
};
|
|
813
|
+
return {
|
|
814
|
+
origin: originHandler,
|
|
815
|
+
credentials,
|
|
816
|
+
methods,
|
|
817
|
+
allowedHeaders,
|
|
818
|
+
exposedHeaders,
|
|
819
|
+
maxAge
|
|
820
|
+
};
|
|
821
|
+
};
|
|
822
|
+
var createBrandCorsOptions = (brandDomain, additionalConfig = {}) => {
|
|
823
|
+
const productionOrigins = [
|
|
824
|
+
`https://${brandDomain}`,
|
|
825
|
+
`https://www.${brandDomain}`
|
|
826
|
+
];
|
|
827
|
+
const allowedSubdomains = [`.${brandDomain}`];
|
|
828
|
+
return createCorsOptions({
|
|
829
|
+
productionOrigins,
|
|
830
|
+
allowedSubdomains,
|
|
831
|
+
...additionalConfig
|
|
832
|
+
});
|
|
833
|
+
};
|
|
834
|
+
var createMultiBrandCorsOptions = (domains, additionalConfig = {}) => {
|
|
835
|
+
const productionOrigins = domains.flatMap((domain) => [
|
|
836
|
+
`https://${domain}`,
|
|
837
|
+
`https://www.${domain}`
|
|
838
|
+
]);
|
|
839
|
+
const allowedSubdomains = domains.map((domain) => `.${domain}`);
|
|
840
|
+
return createCorsOptions({
|
|
841
|
+
productionOrigins,
|
|
842
|
+
allowedSubdomains,
|
|
843
|
+
...additionalConfig
|
|
844
|
+
});
|
|
845
|
+
};
|
|
846
|
+
var EXYCONN_CORS_CONFIG = {
|
|
847
|
+
productionOrigins: [
|
|
848
|
+
"https://exyconn.com",
|
|
849
|
+
"https://www.exyconn.com",
|
|
850
|
+
"https://botify.life",
|
|
851
|
+
"https://www.botify.life",
|
|
852
|
+
"https://partywings.fun",
|
|
853
|
+
"https://www.partywings.fun",
|
|
854
|
+
"https://sibera.work",
|
|
855
|
+
"https://www.sibera.work",
|
|
856
|
+
"https://spentiva.com",
|
|
857
|
+
"https://www.spentiva.com"
|
|
858
|
+
],
|
|
859
|
+
allowedSubdomains: [
|
|
860
|
+
".exyconn.com",
|
|
861
|
+
".botify.life",
|
|
862
|
+
".partywings.fun",
|
|
863
|
+
".sibera.work",
|
|
864
|
+
".spentiva.com"
|
|
865
|
+
],
|
|
866
|
+
developmentOrigins: [
|
|
867
|
+
"http://localhost:3000",
|
|
868
|
+
"http://localhost:4000",
|
|
869
|
+
"http://localhost:4001",
|
|
870
|
+
"http://localhost:4002",
|
|
871
|
+
"http://localhost:4003",
|
|
872
|
+
"http://localhost:4004",
|
|
873
|
+
"http://localhost:4005",
|
|
874
|
+
"http://localhost:5173",
|
|
875
|
+
"http://127.0.0.1:3000",
|
|
876
|
+
"http://127.0.0.1:4000",
|
|
877
|
+
"http://127.0.0.1:5173"
|
|
878
|
+
]
|
|
879
|
+
};
|
|
880
|
+
var STRICT_CORS_CONFIG = {
|
|
881
|
+
allowNoOrigin: false,
|
|
882
|
+
allowAllInDev: false,
|
|
883
|
+
methods: ["GET", "POST", "PUT", "DELETE"]
|
|
884
|
+
};
|
|
885
|
+
var PERMISSIVE_CORS_CONFIG = {
|
|
886
|
+
allowNoOrigin: true,
|
|
887
|
+
allowAllInDev: true,
|
|
888
|
+
originPatterns: [/localhost/, /127\.0\.0\.1/]
|
|
889
|
+
};
|
|
890
|
+
var corsOptions = createCorsOptions(EXYCONN_CORS_CONFIG);
|
|
891
|
+
var DEFAULT_RATE_LIMIT_TIERS = {
|
|
892
|
+
STANDARD: {
|
|
893
|
+
windowMs: 15 * 60 * 1e3,
|
|
894
|
+
// 15 minutes
|
|
895
|
+
maxRequests: 100,
|
|
896
|
+
message: "Too many requests, please try again later.",
|
|
897
|
+
skipSuccessfulRequests: false,
|
|
898
|
+
skipFailedRequests: false
|
|
899
|
+
},
|
|
900
|
+
STRICT: {
|
|
901
|
+
windowMs: 15 * 60 * 1e3,
|
|
902
|
+
// 15 minutes
|
|
903
|
+
maxRequests: 20,
|
|
904
|
+
message: "Too many requests, please try again later.",
|
|
905
|
+
skipSuccessfulRequests: false,
|
|
906
|
+
skipFailedRequests: false
|
|
907
|
+
},
|
|
908
|
+
DDOS: {
|
|
909
|
+
windowMs: 60 * 1e3,
|
|
910
|
+
// 1 minute
|
|
911
|
+
maxRequests: 60,
|
|
912
|
+
message: "Rate limit exceeded. Please slow down.",
|
|
913
|
+
skipSuccessfulRequests: false,
|
|
914
|
+
skipFailedRequests: false
|
|
915
|
+
},
|
|
916
|
+
// Additional presets
|
|
917
|
+
VERY_STRICT: {
|
|
918
|
+
windowMs: 60 * 60 * 1e3,
|
|
919
|
+
// 1 hour
|
|
920
|
+
maxRequests: 5,
|
|
921
|
+
message: "Too many attempts. Please try again in an hour.",
|
|
922
|
+
skipSuccessfulRequests: false,
|
|
923
|
+
skipFailedRequests: false
|
|
924
|
+
},
|
|
925
|
+
RELAXED: {
|
|
926
|
+
windowMs: 15 * 60 * 1e3,
|
|
927
|
+
// 15 minutes
|
|
928
|
+
maxRequests: 500,
|
|
929
|
+
message: "Rate limit exceeded.",
|
|
930
|
+
skipSuccessfulRequests: false,
|
|
931
|
+
skipFailedRequests: false
|
|
932
|
+
},
|
|
933
|
+
API: {
|
|
934
|
+
windowMs: 60 * 1e3,
|
|
935
|
+
// 1 minute
|
|
936
|
+
maxRequests: 30,
|
|
937
|
+
message: "API rate limit exceeded.",
|
|
938
|
+
skipSuccessfulRequests: false,
|
|
939
|
+
skipFailedRequests: false
|
|
940
|
+
}
|
|
941
|
+
};
|
|
942
|
+
var defaultKeyGenerator = (req) => {
|
|
943
|
+
const forwarded = req.headers["x-forwarded-for"];
|
|
944
|
+
const ip = forwarded ? Array.isArray(forwarded) ? forwarded[0] : forwarded.split(",")[0].trim() : req.ip || req.socket.remoteAddress || "unknown";
|
|
945
|
+
return ip;
|
|
946
|
+
};
|
|
947
|
+
var createPrefixedKeyGenerator = (prefix) => (req) => {
|
|
948
|
+
return `${prefix}:${defaultKeyGenerator(req)}`;
|
|
949
|
+
};
|
|
950
|
+
var createUserKeyGenerator = (getUserId) => (req) => {
|
|
951
|
+
const userId = getUserId(req);
|
|
952
|
+
return userId || defaultKeyGenerator(req);
|
|
953
|
+
};
|
|
954
|
+
var createApiKeyGenerator = (headerName = "x-api-key") => (req) => {
|
|
955
|
+
const apiKey = req.headers[headerName.toLowerCase()];
|
|
956
|
+
return apiKey || defaultKeyGenerator(req);
|
|
957
|
+
};
|
|
958
|
+
var createRateLimitResponse = (message, retryAfter) => ({
|
|
959
|
+
status: "error",
|
|
960
|
+
statusCode: 429,
|
|
961
|
+
message,
|
|
962
|
+
...retryAfter
|
|
963
|
+
});
|
|
964
|
+
var createRateLimiter = (tierConfig, options = {}) => {
|
|
965
|
+
const {
|
|
966
|
+
standardHeaders = true,
|
|
967
|
+
legacyHeaders = false,
|
|
968
|
+
keyGenerator = defaultKeyGenerator,
|
|
969
|
+
skip,
|
|
970
|
+
handler
|
|
971
|
+
} = options;
|
|
972
|
+
return rateLimit__default.default({
|
|
973
|
+
windowMs: tierConfig.windowMs,
|
|
974
|
+
max: tierConfig.maxRequests,
|
|
975
|
+
message: createRateLimitResponse(tierConfig.message),
|
|
976
|
+
standardHeaders,
|
|
977
|
+
legacyHeaders,
|
|
978
|
+
keyGenerator,
|
|
979
|
+
skip,
|
|
980
|
+
handler,
|
|
981
|
+
skipSuccessfulRequests: tierConfig.skipSuccessfulRequests,
|
|
982
|
+
skipFailedRequests: tierConfig.skipFailedRequests
|
|
983
|
+
});
|
|
984
|
+
};
|
|
985
|
+
var createStandardRateLimiter = (config = {}, options = {}) => {
|
|
986
|
+
const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STANDARD, ...config };
|
|
987
|
+
return createRateLimiter(tierConfig, options);
|
|
988
|
+
};
|
|
989
|
+
var createStrictRateLimiter = (config = {}, options = {}) => {
|
|
990
|
+
const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.STRICT, ...config };
|
|
991
|
+
return createRateLimiter(tierConfig, options);
|
|
992
|
+
};
|
|
993
|
+
var createDdosRateLimiter = (config = {}, options = {}) => {
|
|
994
|
+
const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.DDOS, ...config };
|
|
995
|
+
return createRateLimiter(tierConfig, options);
|
|
996
|
+
};
|
|
997
|
+
var createApiRateLimiter = (config = {}, options = {}) => {
|
|
998
|
+
const tierConfig = { ...DEFAULT_RATE_LIMIT_TIERS.API, ...config };
|
|
999
|
+
return createRateLimiter(tierConfig, {
|
|
1000
|
+
keyGenerator: createApiKeyGenerator(),
|
|
1001
|
+
...options
|
|
1002
|
+
});
|
|
1003
|
+
};
|
|
1004
|
+
var RateLimiterBuilder = class {
|
|
1005
|
+
constructor(preset = "STANDARD") {
|
|
1006
|
+
const presetConfig = DEFAULT_RATE_LIMIT_TIERS[preset];
|
|
1007
|
+
this.config = {
|
|
1008
|
+
windowMs: presetConfig.windowMs,
|
|
1009
|
+
maxRequests: presetConfig.maxRequests,
|
|
1010
|
+
message: presetConfig.message,
|
|
1011
|
+
skipSuccessfulRequests: presetConfig.skipSuccessfulRequests ?? false,
|
|
1012
|
+
skipFailedRequests: presetConfig.skipFailedRequests ?? false
|
|
1013
|
+
};
|
|
1014
|
+
this.options = {};
|
|
1015
|
+
}
|
|
1016
|
+
/**
|
|
1017
|
+
* Set window duration
|
|
1018
|
+
*/
|
|
1019
|
+
windowMs(ms) {
|
|
1020
|
+
this.config.windowMs = ms;
|
|
1021
|
+
return this;
|
|
1022
|
+
}
|
|
1023
|
+
/**
|
|
1024
|
+
* Set window duration in minutes
|
|
1025
|
+
*/
|
|
1026
|
+
windowMinutes(minutes) {
|
|
1027
|
+
this.config.windowMs = minutes * 60 * 1e3;
|
|
1028
|
+
return this;
|
|
1029
|
+
}
|
|
1030
|
+
/**
|
|
1031
|
+
* Set window duration in hours
|
|
1032
|
+
*/
|
|
1033
|
+
windowHours(hours) {
|
|
1034
|
+
this.config.windowMs = hours * 60 * 60 * 1e3;
|
|
1035
|
+
return this;
|
|
1036
|
+
}
|
|
1037
|
+
/**
|
|
1038
|
+
* Set maximum requests
|
|
1039
|
+
*/
|
|
1040
|
+
max(requests) {
|
|
1041
|
+
this.config.maxRequests = requests;
|
|
1042
|
+
return this;
|
|
1043
|
+
}
|
|
1044
|
+
/**
|
|
1045
|
+
* Set error message
|
|
1046
|
+
*/
|
|
1047
|
+
message(msg) {
|
|
1048
|
+
this.config.message = msg;
|
|
1049
|
+
return this;
|
|
1050
|
+
}
|
|
1051
|
+
/**
|
|
1052
|
+
* Skip successful requests
|
|
1053
|
+
*/
|
|
1054
|
+
skipSuccessful(skip = true) {
|
|
1055
|
+
this.config.skipSuccessfulRequests = skip;
|
|
1056
|
+
return this;
|
|
1057
|
+
}
|
|
1058
|
+
/**
|
|
1059
|
+
* Skip failed requests
|
|
1060
|
+
*/
|
|
1061
|
+
skipFailed(skip = true) {
|
|
1062
|
+
this.config.skipFailedRequests = skip;
|
|
1063
|
+
return this;
|
|
1064
|
+
}
|
|
1065
|
+
/**
|
|
1066
|
+
* Set key generator
|
|
1067
|
+
*/
|
|
1068
|
+
keyBy(generator) {
|
|
1069
|
+
this.options.keyGenerator = generator;
|
|
1070
|
+
return this;
|
|
1071
|
+
}
|
|
1072
|
+
/**
|
|
1073
|
+
* Key by IP (default)
|
|
1074
|
+
*/
|
|
1075
|
+
keyByIp() {
|
|
1076
|
+
this.options.keyGenerator = defaultKeyGenerator;
|
|
1077
|
+
return this;
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* Key by API key
|
|
1081
|
+
*/
|
|
1082
|
+
keyByApiKey(headerName) {
|
|
1083
|
+
this.options.keyGenerator = createApiKeyGenerator(headerName);
|
|
1084
|
+
return this;
|
|
1085
|
+
}
|
|
1086
|
+
/**
|
|
1087
|
+
* Skip certain requests
|
|
1088
|
+
*/
|
|
1089
|
+
skipWhen(predicate) {
|
|
1090
|
+
this.options.skip = predicate;
|
|
1091
|
+
return this;
|
|
1092
|
+
}
|
|
1093
|
+
/**
|
|
1094
|
+
* Build the rate limiter
|
|
1095
|
+
*/
|
|
1096
|
+
build() {
|
|
1097
|
+
return createRateLimiter(this.config, this.options);
|
|
1098
|
+
}
|
|
1099
|
+
};
|
|
1100
|
+
var rateLimiter = (preset) => {
|
|
1101
|
+
return new RateLimiterBuilder(preset);
|
|
1102
|
+
};
|
|
1103
|
+
var RATE_LIMIT_CONFIG = {
|
|
1104
|
+
STANDARD: DEFAULT_RATE_LIMIT_TIERS.STANDARD,
|
|
1105
|
+
STRICT: DEFAULT_RATE_LIMIT_TIERS.STRICT,
|
|
1106
|
+
DDOS: DEFAULT_RATE_LIMIT_TIERS.DDOS
|
|
1107
|
+
};
|
|
1108
|
+
var standardRateLimiter = createStandardRateLimiter();
|
|
1109
|
+
var strictRateLimiter = createStrictRateLimiter();
|
|
1110
|
+
var ddosProtectionLimiter = createDdosRateLimiter();
|
|
1111
|
+
|
|
1112
|
+
// src/server/configs/server.config.ts
|
|
1113
|
+
var DEFAULT_SERVER_CONFIG = {
|
|
1114
|
+
name: "app-server",
|
|
1115
|
+
version: "1.0.0",
|
|
1116
|
+
environment: process.env.NODE_ENV || "development",
|
|
1117
|
+
port: parseInt(process.env.PORT || "3000", 10),
|
|
1118
|
+
host: process.env.HOST || "0.0.0.0",
|
|
1119
|
+
basePath: "/api",
|
|
1120
|
+
debug: process.env.DEBUG === "true",
|
|
1121
|
+
trustProxy: true
|
|
1122
|
+
};
|
|
1123
|
+
var DEFAULT_DATABASE_CONFIG = {
|
|
1124
|
+
uri: process.env.DATABASE_URL || process.env.MONGODB_URI || "",
|
|
1125
|
+
name: process.env.DATABASE_NAME || "app_db",
|
|
1126
|
+
maxPoolSize: process.env.NODE_ENV === "production" ? 50 : 10,
|
|
1127
|
+
minPoolSize: process.env.NODE_ENV === "production" ? 10 : 5,
|
|
1128
|
+
socketTimeoutMS: 45e3,
|
|
1129
|
+
serverSelectionTimeoutMS: 1e4,
|
|
1130
|
+
maxIdleTimeMS: 1e4,
|
|
1131
|
+
retryWrites: true,
|
|
1132
|
+
retryReads: true,
|
|
1133
|
+
writeConcern: "majority"
|
|
1134
|
+
};
|
|
1135
|
+
var DEFAULT_AUTH_CONFIG = {
|
|
1136
|
+
jwtSecret: process.env.JWT_SECRET || "",
|
|
1137
|
+
jwtExpiresIn: process.env.JWT_EXPIRES_IN || "7d",
|
|
1138
|
+
refreshTokenExpiresIn: process.env.REFRESH_TOKEN_EXPIRES_IN || "30d",
|
|
1139
|
+
enableRefreshTokens: true,
|
|
1140
|
+
apiKeyHeader: "x-api-key",
|
|
1141
|
+
orgHeader: "x-organization-id"
|
|
1142
|
+
};
|
|
1143
|
+
var DEFAULT_LOGGING_CONFIG = {
|
|
1144
|
+
level: process.env.LOG_LEVEL || "info",
|
|
1145
|
+
logsDir: process.env.LOGS_DIR || "logs",
|
|
1146
|
+
maxSize: "20m",
|
|
1147
|
+
maxFiles: "14d",
|
|
1148
|
+
errorMaxFiles: "30d",
|
|
1149
|
+
console: true,
|
|
1150
|
+
file: process.env.NODE_ENV === "production",
|
|
1151
|
+
json: process.env.NODE_ENV === "production"
|
|
1152
|
+
};
|
|
1153
|
+
var DEFAULT_CORS_ORIGINS = {
|
|
1154
|
+
production: [],
|
|
1155
|
+
development: [
|
|
1156
|
+
"http://localhost:3000",
|
|
1157
|
+
"http://localhost:4000",
|
|
1158
|
+
"http://localhost:5173",
|
|
1159
|
+
"http://127.0.0.1:3000",
|
|
1160
|
+
"http://127.0.0.1:4000",
|
|
1161
|
+
"http://127.0.0.1:5173"
|
|
1162
|
+
],
|
|
1163
|
+
patterns: []
|
|
1164
|
+
};
|
|
1165
|
+
var DEFAULT_RATE_LIMIT_CONFIG = {
|
|
1166
|
+
enabled: true,
|
|
1167
|
+
standard: {
|
|
1168
|
+
windowMs: 15 * 60 * 1e3,
|
|
1169
|
+
// 15 minutes
|
|
1170
|
+
maxRequests: 100,
|
|
1171
|
+
message: "Too many requests, please try again later."
|
|
1172
|
+
},
|
|
1173
|
+
strict: {
|
|
1174
|
+
windowMs: 15 * 60 * 1e3,
|
|
1175
|
+
// 15 minutes
|
|
1176
|
+
maxRequests: 20,
|
|
1177
|
+
message: "Too many requests, please try again later."
|
|
1178
|
+
},
|
|
1179
|
+
ddos: {
|
|
1180
|
+
windowMs: 60 * 1e3,
|
|
1181
|
+
// 1 minute
|
|
1182
|
+
maxRequests: 60,
|
|
1183
|
+
message: "Rate limit exceeded. Please slow down.",
|
|
1184
|
+
skipSuccessfulRequests: false
|
|
1185
|
+
}
|
|
1186
|
+
};
|
|
1187
|
+
function deepMerge(target, source) {
|
|
1188
|
+
const result = { ...target };
|
|
1189
|
+
for (const key in source) {
|
|
1190
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
1191
|
+
const sourceValue = source[key];
|
|
1192
|
+
const targetValue = target[key];
|
|
1193
|
+
if (sourceValue !== void 0 && typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue) && typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue)) {
|
|
1194
|
+
result[key] = deepMerge(
|
|
1195
|
+
targetValue,
|
|
1196
|
+
sourceValue
|
|
1197
|
+
);
|
|
1198
|
+
} else if (sourceValue !== void 0) {
|
|
1199
|
+
result[key] = sourceValue;
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
return result;
|
|
1204
|
+
}
|
|
1205
|
+
var ConfigBuilder = class {
|
|
1206
|
+
constructor() {
|
|
1207
|
+
this.config = {
|
|
1208
|
+
server: { ...DEFAULT_SERVER_CONFIG },
|
|
1209
|
+
database: { ...DEFAULT_DATABASE_CONFIG },
|
|
1210
|
+
auth: { ...DEFAULT_AUTH_CONFIG },
|
|
1211
|
+
logging: { ...DEFAULT_LOGGING_CONFIG },
|
|
1212
|
+
cors: { ...DEFAULT_CORS_ORIGINS },
|
|
1213
|
+
rateLimit: { ...DEFAULT_RATE_LIMIT_CONFIG }
|
|
1214
|
+
};
|
|
1215
|
+
}
|
|
1216
|
+
/**
|
|
1217
|
+
* Set server configuration
|
|
1218
|
+
*/
|
|
1219
|
+
setServer(config) {
|
|
1220
|
+
this.config.server = deepMerge(this.config.server, config);
|
|
1221
|
+
return this;
|
|
1222
|
+
}
|
|
1223
|
+
/**
|
|
1224
|
+
* Set database configuration
|
|
1225
|
+
*/
|
|
1226
|
+
setDatabase(config) {
|
|
1227
|
+
this.config.database = deepMerge(this.config.database, config);
|
|
1228
|
+
return this;
|
|
1229
|
+
}
|
|
1230
|
+
/**
|
|
1231
|
+
* Set auth configuration
|
|
1232
|
+
*/
|
|
1233
|
+
setAuth(config) {
|
|
1234
|
+
this.config.auth = deepMerge(this.config.auth, config);
|
|
1235
|
+
return this;
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* Set logging configuration
|
|
1239
|
+
*/
|
|
1240
|
+
setLogging(config) {
|
|
1241
|
+
this.config.logging = deepMerge(this.config.logging, config);
|
|
1242
|
+
return this;
|
|
1243
|
+
}
|
|
1244
|
+
/**
|
|
1245
|
+
* Set CORS origins
|
|
1246
|
+
*/
|
|
1247
|
+
setCorsOrigins(config) {
|
|
1248
|
+
this.config.cors = deepMerge(this.config.cors, config);
|
|
1249
|
+
return this;
|
|
1250
|
+
}
|
|
1251
|
+
/**
|
|
1252
|
+
* Add CORS production origin
|
|
1253
|
+
*/
|
|
1254
|
+
addProductionOrigin(origin) {
|
|
1255
|
+
if (!this.config.cors.production.includes(origin)) {
|
|
1256
|
+
this.config.cors.production.push(origin);
|
|
1257
|
+
}
|
|
1258
|
+
return this;
|
|
1259
|
+
}
|
|
1260
|
+
/**
|
|
1261
|
+
* Add CORS development origin
|
|
1262
|
+
*/
|
|
1263
|
+
addDevelopmentOrigin(origin) {
|
|
1264
|
+
if (!this.config.cors.development.includes(origin)) {
|
|
1265
|
+
this.config.cors.development.push(origin);
|
|
1266
|
+
}
|
|
1267
|
+
return this;
|
|
1268
|
+
}
|
|
1269
|
+
/**
|
|
1270
|
+
* Add CORS pattern
|
|
1271
|
+
*/
|
|
1272
|
+
addCorsPattern(pattern) {
|
|
1273
|
+
if (!this.config.cors.patterns.includes(pattern)) {
|
|
1274
|
+
this.config.cors.patterns.push(pattern);
|
|
1275
|
+
}
|
|
1276
|
+
return this;
|
|
1277
|
+
}
|
|
1278
|
+
/**
|
|
1279
|
+
* Set rate limit configuration
|
|
1280
|
+
*/
|
|
1281
|
+
setRateLimit(config) {
|
|
1282
|
+
this.config.rateLimit = deepMerge(this.config.rateLimit, config);
|
|
1283
|
+
return this;
|
|
1284
|
+
}
|
|
1285
|
+
/**
|
|
1286
|
+
* Add custom rate limit tier
|
|
1287
|
+
*/
|
|
1288
|
+
addRateLimitTier(name, tier) {
|
|
1289
|
+
if (!this.config.rateLimit.custom) {
|
|
1290
|
+
this.config.rateLimit.custom = {};
|
|
1291
|
+
}
|
|
1292
|
+
this.config.rateLimit.custom[name] = tier;
|
|
1293
|
+
return this;
|
|
1294
|
+
}
|
|
1295
|
+
/**
|
|
1296
|
+
* Set custom configuration
|
|
1297
|
+
*/
|
|
1298
|
+
setCustom(key, value) {
|
|
1299
|
+
if (!this.config.custom) {
|
|
1300
|
+
this.config.custom = {};
|
|
1301
|
+
}
|
|
1302
|
+
this.config.custom[key] = value;
|
|
1303
|
+
return this;
|
|
1304
|
+
}
|
|
1305
|
+
/**
|
|
1306
|
+
* Load configuration from environment variables
|
|
1307
|
+
*/
|
|
1308
|
+
loadFromEnv() {
|
|
1309
|
+
if (process.env.SERVER_NAME) this.config.server.name = process.env.SERVER_NAME;
|
|
1310
|
+
if (process.env.SERVER_VERSION) this.config.server.version = process.env.SERVER_VERSION;
|
|
1311
|
+
if (process.env.PORT) this.config.server.port = parseInt(process.env.PORT, 10);
|
|
1312
|
+
if (process.env.HOST) this.config.server.host = process.env.HOST;
|
|
1313
|
+
if (process.env.BASE_PATH) this.config.server.basePath = process.env.BASE_PATH;
|
|
1314
|
+
if (process.env.DATABASE_URL) this.config.database.uri = process.env.DATABASE_URL;
|
|
1315
|
+
if (process.env.MONGODB_URI) this.config.database.uri = process.env.MONGODB_URI;
|
|
1316
|
+
if (process.env.DATABASE_NAME) this.config.database.name = process.env.DATABASE_NAME;
|
|
1317
|
+
if (process.env.JWT_SECRET) this.config.auth.jwtSecret = process.env.JWT_SECRET;
|
|
1318
|
+
if (process.env.JWT_EXPIRES_IN) this.config.auth.jwtExpiresIn = process.env.JWT_EXPIRES_IN;
|
|
1319
|
+
if (process.env.LOG_LEVEL) this.config.logging.level = process.env.LOG_LEVEL;
|
|
1320
|
+
if (process.env.LOGS_DIR) this.config.logging.logsDir = process.env.LOGS_DIR;
|
|
1321
|
+
if (process.env.CORS_ORIGINS) {
|
|
1322
|
+
const origins = process.env.CORS_ORIGINS.split(",").map((o) => o.trim());
|
|
1323
|
+
this.config.cors.production.push(...origins);
|
|
1324
|
+
}
|
|
1325
|
+
return this;
|
|
1326
|
+
}
|
|
1327
|
+
/**
|
|
1328
|
+
* Validate configuration
|
|
1329
|
+
*/
|
|
1330
|
+
validate() {
|
|
1331
|
+
const errors = [];
|
|
1332
|
+
if (!this.config.server.name) errors.push("Server name is required");
|
|
1333
|
+
if (this.config.server.port < 1 || this.config.server.port > 65535) {
|
|
1334
|
+
errors.push("Server port must be between 1 and 65535");
|
|
1335
|
+
}
|
|
1336
|
+
if (this.config.server.environment === "production") {
|
|
1337
|
+
if (!this.config.auth.jwtSecret || this.config.auth.jwtSecret.length < 32) {
|
|
1338
|
+
errors.push("JWT secret must be at least 32 characters in production");
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
return { valid: errors.length === 0, errors };
|
|
1342
|
+
}
|
|
1343
|
+
/**
|
|
1344
|
+
* Build the final configuration
|
|
1345
|
+
*/
|
|
1346
|
+
build() {
|
|
1347
|
+
return { ...this.config };
|
|
1348
|
+
}
|
|
1349
|
+
};
|
|
1350
|
+
var createConfig = () => {
|
|
1351
|
+
return new ConfigBuilder();
|
|
1352
|
+
};
|
|
1353
|
+
var buildConfig = (partial = {}) => {
|
|
1354
|
+
const builder = createConfig().loadFromEnv();
|
|
1355
|
+
if (partial.server) builder.setServer(partial.server);
|
|
1356
|
+
if (partial.database) builder.setDatabase(partial.database);
|
|
1357
|
+
if (partial.auth) builder.setAuth(partial.auth);
|
|
1358
|
+
if (partial.logging) builder.setLogging(partial.logging);
|
|
1359
|
+
if (partial.cors) builder.setCorsOrigins(partial.cors);
|
|
1360
|
+
if (partial.rateLimit) builder.setRateLimit(partial.rateLimit);
|
|
1361
|
+
return builder.build();
|
|
1362
|
+
};
|
|
1363
|
+
var isProduction = (config) => {
|
|
1364
|
+
return (config?.environment || process.env.NODE_ENV) === "production";
|
|
1365
|
+
};
|
|
1366
|
+
var isDevelopment = (config) => {
|
|
1367
|
+
return (config?.environment || process.env.NODE_ENV) === "development";
|
|
1368
|
+
};
|
|
1369
|
+
var isTest = (config) => {
|
|
1370
|
+
return (config?.environment || process.env.NODE_ENV) === "test";
|
|
1371
|
+
};
|
|
1372
|
+
var getDatabaseOptions = (config) => {
|
|
1373
|
+
return {
|
|
1374
|
+
maxPoolSize: config.maxPoolSize,
|
|
1375
|
+
minPoolSize: config.minPoolSize,
|
|
1376
|
+
socketTimeoutMS: config.socketTimeoutMS,
|
|
1377
|
+
serverSelectionTimeoutMS: config.serverSelectionTimeoutMS,
|
|
1378
|
+
maxIdleTimeMS: config.maxIdleTimeMS,
|
|
1379
|
+
retryWrites: config.retryWrites,
|
|
1380
|
+
retryReads: config.retryReads,
|
|
1381
|
+
w: config.writeConcern
|
|
1382
|
+
};
|
|
1383
|
+
};
|
|
1384
|
+
|
|
1385
|
+
exports.ConfigBuilder = ConfigBuilder;
|
|
1386
|
+
exports.DEFAULT_AUTH_CONFIG = DEFAULT_AUTH_CONFIG;
|
|
1387
|
+
exports.DEFAULT_CORS_CONFIG = DEFAULT_CORS_CONFIG;
|
|
1388
|
+
exports.DEFAULT_CORS_ORIGINS = DEFAULT_CORS_ORIGINS;
|
|
1389
|
+
exports.DEFAULT_DATABASE_CONFIG = DEFAULT_DATABASE_CONFIG;
|
|
1390
|
+
exports.DEFAULT_LOGGING_CONFIG = DEFAULT_LOGGING_CONFIG;
|
|
1391
|
+
exports.DEFAULT_RATE_LIMIT_CONFIG = DEFAULT_RATE_LIMIT_CONFIG;
|
|
1392
|
+
exports.DEFAULT_RATE_LIMIT_TIERS = DEFAULT_RATE_LIMIT_TIERS;
|
|
1393
|
+
exports.DEFAULT_SERVER_CONFIG = DEFAULT_SERVER_CONFIG;
|
|
1394
|
+
exports.EXYCONN_CORS_CONFIG = EXYCONN_CORS_CONFIG;
|
|
1395
|
+
exports.PERMISSIVE_CORS_CONFIG = PERMISSIVE_CORS_CONFIG;
|
|
1396
|
+
exports.RATE_LIMIT_CONFIG = RATE_LIMIT_CONFIG;
|
|
1397
|
+
exports.RateLimiterBuilder = RateLimiterBuilder;
|
|
1398
|
+
exports.STRICT_CORS_CONFIG = STRICT_CORS_CONFIG;
|
|
723
1399
|
exports.StatusCode = StatusCode;
|
|
724
1400
|
exports.StatusMessage = StatusMessage;
|
|
725
1401
|
exports.authenticateApiKey = authenticateApiKey;
|
|
726
1402
|
exports.authenticateJWT = authenticateJWT;
|
|
727
1403
|
exports.badRequestResponse = badRequestResponse;
|
|
1404
|
+
exports.buildConfig = buildConfig;
|
|
728
1405
|
exports.buildFilter = buildFilter;
|
|
729
1406
|
exports.buildPagination = buildPagination;
|
|
730
1407
|
exports.buildPaginationMeta = buildPaginationMeta;
|
|
731
1408
|
exports.checkPackageServer = checkPackageServer;
|
|
732
1409
|
exports.conflictResponse = conflictResponse;
|
|
733
1410
|
exports.connectDB = connectDB;
|
|
1411
|
+
exports.corsOptions = corsOptions;
|
|
1412
|
+
exports.createApiKeyGenerator = createApiKeyGenerator;
|
|
1413
|
+
exports.createApiRateLimiter = createApiRateLimiter;
|
|
1414
|
+
exports.createBrandCorsOptions = createBrandCorsOptions;
|
|
1415
|
+
exports.createConfig = createConfig;
|
|
1416
|
+
exports.createCorsOptions = createCorsOptions;
|
|
1417
|
+
exports.createDdosRateLimiter = createDdosRateLimiter;
|
|
734
1418
|
exports.createLogger = createLogger;
|
|
735
1419
|
exports.createMorganStream = createMorganStream;
|
|
1420
|
+
exports.createMultiBrandCorsOptions = createMultiBrandCorsOptions;
|
|
1421
|
+
exports.createPrefixedKeyGenerator = createPrefixedKeyGenerator;
|
|
1422
|
+
exports.createRateLimiter = createRateLimiter;
|
|
1423
|
+
exports.createStandardRateLimiter = createStandardRateLimiter;
|
|
1424
|
+
exports.createStrictRateLimiter = createStrictRateLimiter;
|
|
1425
|
+
exports.createUserKeyGenerator = createUserKeyGenerator;
|
|
736
1426
|
exports.createdResponse = createdResponse;
|
|
1427
|
+
exports.ddosProtectionLimiter = ddosProtectionLimiter;
|
|
1428
|
+
exports.defaultKeyGenerator = defaultKeyGenerator;
|
|
737
1429
|
exports.disconnectDB = disconnectDB;
|
|
738
1430
|
exports.errorResponse = errorResponse;
|
|
739
1431
|
exports.extractColumns = extractColumns;
|
|
@@ -742,6 +1434,10 @@ exports.forbiddenResponse = forbiddenResponse;
|
|
|
742
1434
|
exports.formatPackageCheckResult = formatPackageCheckResult;
|
|
743
1435
|
exports.generateNcuCommand = generateNcuCommand;
|
|
744
1436
|
exports.getConnectionStatus = getConnectionStatus;
|
|
1437
|
+
exports.getDatabaseOptions = getDatabaseOptions;
|
|
1438
|
+
exports.isDevelopment = isDevelopment;
|
|
1439
|
+
exports.isProduction = isProduction;
|
|
1440
|
+
exports.isTest = isTest;
|
|
745
1441
|
exports.logger = logger;
|
|
746
1442
|
exports.noContentResponse = noContentResponse;
|
|
747
1443
|
exports.notFoundResponse = notFoundResponse;
|
|
@@ -751,13 +1447,16 @@ exports.packageCheckServer = packageCheckServer;
|
|
|
751
1447
|
exports.pickFields = pickFields;
|
|
752
1448
|
exports.printPackageCheckSummary = printPackageCheckSummary;
|
|
753
1449
|
exports.rateLimitResponse = rateLimitResponse;
|
|
1450
|
+
exports.rateLimiter = rateLimiter;
|
|
754
1451
|
exports.requireOrganization = requireOrganization;
|
|
755
1452
|
exports.sanitizeDocument = sanitizeDocument;
|
|
756
1453
|
exports.sanitizeUser = sanitizeUser;
|
|
757
1454
|
exports.simpleLogger = simpleLogger;
|
|
1455
|
+
exports.standardRateLimiter = standardRateLimiter;
|
|
758
1456
|
exports.statusCode = statusCode;
|
|
759
1457
|
exports.statusMessage = statusMessage;
|
|
760
1458
|
exports.stream = stream;
|
|
1459
|
+
exports.strictRateLimiter = strictRateLimiter;
|
|
761
1460
|
exports.successResponse = successResponse;
|
|
762
1461
|
exports.successResponseArr = successResponseArr;
|
|
763
1462
|
exports.unauthorizedResponse = unauthorizedResponse;
|