@smythos/sre 1.6.8 → 1.6.10

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 (239) hide show
  1. package/CHANGELOG +111 -111
  2. package/LICENSE +18 -18
  3. package/README.md +135 -135
  4. package/dist/bundle-analysis-lazy.html +4949 -0
  5. package/dist/bundle-analysis.html +4949 -0
  6. package/dist/index.js +2 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/types/Components/Triggers/Gmail.trigger.d.ts +58 -0
  9. package/dist/types/Components/Triggers/GmailTrigger.class.d.ts +44 -0
  10. package/dist/types/Components/Triggers/Trigger.class.d.ts +21 -0
  11. package/dist/types/Components/Triggers/WhatsApp.trigger.d.ts +22 -0
  12. package/dist/types/helpers/AIPerformanceAnalyzer.helper.d.ts +45 -0
  13. package/dist/types/helpers/AIPerformanceCollector.helper.d.ts +111 -0
  14. package/dist/types/subsystems/IO/Storage.service/connectors/AzureBlobStorage.class.d.ts +211 -0
  15. package/dist/types/subsystems/IO/VectorDB.service/connectors/WeaviateVectorDB.class.d.ts +187 -0
  16. package/dist/types/subsystems/PerformanceManager/Performance.service/PerformanceConnector.d.ts +102 -0
  17. package/dist/types/subsystems/PerformanceManager/Performance.service/connectors/LocalPerformanceConnector.class.d.ts +100 -0
  18. package/dist/types/subsystems/PerformanceManager/Performance.service/index.d.ts +22 -0
  19. package/dist/types/subsystems/Security/Credentials/Credentials.class.d.ts +2 -0
  20. package/dist/types/subsystems/Security/Credentials/ManagedOAuth2Credentials.class.d.ts +18 -0
  21. package/dist/types/subsystems/Security/Credentials/OAuth2Credentials.class.d.ts +14 -0
  22. package/dist/types/types/Performance.types.d.ts +468 -0
  23. package/dist/types/utils/package-manager.utils.d.ts +26 -0
  24. package/package.json +1 -1
  25. package/src/Components/APICall/APICall.class.ts +161 -161
  26. package/src/Components/APICall/AccessTokenManager.ts +166 -166
  27. package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
  28. package/src/Components/APICall/OAuth.helper.ts +447 -447
  29. package/src/Components/APICall/mimeTypeCategories.ts +46 -46
  30. package/src/Components/APICall/parseData.ts +167 -167
  31. package/src/Components/APICall/parseHeaders.ts +41 -41
  32. package/src/Components/APICall/parseProxy.ts +68 -68
  33. package/src/Components/APICall/parseUrl.ts +91 -91
  34. package/src/Components/APIEndpoint.class.ts +234 -234
  35. package/src/Components/APIOutput.class.ts +58 -58
  36. package/src/Components/AgentPlugin.class.ts +102 -102
  37. package/src/Components/Async.class.ts +155 -155
  38. package/src/Components/Await.class.ts +90 -90
  39. package/src/Components/Classifier.class.ts +158 -158
  40. package/src/Components/Component.class.ts +147 -147
  41. package/src/Components/ComponentHost.class.ts +38 -38
  42. package/src/Components/DataSourceCleaner.class.ts +92 -92
  43. package/src/Components/DataSourceIndexer.class.ts +181 -181
  44. package/src/Components/DataSourceLookup.class.ts +161 -161
  45. package/src/Components/ECMASandbox.class.ts +72 -72
  46. package/src/Components/FEncDec.class.ts +29 -29
  47. package/src/Components/FHash.class.ts +33 -33
  48. package/src/Components/FSign.class.ts +80 -80
  49. package/src/Components/FSleep.class.ts +25 -25
  50. package/src/Components/FTimestamp.class.ts +66 -66
  51. package/src/Components/FileStore.class.ts +78 -78
  52. package/src/Components/ForEach.class.ts +97 -97
  53. package/src/Components/GPTPlugin.class.ts +70 -70
  54. package/src/Components/GenAILLM.class.ts +586 -586
  55. package/src/Components/HuggingFace.class.ts +313 -313
  56. package/src/Components/Image/imageSettings.config.ts +70 -70
  57. package/src/Components/ImageGenerator.class.ts +483 -483
  58. package/src/Components/JSONFilter.class.ts +54 -54
  59. package/src/Components/LLMAssistant.class.ts +213 -213
  60. package/src/Components/LogicAND.class.ts +28 -28
  61. package/src/Components/LogicAtLeast.class.ts +85 -85
  62. package/src/Components/LogicAtMost.class.ts +86 -86
  63. package/src/Components/LogicOR.class.ts +29 -29
  64. package/src/Components/LogicXOR.class.ts +34 -34
  65. package/src/Components/MCPClient.class.ts +137 -137
  66. package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
  67. package/src/Components/MemoryReadKeyVal.class.ts +67 -67
  68. package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
  69. package/src/Components/MemoryWriteObject.class.ts +97 -97
  70. package/src/Components/MultimodalLLM.class.ts +128 -128
  71. package/src/Components/OpenAPI.class.ts +72 -72
  72. package/src/Components/PromptGenerator.class.ts +122 -122
  73. package/src/Components/ScrapflyWebScrape.class.ts +183 -183
  74. package/src/Components/ServerlessCode.class.ts +123 -123
  75. package/src/Components/TavilyWebSearch.class.ts +103 -103
  76. package/src/Components/VisionLLM.class.ts +104 -104
  77. package/src/Components/ZapierAction.class.ts +127 -127
  78. package/src/Components/index.ts +97 -97
  79. package/src/Core/AgentProcess.helper.ts +240 -240
  80. package/src/Core/Connector.class.ts +123 -123
  81. package/src/Core/ConnectorsService.ts +197 -197
  82. package/src/Core/DummyConnector.ts +49 -49
  83. package/src/Core/HookService.ts +105 -105
  84. package/src/Core/SmythRuntime.class.ts +241 -241
  85. package/src/Core/SystemEvents.ts +16 -16
  86. package/src/Core/boot.ts +56 -56
  87. package/src/config.ts +15 -15
  88. package/src/constants.ts +126 -126
  89. package/src/data/hugging-face.params.json +579 -579
  90. package/src/helpers/AWSLambdaCode.helper.ts +624 -624
  91. package/src/helpers/BinaryInput.helper.ts +331 -331
  92. package/src/helpers/Conversation.helper.ts +1157 -1157
  93. package/src/helpers/ECMASandbox.helper.ts +64 -64
  94. package/src/helpers/JsonContent.helper.ts +97 -97
  95. package/src/helpers/LocalCache.helper.ts +97 -97
  96. package/src/helpers/Log.helper.ts +274 -274
  97. package/src/helpers/OpenApiParser.helper.ts +150 -150
  98. package/src/helpers/S3Cache.helper.ts +147 -147
  99. package/src/helpers/SmythURI.helper.ts +5 -5
  100. package/src/helpers/Sysconfig.helper.ts +95 -95
  101. package/src/helpers/TemplateString.helper.ts +243 -243
  102. package/src/helpers/TypeChecker.helper.ts +329 -329
  103. package/src/index.ts +3 -3
  104. package/src/index.ts.bak +3 -3
  105. package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
  106. package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
  107. package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
  108. package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
  109. package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +145 -145
  110. package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
  111. package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
  112. package/src/subsystems/AgentManager/AgentLogger.class.ts +301 -301
  113. package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
  114. package/src/subsystems/AgentManager/AgentRuntime.class.ts +557 -557
  115. package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
  116. package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
  117. package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
  118. package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
  119. package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
  120. package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
  121. package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
  122. package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
  123. package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
  124. package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +171 -171
  125. package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
  126. package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
  127. package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
  128. package/src/subsystems/IO/CLI.service/index.ts +9 -9
  129. package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
  130. package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
  131. package/src/subsystems/IO/Log.service/index.ts +13 -13
  132. package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
  133. package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
  134. package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
  135. package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
  136. package/src/subsystems/IO/NKV.service/index.ts +14 -14
  137. package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
  138. package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
  139. package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
  140. package/src/subsystems/IO/Router.service/index.ts +11 -11
  141. package/src/subsystems/IO/Storage.service/SmythFS.class.ts +488 -488
  142. package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
  143. package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
  144. package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
  145. package/src/subsystems/IO/Storage.service/index.ts +13 -13
  146. package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
  147. package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +465 -465
  148. package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +387 -387
  149. package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +408 -408
  150. package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
  151. package/src/subsystems/IO/VectorDB.service/embed/GoogleEmbedding.ts +118 -118
  152. package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
  153. package/src/subsystems/IO/VectorDB.service/embed/index.ts +26 -26
  154. package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
  155. package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
  156. package/src/subsystems/LLMManager/LLM.inference.ts +345 -345
  157. package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +492 -492
  158. package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
  159. package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +666 -666
  160. package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +407 -407
  161. package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +92 -92
  162. package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +983 -983
  163. package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +319 -319
  164. package/src/subsystems/LLMManager/LLM.service/connectors/Ollama.class.ts +361 -361
  165. package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +257 -257
  166. package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +430 -430
  167. package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +503 -503
  168. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
  169. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
  170. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
  171. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
  172. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
  173. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
  174. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
  175. package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
  176. package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +478 -478
  177. package/src/subsystems/LLMManager/LLM.service/index.ts +47 -47
  178. package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +303 -303
  179. package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +280 -271
  180. package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
  181. package/src/subsystems/LLMManager/custom-models.ts +854 -854
  182. package/src/subsystems/LLMManager/models.ts +2540 -2540
  183. package/src/subsystems/LLMManager/paramMappings.ts +69 -69
  184. package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
  185. package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
  186. package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +214 -214
  187. package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
  188. package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
  189. package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
  190. package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
  191. package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
  192. package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
  193. package/src/subsystems/MemoryManager/RuntimeContext.ts +277 -277
  194. package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
  195. package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
  196. package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
  197. package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
  198. package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
  199. package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +170 -170
  200. package/src/subsystems/Security/Account.service/connectors/MySQLAccount.class.ts +76 -76
  201. package/src/subsystems/Security/Account.service/index.ts +14 -14
  202. package/src/subsystems/Security/Credentials.helper.ts +62 -62
  203. package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
  204. package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
  205. package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
  206. package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
  207. package/src/subsystems/Security/SecureConnector.class.ts +110 -110
  208. package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
  209. package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
  210. package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
  211. package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
  212. package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
  213. package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
  214. package/src/subsystems/Security/Vault.service/index.ts +12 -12
  215. package/src/types/ACL.types.ts +104 -104
  216. package/src/types/AWS.types.ts +10 -10
  217. package/src/types/Agent.types.ts +61 -61
  218. package/src/types/AgentLogger.types.ts +17 -17
  219. package/src/types/Cache.types.ts +1 -1
  220. package/src/types/Common.types.ts +2 -2
  221. package/src/types/LLM.types.ts +520 -520
  222. package/src/types/Redis.types.ts +8 -8
  223. package/src/types/SRE.types.ts +64 -64
  224. package/src/types/Security.types.ts +14 -14
  225. package/src/types/Storage.types.ts +5 -5
  226. package/src/types/VectorDB.types.ts +86 -86
  227. package/src/utils/base64.utils.ts +275 -275
  228. package/src/utils/cli.utils.ts +68 -68
  229. package/src/utils/data.utils.ts +322 -322
  230. package/src/utils/date-time.utils.ts +22 -22
  231. package/src/utils/general.utils.ts +238 -238
  232. package/src/utils/index.ts +12 -12
  233. package/src/utils/lazy-client.ts +261 -261
  234. package/src/utils/numbers.utils.ts +13 -13
  235. package/src/utils/oauth.utils.ts +35 -35
  236. package/src/utils/string.utils.ts +414 -414
  237. package/src/utils/url.utils.ts +19 -19
  238. package/src/utils/validation.utils.ts +74 -74
  239. package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +0 -39
