@futdevpro/fsm-dynamo 1.14.12 → 1.14.13

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.
Files changed (123) hide show
  1. package/build/_collections/utils/async.util.js +3 -5
  2. package/build/_collections/utils/async.util.js.map +1 -1
  3. package/build/_collections/utils/log.util.js +48 -50
  4. package/build/_collections/utils/log.util.js.map +1 -1
  5. package/build/_collections/utils/math/box-bounds.util.js +6 -2
  6. package/build/_collections/utils/math/box-bounds.util.js.map +1 -1
  7. package/build/_collections/utils/math/math.util.js +1 -3
  8. package/build/_collections/utils/math/math.util.js.map +1 -1
  9. package/build/_collections/utils/math/vector2.util.js +60 -62
  10. package/build/_collections/utils/math/vector2.util.js.map +1 -1
  11. package/build/_collections/utils/object.util.js +7 -9
  12. package/build/_collections/utils/object.util.js.map +1 -1
  13. package/build/_collections/utils/stack.util.spec.js +13 -0
  14. package/build/_collections/utils/stack.util.spec.js.map +1 -1
  15. package/build/_collections/utils/time.util.js +28 -28
  16. package/build/_collections/utils/time.util.js.map +1 -1
  17. package/build/_models/control-models/data-model-params.control-model.js +21 -0
  18. package/build/_models/control-models/data-model-params.control-model.js.map +1 -1
  19. package/build/_models/control-models/data-property-params.control-model.js +59 -3
  20. package/build/_models/control-models/data-property-params.control-model.js.map +1 -1
  21. package/build/_models/control-models/error.control-model.js +25 -8
  22. package/build/_models/control-models/error.control-model.js.map +1 -1
  23. package/build/_models/control-models/http/http-error-response.control-model.js +7 -5
  24. package/build/_models/control-models/http/http-error-response.control-model.js.map +1 -1
  25. package/build/_models/control-models/http/http-headers.control-model.js +17 -4
  26. package/build/_models/control-models/http/http-headers.control-model.js.map +1 -1
  27. package/build/_models/control-models/http/http-response.model-base.js +26 -14
  28. package/build/_models/control-models/http/http-response.model-base.js.map +1 -1
  29. package/build/_models/control-models/poll.control-model.js +26 -4
  30. package/build/_models/control-models/poll.control-model.js.map +1 -1
  31. package/build/_models/control-models/range-value.control-model.js +4 -2
  32. package/build/_models/control-models/range-value.control-model.js.map +1 -1
  33. package/build/_models/control-models/server-status.control-model.js +12 -0
  34. package/build/_models/control-models/server-status.control-model.js.map +1 -1
  35. package/build/_models/control-models/service-endpoint-settings-base.control-model.js +14 -1
  36. package/build/_models/control-models/service-endpoint-settings-base.control-model.js.map +1 -1
  37. package/build/_models/data-models/errors.data-model.js +18 -3
  38. package/build/_models/data-models/errors.data-model.js.map +1 -1
  39. package/build/_models/data-models/metadata.data-model.js +12 -0
  40. package/build/_models/data-models/metadata.data-model.js.map +1 -1
  41. package/build/_modules/ai/_models/ai-call-settings.interface.js +49 -46
  42. package/build/_modules/ai/_models/ai-call-settings.interface.js.map +1 -1
  43. package/build/_modules/ai/_models/ai-settings.interface.js +3 -0
  44. package/build/_modules/ai/_models/ai-settings.interface.js.map +1 -1
  45. package/build/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.js +2 -2
  46. package/build/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.js.map +1 -1
  47. package/build/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.js +3 -3
  48. package/build/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.js.map +1 -1
  49. package/build/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.js +2 -2
  50. package/build/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.js.map +1 -1
  51. package/build/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.js +3 -3
  52. package/build/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.js.map +1 -1
  53. package/build/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.js +1 -1
  54. package/build/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.js.map +1 -1
  55. package/build/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.js +3 -3
  56. package/build/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.js.map +1 -1
  57. package/build/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.js +2 -2
  58. package/build/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.js.map +1 -1
  59. package/build/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.js +3 -3
  60. package/build/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.js.map +1 -1
  61. package/build/_modules/ci-tools/_models/cit-ci-result-info.data-models.js +12 -1
  62. package/build/_modules/ci-tools/_models/cit-ci-result-info.data-models.js.map +1 -1
  63. package/build/_modules/crypto/_collections/{crypto-2-non-stable.util.d.ts → crypto-v1.util.d.ts} +1 -1
  64. package/build/_modules/crypto/_collections/crypto-v1.util.d.ts.map +1 -0
  65. package/build/_modules/crypto/_collections/{crypto-2-non-stable.util.js → crypto-v1.util.js} +3 -3
  66. package/build/_modules/crypto/_collections/crypto-v1.util.js.map +1 -0
  67. package/build/_modules/crypto/_collections/{crypto-old.util.d.ts → crypto-v2.util.d.ts} +1 -1
  68. package/build/_modules/crypto/_collections/crypto-v2.util.d.ts.map +1 -0
  69. package/build/_modules/crypto/_collections/{crypto-old.util.js → crypto-v2.util.js} +9 -9
  70. package/build/_modules/crypto/_collections/crypto-v2.util.js.map +1 -0
  71. package/build/_modules/crypto/_collections/crypto-v4.util.d.ts +165 -0
  72. package/build/_modules/crypto/_collections/crypto-v4.util.d.ts.map +1 -0
  73. package/build/_modules/crypto/_collections/crypto-v4.util.js +611 -0
  74. package/build/_modules/crypto/_collections/crypto-v4.util.js.map +1 -0
  75. package/build/_modules/crypto/_collections/crypto.util.js +9 -9
  76. package/build/_modules/crypto/_collections/crypto.util.js.map +1 -1
  77. package/build/_modules/crypto/index.d.ts.map +1 -1
  78. package/build/_modules/crypto/index.js +7 -7
  79. package/build/_modules/crypto/index.js.map +1 -1
  80. package/build/_modules/custom-data/_models/cud.data-model.js +1 -0
  81. package/build/_modules/custom-data/_models/cud.data-model.js.map +1 -1
  82. package/build/_modules/data-handler/_models/data-handler-settings.control-model.js +42 -0
  83. package/build/_modules/data-handler/_models/data-handler-settings.control-model.js.map +1 -1
  84. package/build/_modules/data-handler/_models/data-handler.control-model.js +51 -11
  85. package/build/_modules/data-handler/_models/data-handler.control-model.js.map +1 -1
  86. package/build/_modules/data-handler/_models/data-list-handler.control-model.js +20 -0
  87. package/build/_modules/data-handler/_models/data-list-handler.control-model.js.map +1 -1
  88. package/build/_modules/data-handler/_models/data-search-handler.control-model.js +42 -36
  89. package/build/_modules/data-handler/_models/data-search-handler.control-model.js.map +1 -1
  90. package/build/_modules/data-handler/_models/list-collector-data-handler.control-model.js +25 -0
  91. package/build/_modules/data-handler/_models/list-collector-data-handler.control-model.js.map +1 -1
  92. package/build/_modules/location/_collections/loc-regions.util.js +4 -4
  93. package/build/_modules/location/_collections/loc-regions.util.js.map +1 -1
  94. package/build/_modules/messaging/_models/msg-conversation.data-model.js +23 -0
  95. package/build/_modules/messaging/_models/msg-conversation.data-model.js.map +1 -1
  96. package/build/_modules/messaging/_models/msg-message.data-model.js +34 -0
  97. package/build/_modules/messaging/_models/msg-message.data-model.js.map +1 -1
  98. package/build/_modules/socket/_models/sck-client-params.control-model.js +7 -2
  99. package/build/_modules/socket/_models/sck-client-params.control-model.js.map +1 -1
  100. package/build/_modules/socket/_models/sck-socket-event.control-model.js +8 -0
  101. package/build/_modules/socket/_models/sck-socket-event.control-model.js.map +1 -1
  102. package/build/_modules/socket/_services/sck-client.service-base.js +72 -69
  103. package/build/_modules/socket/_services/sck-client.service-base.js.map +1 -1
  104. package/build/_modules/usage/_models/usg-action.control-model.js +4 -0
  105. package/build/_modules/usage/_models/usg-action.control-model.js.map +1 -1
  106. package/build/_modules/usage/_models/usg-daily-usage-data.control-model.js +12 -10
  107. package/build/_modules/usage/_models/usg-daily-usage-data.control-model.js.map +1 -1
  108. package/build/_modules/usage/_models/usg-data.control-model.js +8 -2
  109. package/build/_modules/usage/_models/usg-data.control-model.js.map +1 -1
  110. package/build/_modules/usage/_models/usg-session.data-model.js +18 -2
  111. package/build/_modules/usage/_models/usg-session.data-model.js.map +1 -1
  112. package/futdevpro-fsm-dynamo-01.14.13.tgz +0 -0
  113. package/package.json +2 -2
  114. package/src/_modules/crypto/_collections/crypto-v4.util.ts +702 -0
  115. package/src/_modules/crypto/index.ts +4 -3
  116. package/tsconfig.json +2 -2
  117. package/build/_modules/crypto/_collections/crypto-2-non-stable.util.d.ts.map +0 -1
  118. package/build/_modules/crypto/_collections/crypto-2-non-stable.util.js.map +0 -1
  119. package/build/_modules/crypto/_collections/crypto-old.util.d.ts.map +0 -1
  120. package/build/_modules/crypto/_collections/crypto-old.util.js.map +0 -1
  121. package/futdevpro-fsm-dynamo-01.14.12.tgz +0 -0
  122. /package/src/_modules/crypto/_collections/{crypto-2-non-stable.util.ts → crypto-v1.util.ts} +0 -0
  123. /package/src/_modules/crypto/_collections/{crypto-old.util.ts → crypto-v2.util.ts} +0 -0
