@samanhappy/mcphub 1.0.31 → 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/betterAuth.js +13 -5
- package/dist/betterAuth.js.map +1 -1
- package/dist/cli/commands/cache.js.map +1 -1
- package/dist/cli/commands/call.js +2 -2
- package/dist/cli/commands/call.js.map +1 -1
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/discover.js.map +1 -1
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/groups.js.map +1 -1
- package/dist/cli/commands/install.js +1 -1
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/keys.js.map +1 -1
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/servers.js.map +1 -1
- package/dist/cli/commands/tools.js +2 -2
- package/dist/cli/commands/tools.js.map +1 -1
- package/dist/cli/context.js +1 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/http.js +3 -1
- package/dist/cli/http.js.map +1 -1
- package/dist/clients/openapi.js +62 -7
- package/dist/clients/openapi.js.map +1 -1
- package/dist/config/DaoConfigService.js +3 -2
- package/dist/config/DaoConfigService.js.map +1 -1
- package/dist/config/configManager.js +9 -8
- package/dist/config/configManager.js.map +1 -1
- package/dist/config/index.js +30 -6
- package/dist/config/index.js.map +1 -1
- package/dist/config/jwt.js +2 -1
- package/dist/config/jwt.js.map +1 -1
- package/dist/config/migrationUtils.js +46 -45
- package/dist/config/migrationUtils.js.map +1 -1
- package/dist/constants/oauthServerDefaults.js.map +1 -1
- package/dist/controllers/activityController.js +6 -5
- package/dist/controllers/activityController.js.map +1 -1
- package/dist/controllers/authController.js +5 -4
- package/dist/controllers/authController.js.map +1 -1
- package/dist/controllers/bearerKeyController.js +7 -6
- package/dist/controllers/bearerKeyController.js.map +1 -1
- package/dist/controllers/betterAuthController.js +2 -1
- package/dist/controllers/betterAuthController.js.map +1 -1
- package/dist/controllers/builtinPromptController.js +13 -5
- package/dist/controllers/builtinPromptController.js.map +1 -1
- package/dist/controllers/builtinResourceController.js +14 -6
- package/dist/controllers/builtinResourceController.js.map +1 -1
- package/dist/controllers/changelogController.js +5 -2
- package/dist/controllers/changelogController.js.map +1 -1
- package/dist/controllers/cloudController.js +11 -10
- package/dist/controllers/cloudController.js.map +1 -1
- package/dist/controllers/configController.js +4 -3
- package/dist/controllers/configController.js.map +1 -1
- package/dist/controllers/contextCostController.js +3 -2
- package/dist/controllers/contextCostController.js.map +1 -1
- package/dist/controllers/groupController.js +2 -1
- package/dist/controllers/groupController.js.map +1 -1
- package/dist/controllers/healthController.js +2 -1
- package/dist/controllers/healthController.js.map +1 -1
- package/dist/controllers/hostedInternalController.js +2 -1
- package/dist/controllers/hostedInternalController.js.map +1 -1
- package/dist/controllers/logController.js +5 -4
- package/dist/controllers/logController.js.map +1 -1
- package/dist/controllers/mcpbController.js +17 -7
- package/dist/controllers/mcpbController.js.map +1 -1
- package/dist/controllers/oauthCallbackController.js +28 -27
- package/dist/controllers/oauthCallbackController.js.map +1 -1
- package/dist/controllers/oauthClientController.js +7 -6
- package/dist/controllers/oauthClientController.js.map +1 -1
- package/dist/controllers/oauthDynamicRegistrationController.js +22 -4
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
- package/dist/controllers/oauthServerController.js +22 -11
- package/dist/controllers/oauthServerController.js.map +1 -1
- package/dist/controllers/openApiController.js +7 -6
- package/dist/controllers/openApiController.js.map +1 -1
- package/dist/controllers/promptController.js +2 -1
- package/dist/controllers/promptController.js.map +1 -1
- package/dist/controllers/registryController.js +4 -3
- package/dist/controllers/registryController.js.map +1 -1
- package/dist/controllers/serverController.js +46 -34
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/controllers/templateController.js +2 -1
- package/dist/controllers/templateController.js.map +1 -1
- package/dist/controllers/toolController.js +2 -1
- package/dist/controllers/toolController.js.map +1 -1
- package/dist/dao/DaoFactory.js +3 -2
- package/dist/dao/DaoFactory.js.map +1 -1
- package/dist/dao/ServerDao.js.map +1 -1
- package/dist/dao/UserConfigDaoDbImpl.js.map +1 -1
- package/dist/dao/UserDao.js.map +1 -1
- package/dist/dao/base/JsonFileBaseDao.js +3 -2
- package/dist/dao/base/JsonFileBaseDao.js.map +1 -1
- package/dist/dao/examples.js +35 -34
- package/dist/dao/examples.js.map +1 -1
- package/dist/db/connection.js +59 -58
- package/dist/db/connection.js.map +1 -1
- package/dist/db/index.js +2 -1
- package/dist/db/index.js.map +1 -1
- package/dist/db/repositories/ServerRepository.js +3 -3
- package/dist/db/repositories/ServerRepository.js.map +1 -1
- package/dist/db/repositories/SystemConfigRepository.js +2 -1
- package/dist/db/repositories/SystemConfigRepository.js.map +1 -1
- package/dist/db/repositories/UserConfigRepository.js.map +1 -1
- package/dist/db/repositories/VectorEmbeddingRepository.js +6 -5
- package/dist/db/repositories/VectorEmbeddingRepository.js.map +1 -1
- package/dist/index.js +28 -19
- package/dist/index.js.map +1 -1
- package/dist/middlewares/auth.js +4 -3
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/middlewares/index.js +2 -1
- package/dist/middlewares/index.js.map +1 -1
- package/dist/middlewares/userContext.js +7 -6
- package/dist/middlewares/userContext.js.map +1 -1
- package/dist/models/OAuth.js +7 -6
- package/dist/models/OAuth.js.map +1 -1
- package/dist/models/User.js +13 -12
- package/dist/models/User.js.map +1 -1
- package/dist/routes/index.js +9 -9
- package/dist/routes/index.js.map +1 -1
- package/dist/scripts/dao-demo.js +28 -27
- package/dist/scripts/dao-demo.js.map +1 -1
- package/dist/server.js +36 -30
- package/dist/server.js.map +1 -1
- package/dist/services/activityLoggingService.js +3 -2
- package/dist/services/activityLoggingService.js.map +1 -1
- package/dist/services/betterAuthConfig.js +1 -4
- package/dist/services/betterAuthConfig.js.map +1 -1
- package/dist/services/betterAuthSession.js +8 -7
- package/dist/services/betterAuthSession.js.map +1 -1
- package/dist/services/changelogService.js +5 -2
- package/dist/services/changelogService.js.map +1 -1
- package/dist/services/cloudService.js +10 -9
- package/dist/services/cloudService.js.map +1 -1
- package/dist/services/contextCostService.js +6 -2
- package/dist/services/contextCostService.js.map +1 -1
- package/dist/services/groupService.js +8 -7
- package/dist/services/groupService.js.map +1 -1
- package/dist/services/hostedAuthService.js +3 -2
- package/dist/services/hostedAuthService.js.map +1 -1
- package/dist/services/hostedControlPlaneClient.js.map +1 -1
- package/dist/services/hostedEventSubscriber.js +9 -8
- package/dist/services/hostedEventSubscriber.js.map +1 -1
- package/dist/services/hostedRuntimeCatalogNames.js +1 -3
- package/dist/services/hostedRuntimeCatalogNames.js.map +1 -1
- package/dist/services/keepAliveService.js +7 -6
- package/dist/services/keepAliveService.js.map +1 -1
- package/dist/services/marketService.js +2 -1
- package/dist/services/marketService.js.map +1 -1
- package/dist/services/mcpOAuthProvider.js +22 -21
- package/dist/services/mcpOAuthProvider.js.map +1 -1
- package/dist/services/mcpService.js +133 -121
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/oauthClientRegistration.js +30 -29
- package/dist/services/oauthClientRegistration.js.map +1 -1
- package/dist/services/oauthServerService.js +22 -17
- package/dist/services/oauthServerService.js.map +1 -1
- package/dist/services/oauthService.js +16 -15
- package/dist/services/oauthService.js.map +1 -1
- package/dist/services/oauthSettingsStore.js +4 -3
- package/dist/services/oauthSettingsStore.js.map +1 -1
- package/dist/services/openApiGeneratorService.js +1 -3
- package/dist/services/openApiGeneratorService.js.map +1 -1
- package/dist/services/registry.js +2 -1
- package/dist/services/registry.js.map +1 -1
- package/dist/services/requestContextService.js.map +1 -1
- package/dist/services/smartRoutingService.js +6 -5
- package/dist/services/smartRoutingService.js.map +1 -1
- package/dist/services/sseService.js +52 -51
- package/dist/services/sseService.js.map +1 -1
- package/dist/services/templateService.js +57 -12
- package/dist/services/templateService.js.map +1 -1
- package/dist/services/toolResultCompressionService.js +8 -5
- package/dist/services/toolResultCompressionService.js.map +1 -1
- package/dist/services/upstreamOAuthDisconnectService.js +9 -6
- package/dist/services/upstreamOAuthDisconnectService.js.map +1 -1
- package/dist/services/userService.js +5 -4
- package/dist/services/userService.js.map +1 -1
- package/dist/services/vectorSearchService.js +126 -112
- package/dist/services/vectorSearchService.js.map +1 -1
- package/dist/utils/cacheUtils.js +5 -4
- package/dist/utils/cacheUtils.js.map +1 -1
- package/dist/utils/corsOrigin.js +42 -0
- package/dist/utils/corsOrigin.js.map +1 -0
- package/dist/utils/dbRetry.js +2 -5
- package/dist/utils/dbRetry.js.map +1 -1
- package/dist/utils/frontendShell.js +2 -1
- package/dist/utils/frontendShell.js.map +1 -1
- package/dist/utils/i18n.js.map +1 -1
- package/dist/utils/logger.js +170 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/migration.js +51 -50
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/parameterConversion.js +2 -1
- package/dist/utils/parameterConversion.js.map +1 -1
- package/dist/utils/path.js +9 -8
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/proxyTrust.js.map +1 -1
- package/dist/utils/rateLimit.js +8 -0
- package/dist/utils/rateLimit.js.map +1 -1
- package/dist/utils/requireAdmin.js +15 -0
- package/dist/utils/requireAdmin.js.map +1 -0
- package/dist/utils/serverConfigPersistence.js.map +1 -1
- package/dist/utils/serverShutdown.js +3 -2
- package/dist/utils/serverShutdown.js.map +1 -1
- package/dist/utils/smartRouting.js +4 -3
- package/dist/utils/smartRouting.js.map +1 -1
- package/dist/utils/ssrf.js +19 -6
- package/dist/utils/ssrf.js.map +1 -1
- package/dist/utils/tokenCost.js.map +1 -1
- package/dist/utils/tokenTruncation.js +9 -4
- package/dist/utils/tokenTruncation.js.map +1 -1
- package/dist/utils/version.js +3 -2
- package/dist/utils/version.js.map +1 -1
- package/frontend/dist/assets/{ActivityPage-Dx53zxEM.js → ActivityPage-C6m1hGLq.js} +2 -2
- package/frontend/dist/assets/{ActivityPage-Dx53zxEM.js.map → ActivityPage-C6m1hGLq.js.map} +1 -1
- package/frontend/dist/assets/{ConfirmDialog-CYfXEuyU.js → ConfirmDialog-BCMNzi21.js} +2 -2
- package/frontend/dist/assets/{ConfirmDialog-CYfXEuyU.js.map → ConfirmDialog-BCMNzi21.js.map} +1 -1
- package/frontend/dist/assets/{Dashboard-ZYVsSvOw.js → Dashboard-DFKfjPff.js} +2 -2
- package/frontend/dist/assets/{Dashboard-ZYVsSvOw.js.map → Dashboard-DFKfjPff.js.map} +1 -1
- package/frontend/dist/assets/{DeleteDialog-DNe-zTEl.js → DeleteDialog-D9ycSRvn.js} +2 -2
- package/frontend/dist/assets/{DeleteDialog-DNe-zTEl.js.map → DeleteDialog-D9ycSRvn.js.map} +1 -1
- package/frontend/dist/assets/{EndpointCopy-ngxLPeDF.js → EndpointCopy-CP_Fb1To.js} +2 -2
- package/frontend/dist/assets/{EndpointCopy-ngxLPeDF.js.map → EndpointCopy-CP_Fb1To.js.map} +1 -1
- package/frontend/dist/assets/{GroupsPage-JPtupGpI.js → GroupsPage-Cwfm5q-a.js} +2 -2
- package/frontend/dist/assets/{GroupsPage-JPtupGpI.js.map → GroupsPage-Cwfm5q-a.js.map} +1 -1
- package/frontend/dist/assets/{LoginPage-B6rU3Ugr.js → LoginPage-CnF44h_n.js} +2 -2
- package/frontend/dist/assets/{LoginPage-B6rU3Ugr.js.map → LoginPage-CnF44h_n.js.map} +1 -1
- package/frontend/dist/assets/{LogsPage-CXq382fb.js → LogsPage-BFIpICsM.js} +2 -2
- package/frontend/dist/assets/{LogsPage-CXq382fb.js.map → LogsPage-BFIpICsM.js.map} +1 -1
- package/frontend/dist/assets/{MarketPage-BGnQQyXK.js → MarketPage-Du-NqiEl.js} +2 -2
- package/frontend/dist/assets/{MarketPage-BGnQQyXK.js.map → MarketPage-Du-NqiEl.js.map} +1 -1
- package/frontend/dist/assets/{OAuthConsentPage-C-n6tv3-.js → OAuthConsentPage-zqXUvKMF.js} +2 -2
- package/frontend/dist/assets/{OAuthConsentPage-C-n6tv3-.js.map → OAuthConsentPage-zqXUvKMF.js.map} +1 -1
- package/frontend/dist/assets/{Pagination-DLSuQ8hw.js → Pagination-Dwko3g48.js} +2 -2
- package/frontend/dist/assets/{Pagination-DLSuQ8hw.js.map → Pagination-Dwko3g48.js.map} +1 -1
- package/frontend/dist/assets/{PromptsPage-BLpy76K4.js → PromptsPage-Cm8ykiI4.js} +2 -2
- package/frontend/dist/assets/{PromptsPage-BLpy76K4.js.map → PromptsPage-Cm8ykiI4.js.map} +1 -1
- package/frontend/dist/assets/{ResourcesPage-C5nynRqE.js → ResourcesPage-UMyO6mQ4.js} +2 -2
- package/frontend/dist/assets/{ResourcesPage-C5nynRqE.js.map → ResourcesPage-UMyO6mQ4.js.map} +1 -1
- package/frontend/dist/assets/{ServersPage-Ca5W9cPW.js → ServersPage-B0RoM8ez.js} +8 -8
- package/frontend/dist/assets/ServersPage-B0RoM8ez.js.map +1 -0
- package/frontend/dist/assets/{SettingsPage-DgFBjp_O.js → SettingsPage-BTB-36-n.js} +2 -2
- package/frontend/dist/assets/{SettingsPage-DgFBjp_O.js.map → SettingsPage-BTB-36-n.js.map} +1 -1
- package/frontend/dist/assets/{StatusDot-CmSkukx0.js → StatusDot-BAMXeT2x.js} +2 -2
- package/frontend/dist/assets/{StatusDot-CmSkukx0.js.map → StatusDot-BAMXeT2x.js.map} +1 -1
- package/frontend/dist/assets/{ToggleGroup-sG_2LQom.js → ToggleGroup-Cfgt5lJo.js} +2 -2
- package/frontend/dist/assets/{ToggleGroup-sG_2LQom.js.map → ToggleGroup-Cfgt5lJo.js.map} +1 -1
- package/frontend/dist/assets/{UsersPage-PHkFXLL8.js → UsersPage-DlzYf7Su.js} +2 -2
- package/frontend/dist/assets/{UsersPage-PHkFXLL8.js.map → UsersPage-DlzYf7Su.js.map} +1 -1
- package/frontend/dist/assets/{contextCost-D_iNNbhX.js → contextCost-kp2vZYp7.js} +2 -2
- package/frontend/dist/assets/{contextCost-D_iNNbhX.js.map → contextCost-kp2vZYp7.js.map} +1 -1
- package/frontend/dist/assets/{framework-vendor-I9Y6AgD5.js → framework-vendor-BHAQX05P.js} +3 -3
- package/frontend/dist/assets/{framework-vendor-I9Y6AgD5.js.map → framework-vendor-BHAQX05P.js.map} +1 -1
- package/frontend/dist/assets/{i18n-vendor-y9bLzIeh.js → i18n-vendor-CMcB7XUR.js} +2 -2
- package/frontend/dist/assets/{i18n-vendor-y9bLzIeh.js.map → i18n-vendor-CMcB7XUR.js.map} +1 -1
- package/frontend/dist/assets/{icons-vendor-BFl4A9fq.js → icons-vendor-HZHHWeTa.js} +2 -2
- package/frontend/dist/assets/{icons-vendor-BFl4A9fq.js.map → icons-vendor-HZHHWeTa.js.map} +1 -1
- package/frontend/dist/assets/{index-CLugsCsy.js → index-CvXw771N.js} +3 -3
- package/frontend/dist/assets/{index-CLugsCsy.js.map → index-CvXw771N.js.map} +1 -1
- package/frontend/dist/assets/{resourceService-33rS8QGJ.js → resourceService-D2QmlFby.js} +2 -2
- package/frontend/dist/assets/{resourceService-33rS8QGJ.js.map → resourceService-D2QmlFby.js.map} +1 -1
- package/frontend/dist/assets/useSettingsData-CeCvZ2nU.js +2 -0
- package/frontend/dist/assets/{useSettingsData-fK2bv9oN.js.map → useSettingsData-CeCvZ2nU.js.map} +1 -1
- package/frontend/dist/assets/{variableDetection-ByJ_cnxa.js → variableDetection-DKPiHkxr.js} +2 -2
- package/frontend/dist/assets/{variableDetection-ByJ_cnxa.js.map → variableDetection-DKPiHkxr.js.map} +1 -1
- package/frontend/dist/index.html +4 -4
- package/package.json +2 -2
- package/frontend/dist/assets/ServersPage-Ca5W9cPW.js.map +0 -1
- package/frontend/dist/assets/useSettingsData-fK2bv9oN.js +0 -2
package/dist/dao/examples.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
1
2
|
/**
|
|
2
3
|
* Data access layer example and test utilities
|
|
3
4
|
*
|
|
@@ -12,22 +13,22 @@ export async function exampleUserOperations() {
|
|
|
12
13
|
const userDao = getUserDao();
|
|
13
14
|
// Create a new user
|
|
14
15
|
const newUser = await userDao.createWithHashedPassword('testuser', 'password123', false);
|
|
15
|
-
|
|
16
|
+
logger.log('Created user:', newUser.username);
|
|
16
17
|
// Find user by username
|
|
17
18
|
const foundUser = await userDao.findByUsername('testuser');
|
|
18
|
-
|
|
19
|
+
logger.log('Found user:', foundUser?.username);
|
|
19
20
|
// Validate credentials
|
|
20
21
|
const isValid = await userDao.validateCredentials('testuser', 'password123');
|
|
21
|
-
|
|
22
|
+
logger.log('Credentials valid:', isValid);
|
|
22
23
|
// Update user
|
|
23
24
|
await userDao.update('testuser', { isAdmin: true });
|
|
24
|
-
|
|
25
|
+
logger.log('Updated user to admin');
|
|
25
26
|
// Find all admin users
|
|
26
27
|
const admins = await userDao.findAdmins();
|
|
27
|
-
|
|
28
|
+
logger.log('Admin users:', admins.map((u) => u.username));
|
|
28
29
|
// Delete user
|
|
29
30
|
await userDao.delete('testuser');
|
|
30
|
-
|
|
31
|
+
logger.log('Deleted test user');
|
|
31
32
|
}
|
|
32
33
|
/**
|
|
33
34
|
* Example usage of ServerDao
|
|
@@ -42,21 +43,21 @@ export async function exampleServerOperations() {
|
|
|
42
43
|
enabled: true,
|
|
43
44
|
owner: 'admin',
|
|
44
45
|
});
|
|
45
|
-
|
|
46
|
+
logger.log('Created server:', newServer.name);
|
|
46
47
|
// Find servers by owner
|
|
47
48
|
const userServers = await serverDao.findByOwner('admin');
|
|
48
|
-
|
|
49
|
+
logger.log('Servers owned by admin:', userServers.map((s) => s.name));
|
|
49
50
|
// Find enabled servers
|
|
50
51
|
const enabledServers = await serverDao.findEnabled();
|
|
51
|
-
|
|
52
|
+
logger.log('Enabled servers:', enabledServers.map((s) => s.name));
|
|
52
53
|
// Update server tools
|
|
53
54
|
await serverDao.updateTools('test-server', {
|
|
54
55
|
tool1: { enabled: true, description: 'Test tool' },
|
|
55
56
|
});
|
|
56
|
-
|
|
57
|
+
logger.log('Updated server tools');
|
|
57
58
|
// Delete server
|
|
58
59
|
await serverDao.delete('test-server');
|
|
59
|
-
|
|
60
|
+
logger.log('Deleted test server');
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Example usage of GroupDao
|
|
@@ -70,22 +71,22 @@ export async function exampleGroupOperations() {
|
|
|
70
71
|
servers: ['server1', 'server2'],
|
|
71
72
|
owner: 'admin',
|
|
72
73
|
});
|
|
73
|
-
|
|
74
|
+
logger.log('Created group:', newGroup.name, 'with ID:', newGroup.id);
|
|
74
75
|
// Find groups by owner
|
|
75
76
|
const userGroups = await groupDao.findByOwner('admin');
|
|
76
|
-
|
|
77
|
+
logger.log('Groups owned by admin:', userGroups.map((g) => g.name));
|
|
77
78
|
// Add server to group
|
|
78
79
|
await groupDao.addServerToGroup(newGroup.id, 'server3');
|
|
79
|
-
|
|
80
|
+
logger.log('Added server3 to group');
|
|
80
81
|
// Find groups containing specific server
|
|
81
82
|
const groupsWithServer = await groupDao.findByServer('server1');
|
|
82
|
-
|
|
83
|
+
logger.log('Groups containing server1:', groupsWithServer.map((g) => g.name));
|
|
83
84
|
// Remove server from group
|
|
84
85
|
await groupDao.removeServerFromGroup(newGroup.id, 'server2');
|
|
85
|
-
|
|
86
|
+
logger.log('Removed server2 from group');
|
|
86
87
|
// Delete group
|
|
87
88
|
await groupDao.delete(newGroup.id);
|
|
88
|
-
|
|
89
|
+
logger.log('Deleted test group');
|
|
89
90
|
}
|
|
90
91
|
/**
|
|
91
92
|
* Example usage of SystemConfigDao
|
|
@@ -94,24 +95,24 @@ export async function exampleSystemConfigOperations() {
|
|
|
94
95
|
const systemConfigDao = getSystemConfigDao();
|
|
95
96
|
// Get current system config
|
|
96
97
|
const currentConfig = await systemConfigDao.get();
|
|
97
|
-
|
|
98
|
+
logger.log('Current system config:', currentConfig);
|
|
98
99
|
// Update routing configuration
|
|
99
100
|
await systemConfigDao.updateSection('routing', {
|
|
100
101
|
enableGlobalRoute: true,
|
|
101
102
|
enableGroupNameRoute: true,
|
|
102
103
|
enableBearerAuth: true,
|
|
103
104
|
});
|
|
104
|
-
|
|
105
|
+
logger.log('Updated routing configuration');
|
|
105
106
|
// Update install configuration
|
|
106
107
|
await systemConfigDao.updateSection('install', {
|
|
107
108
|
pythonIndexUrl: 'https://pypi.org/simple/',
|
|
108
109
|
npmRegistry: 'https://registry.npmjs.org/',
|
|
109
110
|
baseUrl: 'https://mcphub.local',
|
|
110
111
|
});
|
|
111
|
-
|
|
112
|
+
logger.log('Updated install configuration');
|
|
112
113
|
// Get specific section
|
|
113
114
|
const routingConfig = await systemConfigDao.getSection('routing');
|
|
114
|
-
|
|
115
|
+
logger.log('Routing config:', routingConfig);
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
117
118
|
* Example usage of UserConfigDao
|
|
@@ -125,40 +126,40 @@ export async function exampleUserConfigOperations() {
|
|
|
125
126
|
enableGroupNameRoute: true,
|
|
126
127
|
},
|
|
127
128
|
});
|
|
128
|
-
|
|
129
|
+
logger.log('Updated admin user config');
|
|
129
130
|
// Get user configuration
|
|
130
131
|
const adminConfig = await userConfigDao.get('admin');
|
|
131
|
-
|
|
132
|
+
logger.log('Admin config:', adminConfig);
|
|
132
133
|
// Get all user configurations
|
|
133
134
|
const allUserConfigs = await userConfigDao.getAll();
|
|
134
|
-
|
|
135
|
+
logger.log('All user configs:', Object.keys(allUserConfigs));
|
|
135
136
|
// Get specific section for user
|
|
136
137
|
const userRoutingConfig = await userConfigDao.getSection('admin', 'routing');
|
|
137
|
-
|
|
138
|
+
logger.log('Admin routing config:', userRoutingConfig);
|
|
138
139
|
// Delete user configuration
|
|
139
140
|
await userConfigDao.delete('admin');
|
|
140
|
-
|
|
141
|
+
logger.log('Deleted admin user config');
|
|
141
142
|
}
|
|
142
143
|
/**
|
|
143
144
|
* Test all DAO operations
|
|
144
145
|
*/
|
|
145
146
|
export async function testAllDaoOperations() {
|
|
146
147
|
try {
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
logger.log('=== Testing DAO Layer ===');
|
|
149
|
+
logger.log('\n--- User Operations ---');
|
|
149
150
|
await exampleUserOperations();
|
|
150
|
-
|
|
151
|
+
logger.log('\n--- Server Operations ---');
|
|
151
152
|
await exampleServerOperations();
|
|
152
|
-
|
|
153
|
+
logger.log('\n--- Group Operations ---');
|
|
153
154
|
await exampleGroupOperations();
|
|
154
|
-
|
|
155
|
+
logger.log('\n--- System Config Operations ---');
|
|
155
156
|
await exampleSystemConfigOperations();
|
|
156
|
-
|
|
157
|
+
logger.log('\n--- User Config Operations ---');
|
|
157
158
|
await exampleUserConfigOperations();
|
|
158
|
-
|
|
159
|
+
logger.log('\n=== DAO Layer Test Complete ===');
|
|
159
160
|
}
|
|
160
161
|
catch (error) {
|
|
161
|
-
|
|
162
|
+
logger.error('Error during DAO testing:', error);
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
165
|
/**
|
package/dist/dao/examples.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/dao/examples.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,oBAAoB;IACpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,wBAAwB,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IACzF,
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["../../src/dao/examples.ts"],"names":[],"mappings":"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"}
|
package/dist/db/connection.js
CHANGED
|
@@ -6,6 +6,7 @@ import { VectorEmbeddingSubscriber } from './subscribers/VectorEmbeddingSubscrib
|
|
|
6
6
|
import { getSmartRoutingConfig } from '../utils/smartRouting.js';
|
|
7
7
|
import { createVectorIndex } from '../services/vectorSearchService.js';
|
|
8
8
|
import { isRetryableDbError } from '../utils/dbRetry.js';
|
|
9
|
+
import { logger } from '../utils/logger.js';
|
|
9
10
|
// Connection pool and retry configuration
|
|
10
11
|
const CONNECTION_CONFIG = {
|
|
11
12
|
// Connection pool settings
|
|
@@ -29,19 +30,19 @@ let reconnectionPromise = null;
|
|
|
29
30
|
const createRequiredExtensions = async (dataSource) => {
|
|
30
31
|
try {
|
|
31
32
|
await dataSource.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";');
|
|
32
|
-
|
|
33
|
+
logger.log('UUID extension created or already exists.');
|
|
33
34
|
}
|
|
34
35
|
catch (err) {
|
|
35
|
-
|
|
36
|
-
|
|
36
|
+
logger.warn('Failed to create uuid-ossp extension:', err.message);
|
|
37
|
+
logger.warn('UUID generation functionality may not be available.');
|
|
37
38
|
}
|
|
38
39
|
try {
|
|
39
40
|
await dataSource.query('CREATE EXTENSION IF NOT EXISTS vector;');
|
|
40
|
-
|
|
41
|
+
logger.log('Vector extension created or already exists.');
|
|
41
42
|
}
|
|
42
43
|
catch (err) {
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
logger.warn('Failed to create vector extension:', err.message);
|
|
45
|
+
logger.warn('Vector functionality may not be available.');
|
|
45
46
|
}
|
|
46
47
|
};
|
|
47
48
|
// Get database URL from smart routing config or fallback to environment variable
|
|
@@ -60,7 +61,7 @@ const ensureEmbeddingColumnIsVector = async (dataSource) => {
|
|
|
60
61
|
ALTER TABLE vector_embeddings
|
|
61
62
|
ADD COLUMN embedding vector;
|
|
62
63
|
`);
|
|
63
|
-
|
|
64
|
+
logger.log('Created missing embedding column with vector type.');
|
|
64
65
|
return;
|
|
65
66
|
}
|
|
66
67
|
const isVectorType = columnType[0].udt_name === 'vector' || columnType[0].data_type === 'vector';
|
|
@@ -71,7 +72,7 @@ const ensureEmbeddingColumnIsVector = async (dataSource) => {
|
|
|
71
72
|
ALTER TABLE vector_embeddings
|
|
72
73
|
ALTER COLUMN embedding TYPE vector USING embedding::vector;
|
|
73
74
|
`);
|
|
74
|
-
|
|
75
|
+
logger.log('Vector embedding column type updated successfully.');
|
|
75
76
|
};
|
|
76
77
|
// Default database configuration with connection pooling
|
|
77
78
|
const getDefaultConfig = async () => {
|
|
@@ -107,7 +108,7 @@ export const updateDataSourceConfig = async () => {
|
|
|
107
108
|
const currentUrl = appDataSource.options.url;
|
|
108
109
|
const newUrl = newConfig.url;
|
|
109
110
|
if (currentUrl !== newUrl) {
|
|
110
|
-
|
|
111
|
+
logger.log('Database URL configuration changed, updating DataSource...');
|
|
111
112
|
appDataSource = new DataSource(newConfig);
|
|
112
113
|
// Reset initialization promise when configuration changes
|
|
113
114
|
initializationPromise = null;
|
|
@@ -132,7 +133,7 @@ export const reconnectDatabase = async () => {
|
|
|
132
133
|
return await attemptReconnection();
|
|
133
134
|
}
|
|
134
135
|
catch (error) {
|
|
135
|
-
|
|
136
|
+
logger.error('Error during database reconnection:', error);
|
|
136
137
|
throw error;
|
|
137
138
|
}
|
|
138
139
|
};
|
|
@@ -140,19 +141,19 @@ export const reconnectDatabase = async () => {
|
|
|
140
141
|
export const initializeDatabase = async () => {
|
|
141
142
|
// If initialization is already in progress, wait for it to complete
|
|
142
143
|
if (initializationPromise) {
|
|
143
|
-
|
|
144
|
+
logger.log('Database initialization already in progress, waiting for completion...');
|
|
144
145
|
return initializationPromise;
|
|
145
146
|
}
|
|
146
147
|
// If already initialized, return the existing instance
|
|
147
148
|
if (appDataSource && appDataSource.isInitialized) {
|
|
148
|
-
|
|
149
|
+
logger.log('Database already initialized, returning existing instance');
|
|
149
150
|
return Promise.resolve(appDataSource);
|
|
150
151
|
}
|
|
151
152
|
// Create a new initialization promise
|
|
152
153
|
initializationPromise = performDatabaseInitialization();
|
|
153
154
|
try {
|
|
154
155
|
const result = await initializationPromise;
|
|
155
|
-
|
|
156
|
+
logger.log('Database initialization completed successfully');
|
|
156
157
|
// Start health check after successful initialization
|
|
157
158
|
isHealthy = true;
|
|
158
159
|
startHealthCheck();
|
|
@@ -161,7 +162,7 @@ export const initializeDatabase = async () => {
|
|
|
161
162
|
catch (error) {
|
|
162
163
|
// Reset the promise on error so initialization can be retried
|
|
163
164
|
initializationPromise = null;
|
|
164
|
-
|
|
165
|
+
logger.error('Database initialization failed:', error);
|
|
165
166
|
throw error;
|
|
166
167
|
}
|
|
167
168
|
};
|
|
@@ -171,7 +172,7 @@ const performDatabaseInitialization = async () => {
|
|
|
171
172
|
// Update configuration before initializing
|
|
172
173
|
appDataSource = await updateDataSourceConfig();
|
|
173
174
|
if (!appDataSource.isInitialized) {
|
|
174
|
-
|
|
175
|
+
logger.log('Initializing database connection...');
|
|
175
176
|
// Register the vector type with TypeORM
|
|
176
177
|
await appDataSource.initialize();
|
|
177
178
|
registerPostgresVectorType(appDataSource);
|
|
@@ -197,7 +198,7 @@ const performDatabaseInitialization = async () => {
|
|
|
197
198
|
// vector_embeddings has synchronize:false on the entity (prevents the
|
|
198
199
|
// TypeORM DROP+ADD cycle that nulls stored embeddings on every startup).
|
|
199
200
|
// Create the table manually so new installations work correctly.
|
|
200
|
-
|
|
201
|
+
logger.log('Creating vector_embeddings table...');
|
|
201
202
|
await appDataSource.query(`
|
|
202
203
|
CREATE TABLE IF NOT EXISTS vector_embeddings (
|
|
203
204
|
id uuid NOT NULL DEFAULT uuid_generate_v4() PRIMARY KEY,
|
|
@@ -232,25 +233,25 @@ const performDatabaseInitialization = async () => {
|
|
|
232
233
|
`);
|
|
233
234
|
}
|
|
234
235
|
catch (idxError) {
|
|
235
|
-
|
|
236
|
+
logger.warn('Could not create unique index on vector_embeddings:', idxError.message);
|
|
236
237
|
}
|
|
237
238
|
if (tableExists[0].exists || justCreated) {
|
|
238
239
|
// Add pgvector support via raw SQL commands
|
|
239
|
-
|
|
240
|
+
logger.log('Configuring vector support for embeddings table...');
|
|
240
241
|
// Step 1: Drop any existing index on the column
|
|
241
242
|
try {
|
|
242
243
|
await appDataSource.query(`DROP INDEX IF EXISTS idx_vector_embeddings_embedding;`);
|
|
243
244
|
}
|
|
244
245
|
catch (dropError) {
|
|
245
|
-
|
|
246
|
+
logger.warn('Note: Could not drop existing index:', dropError.message);
|
|
246
247
|
}
|
|
247
248
|
// Step 2: Ensure embedding column exists and uses vector type
|
|
248
249
|
try {
|
|
249
250
|
await ensureEmbeddingColumnIsVector(appDataSource);
|
|
250
251
|
}
|
|
251
252
|
catch (alterError) {
|
|
252
|
-
|
|
253
|
-
|
|
253
|
+
logger.warn('Could not alter embedding column type:', alterError.message);
|
|
254
|
+
logger.warn('Will try to recreate the table later.');
|
|
254
255
|
}
|
|
255
256
|
// Step 3: Try to create appropriate indices
|
|
256
257
|
try {
|
|
@@ -261,10 +262,10 @@ const performDatabaseInitialization = async () => {
|
|
|
261
262
|
let dimensions = 1536; // Default to common OpenAI embedding size
|
|
262
263
|
if (records && records.length > 0 && records[0].dimensions) {
|
|
263
264
|
dimensions = records[0].dimensions;
|
|
264
|
-
|
|
265
|
+
logger.log(`Found vector dimension from existing data: ${dimensions}`);
|
|
265
266
|
}
|
|
266
267
|
else {
|
|
267
|
-
|
|
268
|
+
logger.log(`Using default vector dimension: ${dimensions} (no existing data found)`);
|
|
268
269
|
}
|
|
269
270
|
// Set the vector dimensions explicitly only if table has data
|
|
270
271
|
if (records && records.length > 0) {
|
|
@@ -275,29 +276,29 @@ const performDatabaseInitialization = async () => {
|
|
|
275
276
|
// Create appropriate vector index using the helper function
|
|
276
277
|
const result = await createVectorIndex(appDataSource, dimensions);
|
|
277
278
|
if (!result.success) {
|
|
278
|
-
|
|
279
|
+
logger.log('Continuing without optimized vector index...');
|
|
279
280
|
}
|
|
280
281
|
}
|
|
281
282
|
else {
|
|
282
|
-
|
|
283
|
+
logger.log('No existing vector data found, skipping index creation - will be handled by vector service.');
|
|
283
284
|
}
|
|
284
285
|
}
|
|
285
286
|
catch (indexError) {
|
|
286
|
-
|
|
287
|
-
|
|
287
|
+
logger.warn('Vector index creation failed:', indexError.message);
|
|
288
|
+
logger.warn('Vector search will work but may be slower without an optimized index.');
|
|
288
289
|
}
|
|
289
290
|
}
|
|
290
291
|
}
|
|
291
292
|
catch (error) {
|
|
292
|
-
|
|
293
|
-
|
|
293
|
+
logger.warn('Could not set up vector column/index:', error.message);
|
|
294
|
+
logger.warn('Will attempt again after schema synchronization.');
|
|
294
295
|
}
|
|
295
|
-
|
|
296
|
+
logger.log('Database connection established successfully.');
|
|
296
297
|
// Run one final setup check after schema synchronization is done
|
|
297
298
|
const config = await getDefaultConfig();
|
|
298
299
|
if (config.synchronize) {
|
|
299
300
|
try {
|
|
300
|
-
|
|
301
|
+
logger.log('Running final vector configuration check...');
|
|
301
302
|
// Try setup again with the same code from above
|
|
302
303
|
const tableExists = await appDataSource.query(`
|
|
303
304
|
SELECT EXISTS (
|
|
@@ -307,12 +308,12 @@ const performDatabaseInitialization = async () => {
|
|
|
307
308
|
);
|
|
308
309
|
`);
|
|
309
310
|
if (tableExists[0].exists) {
|
|
310
|
-
|
|
311
|
+
logger.log('Vector embeddings table found, checking configuration...');
|
|
311
312
|
try {
|
|
312
313
|
await ensureEmbeddingColumnIsVector(appDataSource);
|
|
313
314
|
}
|
|
314
315
|
catch (alterError) {
|
|
315
|
-
|
|
316
|
+
logger.warn('Could not ensure embedding column type in final check:', alterError.message);
|
|
316
317
|
}
|
|
317
318
|
// Get the dimension size first
|
|
318
319
|
try {
|
|
@@ -323,37 +324,37 @@ const performDatabaseInitialization = async () => {
|
|
|
323
324
|
// Only proceed if we have existing data, otherwise let vector service handle it
|
|
324
325
|
if (records && records.length > 0 && records[0].dimensions) {
|
|
325
326
|
const dimensions = records[0].dimensions;
|
|
326
|
-
|
|
327
|
+
logger.log(`Found vector dimension from database: ${dimensions}`);
|
|
327
328
|
// Ensure column type is vector with explicit dimensions
|
|
328
329
|
await appDataSource.query(`
|
|
329
330
|
ALTER TABLE vector_embeddings
|
|
330
331
|
ALTER COLUMN embedding TYPE vector(${dimensions});
|
|
331
332
|
`);
|
|
332
|
-
|
|
333
|
+
logger.log('Vector embedding column type updated in final check.');
|
|
333
334
|
// Create appropriate vector index using the helper function
|
|
334
335
|
const result = await createVectorIndex(appDataSource, dimensions);
|
|
335
336
|
if (!result.success) {
|
|
336
|
-
|
|
337
|
+
logger.log('Continuing without optimized vector index...');
|
|
337
338
|
}
|
|
338
339
|
}
|
|
339
340
|
else {
|
|
340
|
-
|
|
341
|
+
logger.log('No existing vector data found, vector dimensions will be configured by vector service.');
|
|
341
342
|
}
|
|
342
343
|
}
|
|
343
344
|
catch (setupError) {
|
|
344
|
-
|
|
345
|
+
logger.warn('Vector setup in final check failed:', setupError.message);
|
|
345
346
|
}
|
|
346
347
|
}
|
|
347
348
|
}
|
|
348
349
|
catch (error) {
|
|
349
|
-
|
|
350
|
+
logger.warn('Post-initialization vector setup failed:', error.message);
|
|
350
351
|
}
|
|
351
352
|
}
|
|
352
353
|
}
|
|
353
354
|
return appDataSource;
|
|
354
355
|
}
|
|
355
356
|
catch (error) {
|
|
356
|
-
|
|
357
|
+
logger.error('Error during database initialization:', error);
|
|
357
358
|
throw error;
|
|
358
359
|
}
|
|
359
360
|
};
|
|
@@ -380,14 +381,14 @@ export const checkDatabaseHealth = async () => {
|
|
|
380
381
|
if (!appDataSource.isInitialized) {
|
|
381
382
|
isHealthy = false;
|
|
382
383
|
lastHealthCheckError = new Error('Database not initialized');
|
|
383
|
-
|
|
384
|
+
logger.log('[DB Health] DataSource is disconnected, attempting reconnection...');
|
|
384
385
|
try {
|
|
385
386
|
await attemptReconnection();
|
|
386
387
|
return true;
|
|
387
388
|
}
|
|
388
389
|
catch (error) {
|
|
389
390
|
lastHealthCheckError = error instanceof Error ? error : new Error(String(error));
|
|
390
|
-
|
|
391
|
+
logger.error('[DB Health] Reconnection attempt failed:', lastHealthCheckError.message);
|
|
391
392
|
return false;
|
|
392
393
|
}
|
|
393
394
|
}
|
|
@@ -401,10 +402,10 @@ export const checkDatabaseHealth = async () => {
|
|
|
401
402
|
catch (error) {
|
|
402
403
|
isHealthy = false;
|
|
403
404
|
lastHealthCheckError = error instanceof Error ? error : new Error(String(error));
|
|
404
|
-
|
|
405
|
+
logger.warn('[DB Health] Health check failed:', lastHealthCheckError.message);
|
|
405
406
|
// If it's a retryable error, attempt reconnection
|
|
406
407
|
if (isRetryableDbError(error)) {
|
|
407
|
-
|
|
408
|
+
logger.log('[DB Health] Detected connection issue, attempting reconnection...');
|
|
408
409
|
try {
|
|
409
410
|
await attemptReconnection();
|
|
410
411
|
return true;
|
|
@@ -412,7 +413,7 @@ export const checkDatabaseHealth = async () => {
|
|
|
412
413
|
catch (reconnectError) {
|
|
413
414
|
lastHealthCheckError =
|
|
414
415
|
reconnectError instanceof Error ? reconnectError : new Error(String(reconnectError));
|
|
415
|
-
|
|
416
|
+
logger.error('[DB Health] Reconnection attempt failed:', lastHealthCheckError.message);
|
|
416
417
|
}
|
|
417
418
|
}
|
|
418
419
|
return false;
|
|
@@ -423,7 +424,7 @@ export const startHealthCheck = () => {
|
|
|
423
424
|
if (!CONNECTION_CONFIG.enableHealthCheck || healthCheckInterval) {
|
|
424
425
|
return;
|
|
425
426
|
}
|
|
426
|
-
|
|
427
|
+
logger.log(`[DB Health] Starting health check (interval: ${CONNECTION_CONFIG.healthCheckIntervalMs}ms)`);
|
|
427
428
|
healthCheckInterval = setInterval(async () => {
|
|
428
429
|
await checkDatabaseHealth();
|
|
429
430
|
}, CONNECTION_CONFIG.healthCheckIntervalMs);
|
|
@@ -435,18 +436,18 @@ export const stopHealthCheck = () => {
|
|
|
435
436
|
if (healthCheckInterval) {
|
|
436
437
|
clearInterval(healthCheckInterval);
|
|
437
438
|
healthCheckInterval = null;
|
|
438
|
-
|
|
439
|
+
logger.log('[DB Health] Health check stopped');
|
|
439
440
|
}
|
|
440
441
|
};
|
|
441
442
|
// Attempt to reconnect to the database with retries
|
|
442
443
|
const attemptReconnection = () => {
|
|
443
444
|
if (reconnectionPromise) {
|
|
444
|
-
|
|
445
|
+
logger.log('[DB Reconnect] Reconnection already in progress, waiting...');
|
|
445
446
|
return reconnectionPromise;
|
|
446
447
|
}
|
|
447
448
|
const promise = (async () => {
|
|
448
449
|
reconnectionInProgress = true;
|
|
449
|
-
|
|
450
|
+
logger.log('[DB Reconnect] Starting reconnection attempt...');
|
|
450
451
|
try {
|
|
451
452
|
if (!appDataSource) {
|
|
452
453
|
return await initializeDatabase();
|
|
@@ -454,11 +455,11 @@ const attemptReconnection = () => {
|
|
|
454
455
|
const dataSource = appDataSource;
|
|
455
456
|
if (dataSource.isInitialized) {
|
|
456
457
|
try {
|
|
457
|
-
|
|
458
|
+
logger.log('[DB Reconnect] Closing existing connection...');
|
|
458
459
|
await dataSource.destroy();
|
|
459
460
|
}
|
|
460
461
|
catch (closeError) {
|
|
461
|
-
|
|
462
|
+
logger.warn('[DB Reconnect] Error closing connection:', closeError.message);
|
|
462
463
|
// TypeORM only clears this flag after driver.disconnect() succeeds.
|
|
463
464
|
// If the driver pool is already gone, destroy() throws first and leaves
|
|
464
465
|
// the DataSource incorrectly marked as initialized.
|
|
@@ -468,35 +469,35 @@ const attemptReconnection = () => {
|
|
|
468
469
|
let lastError = null;
|
|
469
470
|
for (let attempt = 1; attempt <= CONNECTION_CONFIG.maxConnectionRetries; attempt++) {
|
|
470
471
|
try {
|
|
471
|
-
|
|
472
|
+
logger.log(`[DB Reconnect] Connection attempt ${attempt}/${CONNECTION_CONFIG.maxConnectionRetries}...`);
|
|
472
473
|
await dataSource.initialize();
|
|
473
474
|
registerPostgresVectorType(dataSource);
|
|
474
475
|
appDataSource = dataSource;
|
|
475
|
-
|
|
476
|
+
logger.log('[DB Reconnect] Successfully reconnected to database');
|
|
476
477
|
isHealthy = true;
|
|
477
478
|
lastHealthCheckError = null;
|
|
478
479
|
return dataSource;
|
|
479
480
|
}
|
|
480
481
|
catch (error) {
|
|
481
482
|
lastError = error instanceof Error ? error : new Error(String(error));
|
|
482
|
-
|
|
483
|
+
logger.warn(`[DB Reconnect] Attempt ${attempt} failed: ${lastError.message}`);
|
|
483
484
|
if (dataSource.isInitialized) {
|
|
484
485
|
try {
|
|
485
486
|
await dataSource.destroy();
|
|
486
487
|
}
|
|
487
488
|
catch (destroyError) {
|
|
488
|
-
|
|
489
|
+
logger.warn('[DB Reconnect] Error cleaning up partially initialized connection:', destroyError.message);
|
|
489
490
|
Object.assign(dataSource, { isInitialized: false });
|
|
490
491
|
}
|
|
491
492
|
}
|
|
492
493
|
if (attempt < CONNECTION_CONFIG.maxConnectionRetries) {
|
|
493
494
|
const delay = CONNECTION_CONFIG.connectionRetryDelayMs * Math.pow(2, attempt - 1);
|
|
494
|
-
|
|
495
|
+
logger.log(`[DB Reconnect] Waiting ${delay}ms before next attempt...`);
|
|
495
496
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
496
497
|
}
|
|
497
498
|
}
|
|
498
499
|
}
|
|
499
|
-
|
|
500
|
+
logger.error(`[DB Reconnect] Failed to reconnect after ${CONNECTION_CONFIG.maxConnectionRetries} attempts`);
|
|
500
501
|
lastHealthCheckError = lastError;
|
|
501
502
|
throw lastError || new Error('Database reconnection failed');
|
|
502
503
|
}
|
|
@@ -519,7 +520,7 @@ export const closeDatabase = async () => {
|
|
|
519
520
|
stopHealthCheck();
|
|
520
521
|
if (appDataSource && appDataSource.isInitialized) {
|
|
521
522
|
await appDataSource.destroy();
|
|
522
|
-
|
|
523
|
+
logger.log('Database connection closed.');
|
|
523
524
|
}
|
|
524
525
|
isHealthy = false;
|
|
525
526
|
};
|