@@ -1,275 +1,275 @@
1
- import { fileTypeFromBuffer } from 'file-type';
2
- import { isValidString } from './string.utils';
3
- import { MAX_FILE_SIZE } from '@sre/constants';
4
-
5
- /**
6
- * This function converts a text string to a base64 URL.
7
- * @param text
8
- * @returns
9
- */
10
- export function textToBase64Url(text) {
11
- // Create a Buffer from the string
12
- const buffer = Buffer.from(text, 'utf-8');
13
-
14
- // Convert the Buffer to a base64 string
15
- const base64String = buffer.toString('base64');
16
-
17
- // Construct the data URL
18
- const base64Url = `data:text/plain;base64,${base64String}`;
19
-
20
- return base64Url;
21
- }
22
-
23
- export const isBase64FileUrl = (url: string): boolean => {
24
- if (typeof url !== 'string') return false;
25
-
26
- const regex = /^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/;
27
- const match = url.match(regex);
28
- if (!match) return false;
29
- const [, , base64Data] = match;
30
-
31
- return isBase64(base64Data);
32
- };
33
-
34
- export const getMimetypeFromBase64Data = async (data: string) => {
35
- try {
36
- data = _cleanUpBase64Data(data);
37
-
38
- // Convert the base64 string back to a Buffer
39
- const imageBuffer = Buffer.from(data, 'base64');
40
-
41
- const type = await fileTypeFromBuffer(imageBuffer);
42
- return type?.mime || '';
43
- } catch (error) {
44
- console.error('Error getting mimetype from base64 data: ', error);
45
- return '';
46
- }
47
- };
48
-
49
- export async function getBase64FileInfo(data: string): Promise<{ data: string; mimetype: string; size: number } | null> {
50
- if (isBase64FileUrl(data)) {
51
- const regex = /^data:([^;]+);base64,(.*)$/;
52
- const match = data.match(regex);
53
- if (!match) return { data: '', mimetype: '', size: 0 };
54
- const [, mimetype, base64Data] = match;
55
-
56
- const cleanData = _cleanUpBase64Data(base64Data);
57
- const buffer = Buffer.from(cleanData, 'base64');
58
-
59
- return { data: cleanData, mimetype, size: buffer.byteLength };
60
- } else if (isBase64(data)) {
61
- const cleanData = _cleanUpBase64Data(data);
62
- const buffer = Buffer.from(cleanData, 'base64');
63
-
64
- return {
65
- data: cleanData,
66
- mimetype: await getMimetypeFromBase64Data(cleanData),
67
- size: buffer.byteLength,
68
- };
69
- }
70
-
71
- return null;
72
- }
73
-
74
- //=== Legacy code below ===
75
- //@Forhad the functions below need to be reviewed and refactored
76
-
77
- /**
78
- * Remove all whitespace characters and literal \n and \s sequences
79
- *
80
- * @note It's common practice to split base64 data into multiple lines for better readability and to avoid issues with systems that can't handle very long lines. So we need to clean up newline characters from the base64 data before processing it.
81
- * @param {string} str - The input string.
82
- * @returns {string} The input string with all newline characters and escaped newline strings removed.
83
- */
84
- function cleanBase64(str: string): string {
85
- return str.replace(/\s|\\n|\\s/g, '');
86
- }
87
-
88
- /**
89
- * Checks if the input is a data URL.
90
- *
91
- * @param {string} input - The input string.
92
- * @returns {boolean} True if the input is a data URL, false otherwise.
93
- */
94
- export function isBase64DataUrl(input: string): boolean {
95
- // Data URL pattern: data:[<mediatype>][;base64],<data>
96
- const pattern = /^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/;
97
-
98
- return pattern.test(input);
99
- }
100
-
101
- /**
102
- * Checks if the given string is a valid Base64-encoded string.
103
- *
104
- * @param {string} str - The string to check.
105
- * @returns {boolean} True if the string is a valid Base64-encoded string, false otherwise.
106
- */
107
- export function isBase64(str: string): boolean {
108
- if (!isValidString(str)) return false;
109
-
110
- const cleanedBase64Data = cleanBase64(str);
111
-
112
- // Sometimes words like 'male' and hashes like md5, sha1, sha256, sha512 are detected as base64
113
- if (cleanedBase64Data.length < 128) return false;
114
-
115
- try {
116
- const buffer = Buffer.from(cleanedBase64Data, 'base64');
117
-
118
- // ignoring trailing padding ensures that the comparison is based on the actual content, not the padding
119
- return buffer.toString('base64').replace(/=+$/, '') === cleanedBase64Data.replace(/=+$/, '');
120
- } catch {
121
- return false;
122
- }
123
- }
124
-
125
- /**
126
- * Parses a Base64-encoded data URL and extracts the MIME type and cleaned data.
127
- *
128
- * @param {string} input - The Base64-encoded data URL.
129
- * @returns {{ mimetype: string; data: string }} An object containing the MIME type and the cleaned Base64 data.
130
- * @throws {Error} If the input is invalid.
131
- */
132
- function parseBase64DataUrl(input: string): { mimetype: string; data: string } {
133
- const pattern = /^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/;
134
- const matches = input.match(pattern);
135
-
136
- if (!matches) {
137
- throw new Error('Invalid data URL!');
138
- }
139
-
140
- const [, mimetype, data] = matches;
141
-
142
- if (!isBase64(data)) {
143
- throw new Error('Invalid base64 data!');
144
- }
145
-
146
- return { mimetype, data: cleanBase64(data) };
147
- }
148
-
149
- /**
150
- * Parses a Base64-encoded string and extracts the MIME type and cleaned data.
151
- *
152
- * @param {string} input - The Base64-encoded string.
153
- * @returns {Promise<{ mimetype: string; data: string }>} An object containing the MIME type and the cleaned Base64 data.
154
- */
155
- export async function parseBase64(input: string): Promise<{ mimetype: string; data: string }> {
156
- const cleanedData = cleanBase64(input);
157
- const mimetype = await identifyMimetypeFromBase64(cleanedData);
158
-
159
- return { mimetype, data: cleanedData };
160
- }
161
-
162
- /**
163
- * Identifies the MIME type from a Base64-encoded string.
164
- *
165
- * This function cleans the input Base64 string, converts it to a buffer, and then identifies the MIME type
166
- * using the `fileTypeFromBuffer` function.
167
- *
168
- * @param {string} data - The Base64-encoded string from which to identify the MIME type.
169
- * @returns {Promise<string>} A promise that resolves to the MIME type of the data, or an empty string if the MIME type cannot be determined.
170
- *
171
- * @throws {Error} If an error occurs during the process, it logs the error and returns an empty string.
172
- */
173
- export async function identifyMimetypeFromBase64(data: string): Promise<string> {
174
- try {
175
- const cleanedData = cleanBase64(data);
176
-
177
- // Convert the base64 string back to a Buffer
178
- const buffer = Buffer.from(cleanedData, 'base64');
179
-
180
- const type = await fileTypeFromBuffer(buffer);
181
-
182
- return type?.mime || '';
183
- } catch (error) {
184
- throw new Error(`Error identifying MIME type from base64 data: ${error?.message}`);
185
- }
186
- }
187
-
188
- /**
189
- * Identifies the MIME type from a Base64-encoded string.
190
- *
191
- * This function cleans the input Base64 string, converts it to a buffer, and then identifies the MIME type
192
- * using the `fileTypeFromBuffer` function.
193
- *
194
- * @param {string} data - The Base64-encoded string from which to identify the MIME type.
195
- * @returns {Promise<string>} A promise that resolves to the MIME type of the data, or an empty string if the MIME type cannot be determined.
196
- *
197
- * @throws {Error} If an error occurs during the process, it logs the error and returns an empty string.
198
- */
199
- export async function identifyMimeTypeFromBase64DataUrl(input: string): Promise<string> {
200
- try {
201
- const { data } = await parseBase64DataUrl(input);
202
-
203
- const buffer = Buffer.from(data, 'base64');
204
-
205
- const type = await fileTypeFromBuffer(buffer);
206
-
207
- return type?.mime || '';
208
- } catch (error) {
209
- throw new Error(`Error identifying MIME type from base64 data: ${error?.message}`);
210
- }
211
- }
212
-
213
- /**
214
- * Calculates the size of a Base64-encoded string in bytes.
215
- *
216
- * This function validates the input string to ensure it is a valid Base64-encoded string,
217
- * converts it to a buffer, and then returns the byte length of the buffer.
218
- *
219
- * @param {string} str - The Base64-encoded string whose size is to be calculated.
220
- * @returns {number} The size of the Base64-encoded string in bytes.
221
- *
222
- * @throws {Error} If the input string is not a valid Base64-encoded string or if an error occurs during conversion.
223
- */
224
- export function getSizeOfBase64(str: string): number {
225
- if (!isValidString(str)) {
226
- throw new Error('Invalid Base64 data!');
227
- }
228
-
229
- try {
230
- const buffer = Buffer.from(str, 'base64');
231
- return buffer.byteLength;
232
- } catch (error) {
233
- throw new Error(`Invalid Base64 data! ${error.message}`);
234
- }
235
- }
236
-
237
- /**
238
- * Generates a Base64 Data URL from a Base64-encoded string.
239
- *
240
- * This function validates the input Base64 string, removes any newline characters,
241
- * and constructs a Data URL with the specified MIME type.
242
- *
243
- * @param {string} data - The Base64-encoded string to be converted into a Data URL.
244
- * @param {string} [mimetype='application/octet-stream'] - The MIME type of the data. Defaults to 'application/octet-stream'.
245
- * @returns {string} The generated Base64 Data URL.
246
- *
247
- * @throws {Error} If the input string is not a valid Base64-encoded string.
248
- */
249
- export function makeBase64Url(data: string, mimetype: string = 'application/octet-stream'): string {
250
- if (!isValidString(data)) {
251
- throw new Error('Invalid Base64 data!');
252
- }
253
-
254
- // Remove any newline characters from the Base64 string
255
- const cleanedData = data.replace(/\n/g, '');
256
-
257
- // Construct and return the Data URL
258
- return `data:${mimetype};base64,${cleanedData}`;
259
- }
260
-
261
- /**
262
- ** It's common practice to split base64 data into multiple lines for better readability and to avoid issues with systems that can't handle very long lines.
263
- ** So we need to clean up newline characters from the base64 data before processing it.
264
- * @param {string} str - The input string.
265
- * @returns {string} The input string with all newline characters and escaped newline strings removed.
266
- */
267
- const _cleanUpBase64Data = (str: string): string => {
268
- // Check if the input is a string and is not excessively large
269
- if (typeof str !== 'string' || str.length > MAX_FILE_SIZE) {
270
- throw new Error('Invalid input');
271
- }
272
-
273
- // Remove all whitespace characters and literal \n and \s sequences
274
- return str.replace(/\s|\\n|\\s/g, '');
275
- };
1
+ import { fileTypeFromBuffer } from 'file-type';
2
+ import { isValidString } from './string.utils';
3
+ import { MAX_FILE_SIZE } from '@sre/constants';
4
+
5
+ /**
6
+ * This function converts a text string to a base64 URL.
7
+ * @param text
8
+ * @returns
9
+ */
10
+ export function textToBase64Url(text) {
11
+ // Create a Buffer from the string
12
+ const buffer = Buffer.from(text, 'utf-8');
13
+
14
+ // Convert the Buffer to a base64 string
15
+ const base64String = buffer.toString('base64');
16
+
17
+ // Construct the data URL
18
+ const base64Url = `data:text/plain;base64,${base64String}`;
19
+
20
+ return base64Url;
21
+ }
22
+
23
+ export const isBase64FileUrl = (url: string): boolean => {
24
+ if (typeof url !== 'string') return false;
25
+
26
+ const regex = /^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/;
27
+ const match = url.match(regex);
28
+ if (!match) return false;
29
+ const [, , base64Data] = match;
30
+
31
+ return isBase64(base64Data);
32
+ };
33
+
34
+ export const getMimetypeFromBase64Data = async (data: string) => {
35
+ try {
36
+ data = _cleanUpBase64Data(data);
37
+
38
+ // Convert the base64 string back to a Buffer
39
+ const imageBuffer = Buffer.from(data, 'base64');
40
+
41
+ const type = await fileTypeFromBuffer(imageBuffer);
42
+ return type?.mime || '';
43
+ } catch (error) {
44
+ console.error('Error getting mimetype from base64 data: ', error);
45
+ return '';
46
+ }
47
+ };
48
+
49
+ export async function getBase64FileInfo(data: string): Promise<{ data: string; mimetype: string; size: number } | null> {
50
+ if (isBase64FileUrl(data)) {
51
+ const regex = /^data:([^;]+);base64,(.*)$/;
52
+ const match = data.match(regex);
53
+ if (!match) return { data: '', mimetype: '', size: 0 };
54
+ const [, mimetype, base64Data] = match;
55
+
56
+ const cleanData = _cleanUpBase64Data(base64Data);
57
+ const buffer = Buffer.from(cleanData, 'base64');
58
+
59
+ return { data: cleanData, mimetype, size: buffer.byteLength };
60
+ } else if (isBase64(data)) {
61
+ const cleanData = _cleanUpBase64Data(data);
62
+ const buffer = Buffer.from(cleanData, 'base64');
63
+
64
+ return {
65
+ data: cleanData,
66
+ mimetype: await getMimetypeFromBase64Data(cleanData),
67
+ size: buffer.byteLength,
68
+ };
69
+ }
70
+
71
+ return null;
72
+ }
73
+
74
+ //=== Legacy code below ===
75
+ //@Forhad the functions below need to be reviewed and refactored
76
+
77
+ /**
78
+ * Remove all whitespace characters and literal \n and \s sequences
79
+ *
80
+ * @note It's common practice to split base64 data into multiple lines for better readability and to avoid issues with systems that can't handle very long lines. So we need to clean up newline characters from the base64 data before processing it.
81
+ * @param {string} str - The input string.
82
+ * @returns {string} The input string with all newline characters and escaped newline strings removed.
83
+ */
84
+ function cleanBase64(str: string): string {
85
+ return str.replace(/\s|\\n|\\s/g, '');
86
+ }
87
+
88
+ /**
89
+ * Checks if the input is a data URL.
90
+ *
91
+ * @param {string} input - The input string.
92
+ * @returns {boolean} True if the input is a data URL, false otherwise.
93
+ */
94
+ export function isBase64DataUrl(input: string): boolean {
95
+ // Data URL pattern: data:[<mediatype>][;base64],<data>
96
+ const pattern = /^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/;
97
+
98
+ return pattern.test(input);
99
+ }
100
+
101
+ /**
102
+ * Checks if the given string is a valid Base64-encoded string.
103
+ *
104
+ * @param {string} str - The string to check.
105
+ * @returns {boolean} True if the string is a valid Base64-encoded string, false otherwise.
106
+ */
107
+ export function isBase64(str: string): boolean {
108
+ if (!isValidString(str)) return false;
109
+
110
+ const cleanedBase64Data = cleanBase64(str);
111
+
112
+ // Sometimes words like 'male' and hashes like md5, sha1, sha256, sha512 are detected as base64
113
+ if (cleanedBase64Data.length < 128) return false;
114
+
115
+ try {
116
+ const buffer = Buffer.from(cleanedBase64Data, 'base64');
117
+
118
+ // ignoring trailing padding ensures that the comparison is based on the actual content, not the padding
119
+ return buffer.toString('base64').replace(/=+$/, '') === cleanedBase64Data.replace(/=+$/, '');
120
+ } catch {
121
+ return false;
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Parses a Base64-encoded data URL and extracts the MIME type and cleaned data.
127
+ *
128
+ * @param {string} input - The Base64-encoded data URL.
129
+ * @returns {{ mimetype: string; data: string }} An object containing the MIME type and the cleaned Base64 data.
130
+ * @throws {Error} If the input is invalid.
131
+ */
132
+ function parseBase64DataUrl(input: string): { mimetype: string; data: string } {
133
+ const pattern = /^data:([\w+\-\.]+\/[\w+\-\.]+);base64,(.*)$/;
134
+ const matches = input.match(pattern);
135
+
136
+ if (!matches) {
137
+ throw new Error('Invalid data URL!');
138
+ }
139
+
140
+ const [, mimetype, data] = matches;
141
+
142
+ if (!isBase64(data)) {
143
+ throw new Error('Invalid base64 data!');
144
+ }
145
+
146
+ return { mimetype, data: cleanBase64(data) };
147
+ }
148
+
149
+ /**
150
+ * Parses a Base64-encoded string and extracts the MIME type and cleaned data.
151
+ *
152
+ * @param {string} input - The Base64-encoded string.
153
+ * @returns {Promise<{ mimetype: string; data: string }>} An object containing the MIME type and the cleaned Base64 data.
154
+ */
155
+ export async function parseBase64(input: string): Promise<{ mimetype: string; data: string }> {
156
+ const cleanedData = cleanBase64(input);
157
+ const mimetype = await identifyMimetypeFromBase64(cleanedData);
158
+
159
+ return { mimetype, data: cleanedData };
160
+ }
161
+
162
+ /**
163
+ * Identifies the MIME type from a Base64-encoded string.
164
+ *
165
+ * This function cleans the input Base64 string, converts it to a buffer, and then identifies the MIME type
166
+ * using the `fileTypeFromBuffer` function.
167
+ *
168
+ * @param {string} data - The Base64-encoded string from which to identify the MIME type.
169
+ * @returns {Promise<string>} A promise that resolves to the MIME type of the data, or an empty string if the MIME type cannot be determined.
170
+ *
171
+ * @throws {Error} If an error occurs during the process, it logs the error and returns an empty string.
172
+ */
173
+ export async function identifyMimetypeFromBase64(data: string): Promise<string> {
174
+ try {
175
+ const cleanedData = cleanBase64(data);
176
+
177
+ // Convert the base64 string back to a Buffer
178
+ const buffer = Buffer.from(cleanedData, 'base64');
179
+
180
+ const type = await fileTypeFromBuffer(buffer);
181
+
182
+ return type?.mime || '';
183
+ } catch (error) {
184
+ throw new Error(`Error identifying MIME type from base64 data: ${error?.message}`);
185
+ }
186
+ }
187
+
188
+ /**
189
+ * Identifies the MIME type from a Base64-encoded string.
190
+ *
191
+ * This function cleans the input Base64 string, converts it to a buffer, and then identifies the MIME type
192
+ * using the `fileTypeFromBuffer` function.
193
+ *
194
+ * @param {string} data - The Base64-encoded string from which to identify the MIME type.
195
+ * @returns {Promise<string>} A promise that resolves to the MIME type of the data, or an empty string if the MIME type cannot be determined.
196
+ *
197
+ * @throws {Error} If an error occurs during the process, it logs the error and returns an empty string.
198
+ */
199
+ export async function identifyMimeTypeFromBase64DataUrl(input: string): Promise<string> {
200
+ try {
201
+ const { data } = await parseBase64DataUrl(input);
202
+
203
+ const buffer = Buffer.from(data, 'base64');
204
+
205
+ const type = await fileTypeFromBuffer(buffer);
206
+
207
+ return type?.mime || '';
208
+ } catch (error) {
209
+ throw new Error(`Error identifying MIME type from base64 data: ${error?.message}`);
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Calculates the size of a Base64-encoded string in bytes.
215
+ *
216
+ * This function validates the input string to ensure it is a valid Base64-encoded string,
217
+ * converts it to a buffer, and then returns the byte length of the buffer.
218
+ *
219
+ * @param {string} str - The Base64-encoded string whose size is to be calculated.
220
+ * @returns {number} The size of the Base64-encoded string in bytes.
221
+ *
222
+ * @throws {Error} If the input string is not a valid Base64-encoded string or if an error occurs during conversion.
223
+ */
224
+ export function getSizeOfBase64(str: string): number {
225
+ if (!isValidString(str)) {
226
+ throw new Error('Invalid Base64 data!');
227
+ }
228
+
229
+ try {
230
+ const buffer = Buffer.from(str, 'base64');
231
+ return buffer.byteLength;
232
+ } catch (error) {
233
+ throw new Error(`Invalid Base64 data! ${error.message}`);
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Generates a Base64 Data URL from a Base64-encoded string.
239
+ *
240
+ * This function validates the input Base64 string, removes any newline characters,
241
+ * and constructs a Data URL with the specified MIME type.
242
+ *
243
+ * @param {string} data - The Base64-encoded string to be converted into a Data URL.
244
+ * @param {string} [mimetype='application/octet-stream'] - The MIME type of the data. Defaults to 'application/octet-stream'.
245
+ * @returns {string} The generated Base64 Data URL.
246
+ *
247
+ * @throws {Error} If the input string is not a valid Base64-encoded string.
248
+ */
249
+ export function makeBase64Url(data: string, mimetype: string = 'application/octet-stream'): string {
250
+ if (!isValidString(data)) {
251
+ throw new Error('Invalid Base64 data!');
252
+ }
253
+
254
+ // Remove any newline characters from the Base64 string
255
+ const cleanedData = data.replace(/\n/g, '');
256
+
257
+ // Construct and return the Data URL
258
+ return `data:${mimetype};base64,${cleanedData}`;
259
+ }
260
+
261
+ /**
262
+ ** It's common practice to split base64 data into multiple lines for better readability and to avoid issues with systems that can't handle very long lines.
263
+ ** So we need to clean up newline characters from the base64 data before processing it.
264
+ * @param {string} str - The input string.
265
+ * @returns {string} The input string with all newline characters and escaped newline strings removed.
266
+ */
267
+ const _cleanUpBase64Data = (str: string): string => {
268
+ // Check if the input is a string and is not excessively large
269
+ if (typeof str !== 'string' || str.length > MAX_FILE_SIZE) {
270
+ throw new Error('Invalid input');
271
+ }
272
+
273
+ // Remove all whitespace characters and literal \n and \s sequences
274
+ return str.replace(/\s|\\n|\\s/g, '');
275
+ };