@arkyn/server 1.3.135 → 1.3.138
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/services/extractJsonFromRequest.d.ts +3 -0
- package/dist/services/extractJsonFromRequest.d.ts.map +1 -0
- package/dist/services/extractJsonFromRequest.js +29 -0
- package/dist/services/formParse.d.ts +3 -0
- package/dist/services/formParse.d.ts.map +1 -0
- package/dist/services/formParse.js +15 -0
- package/dist/services/getScopedParams.d.ts +3 -0
- package/dist/services/getScopedParams.d.ts.map +1 -0
- package/dist/services/getScopedParams.js +10 -0
- package/dist/services/maskSensitiveData.d.ts +3 -0
- package/dist/services/maskSensitiveData.d.ts.map +1 -0
- package/dist/services/maskSensitiveData.js +38 -0
- package/dist/services/truncateLargeFields.d.ts +3 -0
- package/dist/services/truncateLargeFields.d.ts.map +1 -0
- package/dist/services/truncateLargeFields.js +29 -0
- package/package.json +1 -1
- package/src/index.ts +5 -2
- package/src/services/extractJsonFromRequest.ts +30 -0
- /package/src/{helpers → services}/formParse.ts +0 -0
- /package/src/{helpers → services}/getScopedParams.ts +0 -0
package/dist/index.d.ts
CHANGED
|
@@ -5,7 +5,8 @@ export { NotFoundError } from "./httpBadResponses/notFound";
|
|
|
5
5
|
export { ServerError } from "./httpBadResponses/serverError";
|
|
6
6
|
export { UnauthorizedError } from "./httpBadResponses/unauthorized";
|
|
7
7
|
export { UnprocessableEntityError } from "./httpBadResponses/unprocessableEntity";
|
|
8
|
-
export { formParse } from "./helpers/formParse";
|
|
9
|
-
export { getScopedParams } from "./helpers/getScopedParams";
|
|
10
8
|
export { globalErrorHandler } from "./helpers/globalErrorHandler";
|
|
9
|
+
export { extractJsonFromRequest } from "./services/extractJsonFromRequest";
|
|
10
|
+
export { formParse } from "./services/formParse";
|
|
11
|
+
export { getScopedParams } from "./services/getScopedParams";
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAGlF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGlE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,8 @@ export { ServerError } from "./httpBadResponses/serverError";
|
|
|
7
7
|
export { UnauthorizedError } from "./httpBadResponses/unauthorized";
|
|
8
8
|
export { UnprocessableEntityError } from "./httpBadResponses/unprocessableEntity";
|
|
9
9
|
// helpers
|
|
10
|
-
export { formParse } from "./helpers/formParse";
|
|
11
|
-
export { getScopedParams } from "./helpers/getScopedParams";
|
|
12
10
|
export { globalErrorHandler } from "./helpers/globalErrorHandler";
|
|
11
|
+
// services
|
|
12
|
+
export { extractJsonFromRequest } from "./services/extractJsonFromRequest";
|
|
13
|
+
export { formParse } from "./services/formParse";
|
|
14
|
+
export { getScopedParams } from "./services/getScopedParams";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractJsonFromRequest.d.ts","sourceRoot":"","sources":["../../src/services/extractJsonFromRequest.ts"],"names":[],"mappings":"AAAA,iBAAe,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CA2BhE;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
async function extractJsonFromRequest(req) {
|
|
2
|
+
let data;
|
|
3
|
+
try {
|
|
4
|
+
const arrayBuffer = await req.arrayBuffer();
|
|
5
|
+
const text = new TextDecoder().decode(arrayBuffer);
|
|
6
|
+
try {
|
|
7
|
+
data = JSON.parse(text);
|
|
8
|
+
}
|
|
9
|
+
catch (jsonError) {
|
|
10
|
+
try {
|
|
11
|
+
const formData = new URLSearchParams(text);
|
|
12
|
+
data = Object.fromEntries(formData.entries());
|
|
13
|
+
}
|
|
14
|
+
catch (formDataError) {
|
|
15
|
+
console.error("Failed to extract data from request:", {
|
|
16
|
+
jsonError,
|
|
17
|
+
formDataError,
|
|
18
|
+
});
|
|
19
|
+
data = {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.error("Failed to read request body:", error);
|
|
25
|
+
data = {};
|
|
26
|
+
}
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
export { extractJsonFromRequest };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formParse.d.ts","sourceRoot":"","sources":["../../src/services/formParse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExE,wBAAgB,SAAS,CAAC,CAAC,SAAS,cAAc,EAAE,CAClD,QAAQ,EACR,MAAM,EACP,EAAE,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAoB5B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function formParse([formData, schema,]) {
|
|
2
|
+
const zodResponse = schema.safeParse(formData);
|
|
3
|
+
if (zodResponse.success === false) {
|
|
4
|
+
const errorsArray = Object.entries(zodResponse.error.formErrors.fieldErrors);
|
|
5
|
+
const errorsObject = Object.fromEntries(errorsArray.map((item) => [item[0], item[1]?.[0] || "Error"]));
|
|
6
|
+
return {
|
|
7
|
+
success: zodResponse.success,
|
|
8
|
+
fieldErrors: errorsObject,
|
|
9
|
+
fields: formData,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
return { success: zodResponse.success, data: zodResponse.data };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getScopedParams.d.ts","sourceRoot":"","sources":["../../src/services/getScopedParams.ts"],"names":[],"mappings":"AAAA,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,MAAW,iCAW5D;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
function getScopedParams(request, scope = "") {
|
|
2
|
+
const url = new URL(request.url);
|
|
3
|
+
if (scope === "")
|
|
4
|
+
return url.searchParams;
|
|
5
|
+
const scopedSearchParams = Array.from(url.searchParams.entries())
|
|
6
|
+
.filter(([key]) => key.startsWith(`${scope}:`))
|
|
7
|
+
.map(([key, value]) => [key.replace(`${scope}:`, ""), value]);
|
|
8
|
+
return new URLSearchParams(scopedSearchParams);
|
|
9
|
+
}
|
|
10
|
+
export { getScopedParams };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maskSensitiveData.d.ts","sourceRoot":"","sources":["../../src/services/maskSensitiveData.ts"],"names":[],"mappings":"AAAA,iBAAS,iBAAiB,CACxB,UAAU,EAAE,MAAM,EAClB,aAAa,WAAgD,GAC5D,MAAM,CAkCR;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
function maskSensitiveData(jsonString, sensitiveKeys = ["password", "confirmPassword", "creditCard"]) {
|
|
2
|
+
function maskValue(key, value) {
|
|
3
|
+
if (sensitiveKeys.includes(key))
|
|
4
|
+
return "****";
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
7
|
+
function recursiveMask(obj) {
|
|
8
|
+
if (Array.isArray(obj)) {
|
|
9
|
+
return obj.map((item) => recursiveMask(item));
|
|
10
|
+
}
|
|
11
|
+
else if (obj !== null && typeof obj === "object") {
|
|
12
|
+
return Object.keys(obj).reduce((acc, key) => {
|
|
13
|
+
let value = obj[key];
|
|
14
|
+
if (typeof value === "string") {
|
|
15
|
+
try {
|
|
16
|
+
const parsedValue = JSON.parse(value);
|
|
17
|
+
if (typeof parsedValue === "object") {
|
|
18
|
+
value = JSON.stringify(recursiveMask(parsedValue));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (e) { }
|
|
22
|
+
}
|
|
23
|
+
acc[key] = recursiveMask(maskValue(key, value));
|
|
24
|
+
return acc;
|
|
25
|
+
}, {});
|
|
26
|
+
}
|
|
27
|
+
return obj;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const jsonObject = JSON.parse(jsonString);
|
|
31
|
+
const maskedObject = recursiveMask(jsonObject);
|
|
32
|
+
return JSON.stringify(maskedObject);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return jsonString;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export { maskSensitiveData };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncateLargeFields.d.ts","sourceRoot":"","sources":["../../src/services/truncateLargeFields.ts"],"names":[],"mappings":"AAAA,iBAAS,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,SAAO,GAAG,MAAM,CA6BzE;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
function truncateLargeFields(jsonString, maxLength = 1000) {
|
|
2
|
+
function truncateValue(key, value) {
|
|
3
|
+
if (typeof value === "string" && value.length > maxLength) {
|
|
4
|
+
return `To large information: field as ${value.length} characters`;
|
|
5
|
+
}
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
function recursiveTruncate(obj) {
|
|
9
|
+
if (Array.isArray(obj)) {
|
|
10
|
+
return obj.map(recursiveTruncate);
|
|
11
|
+
}
|
|
12
|
+
else if (obj !== null && typeof obj === "object") {
|
|
13
|
+
return Object.fromEntries(Object.entries(obj).map(([key, value]) => [
|
|
14
|
+
key,
|
|
15
|
+
truncateValue(key, recursiveTruncate(value)),
|
|
16
|
+
]));
|
|
17
|
+
}
|
|
18
|
+
return obj;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const parsedJson = JSON.parse(jsonString);
|
|
22
|
+
const truncatedJson = recursiveTruncate(parsedJson);
|
|
23
|
+
return JSON.stringify(truncatedJson);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw new Error("Invalid JSON string");
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export { truncateLargeFields };
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -8,6 +8,9 @@ export { UnauthorizedError } from "./httpBadResponses/unauthorized";
|
|
|
8
8
|
export { UnprocessableEntityError } from "./httpBadResponses/unprocessableEntity";
|
|
9
9
|
|
|
10
10
|
// helpers
|
|
11
|
-
export { formParse } from "./helpers/formParse";
|
|
12
|
-
export { getScopedParams } from "./helpers/getScopedParams";
|
|
13
11
|
export { globalErrorHandler } from "./helpers/globalErrorHandler";
|
|
12
|
+
|
|
13
|
+
// services
|
|
14
|
+
export { extractJsonFromRequest } from "./services/extractJsonFromRequest";
|
|
15
|
+
export { formParse } from "./services/formParse";
|
|
16
|
+
export { getScopedParams } from "./services/getScopedParams";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
async function extractJsonFromRequest(req: Request): Promise<any> {
|
|
2
|
+
let data: any;
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
const arrayBuffer = await req.arrayBuffer();
|
|
6
|
+
const text = new TextDecoder().decode(arrayBuffer);
|
|
7
|
+
|
|
8
|
+
try {
|
|
9
|
+
data = JSON.parse(text);
|
|
10
|
+
} catch (jsonError) {
|
|
11
|
+
try {
|
|
12
|
+
const formData = new URLSearchParams(text);
|
|
13
|
+
data = Object.fromEntries(formData.entries());
|
|
14
|
+
} catch (formDataError) {
|
|
15
|
+
console.error("Failed to extract data from request:", {
|
|
16
|
+
jsonError,
|
|
17
|
+
formDataError,
|
|
18
|
+
});
|
|
19
|
+
data = {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error("Failed to read request body:", error);
|
|
24
|
+
data = {};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { extractJsonFromRequest };
|
|
File without changes
|
|
File without changes
|