@@ -0,0 +1,611 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyFM_Crypto = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const CryptoJS = tslib_1.__importStar(require("crypto-js"));
6
+ const error_control_model_1 = require("../../../_models/control-models/error.control-model");
7
+ const object_util_1 = require("../../../_collections/utils/object.util");
8
+ // Compact: about 60–80 character tokens, not 200+
9
+ // Non-standard: hard to reverse-engineer
10
+ // Usable in cookies, headers, URLs
11
+ /**
12
+ * A utility class for stable encryption and decryption of data
13
+ * Uses AES-256-CBC with deterministic IV and salt for consistent results across systems
14
+ * Prioritizes reliability and cross-platform compatibility over security
15
+ *
16
+ * @important DETERMINISTIC ENCRYPTION: This implementation produces identical encrypted
17
+ * output for identical input data and key across different systems and multiple calls.
18
+ * The same input will ALWAYS generate the same encrypted string on any platform.
19
+ *
20
+ * @warning SECURITY NOTICE: This deterministic behavior is intentional for cross-platform
21
+ * compatibility but reduces security. Identical inputs produce identical outputs, which
22
+ * can be exploited for pattern analysis attacks. Use only when consistency across
23
+ * systems is more important than cryptographic security.
24
+ */
25
+ class DyFM_Crypto {
26
+ static CRYPTO_VERSION = '1.0';
27
+ static DEFAULT_CONFIG = {
28
+ ivLength: 16, // 128 bits
29
+ saltLength: 16, // 128 bits
30
+ keyIterations: 1000, // Reduced for better performance and stability
31
+ keySize: 8 // 256 bits (8 * 32)
32
+ };
33
+ static defaultErrorUserMsg = `We encountered an unhandled Authentication Error, ` +
34
+ `\nplease contact the responsible development team.`;
35
+ // Key derivation cache for performance optimization
36
+ static keyCache = new Map();
37
+ static MAX_CACHE_SIZE = 100;
38
+ /**
39
+ * Validates the input data and key with comprehensive error messages
40
+ * @throws {DyFM_Error} if validation fails
41
+ */
42
+ static validateInput(data, key, operation) {
43
+ // Validate key
44
+ if (!key) {
45
+ throw new error_control_model_1.DyFM_Error({
46
+ ...this.getDefaultErrorSettings(operation),
47
+ errorCode: 'DyFM-CRY-KEY-MISSING',
48
+ message: `Encryption key is required for ${operation} operation. Please provide a valid key.`
49
+ });
50
+ }
51
+ if (typeof key !== 'string') {
52
+ throw new error_control_model_1.DyFM_Error({
53
+ ...this.getDefaultErrorSettings(operation),
54
+ errorCode: 'DyFM-CRY-KEY-TYPE',
55
+ message: `Encryption key must be a string, but received ${typeof key}. Please provide a valid string key.`
56
+ });
57
+ }
58
+ if (key.trim().length === 0) {
59
+ throw new error_control_model_1.DyFM_Error({
60
+ ...this.getDefaultErrorSettings(operation),
61
+ errorCode: 'DyFM-CRY-KEY-EMPTY',
62
+ message: 'Encryption key cannot be empty or contain only whitespace. Please provide a non-empty key.'
63
+ });
64
+ }
65
+ // Only warn about weak keys but don't reject them for backward compatibility
66
+ if (key.length < 8) {
67
+ console.warn('Warning: Encryption key is too short (minimum 8 characters recommended). Consider using a stronger key for better security.');
68
+ }
69
+ // Validate data based on operation
70
+ if (operation === 'encrypt') {
71
+ this.validateEncryptData(data);
72
+ }
73
+ else if (operation === 'decrypt') {
74
+ this.validateDecryptData(data);
75
+ }
76
+ }
77
+ /**
78
+ * Validates data for encryption
79
+ */
80
+ static validateEncryptData(data) {
81
+ if (data === undefined) {
82
+ throw new error_control_model_1.DyFM_Error({
83
+ ...this.getDefaultErrorSettings('encrypt'),
84
+ errorCode: 'DyFM-CRY-DATA-UNDEFINED',
85
+ message: 'Cannot encrypt undefined data. Please provide valid data to encrypt.'
86
+ });
87
+ }
88
+ if (data === null) {
89
+ throw new error_control_model_1.DyFM_Error({
90
+ ...this.getDefaultErrorSettings('encrypt'),
91
+ errorCode: 'DyFM-CRY-DATA-NULL',
92
+ message: 'Cannot encrypt null data. Please provide valid data to encrypt.'
93
+ });
94
+ }
95
+ // Check for empty strings
96
+ if (typeof data === 'string' && data.trim().length === 0) {
97
+ throw new error_control_model_1.DyFM_Error({
98
+ ...this.getDefaultErrorSettings('encrypt'),
99
+ errorCode: 'DyFM-CRY-DATA-EMPTY-STRING',
100
+ message: 'Cannot encrypt empty string. Please provide non-empty data to encrypt.'
101
+ });
102
+ }
103
+ // Allow empty objects and arrays for backward compatibility
104
+ // Only reject truly empty data like empty strings
105
+ }
106
+ /**
107
+ * Validates data for decryption
108
+ */
109
+ static validateDecryptData(data) {
110
+ if (data === undefined) {
111
+ throw new error_control_model_1.DyFM_Error({
112
+ ...this.getDefaultErrorSettings('decrypt'),
113
+ errorCode: 'DyFM-CRY-ENCRYPTED-UNDEFINED',
114
+ message: 'Cannot decrypt undefined data. Please provide valid encrypted data to decrypt.'
115
+ });
116
+ }
117
+ if (data === null) {
118
+ throw new error_control_model_1.DyFM_Error({
119
+ ...this.getDefaultErrorSettings('decrypt'),
120
+ errorCode: 'DyFM-CRY-ENCRYPTED-NULL',
121
+ message: 'Cannot decrypt null data. Please provide valid encrypted data to decrypt.'
122
+ });
123
+ }
124
+ if (typeof data !== 'string') {
125
+ throw new error_control_model_1.DyFM_Error({
126
+ ...this.getDefaultErrorSettings('decrypt'),
127
+ errorCode: 'DyFM-CRY-ENCRYPTED-TYPE',
128
+ message: `Encrypted data must be a string, but received ${typeof data}. Please provide valid encrypted string data.`
129
+ });
130
+ }
131
+ if (data.trim().length === 0) {
132
+ throw new error_control_model_1.DyFM_Error({
133
+ ...this.getDefaultErrorSettings('decrypt'),
134
+ errorCode: 'DyFM-CRY-ENCRYPTED-EMPTY',
135
+ message: 'Cannot decrypt empty string. Please provide valid encrypted data to decrypt.'
136
+ });
137
+ }
138
+ if (data.length < 10) {
139
+ throw new error_control_model_1.DyFM_Error({
140
+ ...this.getDefaultErrorSettings('decrypt'),
141
+ errorCode: 'DyFM-CRY-ENCRYPTED-TOO-SHORT',
142
+ message: 'Encrypted data appears to be too short to be valid. Please check the encrypted data.'
143
+ });
144
+ }
145
+ // Check if it looks like valid encrypted data format
146
+ if (!/^[A-Za-z0-9\-_]+$/.test(data)) {
147
+ throw new error_control_model_1.DyFM_Error({
148
+ ...this.getDefaultErrorSettings('decrypt'),
149
+ errorCode: 'DyFM-CRY-ENCRYPTED-INVALID-FORMAT',
150
+ message: 'Encrypted data does not appear to be in valid format. Expected URL-safe base64 format.'
151
+ });
152
+ }
153
+ }
154
+ /**
155
+ * Generates a deterministic IV based on the input data and key
156
+ * Uses SHA-256 with proper truncation for maximum stability
157
+ *
158
+ * @important DETERMINISTIC: Same data + key will ALWAYS produce the same IV
159
+ * across all systems and CryptoJS versions for consistent encryption results
160
+ */
161
+ static generateIV(data, key, config) {
162
+ // Create a deterministic seed from data and key
163
+ const seed = this.createDeterministicSeed(data, key, 'IV');
164
+ // Use SHA-256 for better stability and consistency
165
+ const hash = CryptoJS.SHA256(seed);
166
+ // Extract exactly 16 bytes (128 bits) for IV
167
+ // Use the first 4 words (4 * 4 = 16 bytes) from the hash
168
+ const ivWords = hash.words.slice(0, 4);
169
+ return CryptoJS.lib.WordArray.create(ivWords);
170
+ }
171
+ /**
172
+ * Generates a deterministic salt based on the input data and key
173
+ * Uses SHA-256 with proper truncation for maximum stability
174
+ *
175
+ * @important DETERMINISTIC: Same data + key will ALWAYS produce the same salt
176
+ * across all systems and CryptoJS versions for consistent encryption results
177
+ */
178
+ static generateSalt(data, key, config) {
179
+ // Create a deterministic seed from data and key (different from IV)
180
+ const seed = this.createDeterministicSeed(data, key, 'SALT');
181
+ // Use SHA-256 for better stability and consistency
182
+ const hash = CryptoJS.SHA256(seed);
183
+ // Extract exactly 16 bytes (128 bits) for salt
184
+ // Use the first 4 words (4 * 4 = 16 bytes) from the hash
185
+ const saltWords = hash.words.slice(0, 4);
186
+ return CryptoJS.lib.WordArray.create(saltWords);
187
+ }
188
+ /**
189
+ * Creates a deterministic seed for IV/salt generation
190
+ * Ensures consistent output across all environments and versions
191
+ */
192
+ static createDeterministicSeed(data, key, purpose) {
193
+ // Create a consistent seed that includes all relevant factors
194
+ // Order matters: data + key + purpose for consistency
195
+ const seed = `${data}|${key}|${purpose}`;
196
+ return seed;
197
+ }
198
+ /**
199
+ * Generates a cache key for the derived key based on the input key and salt
200
+ */
201
+ static generateCacheKey(key, salt) {
202
+ // Create a deterministic cache key from key and salt
203
+ const saltHex = salt.toString(CryptoJS.enc.Hex);
204
+ return `${key}|${saltHex}`;
205
+ }
206
+ /**
207
+ * Manages cache size by removing oldest entries when limit is exceeded
208
+ */
209
+ static manageCacheSize() {
210
+ if (this.keyCache.size >= this.MAX_CACHE_SIZE) {
211
+ // Remove oldest entries (Map maintains insertion order)
212
+ const entriesToRemove = this.keyCache.size - this.MAX_CACHE_SIZE + 10; // Remove 10 extra for efficiency
213
+ const keysToRemove = Array.from(this.keyCache.keys()).slice(0, entriesToRemove);
214
+ keysToRemove.forEach(key => this.keyCache.delete(key));
215
+ }
216
+ }
217
+ /**
218
+ * Derives a key using PBKDF2 with reduced iterations for stability
219
+ * Uses caching to avoid redundant PBKDF2 computations for better performance
220
+ */
221
+ static deriveKey(key, salt, config) {
222
+ const cacheKey = this.generateCacheKey(key, salt);
223
+ // Check cache first
224
+ if (this.keyCache.has(cacheKey)) {
225
+ return this.keyCache.get(cacheKey);
226
+ }
227
+ // Compute new key using PBKDF2
228
+ const derivedKey = CryptoJS.PBKDF2(key, salt, {
229
+ keySize: config.keySize,
230
+ iterations: config.keyIterations
231
+ });
232
+ // Store in cache and manage size
233
+ this.keyCache.set(cacheKey, derivedKey);
234
+ this.manageCacheSize();
235
+ return derivedKey;
236
+ }
237
+ /**
238
+ * Safely serializes data to JSON with deterministic ordering
239
+ * Uses regular JSON.stringify but ensures consistency through other means
240
+ */
241
+ static safeSerialize(data) {
242
+ try {
243
+ // Use regular JSON.stringify for backward compatibility
244
+ // The deterministic behavior comes from the IV/salt generation, not serialization
245
+ return JSON.stringify(data);
246
+ }
247
+ catch (error) {
248
+ throw new error_control_model_1.DyFM_Error({
249
+ ...this.getDefaultErrorSettings('safeSerialize', error),
250
+ errorCode: 'DyFM-CRY-SER',
251
+ message: 'Failed to serialize data'
252
+ });
253
+ }
254
+ }
255
+ /**
256
+ * Deterministic JSON stringify that produces identical output across environments
257
+ * Uses a hybrid approach: sorts keys for consistency but preserves order for arrays
258
+ */
259
+ static deterministicStringify(obj) {
260
+ if (obj === null)
261
+ return 'null';
262
+ if (obj === undefined)
263
+ return 'undefined';
264
+ if (typeof obj === 'string')
265
+ return JSON.stringify(obj);
266
+ if (typeof obj === 'number')
267
+ return JSON.stringify(obj);
268
+ if (typeof obj === 'boolean')
269
+ return JSON.stringify(obj);
270
+ if (Array.isArray(obj)) {
271
+ const items = obj.map(item => this.deterministicStringify(item));
272
+ return '[' + items.join(',') + ']';
273
+ }
274
+ if (typeof obj === 'object') {
275
+ // For objects, we need to be more careful about key ordering
276
+ // Use a stable sort that preserves original order when possible
277
+ const keys = Object.keys(obj);
278
+ // Only sort if there are potential ordering issues
279
+ const needsSorting = keys.some((key, index) => {
280
+ if (index === 0)
281
+ return false;
282
+ return key < keys[index - 1];
283
+ });
284
+ const sortedKeys = needsSorting ? [...keys].sort() : keys;
285
+ const pairs = sortedKeys.map(key => {
286
+ const value = this.deterministicStringify(obj[key]);
287
+ return JSON.stringify(key) + ':' + value;
288
+ });
289
+ return '{' + pairs.join(',') + '}';
290
+ }
291
+ // Handle Date objects and other special types
292
+ if (obj instanceof Date) {
293
+ return JSON.stringify(obj.toISOString());
294
+ }
295
+ // Fallback to regular JSON.stringify for other types
296
+ return JSON.stringify(obj);
297
+ }
298
+ /**
299
+ * Safely deserializes JSON data with enhanced error handling
300
+ */
301
+ static safeDeserialize(data) {
302
+ try {
303
+ if (!data || data.trim().length === 0) {
304
+ throw new error_control_model_1.DyFM_Error({
305
+ ...this.getDefaultErrorSettings('safeDeserialize'),
306
+ errorCode: 'DyFM-CRY-DES-EMPTY',
307
+ message: 'Cannot deserialize empty data. The decrypted data appears to be empty or invalid.'
308
+ });
309
+ }
310
+ //let parsed = JSON.parse(data);
311
+ let parsed = object_util_1.DyFM_Object.failableSafeParseJSON(data);
312
+ // Handle double-stringified JSON (or more levels of stringification)
313
+ let maxAttempts = 3; // Prevent infinite loops
314
+ while (typeof parsed === 'string' && maxAttempts > 0) {
315
+ try {
316
+ //const nextParsed = JSON.parse(parsed);
317
+ const nextParsed = object_util_1.DyFM_Object.failableSafeParseJSON(parsed);
318
+ // Only continue if parsing actually changed the result
319
+ if (nextParsed !== parsed) {
320
+ parsed = nextParsed;
321
+ maxAttempts--;
322
+ }
323
+ else {
324
+ break;
325
+ }
326
+ }
327
+ catch {
328
+ // If parse fails, return current state
329
+ break;
330
+ }
331
+ }
332
+ // Handle primitive values
333
+ /* if (typeof parsed === 'string' || typeof parsed === 'number' || typeof parsed === 'boolean') {
334
+ return parsed as T;
335
+ } */
336
+ return parsed;
337
+ }
338
+ catch (error) {
339
+ if (error instanceof error_control_model_1.DyFM_Error) {
340
+ throw error;
341
+ }
342
+ throw new error_control_model_1.DyFM_Error({
343
+ ...this.getDefaultErrorSettings('safeDeserialize', error),
344
+ errorCode: 'DyFM-CRY-DES',
345
+ message: 'Failed to deserialize data. The decrypted data may be corrupted or in an unexpected format.'
346
+ });
347
+ }
348
+ }
349
+ /**
350
+ * Encrypts data using AES-256-CBC with deterministic IV and salt
351
+ *
352
+ * @important DETERMINISTIC BEHAVIOR: This method will produce identical encrypted
353
+ * output for identical input parameters across different systems, Node.js versions,
354
+ * and multiple function calls. The same data + key combination will ALWAYS generate
355
+ * the same encrypted string.
356
+ *
357
+ * @param data The data to encrypt
358
+ * @param key The encryption key
359
+ * @param config Optional configuration
360
+ * @returns URL-safe encrypted string that is identical across systems for same input
361
+ * @throws {DyFM_Error} if encryption fails
362
+ *
363
+ * @example
364
+ * // These will produce identical results on any system:
365
+ * const result1 = DyFM_Crypto.encrypt({id: 1}, "mykey");
366
+ * const result2 = DyFM_Crypto.encrypt({id: 1}, "mykey");
367
+ * console.log(result1 === result2); // Always true
368
+ */
369
+ static encrypt(data, key, config) {
370
+ try {
371
+ this.validateInput(data, key, 'encrypt');
372
+ const finalConfig = { ...this.DEFAULT_CONFIG, ...config };
373
+ // Convert data to string
374
+ const dataStr = this.safeSerialize(data);
375
+ // Generate deterministic IV and salt based on data and key
376
+ const iv = this.generateIV(dataStr, key, finalConfig);
377
+ const salt = this.generateSalt(dataStr, key, finalConfig);
378
+ // Derive key using PBKDF2
379
+ const derivedKey = this.deriveKey(key, salt, finalConfig);
380
+ // Encrypt the data
381
+ const encrypted = CryptoJS.AES.encrypt(dataStr, derivedKey, {
382
+ iv: iv,
383
+ mode: CryptoJS.mode.CBC,
384
+ padding: CryptoJS.pad.Pkcs7
385
+ });
386
+ // Combine IV + Salt + Ciphertext (skip version for backward compatibility)
387
+ const combined = iv.concat(salt).concat(encrypted.ciphertext);
388
+ // Convert to URL-safe base64
389
+ return CryptoJS.enc.Base64.stringify(combined)
390
+ .replace(/\+/g, '-')
391
+ .replace(/\//g, '_')
392
+ .replace(/=+$/, '');
393
+ }
394
+ catch (error) {
395
+ throw new error_control_model_1.DyFM_Error({
396
+ ...this.getDefaultErrorSettings('encrypt', error),
397
+ errorCode: 'DyFM-CRY-ENC',
398
+ });
399
+ }
400
+ }
401
+ /**
402
+ * Decrypts data that was encrypted using encrypt()
403
+ * @param encryptedData The encrypted data
404
+ * @param key The decryption key
405
+ * @param config Optional configuration
406
+ * @returns The decrypted data
407
+ * @throws {DyFM_Error} if decryption fails
408
+ */
409
+ static decrypt(encryptedData, key, config) {
410
+ try {
411
+ this.validateInput(encryptedData, key, 'decrypt');
412
+ const finalConfig = { ...this.DEFAULT_CONFIG, ...config };
413
+ // Convert from URL-safe base64
414
+ const base64 = encryptedData
415
+ .replace(/-/g, '+')
416
+ .replace(/_/g, '/');
417
+ // Parse the combined data
418
+ const combined = CryptoJS.enc.Base64.parse(base64);
419
+ // For now, skip version checking to maintain backward compatibility
420
+ // TODO: Implement proper version checking in future versions
421
+ // Validate minimum length (IV + Salt + minimum ciphertext)
422
+ const minLength = (finalConfig.ivLength + finalConfig.saltLength + 16) / 4; // 16 bytes minimum for ciphertext
423
+ if (combined.words.length < minLength) {
424
+ throw new error_control_model_1.DyFM_Error({
425
+ ...this.getDefaultErrorSettings('decrypt'),
426
+ errorCode: 'DyFM-CRY-DATA-CORRUPTED',
427
+ message: `Encrypted data is corrupted or incomplete. Expected at least ${minLength * 4} bytes, but received ${combined.sigBytes} bytes.`
428
+ });
429
+ }
430
+ // Extract IV, salt, and ciphertext (skip version for now)
431
+ const ivStart = 0;
432
+ const saltStart = ivStart + finalConfig.ivLength / 4;
433
+ const cipherStart = saltStart + finalConfig.saltLength / 4;
434
+ const iv = CryptoJS.lib.WordArray.create(combined.words.slice(ivStart, saltStart));
435
+ const salt = CryptoJS.lib.WordArray.create(combined.words.slice(saltStart, cipherStart));
436
+ const ciphertext = CryptoJS.lib.WordArray.create(combined.words.slice(cipherStart));
437
+ // Derive key using PBKDF2
438
+ const derivedKey = this.deriveKey(key, salt, finalConfig);
439
+ // Decrypt the data
440
+ const decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, derivedKey, {
441
+ iv: iv,
442
+ mode: CryptoJS.mode.CBC,
443
+ padding: CryptoJS.pad.Pkcs7
444
+ });
445
+ // Parse JSON
446
+ const decryptedStr = decrypted.toString(CryptoJS.enc.Utf8);
447
+ // Check if decryption produced empty result
448
+ if (!decryptedStr || decryptedStr.trim().length === 0) {
449
+ throw new error_control_model_1.DyFM_Error({
450
+ ...this.getDefaultErrorSettings('decrypt'),
451
+ errorCode: 'DyFM-CRY-DECRYPT-EMPTY',
452
+ message: 'Decryption failed - the result is empty. This usually means the encryption key is incorrect or the data is corrupted.'
453
+ });
454
+ }
455
+ return this.safeDeserialize(decryptedStr);
456
+ }
457
+ catch (error) {
458
+ // Check if it's already a DyFM_Error
459
+ if (error instanceof error_control_model_1.DyFM_Error) {
460
+ throw error;
461
+ }
462
+ // Handle specific decryption errors
463
+ if (error instanceof Error) {
464
+ if (error.message.includes('Malformed UTF-8')) {
465
+ throw new error_control_model_1.DyFM_Error({
466
+ ...this.getDefaultErrorSettings('decrypt', error),
467
+ errorCode: 'DyFM-CRY-DECRYPT-UTF8',
468
+ message: 'Decryption failed - invalid UTF-8 data. This usually means the encryption key is incorrect or the data is corrupted.'
469
+ });
470
+ }
471
+ if (error.message.includes('Invalid padding')) {
472
+ throw new error_control_model_1.DyFM_Error({
473
+ ...this.getDefaultErrorSettings('decrypt', error),
474
+ errorCode: 'DyFM-CRY-DECRYPT-PADDING',
475
+ message: 'Decryption failed - invalid padding. This usually means the encryption key is incorrect or the data is corrupted.'
476
+ });
477
+ }
478
+ }
479
+ throw new error_control_model_1.DyFM_Error({
480
+ ...this.getDefaultErrorSettings('decrypt', error),
481
+ errorCode: 'DyFM-CRY-DRY',
482
+ message: 'Decryption failed. Please verify the encryption key and ensure the encrypted data is valid.'
483
+ });
484
+ }
485
+ }
486
+ /**
487
+ * Generates a secure random key with enhanced complexity
488
+ * @param length Length of the key in characters (default: 32)
489
+ * @param customChars Optional custom character set to use
490
+ * @returns A secure random key with mixed case letters, numbers, and special characters
491
+ */
492
+ static generateKey(length = 32, customChars) {
493
+ // Use custom character set if provided, otherwise use simple safe characters
494
+ const chars = customChars || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
495
+ let complexKey = '';
496
+ // Generate random characters directly for the desired length
497
+ for (let i = 0; i < length; i++) {
498
+ // Generate random bytes for each character
499
+ const randomBytes = CryptoJS.lib.WordArray.random(1);
500
+ const randomValue = randomBytes.words[0];
501
+ const charIndex = Math.abs(randomValue) % chars.length;
502
+ complexKey += chars[charIndex];
503
+ }
504
+ return complexKey;
505
+ }
506
+ /**
507
+ * Validates if a string is a valid encrypted data
508
+ * @param encryptedData The data to validate
509
+ * @returns true if the data appears to be valid encrypted data
510
+ */
511
+ static isValidEncryptedData(encryptedData) {
512
+ if (!encryptedData || typeof encryptedData !== 'string') {
513
+ return false;
514
+ }
515
+ return /^[A-Za-z0-9\-_]+$/.test(encryptedData);
516
+ }
517
+ /**
518
+ * Analyzes encrypted data to help with debugging
519
+ * @param encryptedData The encrypted data to analyze
520
+ * @returns Analysis information about the encrypted data
521
+ */
522
+ static analyzeEncryptedData(encryptedData) {
523
+ try {
524
+ if (!this.isValidEncryptedData(encryptedData)) {
525
+ return {
526
+ isValid: false,
527
+ dataLength: encryptedData?.length || 0,
528
+ hasValidFormat: false,
529
+ error: 'Invalid format - not URL-safe base64'
530
+ };
531
+ }
532
+ // Convert from URL-safe base64
533
+ const base64 = encryptedData
534
+ .replace(/-/g, '+')
535
+ .replace(/_/g, '/');
536
+ // Parse the combined data
537
+ const combined = CryptoJS.enc.Base64.parse(base64);
538
+ // For now, just check if the data has minimum required length
539
+ const minLength = (16 + 16 + 16) / 4; // IV + Salt + minimum ciphertext
540
+ if (combined.words.length < minLength) {
541
+ return {
542
+ isValid: false,
543
+ dataLength: combined.sigBytes,
544
+ hasValidFormat: false,
545
+ error: 'Data too short to contain valid encrypted data'
546
+ };
547
+ }
548
+ return {
549
+ isValid: true,
550
+ version: 'legacy',
551
+ dataLength: combined.sigBytes,
552
+ hasValidFormat: true,
553
+ error: undefined
554
+ };
555
+ }
556
+ catch (error) {
557
+ return {
558
+ isValid: false,
559
+ dataLength: encryptedData?.length || 0,
560
+ hasValidFormat: false,
561
+ error: `Analysis failed: ${error}`
562
+ };
563
+ }
564
+ }
565
+ /**
566
+ * Clears the key derivation cache
567
+ * Useful for testing and memory management
568
+ */
569
+ static clearKeyCache() {
570
+ this.keyCache.clear();
571
+ }
572
+ /**
573
+ * Gets cache statistics for debugging and monitoring
574
+ * @returns Cache statistics including size and hit ratio
575
+ */
576
+ static getCacheStats() {
577
+ return {
578
+ size: this.keyCache.size,
579
+ maxSize: this.MAX_CACHE_SIZE,
580
+ utilizationPercent: Math.round((this.keyCache.size / this.MAX_CACHE_SIZE) * 100)
581
+ };
582
+ }
583
+ /**
584
+ * Gets default error settings with enhanced debugging information
585
+ */
586
+ static getDefaultErrorSettings(operation, error) {
587
+ const baseSettings = {
588
+ status: error?.___status ?? error?.status ?? 401,
589
+ message: `Crypto operation "${operation}" failed.`,
590
+ error: error,
591
+ errorCode: 'DyFM-CRY-ERR'
592
+ };
593
+ // Add debugging information for common failure scenarios
594
+ if (operation === 'decrypt') {
595
+ baseSettings.message += '\nThis usually indicates: ' +
596
+ '\n 1) Wrong encryption key, ' +
597
+ '\n 2) Corrupted encrypted data, ' +
598
+ '\n 3) Version incompatibility, ' +
599
+ '\n 4) Data was encrypted with different parameters.';
600
+ }
601
+ else if (operation === 'encrypt') {
602
+ baseSettings.message += '\nThis usually indicates: ' +
603
+ '\n 1) Invalid input data, ' +
604
+ '\n 2) Invalid encryption key, ' +
605
+ '\n 3) Serialization failure.';
606
+ }
607
+ return baseSettings;
608
+ }
609
+ }
610
+ exports.DyFM_Crypto = DyFM_Crypto;
611
+ //# sourceMappingURL=crypto-v4.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto-v4.util.js","sourceRoot":"","sources":["../../../../src/_modules/crypto/_collections/crypto-v4.util.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,15 @@ const object_util_1 = require("../../../_collections/utils/object.util");
23
23
  * systems is more important than cryptographic security.
