@aifabrix/miso-client 2.0.0 → 2.1.0
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 +231 -2
- package/dist/express/async-handler.d.ts +41 -0
- package/dist/express/async-handler.d.ts.map +1 -0
- package/dist/express/async-handler.js +58 -0
- package/dist/express/async-handler.js.map +1 -0
- package/dist/express/encryption.d.ts +29 -0
- package/dist/express/encryption.d.ts.map +1 -0
- package/dist/express/encryption.js +95 -0
- package/dist/express/encryption.js.map +1 -0
- package/dist/express/error-handler.d.ts +23 -0
- package/dist/express/error-handler.d.ts.map +1 -0
- package/dist/express/error-handler.js +140 -0
- package/dist/express/error-handler.js.map +1 -0
- package/dist/express/error-response.d.ts +55 -0
- package/dist/express/error-response.d.ts.map +1 -0
- package/dist/express/error-response.js +95 -0
- package/dist/express/error-response.js.map +1 -0
- package/dist/express/error-types.d.ts +46 -0
- package/dist/express/error-types.d.ts.map +1 -0
- package/dist/express/error-types.js +93 -0
- package/dist/express/error-types.js.map +1 -0
- package/dist/express/index.d.ts +14 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +39 -0
- package/dist/express/index.js.map +1 -0
- package/dist/express/response-helper.d.ts +67 -0
- package/dist/express/response-helper.d.ts.map +1 -0
- package/dist/express/response-helper.js +83 -0
- package/dist/express/response-helper.js.map +1 -0
- package/dist/express/response-middleware.d.ts +18 -0
- package/dist/express/response-middleware.d.ts.map +1 -0
- package/dist/express/response-middleware.js +29 -0
- package/dist/express/response-middleware.js.map +1 -0
- package/dist/express/validation-helper.d.ts +66 -0
- package/dist/express/validation-helper.d.ts.map +1 -0
- package/dist/express/validation-helper.js +102 -0
- package/dist/express/validation-helper.js.map +1 -0
- package/dist/index.d.ts +23 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -23
- package/dist/index.js.map +1 -1
- package/dist/services/auth.service.d.ts +3 -3
- package/dist/services/auth.service.d.ts.map +1 -1
- package/dist/services/auth.service.js +24 -18
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/cache.service.d.ts +1 -1
- package/dist/services/cache.service.d.ts.map +1 -1
- package/dist/services/cache.service.js +1 -1
- package/dist/services/cache.service.js.map +1 -1
- package/dist/services/logger.service.d.ts +3 -3
- package/dist/services/logger.service.d.ts.map +1 -1
- package/dist/services/logger.service.js +32 -25
- package/dist/services/logger.service.js.map +1 -1
- package/dist/services/permission.service.d.ts +3 -3
- package/dist/services/permission.service.d.ts.map +1 -1
- package/dist/services/permission.service.js +9 -6
- package/dist/services/permission.service.js.map +1 -1
- package/dist/services/redis.service.d.ts +1 -1
- package/dist/services/redis.service.js +10 -10
- package/dist/services/role.service.d.ts +3 -3
- package/dist/services/role.service.d.ts.map +1 -1
- package/dist/services/role.service.js +8 -5
- package/dist/services/role.service.js.map +1 -1
- package/dist/types/config.types.d.ts +4 -4
- package/dist/types/config.types.d.ts.map +1 -1
- package/dist/types/config.types.js +6 -5
- package/dist/types/config.types.js.map +1 -1
- package/dist/types/filter.types.d.ts +1 -1
- package/dist/types/filter.types.d.ts.map +1 -1
- package/dist/types/filter.types.js +2 -2
- package/dist/types/filter.types.js.map +1 -1
- package/dist/types/sort.types.d.ts +1 -1
- package/dist/utils/audit-log-queue.d.ts +4 -4
- package/dist/utils/audit-log-queue.d.ts.map +1 -1
- package/dist/utils/audit-log-queue.js +11 -11
- package/dist/utils/audit-log-queue.js.map +1 -1
- package/dist/utils/auth-strategy.d.ts +1 -1
- package/dist/utils/auth-strategy.d.ts.map +1 -1
- package/dist/utils/auth-strategy.js +19 -17
- package/dist/utils/auth-strategy.js.map +1 -1
- package/dist/utils/config-loader.d.ts +2 -2
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +11 -10
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/data-masker.d.ts.map +1 -1
- package/dist/utils/data-masker.js +7 -7
- package/dist/utils/data-masker.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -2
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +37 -30
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/filter.utils.d.ts +2 -2
- package/dist/utils/filter.utils.d.ts.map +1 -1
- package/dist/utils/filter.utils.js +24 -18
- package/dist/utils/filter.utils.js.map +1 -1
- package/dist/utils/http-client-audit.d.ts +4 -4
- package/dist/utils/http-client-audit.d.ts.map +1 -1
- package/dist/utils/http-client-audit.js +30 -22
- package/dist/utils/http-client-audit.js.map +1 -1
- package/dist/utils/http-client-masking.d.ts +1 -1
- package/dist/utils/http-client-masking.d.ts.map +1 -1
- package/dist/utils/http-client-masking.js +31 -21
- package/dist/utils/http-client-masking.js.map +1 -1
- package/dist/utils/http-client-metadata.d.ts +2 -2
- package/dist/utils/http-client-metadata.d.ts.map +1 -1
- package/dist/utils/http-client-metadata.js +7 -7
- package/dist/utils/http-client-metadata.js.map +1 -1
- package/dist/utils/http-client.d.ts +6 -6
- package/dist/utils/http-client.d.ts.map +1 -1
- package/dist/utils/http-client.js +8 -9
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/internal-http-client.d.ts +5 -5
- package/dist/utils/internal-http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.js +48 -42
- package/dist/utils/internal-http-client.js.map +1 -1
- package/dist/utils/pagination.utils.d.ts +1 -1
- package/dist/utils/pagination.utils.d.ts.map +1 -1
- package/dist/utils/pagination.utils.js +3 -3
- package/dist/utils/pagination.utils.js.map +1 -1
- package/dist/utils/sensitive-fields.loader.d.ts.map +1 -1
- package/dist/utils/sensitive-fields.loader.js +77 -60
- package/dist/utils/sensitive-fields.loader.js.map +1 -1
- package/dist/utils/sort.utils.d.ts +14 -3
- package/dist/utils/sort.utils.d.ts.map +1 -1
- package/dist/utils/sort.utils.js +73 -9
- package/dist/utils/sort.utils.js.map +1 -1
- package/package.json +11 -2
- package/dist/services/encryption.service.d.ts +0 -32
- package/dist/services/encryption.service.d.ts.map +0 -1
- package/dist/services/encryption.service.js +0 -135
- package/dist/services/encryption.service.js.map +0 -1
package/dist/utils/sort.utils.js
CHANGED
|
@@ -5,23 +5,58 @@
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.parseSortParams = parseSortParams;
|
|
7
7
|
exports.buildSortString = buildSortString;
|
|
8
|
+
exports.applySorting = applySorting;
|
|
8
9
|
/**
|
|
9
10
|
* Parse sort query parameters into structured SortOption array.
|
|
10
|
-
* Supports
|
|
11
|
-
*
|
|
11
|
+
* Supports formats:
|
|
12
|
+
* - `?sort=-field` (descending) or `?sort=field` (ascending)
|
|
13
|
+
* - `?sort=field:asc` or `?sort=field:desc` (colon-separated)
|
|
14
|
+
* - `?sort[]=-updated_at&sort[]=name` for multiple sorts
|
|
12
15
|
* @param query - Query parameters object (e.g., from URLSearchParams or request query)
|
|
13
16
|
* @returns Array of parsed sort options
|
|
14
17
|
*/
|
|
15
18
|
function parseSortParams(query) {
|
|
16
19
|
const sortParam = query.sort;
|
|
17
|
-
const sorts = Array.isArray(sortParam)
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
const sorts = Array.isArray(sortParam)
|
|
21
|
+
? sortParam
|
|
22
|
+
: sortParam
|
|
23
|
+
? [sortParam]
|
|
24
|
+
: [];
|
|
25
|
+
return sorts
|
|
26
|
+
.map((s) => {
|
|
27
|
+
const sortString = String(s).trim();
|
|
28
|
+
// Filter out empty strings and invalid values
|
|
29
|
+
if (!sortString || sortString === "-" || sortString === ":") {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// Check for colon-separated format (field:asc or field:desc)
|
|
33
|
+
if (sortString.includes(":")) {
|
|
34
|
+
const [field, order] = sortString.split(":");
|
|
35
|
+
const trimmedField = field.trim();
|
|
36
|
+
if (!trimmedField)
|
|
37
|
+
return null;
|
|
38
|
+
return {
|
|
39
|
+
field: trimmedField,
|
|
40
|
+
order: (order?.trim().toLowerCase() === "desc" ? "desc" : "asc"),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Handle minus prefix format (-field)
|
|
44
|
+
if (sortString.startsWith("-")) {
|
|
45
|
+
const field = sortString.substring(1).trim();
|
|
46
|
+
if (!field)
|
|
47
|
+
return null;
|
|
48
|
+
return {
|
|
49
|
+
field,
|
|
50
|
+
order: "desc",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Default ascending
|
|
20
54
|
return {
|
|
21
|
-
field: sortString
|
|
22
|
-
order:
|
|
55
|
+
field: sortString,
|
|
56
|
+
order: "asc",
|
|
23
57
|
};
|
|
24
|
-
})
|
|
58
|
+
})
|
|
59
|
+
.filter((option) => option !== null);
|
|
25
60
|
}
|
|
26
61
|
/**
|
|
27
62
|
* Convert SortOption array to query string format.
|
|
@@ -29,6 +64,35 @@ function parseSortParams(query) {
|
|
|
29
64
|
* @returns Array of sort strings (e.g., `['-updated_at', 'name']`)
|
|
30
65
|
*/
|
|
31
66
|
function buildSortString(sortOptions) {
|
|
32
|
-
return sortOptions.map((so) =>
|
|
67
|
+
return sortOptions.map((so) => so.order === "desc" ? `-${so.field}` : so.field);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Apply sorting to data array based on sort options.
|
|
71
|
+
* Useful for client-side sorting of in-memory data.
|
|
72
|
+
* @param data - Array of data to sort
|
|
73
|
+
* @param sortOptions - Array of sort options (field and order)
|
|
74
|
+
* @returns Sorted array (new array, does not mutate original)
|
|
75
|
+
*/
|
|
76
|
+
function applySorting(data, sortOptions) {
|
|
77
|
+
if (!sortOptions || sortOptions.length === 0) {
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
return [...data].sort((a, b) => {
|
|
81
|
+
for (const sort of sortOptions) {
|
|
82
|
+
const aVal = a[sort.field];
|
|
83
|
+
const bVal = b[sort.field];
|
|
84
|
+
// Handle null/undefined
|
|
85
|
+
if (aVal === null || aVal === undefined)
|
|
86
|
+
return 1;
|
|
87
|
+
if (bVal === null || bVal === undefined)
|
|
88
|
+
return -1;
|
|
89
|
+
// Compare values
|
|
90
|
+
if (aVal < bVal)
|
|
91
|
+
return sort.order === "asc" ? -1 : 1;
|
|
92
|
+
if (aVal > bVal)
|
|
93
|
+
return sort.order === "asc" ? 1 : -1;
|
|
94
|
+
}
|
|
95
|
+
return 0;
|
|
96
|
+
});
|
|
33
97
|
}
|
|
34
98
|
//# sourceMappingURL=sort.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort.utils.js","sourceRoot":"","sources":["../../src/utils/sort.utils.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"sort.utils.js","sourceRoot":"","sources":["../../src/utils/sort.utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aifabrix/miso-client",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "AI Fabrix Client SDK
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "AI Fabrix Client SDK - Authentication, authorization, logging, and Express.js utilities",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"scripts": {
|
|
@@ -27,6 +27,14 @@
|
|
|
27
27
|
],
|
|
28
28
|
"author": "AI Fabrix Team",
|
|
29
29
|
"license": "MIT",
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"express": "^4.18.0 || ^5.0.0"
|
|
32
|
+
},
|
|
33
|
+
"peerDependenciesMeta": {
|
|
34
|
+
"express": {
|
|
35
|
+
"optional": true
|
|
36
|
+
}
|
|
37
|
+
},
|
|
30
38
|
"dependencies": {
|
|
31
39
|
"@types/jsonwebtoken": "^9.0.10",
|
|
32
40
|
"axios": "^1.6.2",
|
|
@@ -35,6 +43,7 @@
|
|
|
35
43
|
"jsonwebtoken": "^9.0.2"
|
|
36
44
|
},
|
|
37
45
|
"devDependencies": {
|
|
46
|
+
"@types/express": "^4.17.21",
|
|
38
47
|
"@types/jest": "^29.5.8",
|
|
39
48
|
"@types/node": "^20.10.4",
|
|
40
49
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Encryption service for symmetric encryption using AES-256-GCM
|
|
3
|
-
*/
|
|
4
|
-
export declare class EncryptionService {
|
|
5
|
-
private key;
|
|
6
|
-
private algorithm;
|
|
7
|
-
/**
|
|
8
|
-
* Create an EncryptionService instance
|
|
9
|
-
* @param encryptionKey - Optional encryption key. If not provided, reads from ENCRYPTION_KEY env var.
|
|
10
|
-
* Supports hex, base64, or raw string format.
|
|
11
|
-
* If string length is not 32 bytes, derives a 32-byte key using SHA-256.
|
|
12
|
-
*/
|
|
13
|
-
constructor(encryptionKey?: string);
|
|
14
|
-
/**
|
|
15
|
-
* Derive a 32-byte key from the provided key string
|
|
16
|
-
* Supports hex, base64, or raw string format
|
|
17
|
-
*/
|
|
18
|
-
private deriveKey;
|
|
19
|
-
/**
|
|
20
|
-
* Encrypt plaintext and return base64-encoded string
|
|
21
|
-
* @param plaintext - The plaintext string to encrypt
|
|
22
|
-
* @returns Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
23
|
-
*/
|
|
24
|
-
encrypt(plaintext: string): string;
|
|
25
|
-
/**
|
|
26
|
-
* Decrypt base64-encoded encrypted string
|
|
27
|
-
* @param encryptedText - Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
28
|
-
* @returns Decrypted plaintext string
|
|
29
|
-
*/
|
|
30
|
-
decrypt(encryptedText: string): string;
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=encryption.service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.service.d.ts","sourceRoot":"","sources":["../../src/services/encryption.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,SAAS,CAAiB;IAElC;;;;;OAKG;gBACS,aAAa,CAAC,EAAE,MAAM;IAalC;;;OAGG;IACH,OAAO,CAAC,SAAS;IAoBjB;;;;OAIG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA0BlC;;;;OAIG;IACH,OAAO,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CA+BvC"}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Encryption service for symmetric encryption using AES-256-GCM
|
|
4
|
-
*/
|
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
-
}
|
|
11
|
-
Object.defineProperty(o, k2, desc);
|
|
12
|
-
}) : (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
o[k2] = m[k];
|
|
15
|
-
}));
|
|
16
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
-
}) : function(o, v) {
|
|
19
|
-
o["default"] = v;
|
|
20
|
-
});
|
|
21
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
-
var ownKeys = function(o) {
|
|
23
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
-
var ar = [];
|
|
25
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
-
return ar;
|
|
27
|
-
};
|
|
28
|
-
return ownKeys(o);
|
|
29
|
-
};
|
|
30
|
-
return function (mod) {
|
|
31
|
-
if (mod && mod.__esModule) return mod;
|
|
32
|
-
var result = {};
|
|
33
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
-
__setModuleDefault(result, mod);
|
|
35
|
-
return result;
|
|
36
|
-
};
|
|
37
|
-
})();
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.EncryptionService = void 0;
|
|
40
|
-
const crypto = __importStar(require("crypto"));
|
|
41
|
-
class EncryptionService {
|
|
42
|
-
/**
|
|
43
|
-
* Create an EncryptionService instance
|
|
44
|
-
* @param encryptionKey - Optional encryption key. If not provided, reads from ENCRYPTION_KEY env var.
|
|
45
|
-
* Supports hex, base64, or raw string format.
|
|
46
|
-
* If string length is not 32 bytes, derives a 32-byte key using SHA-256.
|
|
47
|
-
*/
|
|
48
|
-
constructor(encryptionKey) {
|
|
49
|
-
this.algorithm = 'aes-256-gcm';
|
|
50
|
-
const keyString = encryptionKey || process.env.ENCRYPTION_KEY;
|
|
51
|
-
if (!keyString) {
|
|
52
|
-
throw new Error('Encryption key is required. Provide via constructor parameter or set ENCRYPTION_KEY environment variable.');
|
|
53
|
-
}
|
|
54
|
-
// Derive a 32-byte key from the provided key
|
|
55
|
-
this.key = this.deriveKey(keyString);
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Derive a 32-byte key from the provided key string
|
|
59
|
-
* Supports hex, base64, or raw string format
|
|
60
|
-
*/
|
|
61
|
-
deriveKey(keyString) {
|
|
62
|
-
// Try to parse as hex (64 hex chars = 32 bytes)
|
|
63
|
-
if (/^[0-9a-fA-F]{64}$/.test(keyString)) {
|
|
64
|
-
return Buffer.from(keyString, 'hex');
|
|
65
|
-
}
|
|
66
|
-
// Try to parse as base64
|
|
67
|
-
try {
|
|
68
|
-
const base64Decoded = Buffer.from(keyString, 'base64');
|
|
69
|
-
if (base64Decoded.length === 32) {
|
|
70
|
-
return base64Decoded;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// Not valid base64, continue
|
|
75
|
-
}
|
|
76
|
-
// Use SHA-256 to derive a 32-byte key from the string
|
|
77
|
-
return crypto.createHash('sha256').update(keyString, 'utf8').digest();
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Encrypt plaintext and return base64-encoded string
|
|
81
|
-
* @param plaintext - The plaintext string to encrypt
|
|
82
|
-
* @returns Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
83
|
-
*/
|
|
84
|
-
encrypt(plaintext) {
|
|
85
|
-
if (plaintext === '') {
|
|
86
|
-
return '';
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
// Generate random IV (12 bytes for GCM)
|
|
90
|
-
const iv = crypto.randomBytes(12);
|
|
91
|
-
const cipher = crypto.createCipheriv(this.algorithm, this.key, iv);
|
|
92
|
-
let encrypted = cipher.update(plaintext, 'utf8');
|
|
93
|
-
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
94
|
-
// Get authentication tag
|
|
95
|
-
const authTag = cipher.getAuthTag();
|
|
96
|
-
// Combine IV, authTag, and ciphertext, then base64 encode
|
|
97
|
-
const combined = Buffer.concat([iv, authTag, encrypted]);
|
|
98
|
-
return combined.toString('base64');
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
throw new Error(`Encryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Decrypt base64-encoded encrypted string
|
|
106
|
-
* @param encryptedText - Base64-encoded encrypted string (format: iv:authTag:ciphertext)
|
|
107
|
-
* @returns Decrypted plaintext string
|
|
108
|
-
*/
|
|
109
|
-
decrypt(encryptedText) {
|
|
110
|
-
if (encryptedText === '') {
|
|
111
|
-
return '';
|
|
112
|
-
}
|
|
113
|
-
try {
|
|
114
|
-
// Decode from base64
|
|
115
|
-
const combined = Buffer.from(encryptedText, 'base64');
|
|
116
|
-
// Extract IV (12 bytes), authTag (16 bytes), and ciphertext
|
|
117
|
-
if (combined.length < 28) {
|
|
118
|
-
throw new Error('Invalid encrypted data: too short');
|
|
119
|
-
}
|
|
120
|
-
const iv = combined.subarray(0, 12);
|
|
121
|
-
const authTag = combined.subarray(12, 28);
|
|
122
|
-
const ciphertext = combined.subarray(28);
|
|
123
|
-
const decipher = crypto.createDecipheriv(this.algorithm, this.key, iv);
|
|
124
|
-
decipher.setAuthTag(authTag);
|
|
125
|
-
let decrypted = decipher.update(ciphertext, undefined, 'utf8');
|
|
126
|
-
decrypted += decipher.final('utf8');
|
|
127
|
-
return decrypted;
|
|
128
|
-
}
|
|
129
|
-
catch (error) {
|
|
130
|
-
throw new Error(`Decryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
exports.EncryptionService = EncryptionService;
|
|
135
|
-
//# sourceMappingURL=encryption.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.service.js","sourceRoot":"","sources":["../../src/services/encryption.service.ts"],"names":[],"mappings":"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"}
|