@smythos/sre 1.5.53 → 1.5.54
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/CHANGELOG +98 -98
- package/LICENSE +18 -18
- package/README.md +135 -135
- package/dist/bundle-analysis-lazy.html +4949 -0
- package/dist/bundle-analysis.html +4949 -0
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.d.ts +1 -6
- package/dist/types/utils/package-manager.utils.d.ts +26 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +157 -157
- package/src/Components/APICall/AccessTokenManager.ts +166 -166
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +447 -447
- package/src/Components/APICall/mimeTypeCategories.ts +46 -46
- package/src/Components/APICall/parseData.ts +167 -167
- package/src/Components/APICall/parseHeaders.ts +41 -41
- package/src/Components/APICall/parseProxy.ts +68 -68
- package/src/Components/APICall/parseUrl.ts +91 -91
- package/src/Components/APIEndpoint.class.ts +234 -234
- package/src/Components/APIOutput.class.ts +58 -58
- package/src/Components/AgentPlugin.class.ts +102 -102
- package/src/Components/Async.class.ts +155 -155
- package/src/Components/Await.class.ts +90 -90
- package/src/Components/Classifier.class.ts +158 -158
- package/src/Components/Component.class.ts +132 -132
- package/src/Components/ComponentHost.class.ts +38 -38
- package/src/Components/DataSourceCleaner.class.ts +92 -92
- package/src/Components/DataSourceIndexer.class.ts +181 -181
- package/src/Components/DataSourceLookup.class.ts +161 -161
- package/src/Components/ECMASandbox.class.ts +71 -71
- package/src/Components/FEncDec.class.ts +29 -29
- package/src/Components/FHash.class.ts +33 -33
- package/src/Components/FSign.class.ts +80 -80
- package/src/Components/FSleep.class.ts +25 -25
- package/src/Components/FTimestamp.class.ts +25 -25
- package/src/Components/FileStore.class.ts +78 -78
- package/src/Components/ForEach.class.ts +97 -97
- package/src/Components/GPTPlugin.class.ts +70 -70
- package/src/Components/GenAILLM.class.ts +586 -586
- package/src/Components/HuggingFace.class.ts +314 -314
- package/src/Components/Image/imageSettings.config.ts +70 -70
- package/src/Components/ImageGenerator.class.ts +502 -502
- package/src/Components/JSONFilter.class.ts +54 -54
- package/src/Components/LLMAssistant.class.ts +213 -213
- package/src/Components/LogicAND.class.ts +28 -28
- package/src/Components/LogicAtLeast.class.ts +85 -85
- package/src/Components/LogicAtMost.class.ts +86 -86
- package/src/Components/LogicOR.class.ts +29 -29
- package/src/Components/LogicXOR.class.ts +34 -34
- package/src/Components/MCPClient.class.ts +138 -138
- package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
- package/src/Components/MemoryReadKeyVal.class.ts +66 -66
- package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
- package/src/Components/MemoryWriteObject.class.ts +97 -97
- package/src/Components/MultimodalLLM.class.ts +128 -128
- package/src/Components/OpenAPI.class.ts +72 -72
- package/src/Components/PromptGenerator.class.ts +122 -122
- package/src/Components/ScrapflyWebScrape.class.ts +159 -159
- package/src/Components/ServerlessCode.class.ts +123 -123
- package/src/Components/TavilyWebSearch.class.ts +98 -98
- package/src/Components/VisionLLM.class.ts +104 -104
- package/src/Components/ZapierAction.class.ts +127 -127
- package/src/Components/index.ts +97 -97
- package/src/Core/AgentProcess.helper.ts +240 -240
- package/src/Core/Connector.class.ts +123 -123
- package/src/Core/ConnectorsService.ts +197 -197
- package/src/Core/DummyConnector.ts +49 -49
- package/src/Core/HookService.ts +105 -105
- package/src/Core/SmythRuntime.class.ts +235 -235
- package/src/Core/SystemEvents.ts +16 -16
- package/src/Core/boot.ts +56 -56
- package/src/config.ts +15 -15
- package/src/constants.ts +126 -126
- package/src/data/hugging-face.params.json +579 -579
- package/src/helpers/AWSLambdaCode.helper.ts +590 -590
- package/src/helpers/BinaryInput.helper.ts +331 -331
- package/src/helpers/Conversation.helper.ts +1119 -1119
- package/src/helpers/ECMASandbox.helper.ts +54 -54
- package/src/helpers/JsonContent.helper.ts +97 -97
- package/src/helpers/LocalCache.helper.ts +97 -97
- package/src/helpers/Log.helper.ts +274 -274
- package/src/helpers/OpenApiParser.helper.ts +150 -150
- package/src/helpers/S3Cache.helper.ts +147 -147
- package/src/helpers/SmythURI.helper.ts +5 -5
- package/src/helpers/Sysconfig.helper.ts +77 -77
- package/src/helpers/TemplateString.helper.ts +243 -243
- package/src/helpers/TypeChecker.helper.ts +329 -329
- package/src/index.ts +3 -3
- package/src/index.ts.bak +3 -3
- package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
- package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
- package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
- package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
- package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +142 -142
- package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
- package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
- package/src/subsystems/AgentManager/AgentLogger.class.ts +301 -297
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +559 -559
- package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
- package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
- package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
- package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
- package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
- package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
- package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
- package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
- package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
- package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +172 -172
- package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
- package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
- package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
- package/src/subsystems/IO/CLI.service/index.ts +9 -9
- package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
- package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
- package/src/subsystems/IO/Log.service/index.ts +13 -13
- package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
- package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
- package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
- package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
- package/src/subsystems/IO/NKV.service/index.ts +14 -14
- package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
- package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
- package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
- package/src/subsystems/IO/Router.service/index.ts +11 -11
- package/src/subsystems/IO/Storage.service/SmythFS.class.ts +489 -489
- package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
- package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
- package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
- package/src/subsystems/IO/Storage.service/index.ts +13 -13
- package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +454 -454
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +384 -384
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +421 -421
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +21 -21
- package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
- package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
- package/src/subsystems/LLMManager/LLM.inference.ts +339 -339
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +489 -489
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +659 -659
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +400 -400
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +77 -77
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +757 -757
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +304 -304
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +250 -250
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +423 -423
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +488 -488
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1145 -1145
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -32
- package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +471 -471
- package/src/subsystems/LLMManager/LLM.service/index.ts +44 -44
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +300 -300
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +252 -252
- package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
- package/src/subsystems/LLMManager/custom-models.ts +854 -854
- package/src/subsystems/LLMManager/models.ts +2540 -2540
- package/src/subsystems/LLMManager/paramMappings.ts +69 -69
- package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
- package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
- package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +201 -201
- package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
- package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
- package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
- package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
- package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
- package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
- package/src/subsystems/MemoryManager/RuntimeContext.ts +266 -266
- package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
- package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
- package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
- package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
- package/src/subsystems/Security/Account.service/connectors/AWSAccount.class.ts +76 -76
- package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +159 -159
- package/src/subsystems/Security/Account.service/index.ts +14 -14
- package/src/subsystems/Security/Credentials.helper.ts +62 -62
- package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
- package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
- package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
- package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
- package/src/subsystems/Security/SecureConnector.class.ts +110 -110
- package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
- package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
- package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
- package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
- package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
- package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
- package/src/subsystems/Security/Vault.service/index.ts +12 -12
- package/src/types/ACL.types.ts +104 -104
- package/src/types/AWS.types.ts +10 -10
- package/src/types/Agent.types.ts +61 -61
- package/src/types/AgentLogger.types.ts +17 -17
- package/src/types/Cache.types.ts +1 -1
- package/src/types/Common.types.ts +2 -2
- package/src/types/LLM.types.ts +496 -496
- package/src/types/Redis.types.ts +8 -8
- package/src/types/SRE.types.ts +64 -64
- package/src/types/Security.types.ts +14 -14
- package/src/types/Storage.types.ts +5 -5
- package/src/types/VectorDB.types.ts +86 -86
- package/src/utils/base64.utils.ts +275 -275
- package/src/utils/cli.utils.ts +68 -68
- package/src/utils/data.utils.ts +322 -322
- package/src/utils/date-time.utils.ts +22 -22
- package/src/utils/general.utils.ts +238 -238
- package/src/utils/index.ts +12 -12
- package/src/utils/lazy-client.ts +261 -261
- package/src/utils/numbers.utils.ts +13 -13
- package/src/utils/oauth.utils.ts +35 -35
- package/src/utils/string.utils.ts +414 -414
- package/src/utils/url.utils.ts +19 -19
- package/src/utils/validation.utils.ts +74 -74
- package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +0 -39
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
// accessTokenManager.ts
|
|
2
|
-
import { Agent } from '@sre/AgentManager/Agent.class';
|
|
3
|
-
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
4
|
-
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
5
|
-
import { Logger } from '@sre/helpers/Log.helper';
|
|
6
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
7
|
-
import axios from 'axios';
|
|
8
|
-
|
|
9
|
-
const console = Logger('AccessTokenManager');
|
|
10
|
-
let managedVault: any;
|
|
11
|
-
|
|
12
|
-
SystemEvents.on('SRE:Booted', () => {
|
|
13
|
-
managedVault = ConnectorService.getManagedVaultConnector();
|
|
14
|
-
});
|
|
15
|
-
class AccessTokenManager {
|
|
16
|
-
private clientId: string;
|
|
17
|
-
private clientSecret: string;
|
|
18
|
-
private primaryToken: string; // accessToken || token
|
|
19
|
-
private secondaryToken: string; // refreshToken || tokenSecret
|
|
20
|
-
private tokenUrl: string; // tokenURL to refresh accessToken
|
|
21
|
-
private expires_in: any;
|
|
22
|
-
private tokensData: any; // Full tokens data object
|
|
23
|
-
private keyId: any; // key of object in teamSettings
|
|
24
|
-
private logger: any; // Use to log console in debugger
|
|
25
|
-
private agent: Agent;
|
|
26
|
-
private isNewStructure: boolean;
|
|
27
|
-
constructor(
|
|
28
|
-
clientId: string,
|
|
29
|
-
clientSecret: string,
|
|
30
|
-
secondaryToken: string,
|
|
31
|
-
tokenUrl: string,
|
|
32
|
-
expires_in: any,
|
|
33
|
-
primaryToken: string,
|
|
34
|
-
tokensData: any,
|
|
35
|
-
keyId: any,
|
|
36
|
-
logger: any,
|
|
37
|
-
agent: Agent,
|
|
38
|
-
isNewStructure: boolean = false,
|
|
39
|
-
) {
|
|
40
|
-
this.clientId = clientId;
|
|
41
|
-
this.clientSecret = clientSecret;
|
|
42
|
-
this.primaryToken = primaryToken;
|
|
43
|
-
this.secondaryToken = secondaryToken;
|
|
44
|
-
this.tokenUrl = tokenUrl;
|
|
45
|
-
this.expires_in = expires_in;
|
|
46
|
-
this.tokensData = tokensData;
|
|
47
|
-
this.keyId = keyId;
|
|
48
|
-
this.logger = logger;
|
|
49
|
-
this.agent = agent;
|
|
50
|
-
this.isNewStructure = isNewStructure;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async getAccessToken(): Promise<string> {
|
|
54
|
-
try {
|
|
55
|
-
const currentTime: any = new Date().getTime();
|
|
56
|
-
|
|
57
|
-
// If there's no secondaryToken (refresh token) and no expires_in,
|
|
58
|
-
// assume it's a long-lived token and return the primaryToken directly
|
|
59
|
-
if (!this.secondaryToken && !this.expires_in) {
|
|
60
|
-
console.log('Using long-lived access token');
|
|
61
|
-
this.logger.debug('Using long-lived access token. If authentication failes, please re-authenticate and try again');
|
|
62
|
-
return this.primaryToken;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Regular token expiration check for tokens with expiration
|
|
66
|
-
// should be alway currentTime >= Number(this.expires_in)
|
|
67
|
-
if (!this.expires_in || currentTime >= Number(this.expires_in)) {
|
|
68
|
-
if (!this.secondaryToken) {
|
|
69
|
-
this.logger.debug('Refresh token is missing. Please re authenticate');
|
|
70
|
-
console.log('Refresh token is missing. Please re authenticate...');
|
|
71
|
-
// Redirect the user to the OAuth authorization URL or initiate the reauthentication flow
|
|
72
|
-
throw new Error('Reauthentication required');
|
|
73
|
-
}
|
|
74
|
-
this.logger.debug('Access token is expired or missing. Refreshing access token...');
|
|
75
|
-
console.log('Access token is expired or missing. Refreshing access token...');
|
|
76
|
-
return await this.refreshAccessToken();
|
|
77
|
-
} else {
|
|
78
|
-
console.log('Access token is still valid');
|
|
79
|
-
this.logger.debug('Access token is still valid.');
|
|
80
|
-
return this.primaryToken;
|
|
81
|
-
}
|
|
82
|
-
} catch (error) {
|
|
83
|
-
console.error('Error fetching access token:', error);
|
|
84
|
-
this.logger.debug('Error fetching access token');
|
|
85
|
-
throw error;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async refreshAccessToken(): Promise<string> {
|
|
90
|
-
try {
|
|
91
|
-
const response = await axios.post(
|
|
92
|
-
this.tokenUrl,
|
|
93
|
-
new URLSearchParams({
|
|
94
|
-
client_id: this.clientId,
|
|
95
|
-
client_secret: this.clientSecret,
|
|
96
|
-
refresh_token: this.secondaryToken,
|
|
97
|
-
grant_type: 'refresh_token',
|
|
98
|
-
}).toString(),
|
|
99
|
-
{
|
|
100
|
-
headers: {
|
|
101
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
const newAccessToken: string = response?.data?.access_token;
|
|
107
|
-
console.log('Access token refreshed successfully.');
|
|
108
|
-
this.logger.debug('Access token refreshed successfully.');
|
|
109
|
-
const expiresInMilliseconds: number = response?.data?.expires_in ? response?.data?.expires_in * 1000 : response?.data?.expires_in;
|
|
110
|
-
const expirationTimestamp: number = expiresInMilliseconds ? new Date().getTime() + expiresInMilliseconds : expiresInMilliseconds;
|
|
111
|
-
|
|
112
|
-
// Maintain the same structure format when saving
|
|
113
|
-
let updatedData;
|
|
114
|
-
if (this.isNewStructure) {
|
|
115
|
-
// Maintain new structure format
|
|
116
|
-
updatedData = {
|
|
117
|
-
...this.tokensData,
|
|
118
|
-
auth_data: {
|
|
119
|
-
...(this.tokensData?.auth_data ?? {}),
|
|
120
|
-
primary: newAccessToken,
|
|
121
|
-
// Persist rotated refresh_token when provided; fall back to existing
|
|
122
|
-
secondary: (response?.data?.refresh_token ?? this.secondaryToken),
|
|
123
|
-
// Use nullish check so 0 is preserved
|
|
124
|
-
expires_in: (expirationTimestamp ?? undefined) !== undefined ? String(expirationTimestamp) : undefined
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
} else {
|
|
128
|
-
// Maintain old structure format
|
|
129
|
-
updatedData = {
|
|
130
|
-
...this.tokensData,
|
|
131
|
-
primary: newAccessToken,
|
|
132
|
-
expires_in: (expirationTimestamp ?? undefined) !== undefined ? String(expirationTimestamp) : undefined
|
|
133
|
-
};
|
|
134
|
-
// Persist rotated refresh_token when provided; otherwise keep existing
|
|
135
|
-
updatedData.secondary = (response?.data?.refresh_token ?? this.secondaryToken);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
const save: any = await managedVault.user(AccessCandidate.agent(this.agent.id)).set(this.keyId, JSON.stringify(updatedData));
|
|
139
|
-
if (save && save.status === 200) {
|
|
140
|
-
console.log('Access token value is updated successfully.');
|
|
141
|
-
this.logger.debug('Access token value is updated successfully.');
|
|
142
|
-
} else {
|
|
143
|
-
console.log('Warning: new access token value is not updated.');
|
|
144
|
-
this.logger.debug('Warning: new access token value is not updated.');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Update internal tokensData reference
|
|
148
|
-
this.tokensData = updatedData;
|
|
149
|
-
this.primaryToken = newAccessToken;
|
|
150
|
-
// Update in-memory refresh token in case the provider rotated it
|
|
151
|
-
this.secondaryToken = (response?.data?.refresh_token ?? this.secondaryToken);
|
|
152
|
-
// Preserve 0 and avoid dropping undefined
|
|
153
|
-
this.expires_in =
|
|
154
|
-
(expirationTimestamp ?? undefined) !== undefined
|
|
155
|
-
? String(expirationTimestamp)
|
|
156
|
-
: undefined;
|
|
157
|
-
return newAccessToken;
|
|
158
|
-
} catch (error) {
|
|
159
|
-
console.error('Failed to refresh access token:', error);
|
|
160
|
-
this.logger.debug(`Failed to refresh access token: ${error}`);
|
|
161
|
-
throw new Error('Failed to refresh access token.');
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export default AccessTokenManager;
|
|
1
|
+
// accessTokenManager.ts
|
|
2
|
+
import { Agent } from '@sre/AgentManager/Agent.class';
|
|
3
|
+
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
4
|
+
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
5
|
+
import { Logger } from '@sre/helpers/Log.helper';
|
|
6
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
7
|
+
import axios from 'axios';
|
|
8
|
+
|
|
9
|
+
const console = Logger('AccessTokenManager');
|
|
10
|
+
let managedVault: any;
|
|
11
|
+
|
|
12
|
+
SystemEvents.on('SRE:Booted', () => {
|
|
13
|
+
managedVault = ConnectorService.getManagedVaultConnector();
|
|
14
|
+
});
|
|
15
|
+
class AccessTokenManager {
|
|
16
|
+
private clientId: string;
|
|
17
|
+
private clientSecret: string;
|
|
18
|
+
private primaryToken: string; // accessToken || token
|
|
19
|
+
private secondaryToken: string; // refreshToken || tokenSecret
|
|
20
|
+
private tokenUrl: string; // tokenURL to refresh accessToken
|
|
21
|
+
private expires_in: any;
|
|
22
|
+
private tokensData: any; // Full tokens data object
|
|
23
|
+
private keyId: any; // key of object in teamSettings
|
|
24
|
+
private logger: any; // Use to log console in debugger
|
|
25
|
+
private agent: Agent;
|
|
26
|
+
private isNewStructure: boolean;
|
|
27
|
+
constructor(
|
|
28
|
+
clientId: string,
|
|
29
|
+
clientSecret: string,
|
|
30
|
+
secondaryToken: string,
|
|
31
|
+
tokenUrl: string,
|
|
32
|
+
expires_in: any,
|
|
33
|
+
primaryToken: string,
|
|
34
|
+
tokensData: any,
|
|
35
|
+
keyId: any,
|
|
36
|
+
logger: any,
|
|
37
|
+
agent: Agent,
|
|
38
|
+
isNewStructure: boolean = false,
|
|
39
|
+
) {
|
|
40
|
+
this.clientId = clientId;
|
|
41
|
+
this.clientSecret = clientSecret;
|
|
42
|
+
this.primaryToken = primaryToken;
|
|
43
|
+
this.secondaryToken = secondaryToken;
|
|
44
|
+
this.tokenUrl = tokenUrl;
|
|
45
|
+
this.expires_in = expires_in;
|
|
46
|
+
this.tokensData = tokensData;
|
|
47
|
+
this.keyId = keyId;
|
|
48
|
+
this.logger = logger;
|
|
49
|
+
this.agent = agent;
|
|
50
|
+
this.isNewStructure = isNewStructure;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async getAccessToken(): Promise<string> {
|
|
54
|
+
try {
|
|
55
|
+
const currentTime: any = new Date().getTime();
|
|
56
|
+
|
|
57
|
+
// If there's no secondaryToken (refresh token) and no expires_in,
|
|
58
|
+
// assume it's a long-lived token and return the primaryToken directly
|
|
59
|
+
if (!this.secondaryToken && !this.expires_in) {
|
|
60
|
+
console.log('Using long-lived access token');
|
|
61
|
+
this.logger.debug('Using long-lived access token. If authentication failes, please re-authenticate and try again');
|
|
62
|
+
return this.primaryToken;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Regular token expiration check for tokens with expiration
|
|
66
|
+
// should be alway currentTime >= Number(this.expires_in)
|
|
67
|
+
if (!this.expires_in || currentTime >= Number(this.expires_in)) {
|
|
68
|
+
if (!this.secondaryToken) {
|
|
69
|
+
this.logger.debug('Refresh token is missing. Please re authenticate');
|
|
70
|
+
console.log('Refresh token is missing. Please re authenticate...');
|
|
71
|
+
// Redirect the user to the OAuth authorization URL or initiate the reauthentication flow
|
|
72
|
+
throw new Error('Reauthentication required');
|
|
73
|
+
}
|
|
74
|
+
this.logger.debug('Access token is expired or missing. Refreshing access token...');
|
|
75
|
+
console.log('Access token is expired or missing. Refreshing access token...');
|
|
76
|
+
return await this.refreshAccessToken();
|
|
77
|
+
} else {
|
|
78
|
+
console.log('Access token is still valid');
|
|
79
|
+
this.logger.debug('Access token is still valid.');
|
|
80
|
+
return this.primaryToken;
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
console.error('Error fetching access token:', error);
|
|
84
|
+
this.logger.debug('Error fetching access token');
|
|
85
|
+
throw error;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async refreshAccessToken(): Promise<string> {
|
|
90
|
+
try {
|
|
91
|
+
const response = await axios.post(
|
|
92
|
+
this.tokenUrl,
|
|
93
|
+
new URLSearchParams({
|
|
94
|
+
client_id: this.clientId,
|
|
95
|
+
client_secret: this.clientSecret,
|
|
96
|
+
refresh_token: this.secondaryToken,
|
|
97
|
+
grant_type: 'refresh_token',
|
|
98
|
+
}).toString(),
|
|
99
|
+
{
|
|
100
|
+
headers: {
|
|
101
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
const newAccessToken: string = response?.data?.access_token;
|
|
107
|
+
console.log('Access token refreshed successfully.');
|
|
108
|
+
this.logger.debug('Access token refreshed successfully.');
|
|
109
|
+
const expiresInMilliseconds: number = response?.data?.expires_in ? response?.data?.expires_in * 1000 : response?.data?.expires_in;
|
|
110
|
+
const expirationTimestamp: number = expiresInMilliseconds ? new Date().getTime() + expiresInMilliseconds : expiresInMilliseconds;
|
|
111
|
+
|
|
112
|
+
// Maintain the same structure format when saving
|
|
113
|
+
let updatedData;
|
|
114
|
+
if (this.isNewStructure) {
|
|
115
|
+
// Maintain new structure format
|
|
116
|
+
updatedData = {
|
|
117
|
+
...this.tokensData,
|
|
118
|
+
auth_data: {
|
|
119
|
+
...(this.tokensData?.auth_data ?? {}),
|
|
120
|
+
primary: newAccessToken,
|
|
121
|
+
// Persist rotated refresh_token when provided; fall back to existing
|
|
122
|
+
secondary: (response?.data?.refresh_token ?? this.secondaryToken),
|
|
123
|
+
// Use nullish check so 0 is preserved
|
|
124
|
+
expires_in: (expirationTimestamp ?? undefined) !== undefined ? String(expirationTimestamp) : undefined
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
} else {
|
|
128
|
+
// Maintain old structure format
|
|
129
|
+
updatedData = {
|
|
130
|
+
...this.tokensData,
|
|
131
|
+
primary: newAccessToken,
|
|
132
|
+
expires_in: (expirationTimestamp ?? undefined) !== undefined ? String(expirationTimestamp) : undefined
|
|
133
|
+
};
|
|
134
|
+
// Persist rotated refresh_token when provided; otherwise keep existing
|
|
135
|
+
updatedData.secondary = (response?.data?.refresh_token ?? this.secondaryToken);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const save: any = await managedVault.user(AccessCandidate.agent(this.agent.id)).set(this.keyId, JSON.stringify(updatedData));
|
|
139
|
+
if (save && save.status === 200) {
|
|
140
|
+
console.log('Access token value is updated successfully.');
|
|
141
|
+
this.logger.debug('Access token value is updated successfully.');
|
|
142
|
+
} else {
|
|
143
|
+
console.log('Warning: new access token value is not updated.');
|
|
144
|
+
this.logger.debug('Warning: new access token value is not updated.');
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Update internal tokensData reference
|
|
148
|
+
this.tokensData = updatedData;
|
|
149
|
+
this.primaryToken = newAccessToken;
|
|
150
|
+
// Update in-memory refresh token in case the provider rotated it
|
|
151
|
+
this.secondaryToken = (response?.data?.refresh_token ?? this.secondaryToken);
|
|
152
|
+
// Preserve 0 and avoid dropping undefined
|
|
153
|
+
this.expires_in =
|
|
154
|
+
(expirationTimestamp ?? undefined) !== undefined
|
|
155
|
+
? String(expirationTimestamp)
|
|
156
|
+
: undefined;
|
|
157
|
+
return newAccessToken;
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error('Failed to refresh access token:', error);
|
|
160
|
+
this.logger.debug(`Failed to refresh access token: ${error}`);
|
|
161
|
+
throw new Error('Failed to refresh access token.');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export default AccessTokenManager;
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
import { Agent } from '@sre/AgentManager/Agent.class';
|
|
2
|
-
import { BinaryInput } from '@sre/helpers/BinaryInput.helper';
|
|
3
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
4
|
-
import { isBinaryData, isBinaryMimeType } from '@sre/utils/data.utils';
|
|
5
|
-
import { AxiosResponse } from 'axios';
|
|
6
|
-
import mimeTypeCategories from './mimeTypeCategories';
|
|
7
|
-
|
|
8
|
-
const contentHandlers = {
|
|
9
|
-
json: parseJson,
|
|
10
|
-
text: parseText,
|
|
11
|
-
binary: parseBinary,
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
function parseJson(data) {
|
|
15
|
-
return JSON.parse(Buffer.from(data).toString('utf8') || '{}');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function parseText(data) {
|
|
19
|
-
return Buffer.from(data).toString('utf8');
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
async function parseBinary(data, contentType, agentId) {
|
|
23
|
-
const binaryInput = BinaryInput.from(data, null, contentType);
|
|
24
|
-
const smythFile = await binaryInput.getJsonData(AccessCandidate.agent(agentId));
|
|
25
|
-
|
|
26
|
-
return smythFile;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export async function parseArrayBufferResponse(response: AxiosResponse, agent: Agent): Promise<any> {
|
|
30
|
-
if (!response?.data) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
const data = response.data;
|
|
34
|
-
const contentType = response.headers['content-type'];
|
|
35
|
-
const cleanContentType = contentType?.split(';')[0];
|
|
36
|
-
|
|
37
|
-
// Try to find an exact match first,
|
|
38
|
-
let handlerType = Object.keys(mimeTypeCategories).find((type) => mimeTypeCategories[type].includes(cleanContentType));
|
|
39
|
-
|
|
40
|
-
// If no exact match, try to find a match for the first part of the handlerTypes, some handlers are generic like text/ in that case we check if the handler is a substring of the contentType
|
|
41
|
-
if (!handlerType) {
|
|
42
|
-
handlerType = Object.keys(mimeTypeCategories).find((type) => mimeTypeCategories[type].some((prefix) => cleanContentType?.startsWith(prefix)));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const handler = contentHandlers[handlerType];
|
|
46
|
-
|
|
47
|
-
if (handler) {
|
|
48
|
-
return handler(data, contentType, agent.id);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Fallback: if no content type matches then check if the data is binary
|
|
52
|
-
// If so then parse it as binary, otherwise parse it as text
|
|
53
|
-
if (isBinaryMimeType(contentType) || isBinaryData(data)) {
|
|
54
|
-
return parseBinary(data, contentType, agent.id);
|
|
55
|
-
} else {
|
|
56
|
-
return parseText(data);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
1
|
+
import { Agent } from '@sre/AgentManager/Agent.class';
|
|
2
|
+
import { BinaryInput } from '@sre/helpers/BinaryInput.helper';
|
|
3
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
4
|
+
import { isBinaryData, isBinaryMimeType } from '@sre/utils/data.utils';
|
|
5
|
+
import { AxiosResponse } from 'axios';
|
|
6
|
+
import mimeTypeCategories from './mimeTypeCategories';
|
|
7
|
+
|
|
8
|
+
const contentHandlers = {
|
|
9
|
+
json: parseJson,
|
|
10
|
+
text: parseText,
|
|
11
|
+
binary: parseBinary,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function parseJson(data) {
|
|
15
|
+
return JSON.parse(Buffer.from(data).toString('utf8') || '{}');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function parseText(data) {
|
|
19
|
+
return Buffer.from(data).toString('utf8');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function parseBinary(data, contentType, agentId) {
|
|
23
|
+
const binaryInput = BinaryInput.from(data, null, contentType);
|
|
24
|
+
const smythFile = await binaryInput.getJsonData(AccessCandidate.agent(agentId));
|
|
25
|
+
|
|
26
|
+
return smythFile;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function parseArrayBufferResponse(response: AxiosResponse, agent: Agent): Promise<any> {
|
|
30
|
+
if (!response?.data) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
const data = response.data;
|
|
34
|
+
const contentType = response.headers['content-type'];
|
|
35
|
+
const cleanContentType = contentType?.split(';')[0];
|
|
36
|
+
|
|
37
|
+
// Try to find an exact match first,
|
|
38
|
+
let handlerType = Object.keys(mimeTypeCategories).find((type) => mimeTypeCategories[type].includes(cleanContentType));
|
|
39
|
+
|
|
40
|
+
// If no exact match, try to find a match for the first part of the handlerTypes, some handlers are generic like text/ in that case we check if the handler is a substring of the contentType
|
|
41
|
+
if (!handlerType) {
|
|
42
|
+
handlerType = Object.keys(mimeTypeCategories).find((type) => mimeTypeCategories[type].some((prefix) => cleanContentType?.startsWith(prefix)));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const handler = contentHandlers[handlerType];
|
|
46
|
+
|
|
47
|
+
if (handler) {
|
|
48
|
+
return handler(data, contentType, agent.id);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Fallback: if no content type matches then check if the data is binary
|
|
52
|
+
// If so then parse it as binary, otherwise parse it as text
|
|
53
|
+
if (isBinaryMimeType(contentType) || isBinaryData(data)) {
|
|
54
|
+
return parseBinary(data, contentType, agent.id);
|
|
55
|
+
} else {
|
|
56
|
+
return parseText(data);
|
|
57
|
+
}
|
|
58
|
+
}
|