24
24
  */
25
25
  class DyFM_Crypto {
26
+ static CRYPTO_VERSION = '1.0';
27
+ static DEFAULT_CONFIG = {
28
+ ivLength: 16, // 128 bits
29
+ saltLength: 16, // 128 bits
30
+ keyIterations: 1000, // Reduced for better performance and stability
31
+ keySize: 8 // 256 bits (8 * 32)
32
+ };
33
+ static defaultErrorUserMsg = `We encountered an unhandled Authentication Error, ` +
34
+ `\nplease contact the responsible development team.`;
26
35
  /**
27
36
  * Validates the input data and key with comprehensive error messages
28
37
  * @throws {DyFM_Error} if validation fails
@@ -548,13 +557,4 @@ class DyFM_Crypto {
548
557
  }
549
558
  }
550
559
  exports.DyFM_Crypto = DyFM_Crypto;
551
- DyFM_Crypto.CRYPTO_VERSION = '1.0';
552
- DyFM_Crypto.DEFAULT_CONFIG = {
553
- ivLength: 16, // 128 bits
554
- saltLength: 16, // 128 bits
555
- keyIterations: 1000, // Reduced for better performance and stability
556
- keySize: 8 // 256 bits (8 * 32)
557
- };
558
- DyFM_Crypto.defaultErrorUserMsg = `We encountered an unhandled Authentication Error, ` +
559
- `\nplease contact the responsible development team.`;
560
560
  //# sourceMappingURL=crypto.util.js.map