@harperfast/harper-pro 5.0.25 → 5.1.0-beta.1
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/analytics/profile.ts +4 -0
- package/core/AGENTS.md +92 -6
- package/core/DESIGN.md +24 -0
- package/core/README.md +11 -10
- package/core/agent/agent.ts +203 -0
- package/core/agent/loop.ts +205 -0
- package/core/agent/operations.ts +148 -0
- package/core/agent/session.ts +187 -0
- package/core/agent/tools/fsTools.ts +276 -0
- package/core/agent/tools/httpFetchTool.ts +112 -0
- package/core/agent/tools/scheduleTool.ts +68 -0
- package/core/agent/toolset.ts +43 -0
- package/core/agent/types.ts +85 -0
- package/core/benchmarks/hnsw-search.js +157 -0
- package/core/benchmarks/ycsb/README.md +144 -0
- package/core/benchmarks/ycsb/analyze-profile.mts +120 -0
- package/core/benchmarks/ycsb/app/config.yaml +3 -0
- package/core/benchmarks/ycsb/app/schema.graphql +17 -0
- package/core/benchmarks/ycsb/harness.mts +328 -0
- package/core/benchmarks/ycsb/restClient.mts +120 -0
- package/core/benchmarks/ycsb/run-single-node.mts +97 -0
- package/core/benchmarks/ycsb/to-benchmark-json.mts +58 -0
- package/core/benchmarks/ycsb/workload.mts +499 -0
- package/core/benchmarks/ycsb/workload.test.mts +174 -0
- package/core/bin/{BinObjects.js → BinObjects.ts} +4 -5
- package/core/bin/cliCredentials.ts +133 -0
- package/core/bin/cliOperations.ts +339 -0
- package/core/bin/copyDb.ts +10 -10
- package/core/bin/deployRenderer.ts +196 -0
- package/core/bin/{harper.js → harper.ts} +48 -24
- package/core/bin/{install.js → install.ts} +3 -3
- package/core/bin/lite.ts +2 -0
- package/core/bin/login.ts +168 -0
- package/core/bin/logout.ts +11 -0
- package/core/bin/mcp/client.ts +407 -0
- package/core/bin/mcp/doctor.ts +189 -0
- package/core/bin/mcp/index.ts +80 -0
- package/core/bin/mcp/options.ts +122 -0
- package/core/bin/mcp/printConfig.ts +89 -0
- package/core/bin/multipartBuilder.ts +74 -0
- package/core/bin/{restart.js → restart.ts} +31 -32
- package/core/bin/{run.js → run.ts} +57 -46
- package/core/bin/sseConsumer.ts +126 -0
- package/core/bin/{status.js → status.ts} +10 -10
- package/core/bin/stop.ts +21 -0
- package/core/bin/upgrade.js +6 -6
- package/core/components/Application.ts +144 -18
- package/core/components/ApplicationScope.ts +2 -2
- package/core/components/ComponentV1.ts +2 -2
- package/core/components/EntryHandler.ts +159 -9
- package/core/components/OptionsWatcher.ts +75 -11
- package/core/components/Scope.ts +125 -15
- package/core/components/anthropic/index.ts +547 -0
- package/core/components/bedrock/index.ts +823 -0
- package/core/components/componentLoader.ts +63 -32
- package/core/components/deployLifecycle.ts +161 -0
- package/core/components/deploymentOperations.ts +173 -0
- package/core/components/deploymentRecorder.ts +402 -0
- package/core/components/deriveURLPath.ts +4 -4
- package/core/components/mcp/adapters/fastify.ts +87 -0
- package/core/components/mcp/adapters/harperHttp.ts +103 -0
- package/core/components/mcp/audit.ts +75 -0
- package/core/components/mcp/index.ts +134 -0
- package/core/components/mcp/jsonrpc.ts +134 -0
- package/core/components/mcp/lifecycle.ts +105 -0
- package/core/components/mcp/listChanged.ts +270 -0
- package/core/components/mcp/rateLimit.ts +217 -0
- package/core/components/mcp/resources.ts +593 -0
- package/core/components/mcp/session.ts +151 -0
- package/core/components/mcp/sessionRegistry.ts +140 -0
- package/core/components/mcp/toolRegistry.ts +292 -0
- package/core/components/mcp/tools/application.ts +603 -0
- package/core/components/mcp/tools/operations.ts +283 -0
- package/core/components/mcp/tools/schemas/derive.ts +256 -0
- package/core/components/mcp/tools/schemas/operations.ts +245 -0
- package/core/components/mcp/transport.ts +517 -0
- package/core/components/ollama/index.ts +316 -0
- package/core/components/openai/index.ts +563 -0
- package/core/components/operations.js +211 -60
- package/core/components/operationsValidation.js +3 -3
- package/core/components/packageComponent.ts +97 -29
- package/core/components/requestRestart.ts +17 -2
- package/core/components/status/crossThread.ts +14 -5
- package/core/components/status/errors.ts +1 -1
- package/core/config/RootConfigWatcher.ts +56 -2
- package/core/config/configUtils.js +29 -8
- package/core/config/harperConfigEnvVars.ts +1 -1
- package/core/dataLayer/{CreateAttributeObject.js → CreateAttributeObject.ts} +4 -3
- package/core/dataLayer/{CreateTableObject.js → CreateTableObject.ts} +2 -1
- package/core/dataLayer/{DataLayerObjects.js → DataLayerObjects.ts} +17 -9
- package/core/dataLayer/{DeleteBeforeObject.js → DeleteBeforeObject.ts} +2 -1
- package/core/dataLayer/{DeleteObject.js → DeleteObject.ts} +3 -2
- package/core/dataLayer/{DropAttributeObject.js → DropAttributeObject.ts} +2 -1
- package/core/dataLayer/{GetBackupObject.js → GetBackupObject.ts} +3 -2
- package/core/dataLayer/{InsertObject.js → InsertObject.ts} +3 -2
- package/core/dataLayer/{ReadAuditLogObject.js → ReadAuditLogObject.ts} +3 -2
- package/core/dataLayer/{SQLSearch.js → SQLSearch.ts} +97 -43
- package/core/dataLayer/{SearchByConditionsObject.js → SearchByConditionsObject.ts} +5 -6
- package/core/dataLayer/{SearchByHashObject.js → SearchByHashObject.ts} +2 -1
- package/core/dataLayer/{SearchObject.js → SearchObject.ts} +2 -1
- package/core/dataLayer/{SqlSearchObject.js → SqlSearchObject.ts} +2 -1
- package/core/dataLayer/{UpdateObject.js → UpdateObject.ts} +3 -2
- package/core/dataLayer/{UpsertObject.js → UpsertObject.ts} +3 -2
- package/core/dataLayer/{bulkLoad.js → bulkLoad.ts} +40 -49
- package/core/dataLayer/{delete.js → delete.ts} +21 -26
- package/core/dataLayer/{export.js → export.ts} +22 -26
- package/core/dataLayer/{getBackup.js → getBackup.ts} +7 -9
- package/core/dataLayer/harperBridge/BridgeMethods.ts +102 -0
- package/core/dataLayer/harperBridge/ResourceBridge.ts +27 -26
- package/core/dataLayer/harperBridge/TableSizeObject.ts +1 -0
- package/core/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
- package/core/dataLayer/harperBridge/{harperBridge.js → harperBridge.ts} +3 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +8 -6
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +6 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +5 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +6 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +5 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +3 -2
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +10 -8
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +4 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +6 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +2 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +3 -2
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +5 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +6 -3
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.ts +1 -1
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
- package/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
- package/core/dataLayer/{hdbInfoController.js → hdbInfoController.ts} +20 -26
- package/core/dataLayer/{insert.js → insert.ts} +24 -24
- package/core/dataLayer/{readAuditLog.js → readAuditLog.ts} +8 -10
- package/core/dataLayer/{schema.js → schema.ts} +32 -44
- package/core/dataLayer/{schemaDescribe.js → schemaDescribe.ts} +23 -26
- package/core/dataLayer/{search.js → search.ts} +9 -15
- package/core/dataLayer/{transaction.js → transaction.ts} +2 -5
- package/core/dataLayer/{update.js → update.ts} +19 -22
- package/core/index.ts +5 -0
- package/core/json/systemSchema.json +65 -0
- package/core/launchServiceScripts/utility/checkNodeVersion.js +2 -0
- package/core/package-lock.json +9051 -4318
- package/core/resources/DESIGN.md +98 -0
- package/core/resources/DatabaseTransaction.ts +58 -30
- package/core/resources/ErrorResource.ts +2 -1
- package/core/resources/LMDBTransaction.ts +38 -29
- package/core/resources/RecordEncoder.ts +12 -4
- package/core/resources/RequestTarget.ts +2 -0
- package/core/resources/Resource.ts +89 -56
- package/core/resources/ResourceInterface.ts +44 -21
- package/core/resources/Resources.ts +8 -8
- package/core/resources/RocksIndexStore.ts +3 -0
- package/core/resources/RocksTransactionLogStore.ts +47 -28
- package/core/resources/Table.ts +386 -214
- package/core/resources/analytics/metadata.ts +1 -0
- package/core/resources/analytics/read.ts +24 -6
- package/core/resources/analytics/write.ts +240 -17
- package/core/resources/auditStore.ts +28 -19
- package/core/resources/blob.ts +53 -53
- package/core/resources/dataLoader.ts +4 -4
- package/core/resources/databases.ts +190 -71
- package/core/resources/graphql.ts +227 -164
- package/core/resources/indexes/HierarchicalNavigableSmallWorld.ts +294 -65
- package/core/resources/indexes/vector.ts +17 -0
- package/core/resources/loadEnv.ts +21 -17
- package/core/resources/login.ts +5 -3
- package/core/resources/models/Models.ts +304 -0
- package/core/resources/models/TestBackend.ts +83 -0
- package/core/resources/models/agentLoop.ts +895 -0
- package/core/resources/models/analyticsTable.ts +199 -0
- package/core/resources/models/backendHelpers.ts +116 -0
- package/core/resources/models/backendRegistry.ts +66 -0
- package/core/resources/models/bootstrap.ts +135 -0
- package/core/resources/models/embedHook.ts +138 -0
- package/core/resources/models/types.ts +296 -0
- package/core/resources/replayLogs.ts +15 -7
- package/core/resources/roles.ts +62 -67
- package/core/resources/search.ts +355 -135
- package/core/resources/tracked.ts +8 -8
- package/core/resources/transaction.ts +8 -8
- package/core/resources/transactionBroadcast.ts +3 -3
- package/core/security/auth.ts +35 -26
- package/core/security/certificateVerification/crlVerification.ts +11 -4
- package/core/security/{cryptoHash.js → cryptoHash.ts} +3 -8
- package/core/security/data_objects/{PermissionAttributeResponseObject.js → PermissionAttributeResponseObject.ts} +4 -4
- package/core/security/data_objects/{PermissionResponseObject.js → PermissionResponseObject.ts} +12 -11
- package/core/security/data_objects/{PermissionTableResponseObject.js → PermissionTableResponseObject.ts} +6 -4
- package/core/security/{fastifyAuth.js → fastifyAuth.ts} +93 -20
- package/core/security/impersonation.ts +3 -3
- package/core/security/jsLoader.ts +22 -8
- package/core/security/{keys.js → keys.ts} +113 -121
- package/core/security/permissionsTranslator.js +2 -2
- package/core/security/{role.js → role.ts} +26 -33
- package/core/security/tokenAuthentication.ts +34 -7
- package/core/security/user.ts +26 -22
- package/core/server/DESIGN.md +139 -0
- package/core/server/DurableSubscriptionsSession.ts +67 -50
- package/core/server/REST.ts +120 -107
- package/core/server/Server.ts +31 -12
- package/core/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
- package/core/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
- package/core/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
- package/core/server/fastifyRoutes.ts +37 -33
- package/core/server/graphqlQuerying.ts +6 -5
- package/core/server/http.ts +517 -26
- package/core/server/itc/serverHandlers.js +75 -14
- package/core/server/jobs/{JobObject.js → JobObject.ts} +13 -6
- package/core/server/jobs/{jobProcess.js → jobProcess.ts} +20 -16
- package/core/server/jobs/{jobRunner.js → jobRunner.ts} +20 -21
- package/core/server/jobs/{jobs.js → jobs.ts} +41 -44
- package/core/server/loadRootComponents.js +1 -1
- package/core/server/middlewareChain.ts +270 -0
- package/core/server/mqtt.ts +35 -26
- package/core/server/nodeName.ts +2 -1
- package/core/server/operationsServer.ts +85 -10
- package/core/server/serverHelpers/Headers.ts +10 -8
- package/core/server/serverHelpers/JSONStream.ts +15 -5
- package/core/server/serverHelpers/Request.ts +370 -13
- package/core/server/serverHelpers/contentTypes.ts +42 -11
- package/core/server/serverHelpers/multipartParser.ts +152 -0
- package/core/server/serverHelpers/progressEmitter.ts +110 -0
- package/core/server/serverHelpers/serverHandlers.js +43 -7
- package/core/server/serverHelpers/serverUtilities.ts +40 -30
- package/core/server/static.ts +9 -6
- package/core/server/status/index.ts +2 -2
- package/core/server/storageReclamation.ts +39 -2
- package/core/server/threads/itc.js +7 -4
- package/core/server/threads/manageThreads.js +100 -26
- package/core/server/threads/socketRouter.ts +12 -275
- package/core/server/threads/threadServer.js +345 -105
- package/core/server/threads/workerProcessGuard.ts +93 -0
- package/core/server/throttle.ts +18 -0
- package/core/sqlTranslator/{SelectValidator.js → SelectValidator.ts} +41 -49
- package/core/sqlTranslator/{alasqlFunctionImporter.js → alasqlFunctionImporter.ts} +5 -5
- package/core/sqlTranslator/{deleteTranslator.js → deleteTranslator.ts} +13 -18
- package/core/sqlTranslator/{index.js → index.ts} +30 -33
- package/core/sqlTranslator/{sql_statement_bucket.js → sql_statement_bucket.ts} +49 -20
- package/core/static/README.md +10 -9
- package/core/system/000004.log +0 -0
- package/core/system/CURRENT +1 -0
- package/core/system/IDENTITY +1 -0
- package/core/system/LOCK +0 -0
- package/core/system/LOG +1351 -0
- package/core/system/MANIFEST-000005 +0 -0
- package/core/system/OPTIONS-000013 +607 -0
- package/core/system/OPTIONS-000015 +734 -0
- package/core/upgrade/{UpgradeObjects.js → UpgradeObjects.ts} +3 -6
- package/core/upgrade/directives/5-2-0.ts +49 -0
- package/core/upgrade/directives/{directivesController.js → directivesController.ts} +16 -16
- package/core/upgrade/{directivesManager.js → directivesManager.ts} +7 -11
- package/core/upgrade/{upgradePrompt.js → upgradePrompt.ts} +8 -14
- package/core/upgrade/{upgradeUtilities.js → upgradeUtilities.ts} +3 -7
- package/core/utility/{OperationFunctionCaller.js → OperationFunctionCaller.ts} +7 -7
- package/core/utility/{assignCmdEnvVariables.js → assignCmdEnvVariables.ts} +6 -8
- package/core/utility/{common_utils.js → common_utils.ts} +113 -139
- package/core/utility/environment/{environmentManager.js → environmentManager.ts} +34 -33
- package/core/utility/environment/systemInformation.ts +18 -4
- package/core/utility/errors/{commonErrors.js → commonErrors.ts} +9 -9
- package/core/utility/errors/{hdbError.js → hdbError.ts} +39 -45
- package/core/utility/expandEnvVar.ts +110 -0
- package/core/utility/functions/geo.js +2 -2
- package/core/utility/functions/sql/alaSQLExtension.js +1 -1
- package/core/utility/globalSchema.ts +30 -0
- package/core/utility/hdbTerms.ts +56 -0
- package/core/utility/install/checkJWTTokensExist.js +1 -1
- package/core/utility/install/{installer.js → installer.ts} +58 -59
- package/core/utility/installation.ts +2 -2
- package/core/utility/lmdb/{DBIDefinition.js → DBIDefinition.ts} +4 -1
- package/core/utility/lmdb/{DeleteRecordsResponseObject.js → DeleteRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/{InsertRecordsResponseObject.js → InsertRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/OpenDBIObject.ts +43 -0
- package/core/utility/lmdb/{OpenEnvironmentObject.js → OpenEnvironmentObject.ts} +19 -6
- package/core/utility/lmdb/{UpdateRecordsResponseObject.js → UpdateRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/{UpsertRecordsResponseObject.js → UpsertRecordsResponseObject.ts} +2 -1
- package/core/utility/lmdb/{cleanLMDBMap.js → cleanLMDBMap.ts} +5 -5
- package/core/utility/lmdb/{commonUtility.js → commonUtility.ts} +13 -21
- package/core/utility/lmdb/{deleteUtility.js → deleteUtility.ts} +8 -12
- package/core/utility/lmdb/{environmentUtility.js → environmentUtility.ts} +43 -52
- package/core/utility/lmdb/{searchCursorFunctions.js → searchCursorFunctions.ts} +12 -26
- package/core/utility/lmdb/{searchUtility.js → searchUtility.ts} +75 -64
- package/core/utility/lmdb/{terms.js → terms.ts} +10 -23
- package/core/utility/lmdb/{writeUtility.js → writeUtility.ts} +37 -22
- package/core/utility/logging/{harper_logger.js → harper_logger.ts} +136 -89
- package/core/utility/logging/{logRotator.js → logRotator.ts} +13 -13
- package/core/utility/logging/logger.ts +1 -1
- package/core/utility/logging/{readLog.js → readLog.ts} +19 -19
- package/core/utility/logging/{transactionLog.js → transactionLog.ts} +10 -14
- package/core/utility/{mount_hdb.js → mount_hdb.ts} +15 -16
- package/core/utility/{npmUtilities.js → npmUtilities.ts} +14 -17
- package/core/utility/{operation_authorization.js → operation_authorization.ts} +173 -124
- package/core/utility/packageUtils.js +7 -16
- package/core/utility/password.ts +1 -1
- package/core/utility/processManagement/processManagement.js +2 -2
- package/core/utility/processManagement/servicesConfig.js +1 -1
- package/core/utility/{signalling.js → signalling.ts} +6 -11
- package/core/utility/watcherFallback.ts +74 -0
- package/core/validation/analyticsValidator.ts +43 -0
- package/core/validation/{bulkDeleteValidator.js → bulkDeleteValidator.ts} +5 -5
- package/core/validation/{check_permissions.js → check_permissions.ts} +3 -3
- package/core/validation/{common_validators.js → common_validators.ts} +12 -24
- package/core/validation/{configValidator.js → configValidator.ts} +114 -18
- package/core/validation/{deleteValidator.js → deleteValidator.ts} +5 -5
- package/core/validation/{fileLoadValidator.js → fileLoadValidator.ts} +12 -19
- package/core/validation/{insertValidator.js → insertValidator.ts} +5 -5
- package/core/validation/{installValidator.js → installValidator.ts} +8 -8
- package/core/validation/{readLogValidator.js → readLogValidator.ts} +10 -10
- package/core/validation/{role_validation.js → role_validation.ts} +26 -32
- package/core/validation/{schemaMetadataValidator.js → schemaMetadataValidator.ts} +5 -11
- package/core/validation/{searchValidator.js → searchValidator.ts} +12 -11
- package/core/validation/statusValidator.ts +1 -1
- package/core/validation/{transactionLogValidator.js → transactionLogValidator.ts} +4 -9
- package/core/validation/{user_validation.js → user_validation.ts} +4 -10
- package/core/validation/{validationWrapper.js → validationWrapper.ts} +3 -9
- package/dist/analytics/profile.js +4 -0
- package/dist/analytics/profile.js.map +1 -1
- package/dist/cloneNode/cloneNode.js +224 -12
- package/dist/cloneNode/cloneNode.js.map +1 -1
- package/dist/core/agent/agent.js +175 -0
- package/dist/core/agent/agent.js.map +1 -0
- package/dist/core/agent/loop.js +176 -0
- package/dist/core/agent/loop.js.map +1 -0
- package/dist/core/agent/operations.js +137 -0
- package/dist/core/agent/operations.js.map +1 -0
- package/dist/core/agent/session.js +182 -0
- package/dist/core/agent/session.js.map +1 -0
- package/dist/core/agent/tools/fsTools.js +286 -0
- package/dist/core/agent/tools/fsTools.js.map +1 -0
- package/dist/core/agent/tools/httpFetchTool.js +116 -0
- package/dist/core/agent/tools/httpFetchTool.js.map +1 -0
- package/dist/core/agent/tools/scheduleTool.js +54 -0
- package/dist/core/agent/tools/scheduleTool.js.map +1 -0
- package/dist/core/agent/toolset.js +33 -0
- package/dist/core/agent/toolset.js.map +1 -0
- package/dist/core/agent/types.js +10 -0
- package/dist/core/agent/types.js.map +1 -0
- package/dist/core/bin/BinObjects.js +6 -3
- package/dist/core/bin/BinObjects.js.map +1 -1
- package/dist/core/bin/cliCredentials.js +130 -0
- package/dist/core/bin/cliCredentials.js.map +1 -0
- package/dist/core/bin/cliOperations.js +254 -40
- package/dist/core/bin/cliOperations.js.map +1 -1
- package/dist/core/bin/copyDb.js +16 -16
- package/dist/core/bin/copyDb.js.map +1 -1
- package/dist/core/bin/deployRenderer.js +185 -0
- package/dist/core/bin/deployRenderer.js.map +1 -0
- package/dist/core/bin/harper.js +92 -31
- package/dist/core/bin/harper.js.map +1 -1
- package/dist/core/bin/install.js +41 -4
- package/dist/core/bin/install.js.map +1 -1
- package/dist/core/bin/lite.js +3 -4
- package/dist/core/bin/lite.js.map +1 -1
- package/dist/core/bin/login.js +158 -0
- package/dist/core/bin/login.js.map +1 -0
- package/dist/core/bin/logout.js +16 -0
- package/dist/core/bin/logout.js.map +1 -0
- package/dist/core/bin/mcp/client.js +395 -0
- package/dist/core/bin/mcp/client.js.map +1 -0
- package/dist/core/bin/mcp/doctor.js +193 -0
- package/dist/core/bin/mcp/doctor.js.map +1 -0
- package/dist/core/bin/mcp/index.js +81 -0
- package/dist/core/bin/mcp/index.js.map +1 -0
- package/dist/core/bin/mcp/options.js +113 -0
- package/dist/core/bin/mcp/options.js.map +1 -0
- package/dist/core/bin/mcp/printConfig.js +85 -0
- package/dist/core/bin/mcp/printConfig.js.map +1 -0
- package/dist/core/bin/multipartBuilder.js +55 -0
- package/dist/core/bin/multipartBuilder.js.map +1 -0
- package/dist/core/bin/restart.js +85 -48
- package/dist/core/bin/restart.js.map +1 -1
- package/dist/core/bin/run.js +123 -77
- package/dist/core/bin/run.js.map +1 -1
- package/dist/core/bin/sseConsumer.js +127 -0
- package/dist/core/bin/sseConsumer.js.map +1 -0
- package/dist/core/bin/status.js +48 -11
- package/dist/core/bin/status.js.map +1 -1
- package/dist/core/bin/stop.js +44 -7
- package/dist/core/bin/stop.js.map +1 -1
- package/dist/core/bin/upgrade.js +6 -6
- package/dist/core/components/Application.js +134 -28
- package/dist/core/components/Application.js.map +1 -1
- package/dist/core/components/ApplicationScope.js +2 -2
- package/dist/core/components/ComponentV1.js +5 -5
- package/dist/core/components/ComponentV1.js.map +1 -1
- package/dist/core/components/EntryHandler.js +153 -13
- package/dist/core/components/EntryHandler.js.map +1 -1
- package/dist/core/components/OptionsWatcher.js +72 -10
- package/dist/core/components/OptionsWatcher.js.map +1 -1
- package/dist/core/components/Scope.js +105 -9
- package/dist/core/components/Scope.js.map +1 -1
- package/dist/core/components/anthropic/index.js +428 -0
- package/dist/core/components/anthropic/index.js.map +1 -0
- package/dist/core/components/bedrock/index.js +734 -0
- package/dist/core/components/bedrock/index.js.map +1 -0
- package/dist/core/components/componentLoader.js +63 -38
- package/dist/core/components/componentLoader.js.map +1 -1
- package/dist/core/components/deployLifecycle.js +156 -0
- package/dist/core/components/deployLifecycle.js.map +1 -0
- package/dist/core/components/deploymentOperations.js +185 -0
- package/dist/core/components/deploymentOperations.js.map +1 -0
- package/dist/core/components/deploymentRecorder.js +401 -0
- package/dist/core/components/deploymentRecorder.js.map +1 -0
- package/dist/core/components/deriveURLPath.js +2 -2
- package/dist/core/components/deriveURLPath.js.map +1 -1
- package/dist/core/components/mcp/adapters/fastify.js +66 -0
- package/dist/core/components/mcp/adapters/fastify.js.map +1 -0
- package/dist/core/components/mcp/adapters/harperHttp.js +78 -0
- package/dist/core/components/mcp/adapters/harperHttp.js.map +1 -0
- package/dist/core/components/mcp/audit.js +73 -0
- package/dist/core/components/mcp/audit.js.map +1 -0
- package/dist/core/components/mcp/index.js +109 -0
- package/dist/core/components/mcp/index.js.map +1 -0
- package/dist/core/components/mcp/jsonrpc.js +93 -0
- package/dist/core/components/mcp/jsonrpc.js.map +1 -0
- package/dist/core/components/mcp/lifecycle.js +79 -0
- package/dist/core/components/mcp/lifecycle.js.map +1 -0
- package/dist/core/components/mcp/listChanged.js +257 -0
- package/dist/core/components/mcp/listChanged.js.map +1 -0
- package/dist/core/components/mcp/rateLimit.js +226 -0
- package/dist/core/components/mcp/rateLimit.js.map +1 -0
- package/dist/core/components/mcp/resources.js +515 -0
- package/dist/core/components/mcp/resources.js.map +1 -0
- package/dist/core/components/mcp/session.js +170 -0
- package/dist/core/components/mcp/session.js.map +1 -0
- package/dist/core/components/mcp/sessionRegistry.js +124 -0
- package/dist/core/components/mcp/sessionRegistry.js.map +1 -0
- package/dist/core/components/mcp/toolRegistry.js +176 -0
- package/dist/core/components/mcp/toolRegistry.js.map +1 -0
- package/dist/core/components/mcp/tools/application.js +549 -0
- package/dist/core/components/mcp/tools/application.js.map +1 -0
- package/dist/core/components/mcp/tools/operations.js +303 -0
- package/dist/core/components/mcp/tools/operations.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/derive.js +216 -0
- package/dist/core/components/mcp/tools/schemas/derive.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/operations.js +243 -0
- package/dist/core/components/mcp/tools/schemas/operations.js.map +1 -0
- package/dist/core/components/mcp/transport.js +467 -0
- package/dist/core/components/mcp/transport.js.map +1 -0
- package/dist/core/components/ollama/index.js +239 -0
- package/dist/core/components/ollama/index.js.map +1 -0
- package/dist/core/components/openai/index.js +475 -0
- package/dist/core/components/openai/index.js.map +1 -0
- package/dist/core/components/operations.js +198 -52
- package/dist/core/components/operations.js.map +1 -1
- package/dist/core/components/operationsValidation.js +3 -3
- package/dist/core/components/packageComponent.js +87 -26
- package/dist/core/components/packageComponent.js.map +1 -1
- package/dist/core/components/requestRestart.js +12 -1
- package/dist/core/components/requestRestart.js.map +1 -1
- package/dist/core/components/status/crossThread.js +12 -5
- package/dist/core/components/status/crossThread.js.map +1 -1
- package/dist/core/components/status/errors.js +7 -7
- package/dist/core/config/RootConfigWatcher.js +52 -1
- package/dist/core/config/RootConfigWatcher.js.map +1 -1
- package/dist/core/config/configUtils.js +31 -8
- package/dist/core/config/configUtils.js.map +1 -1
- package/dist/core/config/harperConfigEnvVars.js +1 -1
- package/dist/core/config/harperConfigEnvVars.js.map +1 -1
- package/dist/core/dataLayer/CreateAttributeObject.js +4 -3
- package/dist/core/dataLayer/CreateAttributeObject.js.map +1 -1
- package/dist/core/dataLayer/CreateTableObject.js +2 -1
- package/dist/core/dataLayer/CreateTableObject.js.map +1 -1
- package/dist/core/dataLayer/DataLayerObjects.js +19 -5
- package/dist/core/dataLayer/DataLayerObjects.js.map +1 -1
- package/dist/core/dataLayer/DeleteBeforeObject.js +2 -1
- package/dist/core/dataLayer/DeleteBeforeObject.js.map +1 -1
- package/dist/core/dataLayer/DeleteObject.js +4 -3
- package/dist/core/dataLayer/DeleteObject.js.map +1 -1
- package/dist/core/dataLayer/DropAttributeObject.js +2 -1
- package/dist/core/dataLayer/DropAttributeObject.js.map +1 -1
- package/dist/core/dataLayer/GetBackupObject.js +4 -3
- package/dist/core/dataLayer/GetBackupObject.js.map +1 -1
- package/dist/core/dataLayer/InsertObject.js +4 -3
- package/dist/core/dataLayer/InsertObject.js.map +1 -1
- package/dist/core/dataLayer/ReadAuditLogObject.js +4 -3
- package/dist/core/dataLayer/ReadAuditLogObject.js.map +1 -1
- package/dist/core/dataLayer/SQLSearch.js +140 -78
- package/dist/core/dataLayer/SQLSearch.js.map +1 -1
- package/dist/core/dataLayer/SearchByConditionsObject.js +5 -7
- package/dist/core/dataLayer/SearchByConditionsObject.js.map +1 -1
- package/dist/core/dataLayer/SearchByHashObject.js +2 -1
- package/dist/core/dataLayer/SearchByHashObject.js.map +1 -1
- package/dist/core/dataLayer/SearchObject.js +2 -1
- package/dist/core/dataLayer/SearchObject.js.map +1 -1
- package/dist/core/dataLayer/SqlSearchObject.js +2 -1
- package/dist/core/dataLayer/SqlSearchObject.js.map +1 -1
- package/dist/core/dataLayer/UpdateObject.js +4 -3
- package/dist/core/dataLayer/UpdateObject.js.map +1 -1
- package/dist/core/dataLayer/UpsertObject.js +4 -3
- package/dist/core/dataLayer/UpsertObject.js.map +1 -1
- package/dist/core/dataLayer/bulkLoad.js +122 -88
- package/dist/core/dataLayer/bulkLoad.js.map +1 -1
- package/dist/core/dataLayer/delete.js +74 -39
- package/dist/core/dataLayer/delete.js.map +1 -1
- package/dist/core/dataLayer/export.js +90 -55
- package/dist/core/dataLayer/export.js.map +1 -1
- package/dist/core/dataLayer/getBackup.js +43 -11
- package/dist/core/dataLayer/getBackup.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/BridgeMethods.js +41 -20
- package/dist/core/dataLayer/harperBridge/BridgeMethods.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/ResourceBridge.js +26 -25
- package/dist/core/dataLayer/harperBridge/ResourceBridge.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/TableSizeObject.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/bridgeUtility/insertUpdateValidate.js +4 -4
- package/dist/core/dataLayer/harperBridge/harperBridge.js +38 -4
- package/dist/core/dataLayer/harperBridge/harperBridge.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js +7 -6
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateAttribute.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateRecords.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateSchema.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js +5 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbCreateTable.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteAuditLogsBefore.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDeleteRecords.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropAttribute.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropSchema.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbDropTable.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbFlush.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetBackup.js +3 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByHash.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbGetDataByValue.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbReadAuditLog.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js +8 -8
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByConditions.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByHash.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js +3 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbSearchByValue.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpdateRecords.js +3 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbMethods/lmdbUpsertRecords.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/LMDBCreateAttributeObject.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializeHashSearch.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCheckForNewAttributes.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js +5 -3
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbCreateTransactionsAuditEnvironment.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbGetTableSize.js +2 -2
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js +4 -4
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbProcessRows.js.map +1 -1
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbSearch.js +5 -5
- package/dist/core/dataLayer/harperBridge/lmdbBridge/lmdbUtility/lmdbWriteTransaction.js +4 -4
- package/dist/core/dataLayer/hdbInfoController.js +66 -31
- package/dist/core/dataLayer/hdbInfoController.js.map +1 -1
- package/dist/core/dataLayer/insert.js +63 -28
- package/dist/core/dataLayer/insert.js.map +1 -1
- package/dist/core/dataLayer/readAuditLog.js +45 -13
- package/dist/core/dataLayer/readAuditLog.js.map +1 -1
- package/dist/core/dataLayer/schema.js +124 -89
- package/dist/core/dataLayer/schema.js.map +1 -1
- package/dist/core/dataLayer/schemaDescribe.js +78 -41
- package/dist/core/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/core/dataLayer/search.js +12 -13
- package/dist/core/dataLayer/search.js.map +1 -1
- package/dist/core/dataLayer/transaction.js +3 -4
- package/dist/core/dataLayer/transaction.js.map +1 -1
- package/dist/core/dataLayer/update.js +53 -18
- package/dist/core/dataLayer/update.js.map +1 -1
- package/dist/core/globals.js +1 -0
- package/dist/core/globals.js.map +1 -1
- package/dist/core/index.js +4 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/json/systemSchema.json +65 -0
- package/dist/core/launchServiceScripts/utility/checkNodeVersion.js +3 -0
- package/dist/core/launchServiceScripts/utility/checkNodeVersion.js.map +1 -1
- package/dist/core/resources/DatabaseTransaction.js +39 -15
- package/dist/core/resources/DatabaseTransaction.js.map +1 -1
- package/dist/core/resources/ErrorResource.js +3 -1
- package/dist/core/resources/ErrorResource.js.map +1 -1
- package/dist/core/resources/LMDBTransaction.js +18 -7
- package/dist/core/resources/LMDBTransaction.js.map +1 -1
- package/dist/core/resources/RecordEncoder.js +5 -2
- package/dist/core/resources/RecordEncoder.js.map +1 -1
- package/dist/core/resources/RequestTarget.js.map +1 -1
- package/dist/core/resources/Resource.js +37 -10
- package/dist/core/resources/Resource.js.map +1 -1
- package/dist/core/resources/ResourceInterface.js +20 -0
- package/dist/core/resources/ResourceInterface.js.map +1 -1
- package/dist/core/resources/Resources.js +7 -6
- package/dist/core/resources/Resources.js.map +1 -1
- package/dist/core/resources/RocksIndexStore.js +3 -0
- package/dist/core/resources/RocksIndexStore.js.map +1 -1
- package/dist/core/resources/RocksTransactionLogStore.js +46 -27
- package/dist/core/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/core/resources/Table.js +267 -107
- package/dist/core/resources/Table.js.map +1 -1
- package/dist/core/resources/analytics/metadata.js +1 -0
- package/dist/core/resources/analytics/metadata.js.map +1 -1
- package/dist/core/resources/analytics/read.js +16 -5
- package/dist/core/resources/analytics/read.js.map +1 -1
- package/dist/core/resources/analytics/write.js +232 -20
- package/dist/core/resources/analytics/write.js.map +1 -1
- package/dist/core/resources/auditStore.js +13 -8
- package/dist/core/resources/auditStore.js.map +1 -1
- package/dist/core/resources/blob.js +8 -8
- package/dist/core/resources/blob.js.map +1 -1
- package/dist/core/resources/dataLoader.js +13 -13
- package/dist/core/resources/databases.js +160 -52
- package/dist/core/resources/databases.js.map +1 -1
- package/dist/core/resources/graphql.js +224 -174
- package/dist/core/resources/graphql.js.map +1 -1
- package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js +308 -59
- package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/core/resources/indexes/vector.js +14 -0
- package/dist/core/resources/indexes/vector.js.map +1 -1
- package/dist/core/resources/loadEnv.js +21 -18
- package/dist/core/resources/loadEnv.js.map +1 -1
- package/dist/core/resources/login.js +5 -4
- package/dist/core/resources/login.js.map +1 -1
- package/dist/core/resources/models/Models.js +265 -0
- package/dist/core/resources/models/Models.js.map +1 -0
- package/dist/core/resources/models/TestBackend.js +71 -0
- package/dist/core/resources/models/TestBackend.js.map +1 -0
- package/dist/core/resources/models/agentLoop.js +746 -0
- package/dist/core/resources/models/agentLoop.js.map +1 -0
- package/dist/core/resources/models/analyticsTable.js +166 -0
- package/dist/core/resources/models/analyticsTable.js.map +1 -0
- package/dist/core/resources/models/backendHelpers.js +109 -0
- package/dist/core/resources/models/backendHelpers.js.map +1 -0
- package/dist/core/resources/models/backendRegistry.js +54 -0
- package/dist/core/resources/models/backendRegistry.js.map +1 -0
- package/dist/core/resources/models/bootstrap.js +112 -0
- package/dist/core/resources/models/bootstrap.js.map +1 -0
- package/dist/core/resources/models/embedHook.js +127 -0
- package/dist/core/resources/models/embedHook.js.map +1 -0
- package/dist/core/resources/models/types.js +11 -0
- package/dist/core/resources/models/types.js.map +1 -0
- package/dist/core/resources/replayLogs.js +7 -1
- package/dist/core/resources/replayLogs.js.map +1 -1
- package/dist/core/resources/roles.js +67 -71
- package/dist/core/resources/roles.js.map +1 -1
- package/dist/core/resources/search.js +349 -140
- package/dist/core/resources/search.js.map +1 -1
- package/dist/core/resources/tracked.js +14 -14
- package/dist/core/resources/tracked.js.map +1 -1
- package/dist/core/resources/transaction.js +1 -1
- package/dist/core/resources/transaction.js.map +1 -1
- package/dist/core/resources/transactionBroadcast.js.map +1 -1
- package/dist/core/security/auth.js +34 -25
- package/dist/core/security/auth.js.map +1 -1
- package/dist/core/security/certificateVerification/crlVerification.js +7 -1
- package/dist/core/security/certificateVerification/crlVerification.js.map +1 -1
- package/dist/core/security/cryptoHash.js +37 -5
- package/dist/core/security/cryptoHash.js.map +1 -1
- package/dist/core/security/data_objects/PermissionAttributeResponseObject.js +4 -1
- package/dist/core/security/data_objects/PermissionAttributeResponseObject.js.map +1 -1
- package/dist/core/security/data_objects/PermissionResponseObject.js +15 -8
- package/dist/core/security/data_objects/PermissionResponseObject.js.map +1 -1
- package/dist/core/security/data_objects/PermissionTableResponseObject.js +6 -1
- package/dist/core/security/data_objects/PermissionTableResponseObject.js.map +1 -1
- package/dist/core/security/fastifyAuth.js +131 -22
- package/dist/core/security/fastifyAuth.js.map +1 -1
- package/dist/core/security/impersonation.js +15 -15
- package/dist/core/security/jsLoader.js +18 -5
- package/dist/core/security/jsLoader.js.map +1 -1
- package/dist/core/security/keys.js +160 -114
- package/dist/core/security/keys.js.map +1 -1
- package/dist/core/security/permissionsTranslator.js +2 -2
- package/dist/core/security/role.js +70 -35
- package/dist/core/security/role.js.map +1 -1
- package/dist/core/security/tokenAuthentication.js +57 -27
- package/dist/core/security/tokenAuthentication.js.map +1 -1
- package/dist/core/security/user.js +74 -38
- package/dist/core/security/user.js.map +1 -1
- package/dist/core/server/DurableSubscriptionsSession.js +71 -55
- package/dist/core/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/core/server/REST.js +17 -16
- package/dist/core/server/REST.js.map +1 -1
- package/dist/core/server/Server.js +1 -1
- package/dist/core/server/Server.js.map +1 -1
- package/dist/core/server/fastifyRoutes/helpers/getCORSOptions.js +1 -1
- package/dist/core/server/fastifyRoutes/helpers/getHeaderTimeoutConfig.js +1 -1
- package/dist/core/server/fastifyRoutes/helpers/getServerOptions.js +1 -1
- package/dist/core/server/fastifyRoutes.js +34 -30
- package/dist/core/server/fastifyRoutes.js.map +1 -1
- package/dist/core/server/graphqlQuerying.js +8 -7
- package/dist/core/server/graphqlQuerying.js.map +1 -1
- package/dist/core/server/http.js +523 -47
- package/dist/core/server/http.js.map +1 -1
- package/dist/core/server/itc/serverHandlers.js +66 -15
- package/dist/core/server/itc/serverHandlers.js.map +1 -1
- package/dist/core/server/jobs/JobObject.js +53 -7
- package/dist/core/server/jobs/JobObject.js.map +1 -1
- package/dist/core/server/jobs/jobProcess.js +64 -24
- package/dist/core/server/jobs/jobProcess.js.map +1 -1
- package/dist/core/server/jobs/jobRunner.js +68 -30
- package/dist/core/server/jobs/jobRunner.js.map +1 -1
- package/dist/core/server/jobs/jobs.js +93 -61
- package/dist/core/server/jobs/jobs.js.map +1 -1
- package/dist/core/server/loadRootComponents.js +1 -1
- package/dist/core/server/middlewareChain.js +252 -0
- package/dist/core/server/middlewareChain.js.map +1 -0
- package/dist/core/server/mqtt.js +22 -17
- package/dist/core/server/mqtt.js.map +1 -1
- package/dist/core/server/nodeName.js +44 -13
- package/dist/core/server/nodeName.js.map +1 -1
- package/dist/core/server/operationsServer.js +106 -33
- package/dist/core/server/operationsServer.js.map +1 -1
- package/dist/core/server/serverHelpers/Headers.js +2 -0
- package/dist/core/server/serverHelpers/Headers.js.map +1 -1
- package/dist/core/server/serverHelpers/JSONStream.js +12 -3
- package/dist/core/server/serverHelpers/JSONStream.js.map +1 -1
- package/dist/core/server/serverHelpers/Request.js +370 -9
- package/dist/core/server/serverHelpers/Request.js.map +1 -1
- package/dist/core/server/serverHelpers/contentTypes.js +36 -7
- package/dist/core/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/core/server/serverHelpers/multipartParser.js +142 -0
- package/dist/core/server/serverHelpers/multipartParser.js.map +1 -0
- package/dist/core/server/serverHelpers/progressEmitter.js +103 -0
- package/dist/core/server/serverHelpers/progressEmitter.js.map +1 -0
- package/dist/core/server/serverHelpers/serverHandlers.js +38 -7
- package/dist/core/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/core/server/serverHelpers/serverUtilities.js +97 -93
- package/dist/core/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/core/server/static.js +8 -5
- package/dist/core/server/static.js.map +1 -1
- package/dist/core/server/status/index.js +3 -3
- package/dist/core/server/storageReclamation.js +68 -9
- package/dist/core/server/storageReclamation.js.map +1 -1
- package/dist/core/server/threads/itc.js +7 -4
- package/dist/core/server/threads/itc.js.map +1 -1
- package/dist/core/server/threads/manageThreads.js +110 -26
- package/dist/core/server/threads/manageThreads.js.map +1 -1
- package/dist/core/server/threads/socketRouter.js +8 -271
- package/dist/core/server/threads/socketRouter.js.map +1 -1
- package/dist/core/server/threads/threadServer.js +360 -118
- package/dist/core/server/threads/threadServer.js.map +1 -1
- package/dist/core/server/threads/workerProcessGuard.js +114 -0
- package/dist/core/server/threads/workerProcessGuard.js.map +1 -0
- package/dist/core/server/throttle.js +17 -0
- package/dist/core/server/throttle.js.map +1 -1
- package/dist/core/sqlTranslator/SelectValidator.js +86 -47
- package/dist/core/sqlTranslator/SelectValidator.js.map +1 -1
- package/dist/core/sqlTranslator/alasqlFunctionImporter.js +40 -3
- package/dist/core/sqlTranslator/alasqlFunctionImporter.js.map +1 -1
- package/dist/core/sqlTranslator/deleteTranslator.js +48 -14
- package/dist/core/sqlTranslator/deleteTranslator.js.map +1 -1
- package/dist/core/sqlTranslator/index.js +69 -30
- package/dist/core/sqlTranslator/index.js.map +1 -1
- package/dist/core/sqlTranslator/sql_statement_bucket.js +55 -13
- package/dist/core/sqlTranslator/sql_statement_bucket.js.map +1 -1
- package/dist/core/upgrade/UpgradeObjects.js +37 -4
- package/dist/core/upgrade/UpgradeObjects.js.map +1 -1
- package/dist/core/upgrade/directives/5-2-0.js +77 -0
- package/dist/core/upgrade/directives/5-2-0.js.map +1 -0
- package/dist/core/upgrade/directives/directivesController.js +52 -11
- package/dist/core/upgrade/directives/directivesController.js.map +1 -1
- package/dist/core/upgrade/directivesManager.js +53 -18
- package/dist/core/upgrade/directivesManager.js.map +1 -1
- package/dist/core/upgrade/upgradePrompt.js +65 -30
- package/dist/core/upgrade/upgradePrompt.js.map +1 -1
- package/dist/core/upgrade/upgradeUtilities.js +37 -5
- package/dist/core/upgrade/upgradeUtilities.js.map +1 -1
- package/dist/core/utility/OperationFunctionCaller.js +45 -10
- package/dist/core/utility/OperationFunctionCaller.js.map +1 -1
- package/dist/core/utility/assignCmdEnvVariables.js +8 -4
- package/dist/core/utility/assignCmdEnvVariables.js.map +1 -1
- package/dist/core/utility/common_utils.js +140 -79
- package/dist/core/utility/common_utils.js.map +1 -1
- package/dist/core/utility/environment/environmentManager.js +75 -29
- package/dist/core/utility/environment/environmentManager.js.map +1 -1
- package/dist/core/utility/environment/systemInformation.js +27 -16
- package/dist/core/utility/environment/systemInformation.js.map +1 -1
- package/dist/core/utility/errors/commonErrors.js +49 -18
- package/dist/core/utility/errors/commonErrors.js.map +1 -1
- package/dist/core/utility/errors/hdbError.js +65 -26
- package/dist/core/utility/errors/hdbError.js.map +1 -1
- package/dist/core/utility/expandEnvVar.js +113 -0
- package/dist/core/utility/expandEnvVar.js.map +1 -0
- package/dist/core/utility/functions/geo.js +2 -2
- package/dist/core/utility/functions/sql/alaSQLExtension.js +1 -1
- package/dist/core/utility/globalSchema.js +14 -11
- package/dist/core/utility/globalSchema.js.map +1 -1
- package/dist/core/utility/hdbTerms.js +56 -0
- package/dist/core/utility/hdbTerms.js.map +1 -1
- package/dist/core/utility/install/checkJWTTokensExist.js +1 -1
- package/dist/core/utility/install/installer.js +106 -70
- package/dist/core/utility/install/installer.js.map +1 -1
- package/dist/core/utility/installation.js +3 -3
- package/dist/core/utility/lmdb/DBIDefinition.js +5 -1
- package/dist/core/utility/lmdb/DBIDefinition.js.map +1 -1
- package/dist/core/utility/lmdb/DeleteRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/DeleteRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/InsertRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/InsertRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/OpenDBIObject.js +54 -6
- package/dist/core/utility/lmdb/OpenDBIObject.js.map +1 -1
- package/dist/core/utility/lmdb/OpenEnvironmentObject.js +52 -4
- package/dist/core/utility/lmdb/OpenEnvironmentObject.js.map +1 -1
- package/dist/core/utility/lmdb/UpdateRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/UpdateRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/UpsertRecordsResponseObject.js +2 -1
- package/dist/core/utility/lmdb/UpsertRecordsResponseObject.js.map +1 -1
- package/dist/core/utility/lmdb/cleanLMDBMap.js +44 -7
- package/dist/core/utility/lmdb/cleanLMDBMap.js.map +1 -1
- package/dist/core/utility/lmdb/commonUtility.js +46 -17
- package/dist/core/utility/lmdb/commonUtility.js.map +1 -1
- package/dist/core/utility/lmdb/deleteUtility.js +51 -16
- package/dist/core/utility/lmdb/deleteUtility.js.map +1 -1
- package/dist/core/utility/lmdb/environmentUtility.js +91 -51
- package/dist/core/utility/lmdb/environmentUtility.js.map +1 -1
- package/dist/core/utility/lmdb/searchCursorFunctions.js +46 -14
- package/dist/core/utility/lmdb/searchCursorFunctions.js.map +1 -1
- package/dist/core/utility/lmdb/searchUtility.js +91 -55
- package/dist/core/utility/lmdb/searchUtility.js.map +1 -1
- package/dist/core/utility/lmdb/terms.js +12 -22
- package/dist/core/utility/lmdb/terms.js.map +1 -1
- package/dist/core/utility/lmdb/writeUtility.js +61 -28
- package/dist/core/utility/lmdb/writeUtility.js.map +1 -1
- package/dist/core/utility/logging/harper_logger.js +176 -81
- package/dist/core/utility/logging/harper_logger.js.map +1 -1
- package/dist/core/utility/logging/logRotator.js +65 -28
- package/dist/core/utility/logging/logRotator.js.map +1 -1
- package/dist/core/utility/logging/logger.js +4 -4
- package/dist/core/utility/logging/readLog.js +54 -17
- package/dist/core/utility/logging/readLog.js.map +1 -1
- package/dist/core/utility/logging/transactionLog.js +51 -16
- package/dist/core/utility/logging/transactionLog.js.map +1 -1
- package/dist/core/utility/mount_hdb.js +54 -17
- package/dist/core/utility/mount_hdb.js.map +1 -1
- package/dist/core/utility/npmUtilities.js +54 -19
- package/dist/core/utility/npmUtilities.js.map +1 -1
- package/dist/core/utility/operation_authorization.js +135 -86
- package/dist/core/utility/operation_authorization.js.map +1 -1
- package/dist/core/utility/packageUtils.js +7 -17
- package/dist/core/utility/packageUtils.js.map +1 -1
- package/dist/core/utility/password.js +2 -2
- package/dist/core/utility/processManagement/processManagement.js +2 -2
- package/dist/core/utility/processManagement/servicesConfig.js +1 -1
- package/dist/core/utility/signalling.js +51 -16
- package/dist/core/utility/signalling.js.map +1 -1
- package/dist/core/utility/watcherFallback.js +73 -0
- package/dist/core/utility/watcherFallback.js.map +1 -0
- package/dist/core/validation/analyticsValidator.js +79 -0
- package/dist/core/validation/analyticsValidator.js.map +1 -0
- package/dist/core/validation/bulkDeleteValidator.js +49 -11
- package/dist/core/validation/bulkDeleteValidator.js.map +1 -1
- package/dist/core/validation/check_permissions.js +38 -3
- package/dist/core/validation/check_permissions.js.map +1 -1
- package/dist/core/validation/common_validators.js +62 -31
- package/dist/core/validation/common_validators.js.map +1 -1
- package/dist/core/validation/configValidator.js +189 -54
- package/dist/core/validation/configValidator.js.map +1 -1
- package/dist/core/validation/deleteValidator.js +49 -11
- package/dist/core/validation/deleteValidator.js.map +1 -1
- package/dist/core/validation/fileLoadValidator.js +67 -32
- package/dist/core/validation/fileLoadValidator.js.map +1 -1
- package/dist/core/validation/insertValidator.js +48 -10
- package/dist/core/validation/insertValidator.js.map +1 -1
- package/dist/core/validation/installValidator.js +47 -10
- package/dist/core/validation/installValidator.js.map +1 -1
- package/dist/core/validation/readLogValidator.js +60 -22
- package/dist/core/validation/readLogValidator.js.map +1 -1
- package/dist/core/validation/role_validation.js +55 -19
- package/dist/core/validation/role_validation.js.map +1 -1
- package/dist/core/validation/schemaMetadataValidator.js +11 -12
- package/dist/core/validation/schemaMetadataValidator.js.map +1 -1
- package/dist/core/validation/searchValidator.js +82 -43
- package/dist/core/validation/searchValidator.js.map +1 -1
- package/dist/core/validation/transactionLogValidator.js +52 -17
- package/dist/core/validation/transactionLogValidator.js.map +1 -1
- package/dist/core/validation/user_validation.js +38 -6
- package/dist/core/validation/user_validation.js.map +1 -1
- package/dist/core/validation/validationWrapper.js +4 -5
- package/dist/core/validation/validationWrapper.js.map +1 -1
- package/dist/licensing/usageLicensing.js +30 -21
- package/dist/licensing/usageLicensing.js.map +1 -1
- package/dist/replication/knownNodes.js +173 -39
- package/dist/replication/knownNodes.js.map +1 -1
- package/dist/replication/replicationConnection.js +441 -85
- package/dist/replication/replicationConnection.js.map +1 -1
- package/dist/replication/replicator.js +44 -26
- package/dist/replication/replicator.js.map +1 -1
- package/dist/replication/setNode.js +22 -2
- package/dist/replication/setNode.js.map +1 -1
- package/dist/replication/subscriptionManager.js +121 -9
- package/dist/replication/subscriptionManager.js.map +1 -1
- package/dist/security/certificate.js +41 -6
- package/dist/security/certificate.js.map +1 -1
- package/dist/security/sshKeyOperations.js +35 -2
- package/dist/security/sshKeyOperations.js.map +1 -1
- package/licensing/usageLicensing.ts +32 -37
- package/npm-shrinkwrap.json +8994 -4305
- package/package.json +16 -11
- package/replication/DESIGN.md +139 -0
- package/replication/knownNodes.ts +166 -43
- package/replication/replicationConnection.ts +475 -92
- package/replication/replicator.ts +42 -25
- package/replication/setNode.ts +28 -9
- package/replication/subscriptionManager.ts +138 -14
- package/security/certificate.ts +8 -4
- package/security/sshKeyOperations.ts +1 -1
- package/static/defaultConfig.yaml +1 -0
- package/studio/web/assets/{index-CmtPP0YO.js → index-COfIkCT-.js} +5 -5
- package/studio/web/assets/index-COfIkCT-.js.map +1 -0
- package/studio/web/assets/{index.lazy-C8jvGtlu.js → index.lazy-CIvl7Fj9.js} +2 -2
- package/studio/web/assets/{index.lazy-C8jvGtlu.js.map → index.lazy-CIvl7Fj9.js.map} +1 -1
- package/studio/web/assets/{profile-O0DYlJUv.js → profile-B2ZVB--r.js} +2 -2
- package/studio/web/assets/{profile-O0DYlJUv.js.map → profile-B2ZVB--r.js.map} +1 -1
- package/studio/web/assets/{status-BIlJkJby.js → status-Db6WBmhf.js} +2 -2
- package/studio/web/assets/{status-BIlJkJby.js.map → status-Db6WBmhf.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/core/bin/cliOperations.js +0 -159
- package/core/bin/lite.js +0 -5
- package/core/bin/stop.js +0 -21
- package/core/dataLayer/harperBridge/BridgeMethods.js +0 -85
- package/core/utility/globalSchema.js +0 -35
- package/core/utility/lmdb/OpenDBIObject.js +0 -31
- package/studio/web/assets/index-CmtPP0YO.js.map +0 -1
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
LATENCY_POSITION,
|
|
28
28
|
} from './replicationConnection.ts';
|
|
29
29
|
import { server } from '../core/server/Server.ts';
|
|
30
|
-
import env from '../core/utility/environment/environmentManager.js';
|
|
30
|
+
import * as env from '../core/utility/environment/environmentManager.js';
|
|
31
31
|
import * as logger from '../core/utility/logging/harper_logger.js';
|
|
32
32
|
import { verifyCertificate } from '../core/security/certificateVerification/index.ts';
|
|
33
33
|
export { startOnMainThread } from './subscriptionManager.ts';
|
|
@@ -97,12 +97,12 @@ export function start(options) {
|
|
|
97
97
|
logger.notify('Starting replication server');
|
|
98
98
|
if (options.hostname && !env.get('node_hostname')) {
|
|
99
99
|
// for back-compat, carry this over
|
|
100
|
-
env.setProperty('node_hostname');
|
|
100
|
+
env.setProperty('node_hostname', options.hostname);
|
|
101
101
|
clearThisNodeName();
|
|
102
102
|
}
|
|
103
103
|
if (options.url && !env.get('node_url')) {
|
|
104
104
|
// for back-compat, carry this over
|
|
105
|
-
env.setProperty('node_url');
|
|
105
|
+
env.setProperty('node_url', options.url);
|
|
106
106
|
clearThisNodeName();
|
|
107
107
|
}
|
|
108
108
|
if (!options.port && !options.securePort) {
|
|
@@ -152,7 +152,7 @@ export function start(options) {
|
|
|
152
152
|
server.http(async (request, nextHandler) => {
|
|
153
153
|
if (request.isWebSocket && request.headers.get('Sec-WebSocket-Protocol') === 'harperdb-replication-v1') {
|
|
154
154
|
logger.debug('Incoming replication WS connection received, authorized: ' + request.authorized);
|
|
155
|
-
const authorizationError = request._nodeRequest.socket.authorizationError;
|
|
155
|
+
const authorizationError = (request._nodeRequest.socket as any).authorizationError;
|
|
156
156
|
if (authorizationError) {
|
|
157
157
|
if (authorizationError === 'CERT_HAS_EXPIRED') {
|
|
158
158
|
logger.error(
|
|
@@ -166,7 +166,7 @@ export function start(options) {
|
|
|
166
166
|
'certificate issuer',
|
|
167
167
|
request.peerCertificate.issuer,
|
|
168
168
|
'did not match any available CAs',
|
|
169
|
-
Array.from(Array.from(wsServers[0].secureContexts.values())[0].options.availableCAs.keys())
|
|
169
|
+
Array.from((Array.from(wsServers[0].secureContexts.values())[0] as any).options.availableCAs.keys())
|
|
170
170
|
);
|
|
171
171
|
}
|
|
172
172
|
}
|
|
@@ -249,7 +249,7 @@ export function start(options) {
|
|
|
249
249
|
// add a big performance penalty on connection setup
|
|
250
250
|
const contextsToUpdate = new Set(wsServer.secureContexts.values());
|
|
251
251
|
if (wsServer.defaultContext) contextsToUpdate.add(wsServer.defaultContext);
|
|
252
|
-
for (const context of contextsToUpdate) {
|
|
252
|
+
for (const context of contextsToUpdate as Set<any>) {
|
|
253
253
|
try {
|
|
254
254
|
const ca = Array.from(replicationCertificateAuthorities);
|
|
255
255
|
// add the replication CAs (and root CAs) to any existing CAs for the context
|
|
@@ -344,6 +344,7 @@ export function setReplicator(dbName: string, table: any, options: any) {
|
|
|
344
344
|
// We may try to consult this to get the other nodes for back-compat
|
|
345
345
|
// const { hub_routes } = getClusteringRoutes();
|
|
346
346
|
table.sourcedFrom(
|
|
347
|
+
// @ts-expect-error: static side intentionally differs from Resource
|
|
347
348
|
class Replicator extends Resource {
|
|
348
349
|
/**
|
|
349
350
|
* This subscribes to the other nodes. Subscription events are notifications rather than
|
|
@@ -475,7 +476,9 @@ function getSubscriptionConnection(
|
|
|
475
476
|
(connection = new NodeReplicationConnection(connectingUrl, subscription, dbName, nodeName, authorization))
|
|
476
477
|
);
|
|
477
478
|
connection.connect();
|
|
478
|
-
connection.once('finished', () =>
|
|
479
|
+
connection.once('finished', () => {
|
|
480
|
+
if (dbConnections.get(dbName) === connection) dbConnections.delete(dbName);
|
|
481
|
+
});
|
|
479
482
|
return connection;
|
|
480
483
|
}
|
|
481
484
|
}
|
|
@@ -502,7 +505,7 @@ function getRetrievalConnectionByName(nodeName, subscription, dbName): NodeRepli
|
|
|
502
505
|
return connection;
|
|
503
506
|
}
|
|
504
507
|
|
|
505
|
-
export async function sendOperationToNode(node, operation, options) {
|
|
508
|
+
export async function sendOperationToNode(node, operation, options?) {
|
|
506
509
|
if (!options) options = {};
|
|
507
510
|
options.serverName = node.name;
|
|
508
511
|
const socket = await createWebSocket(getNodeURL(node), options);
|
|
@@ -590,7 +593,7 @@ export async function unsubscribeFromNode({ url, nodes, database }) {
|
|
|
590
593
|
}
|
|
591
594
|
}
|
|
592
595
|
|
|
593
|
-
server.replication = {
|
|
596
|
+
(server as any).replication = {
|
|
594
597
|
exportIdMapping,
|
|
595
598
|
getIdOfRemoteNode,
|
|
596
599
|
};
|
|
@@ -659,8 +662,8 @@ function hasExplicitlyReplicatedTable(databaseName) {
|
|
|
659
662
|
}
|
|
660
663
|
}
|
|
661
664
|
|
|
662
|
-
export async function replicateOperation(req) {
|
|
663
|
-
const response = { message: '' };
|
|
665
|
+
export async function replicateOperation(req, options?: { onPeerResult?: (result: any) => void }) {
|
|
666
|
+
const response: { message: string; replicated?: any[] } = { message: '' };
|
|
664
667
|
if (req.replicated !== false) {
|
|
665
668
|
req.replicated = false; // don't send a replicated flag to the nodes we are sending to
|
|
666
669
|
logger.trace?.(
|
|
@@ -669,21 +672,35 @@ export async function replicateOperation(req) {
|
|
|
669
672
|
'to nodes',
|
|
670
673
|
server.nodes.map((node) => node.name)
|
|
671
674
|
);
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
675
|
+
// Dispatch all peers in parallel. Each promise resolves to a normalized result
|
|
676
|
+
// (with `.node` attached), and the optional `onPeerResult` callback fires as
|
|
677
|
+
// each peer settles — letting callers surface per-peer progress in real time
|
|
678
|
+
// rather than waiting for the aggregate at the end.
|
|
679
|
+
const onPeerResult = options?.onPeerResult;
|
|
680
|
+
const perPeer = server.nodes.map((node) =>
|
|
681
|
+
sendOperationToNode(node, req)
|
|
682
|
+
.then((value: any) => {
|
|
683
|
+
const result: any = value && typeof value === 'object' ? value : { value };
|
|
684
|
+
result.node = node.name;
|
|
685
|
+
return result;
|
|
686
|
+
})
|
|
687
|
+
.catch((reason) => ({
|
|
688
|
+
status: 'failed',
|
|
689
|
+
reason: reason?.toString?.() ?? String(reason),
|
|
690
|
+
node: node.name,
|
|
691
|
+
}))
|
|
692
|
+
.then((result) => {
|
|
693
|
+
if (onPeerResult) {
|
|
694
|
+
try {
|
|
695
|
+
onPeerResult(result);
|
|
696
|
+
} catch (err) {
|
|
697
|
+
logger.warn?.('onPeerResult callback threw; ignoring', err);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
return result;
|
|
701
|
+
})
|
|
677
702
|
);
|
|
678
|
-
|
|
679
|
-
response.replicated = replicatedResults.map((settledResult, index) => {
|
|
680
|
-
const result =
|
|
681
|
-
settledResult.status === 'rejected'
|
|
682
|
-
? { status: 'failed', reason: settledResult.reason.toString() }
|
|
683
|
-
: settledResult.value;
|
|
684
|
-
result.node = server.nodes[index]?.name; // add the node to the result so we know which node succeeded/failed
|
|
685
|
-
return result;
|
|
686
|
-
});
|
|
703
|
+
response.replicated = await Promise.all(perPeer);
|
|
687
704
|
}
|
|
688
705
|
return response;
|
|
689
706
|
}
|
package/replication/setNode.ts
CHANGED
|
@@ -17,10 +17,13 @@ const { HTTP_STATUS_CODES } = hdbErrors;
|
|
|
17
17
|
const validationSchema = Joi.object({
|
|
18
18
|
hostname: Joi.string(),
|
|
19
19
|
verify_tls: Joi.boolean(),
|
|
20
|
-
replicates: Joi.boolean(),
|
|
20
|
+
replicates: Joi.alternatives().try(Joi.boolean(), Joi.object()),
|
|
21
|
+
sendsTo: Joi.array(),
|
|
22
|
+
receivesFrom: Joi.array(),
|
|
21
23
|
subscriptions: Joi.array(),
|
|
22
24
|
revoked_certificates: Joi.array(),
|
|
23
25
|
shard: Joi.number(),
|
|
26
|
+
isLeader: Joi.boolean(),
|
|
24
27
|
});
|
|
25
28
|
|
|
26
29
|
/**
|
|
@@ -97,7 +100,7 @@ export async function setNode(req: any) {
|
|
|
97
100
|
}
|
|
98
101
|
|
|
99
102
|
// This is the record that will be added to the other nodes hdbNodes table
|
|
100
|
-
const targetAddNodeObj = {
|
|
103
|
+
const targetAddNodeObj: any = {
|
|
101
104
|
operation: 'add_node_back',
|
|
102
105
|
hostname: getThisNodeName(),
|
|
103
106
|
target_hostname: hostname,
|
|
@@ -112,6 +115,13 @@ export async function setNode(req: any) {
|
|
|
112
115
|
targetAddNodeObj.subscriptions = req.subscriptions.map(reverseSubscription);
|
|
113
116
|
} else targetAddNodeObj.subscriptions = null;
|
|
114
117
|
|
|
118
|
+
// Pass route exclusions to the peer with directions swapped: what LOCAL sends to PEER
|
|
119
|
+
// becomes what PEER receives from LOCAL, and vice versa.
|
|
120
|
+
if (req.sendsTo || req.receivesFrom) {
|
|
121
|
+
targetAddNodeObj.sendsTo = req.receivesFrom;
|
|
122
|
+
targetAddNodeObj.receivesFrom = req.sendsTo;
|
|
123
|
+
}
|
|
124
|
+
|
|
115
125
|
if (req.hasOwnProperty('subscribe') || req.hasOwnProperty('publish')) {
|
|
116
126
|
const rev = reverseSubscription(req);
|
|
117
127
|
targetAddNodeObj.subscribe = rev.subscribe;
|
|
@@ -125,7 +135,7 @@ export async function setNode(req: any) {
|
|
|
125
135
|
|
|
126
136
|
let targetNodeResponse: any;
|
|
127
137
|
let targetNodeResponseError: Error;
|
|
128
|
-
hdbLogger.
|
|
138
|
+
hdbLogger.notify('sending add_node_back operation', targetAddNodeObj);
|
|
129
139
|
try {
|
|
130
140
|
targetNodeResponse = await sendOperationToNode({ url }, targetAddNodeObj, req);
|
|
131
141
|
} catch (err) {
|
|
@@ -167,9 +177,11 @@ export async function setNode(req: any) {
|
|
|
167
177
|
cert_auth = targetNodeResponse.signingCA;
|
|
168
178
|
}
|
|
169
179
|
|
|
170
|
-
const nodeRecord = { url, ca: targetNodeResponse?.usingCA };
|
|
180
|
+
const nodeRecord: any = { url, ca: targetNodeResponse?.usingCA };
|
|
171
181
|
if (req.hostname) nodeRecord.name = req.hostname;
|
|
172
182
|
if (req.subscriptions) nodeRecord.subscriptions = req.subscriptions;
|
|
183
|
+
else if (req.sendsTo || req.receivesFrom)
|
|
184
|
+
nodeRecord.replicates = { sends: true, sendsTo: req.sendsTo, receivesFrom: req.receivesFrom };
|
|
173
185
|
else nodeRecord.replicates = true;
|
|
174
186
|
if (req.start_time) {
|
|
175
187
|
nodeRecord.start_time = typeof req.start_time === 'string' ? new Date(req.start_time).getTime() : req.start_time;
|
|
@@ -178,9 +190,13 @@ export async function setNode(req: any) {
|
|
|
178
190
|
if (req.revoked_certificates) nodeRecord.revoked_certificates = req.revoked_certificates;
|
|
179
191
|
if (targetNodeResponse?.shard !== undefined) nodeRecord.shard = targetNodeResponse.shard;
|
|
180
192
|
else if (req.shard !== undefined) nodeRecord.shard = req.shard;
|
|
193
|
+
// isLeader is LOCAL-ONLY: it means "this peer is my leader; request a full-table copy from it".
|
|
194
|
+
// It must NOT be forwarded to the peer via targetAddNodeObj — doing so would cause the peer
|
|
195
|
+
// to treat this node as its leader and attempt to full-copy in the wrong direction.
|
|
196
|
+
if (req.isLeader !== undefined) nodeRecord.isLeader = req.isLeader;
|
|
181
197
|
|
|
182
198
|
if (nodeRecord.replicates) {
|
|
183
|
-
const thisNode = {
|
|
199
|
+
const thisNode: any = {
|
|
184
200
|
url: thisUrl,
|
|
185
201
|
ca: cert_auth,
|
|
186
202
|
replicates: true,
|
|
@@ -212,7 +228,7 @@ export async function setNode(req: any) {
|
|
|
212
228
|
export async function addNodeBack(req) {
|
|
213
229
|
hdbLogger.trace('addNodeBack received request:', req);
|
|
214
230
|
|
|
215
|
-
let certs = {};
|
|
231
|
+
let certs: any = {};
|
|
216
232
|
// If the add_node req has a CSR attached, return the CA that was used to issue the CSR,
|
|
217
233
|
// else return whatever CA this node is using for replication
|
|
218
234
|
let originCa: string;
|
|
@@ -230,9 +246,12 @@ export async function addNodeBack(req) {
|
|
|
230
246
|
);
|
|
231
247
|
}
|
|
232
248
|
|
|
233
|
-
const nodeRecord = { url: req.url, ca: originCa };
|
|
249
|
+
const nodeRecord: any = { url: req.url, ca: originCa };
|
|
234
250
|
if (req.subscriptions) nodeRecord.subscriptions = req.subscriptions;
|
|
235
|
-
else {
|
|
251
|
+
else if (req.sendsTo || req.receivesFrom) {
|
|
252
|
+
nodeRecord.replicates = { sends: true, sendsTo: req.sendsTo, receivesFrom: req.receivesFrom };
|
|
253
|
+
nodeRecord.subscriptions = null;
|
|
254
|
+
} else {
|
|
236
255
|
nodeRecord.replicates = true;
|
|
237
256
|
nodeRecord.subscriptions = null;
|
|
238
257
|
}
|
|
@@ -243,7 +262,7 @@ export async function addNodeBack(req) {
|
|
|
243
262
|
|
|
244
263
|
const repCa = await getReplicationCertAuth();
|
|
245
264
|
if (nodeRecord.replicates) {
|
|
246
|
-
const thisNode = {
|
|
265
|
+
const thisNode: any = {
|
|
247
266
|
url: getThisNodeUrl(),
|
|
248
267
|
ca: repCa?.certificate,
|
|
249
268
|
replicates: true,
|
|
@@ -14,25 +14,25 @@ import {
|
|
|
14
14
|
getHDBNodeTable,
|
|
15
15
|
iterateRoutes,
|
|
16
16
|
shouldReplicateFromNode,
|
|
17
|
-
type Node,
|
|
18
17
|
type Route,
|
|
19
18
|
getNodeURL,
|
|
20
19
|
} from './knownNodes.ts';
|
|
21
20
|
import * as logger from '../core/utility/logging/harper_logger.js';
|
|
22
21
|
import lodash from 'lodash';
|
|
23
22
|
const { cloneDeep } = lodash;
|
|
24
|
-
import env from '../core/utility/environment/environmentManager.js';
|
|
23
|
+
import * as env from '../core/utility/environment/environmentManager.js';
|
|
25
24
|
import { CONFIG_PARAMS } from '../core/utility/hdbTerms.ts';
|
|
26
25
|
import { X509Certificate } from 'crypto';
|
|
27
26
|
import minimist from 'minimist';
|
|
28
27
|
const cliArgs = minimist(process.argv);
|
|
29
28
|
|
|
30
29
|
type ConnectedWorkerStatus = {
|
|
31
|
-
worker:
|
|
30
|
+
worker: any;
|
|
32
31
|
connected?: boolean;
|
|
33
32
|
latency?: number;
|
|
34
33
|
};
|
|
35
34
|
type ReplicationConnectionStatus = {
|
|
35
|
+
url?: string;
|
|
36
36
|
nodes: ({
|
|
37
37
|
name: string;
|
|
38
38
|
url: string;
|
|
@@ -41,9 +41,12 @@ type ReplicationConnectionStatus = {
|
|
|
41
41
|
startTime?: number;
|
|
42
42
|
endTime?: number;
|
|
43
43
|
shard?: string;
|
|
44
|
+
subscriptions?: any;
|
|
45
|
+
worker?: any;
|
|
46
|
+
isLeader?: boolean;
|
|
44
47
|
} & ConnectedWorkerStatus)[];
|
|
45
48
|
} & ConnectedWorkerStatus;
|
|
46
|
-
type DBReplicationStatusMap = Map<string, ReplicationConnectionStatus> & { iterator
|
|
49
|
+
type DBReplicationStatusMap = Map<string, ReplicationConnectionStatus> & { iterator?: any };
|
|
47
50
|
|
|
48
51
|
const NODE_SUBSCRIBE_DELAY = 200; // delay before sending node subscribe to other nodes, so operations can complete first
|
|
49
52
|
// When a worker dies it may have been holding subscriptions for many (database, node) pairs.
|
|
@@ -52,8 +55,36 @@ const NODE_SUBSCRIBE_DELAY = 200; // delay before sending node subscribe to othe
|
|
|
52
55
|
// caused the OOM in the first place. We stagger the re-subscriptions in time so the new
|
|
53
56
|
// worker(s) absorb them gradually.
|
|
54
57
|
const WORKER_EXIT_REASSIGN_STAGGER_MS = 100;
|
|
58
|
+
// Cadence of the per-process safety-net reconcile that rebinds subscriptions whose
|
|
59
|
+
// worker no longer exists. Pure read-side filter against `workers` and
|
|
60
|
+
// `connectionReplicationMap` on each tick when nothing is wrong, so a short interval
|
|
61
|
+
// is cheap. Sized for the deploy-time rapid-restart-storm pattern (stacked
|
|
62
|
+
// `restart_http_workers` at ~1.5s spacing under live write traffic), where the per-
|
|
63
|
+
// worker exit chain races against shutdown and silently drops half the subscription
|
|
64
|
+
// assignments — this is the user-visible recovery latency for the resulting drift.
|
|
65
|
+
const RECONCILE_INTERVAL_MS = 5_000;
|
|
55
66
|
let nextWorkerExitReassignAt = 0;
|
|
56
67
|
const connectionReplicationMap = new Map<string, DBReplicationStatusMap>();
|
|
68
|
+
// Returns the set of node URLs whose replication entries either point at a worker no longer
|
|
69
|
+
// in the supplied http pool, OR have no worker assigned at all while live workers exist.
|
|
70
|
+
// The second case covers "all workers were down at registration time" — onDatabase stores
|
|
71
|
+
// `worker: undefined` when httpWorkers is empty, and without this the entry would never
|
|
72
|
+
// get reassigned once workers came back. Pure helper so the reconcile pass below — and its
|
|
73
|
+
// unit tests — can verify the broken-chain detection without spinning up real workers.
|
|
74
|
+
export function findStaleNodeUrls(connectionMap: Map<string, DBReplicationStatusMap>, httpWorkers: any[]): Set<string> {
|
|
75
|
+
const staleNodeUrls = new Set<string>();
|
|
76
|
+
// No live workers to reassign to — flagging here would cause endless no-op reassignments.
|
|
77
|
+
if (httpWorkers.length === 0) return staleNodeUrls;
|
|
78
|
+
for (const [url, dbReplicationWorkers] of connectionMap) {
|
|
79
|
+
for (const entry of dbReplicationWorkers.values()) {
|
|
80
|
+
if (!entry.worker || !httpWorkers.includes(entry.worker)) {
|
|
81
|
+
staleNodeUrls.add(url);
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return staleNodeUrls;
|
|
87
|
+
}
|
|
57
88
|
export let disconnectedFromNode; // this is set by thread to handle when a node is disconnected (or notify main thread so it can handle)
|
|
58
89
|
export let connectedToNode; // this is set by thread to handle when a node is connected (or notify main thread so it can handle)
|
|
59
90
|
const nodeMap = new Map(); // this is a map of all nodes that are available to connect to
|
|
@@ -71,7 +102,7 @@ export async function startOnMainThread(options) {
|
|
|
71
102
|
for (const tableName in database) {
|
|
72
103
|
const table = database[tableName];
|
|
73
104
|
if (table.auditStore) {
|
|
74
|
-
selfCatchupOfDatabase.set(dbName, lastTimeInAuditStore(table.auditStore));
|
|
105
|
+
selfCatchupOfDatabase.set(dbName, lastTimeInAuditStore(table.auditStore) as number);
|
|
75
106
|
break;
|
|
76
107
|
}
|
|
77
108
|
}
|
|
@@ -102,7 +133,7 @@ export async function startOnMainThread(options) {
|
|
|
102
133
|
}
|
|
103
134
|
}
|
|
104
135
|
if (getHDBNodeTable().primaryStore.get(thisName)) ensureThisNode(); // if this node record already exists, check for config changes
|
|
105
|
-
for (const route of iterateRoutes(options)) {
|
|
136
|
+
for (const route of iterateRoutes(options) as any) {
|
|
106
137
|
try {
|
|
107
138
|
const replicateAll = !route.subscriptions;
|
|
108
139
|
if (replicateAll) {
|
|
@@ -143,6 +174,7 @@ export async function startOnMainThread(options) {
|
|
|
143
174
|
logger.info('Setting up node replication for', node);
|
|
144
175
|
if (!node) {
|
|
145
176
|
// deleted node
|
|
177
|
+
nodeMap.delete(hostname);
|
|
146
178
|
for (const [url, dbReplicationWorkers] of connectionReplicationMap) {
|
|
147
179
|
let foundNode;
|
|
148
180
|
for (const [_database, { nodes }] of dbReplicationWorkers) {
|
|
@@ -170,7 +202,16 @@ export async function startOnMainThread(options) {
|
|
|
170
202
|
if (isSelf) return;
|
|
171
203
|
let dbReplicationWorkers = connectionReplicationMap.get(getNodeURL(node));
|
|
172
204
|
if (dbReplicationWorkers) dbReplicationWorkers.iterator.remove(); // we need to remove the old iterator so we can create a new one
|
|
173
|
-
if (
|
|
205
|
+
if (
|
|
206
|
+
!(
|
|
207
|
+
node.replicates === true ||
|
|
208
|
+
node.replicates?.sends ||
|
|
209
|
+
node.replicates?.sendsTo?.length ||
|
|
210
|
+
node.replicates?.receivesFrom?.length
|
|
211
|
+
) &&
|
|
212
|
+
!node.subscriptions?.length &&
|
|
213
|
+
!dbReplicationWorkers
|
|
214
|
+
)
|
|
174
215
|
return; // we don't have any subscriptions and we haven't connected yet, so just return
|
|
175
216
|
logger.info(`Added node ${node.name} at ${getNodeURL(node)} for process ${getThisNodeName()}`);
|
|
176
217
|
if (node.replicates && node.subscriptions) {
|
|
@@ -211,12 +252,37 @@ export async function startOnMainThread(options) {
|
|
|
211
252
|
}
|
|
212
253
|
}
|
|
213
254
|
}
|
|
255
|
+
// When this peer is our leader, bootstrap subscriptions for configured databases
|
|
256
|
+
// that don't exist locally yet — they need a full-table copy from the leader.
|
|
257
|
+
// forEachReplicatedDatabase above only iterates local databases, so an empty node
|
|
258
|
+
// joining a populated leader would never schedule the catchup without this.
|
|
259
|
+
if (node.isLeader && Array.isArray(options?.databases)) {
|
|
260
|
+
for (const dbConfig of options.databases) {
|
|
261
|
+
const databaseName = typeof dbConfig === 'string' ? dbConfig : dbConfig?.name;
|
|
262
|
+
if (databaseName && !databases[databaseName]) {
|
|
263
|
+
logger.warn(
|
|
264
|
+
`isLeader: bootstrapping full-copy subscription for non-existent database ${databaseName} from ${node.name}`
|
|
265
|
+
);
|
|
266
|
+
onDatabase(databaseName, true);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
214
270
|
|
|
215
271
|
function onDatabase(databaseName, tablesReplicateByDefault) {
|
|
216
272
|
logger.trace('Setting up replication for database', databaseName, 'on node', node.name);
|
|
217
|
-
|
|
273
|
+
let existingEntry = dbReplicationWorkers.get(databaseName);
|
|
218
274
|
let worker;
|
|
219
|
-
|
|
275
|
+
// Find the matching route config for this peer so we can pass its receivesFrom/sendsTo
|
|
276
|
+
// exclusions to the worker thread (via the node subscription payload). For dynamic
|
|
277
|
+
// routes (add_node), fall back to the node's own hdb_nodes replicates object.
|
|
278
|
+
const matchingRoute = routes.find((r) => r.name === node.name);
|
|
279
|
+
const routeReplicates =
|
|
280
|
+
typeof matchingRoute?.replicates === 'object'
|
|
281
|
+
? matchingRoute.replicates
|
|
282
|
+
: node.replicates && typeof node.replicates === 'object'
|
|
283
|
+
? node.replicates
|
|
284
|
+
: null;
|
|
285
|
+
const nodes = [{ replicateByDefault: tablesReplicateByDefault, ...node, routeReplicates }];
|
|
220
286
|
// Self catchup is done in case we have replicated any records that weren't actually written to our storage
|
|
221
287
|
// before a crash.
|
|
222
288
|
if (selfCatchupOfDatabase.has(databaseName) && env.get(CONFIG_PARAMS.REPLICATION_FAILOVER)) {
|
|
@@ -233,6 +299,18 @@ export async function startOnMainThread(options) {
|
|
|
233
299
|
}
|
|
234
300
|
const shouldSubscribe = shouldReplicateFromNode(node, databaseName);
|
|
235
301
|
const httpWorkers = workers.filter((worker) => worker.name === 'http');
|
|
302
|
+
// Defensively detect entries that point at a worker no longer in the http pool.
|
|
303
|
+
// This happens when the worker.on('exit') handler below never fired (hung WebSocket
|
|
304
|
+
// refs blocking exit), the identity check rejected the reassignment, or its
|
|
305
|
+
// setTimeout retry was lost. We also catch the case where the entry has no worker
|
|
306
|
+
// assigned at all (all workers were down at registration time) so it gets rebound
|
|
307
|
+
// once workers come back. Without these checks, the early-return branch keeps the
|
|
308
|
+
// entry stuck and the subscription never recovers.
|
|
309
|
+
if (existingEntry && httpWorkers.length > 0 && !httpWorkers.includes(existingEntry.worker as any)) {
|
|
310
|
+
logger.warn(`Subscription for ${databaseName} on node ${node.name} has no live worker; reassigning`);
|
|
311
|
+
dbReplicationWorkers.delete(databaseName);
|
|
312
|
+
existingEntry = undefined;
|
|
313
|
+
}
|
|
236
314
|
if (existingEntry) {
|
|
237
315
|
worker = existingEntry.worker;
|
|
238
316
|
existingEntry.nodes = nodes;
|
|
@@ -268,6 +346,12 @@ export async function startOnMainThread(options) {
|
|
|
268
346
|
cliArgs.HDB_LEADER_URL ?? // first see if there was a leader explicitly specified
|
|
269
347
|
process.env.HDB_LEADER_URL ??
|
|
270
348
|
routes[0]?.url; // if we have routes, use the first one
|
|
349
|
+
// Track whether the leader is explicitly configured (env/cli/routes). The
|
|
350
|
+
// fallback "first other node in hdb_nodes" is only a guess and must NOT be
|
|
351
|
+
// treated as authoritative — otherwise a bidirectional add_node handshake
|
|
352
|
+
// where the responder has no leader config will incorrectly mark the
|
|
353
|
+
// requester as its leader and trigger a reverse full-table copy.
|
|
354
|
+
const hasExplicitLeader = !!leaderUrl;
|
|
271
355
|
|
|
272
356
|
let leaderName = leaderUrl
|
|
273
357
|
? new URL(leaderUrl).hostname
|
|
@@ -278,7 +362,13 @@ export async function startOnMainThread(options) {
|
|
|
278
362
|
)[0]; // try to find the first node
|
|
279
363
|
const nodeName = nodes[0].name ?? (nodes[0].url && new URL(nodes[0].url).hostname);
|
|
280
364
|
logger.warn(`Setting up subscription with leader ${leaderName} for node ${nodeName}`);
|
|
281
|
-
|
|
365
|
+
// isLeader is true only if:
|
|
366
|
+
// 1. it was explicitly persisted (e.g. by add_node { isLeader: true }), OR
|
|
367
|
+
// 2. there is no leader candidate at all, OR
|
|
368
|
+
// 3. an explicitly configured leader (env/cli/routes) matches this node.
|
|
369
|
+
// We deliberately do NOT honour nodeName === leaderName when leaderName came
|
|
370
|
+
// from the "first other node in hdb_nodes" fallback — that's just a guess.
|
|
371
|
+
nodes[0].isLeader = nodes[0].isLeader || !leaderName || (hasExplicitLeader && nodeName === leaderName);
|
|
282
372
|
nodes[0].url ??= getNodeURL(nodes[0]);
|
|
283
373
|
setTimeout(() => {
|
|
284
374
|
const request = {
|
|
@@ -353,8 +443,16 @@ export async function startOnMainThread(options) {
|
|
|
353
443
|
// if failover is disabled, immediately return
|
|
354
444
|
return;
|
|
355
445
|
}
|
|
356
|
-
const mainNode = existingWorkerEntry.nodes[0];
|
|
357
|
-
if (
|
|
446
|
+
const mainNode: any = existingWorkerEntry.nodes[0];
|
|
447
|
+
if (
|
|
448
|
+
!(
|
|
449
|
+
mainNode.replicates === true ||
|
|
450
|
+
mainNode.replicates?.sends ||
|
|
451
|
+
mainNode.replicates?.sendsTo?.length ||
|
|
452
|
+
mainNode.replicates?.receivesFrom?.length ||
|
|
453
|
+
mainNode.subscriptions?.length
|
|
454
|
+
)
|
|
455
|
+
) {
|
|
358
456
|
// no replication, so just return
|
|
359
457
|
return;
|
|
360
458
|
}
|
|
@@ -462,7 +560,7 @@ export async function startOnMainThread(options) {
|
|
|
462
560
|
}
|
|
463
561
|
}
|
|
464
562
|
};
|
|
465
|
-
function connectToNextWorker(node:
|
|
563
|
+
function connectToNextWorker(node: any, database: string, connectingNode = node) {
|
|
466
564
|
const httpWorkers = workers.filter((worker: any) => worker.name === 'http');
|
|
467
565
|
nextWorkerIndex = nextWorkerIndex % httpWorkers.length; // wrap around as necessary
|
|
468
566
|
const worker = httpWorkers[nextWorkerIndex++];
|
|
@@ -478,6 +576,32 @@ export async function startOnMainThread(options) {
|
|
|
478
576
|
});
|
|
479
577
|
} else subscribeToNode({ url: getNodeURL(connectingNode), name: connectingNode.name, database, nodes: [node] });
|
|
480
578
|
}
|
|
579
|
+
// Periodic safety net for stale subscription entries. The existing per-database
|
|
580
|
+
// worker.on('exit') chain reassigns to a healthy worker after a worker dies, but a
|
|
581
|
+
// single broken link in that chain (identity check failing, setTimeout retry being
|
|
582
|
+
// lost under load, shouldSubscribe early-return pinning to a dead worker before
|
|
583
|
+
// the defensive check was added) used to leave the entry permanently pointing at
|
|
584
|
+
// an exited worker, silently breaking outbound replication for the lifetime of the
|
|
585
|
+
// process. This reconciles independently of the chain so the broken-state node
|
|
586
|
+
// can never get stuck.
|
|
587
|
+
function reconcileWorkers() {
|
|
588
|
+
const httpWorkers = workers.filter((worker) => worker.name === 'http');
|
|
589
|
+
const staleNodeUrls = findStaleNodeUrls(connectionReplicationMap, httpWorkers);
|
|
590
|
+
if (staleNodeUrls.size === 0) return;
|
|
591
|
+
logger.warn(
|
|
592
|
+
'Reconciling replication subscriptions for nodes pointing at exited workers:',
|
|
593
|
+
Array.from(staleNodeUrls)
|
|
594
|
+
);
|
|
595
|
+
for (const node of nodeMap.values()) {
|
|
596
|
+
if (!staleNodeUrls.has(getNodeURL(node))) continue;
|
|
597
|
+
try {
|
|
598
|
+
onNodeUpdate(node);
|
|
599
|
+
} catch (error) {
|
|
600
|
+
logger.error('Error reconciling node', node?.name, error);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
setInterval(reconcileWorkers, RECONCILE_INTERVAL_MS).unref();
|
|
481
605
|
onMessageByType('disconnected-from-node', disconnectedFromNode);
|
|
482
606
|
onMessageByType('connected-to-node', connectedToNode);
|
|
483
607
|
onMessageByType('request-cluster-status', requestClusterStatus);
|
|
@@ -489,7 +613,7 @@ export async function startOnMainThread(options) {
|
|
|
489
613
|
* @param message
|
|
490
614
|
* @param port
|
|
491
615
|
*/
|
|
492
|
-
export function requestClusterStatus(message
|
|
616
|
+
export function requestClusterStatus(message?, port?) {
|
|
493
617
|
const connections = [];
|
|
494
618
|
for (const [node_name, node] of nodeMap) {
|
|
495
619
|
try {
|
package/security/certificate.ts
CHANGED
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
getPrimaryHostName,
|
|
19
19
|
setCertTable,
|
|
20
20
|
} from '../core/security/keys.js';
|
|
21
|
-
import env from '../core/utility/environment/environmentManager.js';
|
|
21
|
+
import * as env from '../core/utility/environment/environmentManager.js';
|
|
22
22
|
import { LICENSE_KEY_DIR_NAME } from '../core/utility/hdbTerms.ts';
|
|
23
23
|
import harperLogger from '../core/utility/logging/harper_logger.js';
|
|
24
24
|
import { getThisNodeName } from '../core/server/nodeName.ts';
|
|
@@ -36,7 +36,7 @@ const fileExists = async (path: string): Promise<boolean> =>
|
|
|
36
36
|
.catch(() => false);
|
|
37
37
|
|
|
38
38
|
export async function signCertificate(req) {
|
|
39
|
-
const response = {};
|
|
39
|
+
const response: any = {};
|
|
40
40
|
const hdbKeysDir = join(env.getHdbBasePath(), LICENSE_KEY_DIR_NAME);
|
|
41
41
|
|
|
42
42
|
if (req.csr) {
|
|
@@ -117,7 +117,11 @@ export async function createCsr() {
|
|
|
117
117
|
const hdbKeysDir = join(env.getHdbBasePath(), LICENSE_KEY_DIR_NAME);
|
|
118
118
|
let opsCert, opsPrivateKey, certName, privateKeyName;
|
|
119
119
|
for await (const cert of certificateTable.search([])) {
|
|
120
|
-
if (
|
|
120
|
+
if (
|
|
121
|
+
cert.is_self_signed &&
|
|
122
|
+
(cert.details?.issuer?.includes('Harper-Certificate-Authority') ||
|
|
123
|
+
cert.details?.issuer?.includes('HarperDB-Certificate-Authority'))
|
|
124
|
+
) {
|
|
121
125
|
// privateKeys Map is populated from config-referenced paths only, so a Harper CA key
|
|
122
126
|
// on disk but not referenced in config won't appear there — fall back to reading it.
|
|
123
127
|
let key: string | Buffer | undefined = privateKeys.get(cert.private_key_name);
|
|
@@ -361,7 +365,7 @@ async function removeCertificate(req: { name: string }): Promise<{ message: stri
|
|
|
361
365
|
);
|
|
362
366
|
|
|
363
367
|
// Only delete the key file if this is the only cert referencing it.
|
|
364
|
-
if (matchingKeys.length === 1 && matchingKeys[0].name === name) {
|
|
368
|
+
if (matchingKeys.length === 1 && (matchingKeys[0] as any).name === name) {
|
|
365
369
|
try {
|
|
366
370
|
logger.info?.('Removing private key named', private_key_name);
|
|
367
371
|
await unlink(join(env.getHdbBasePath(), LICENSE_KEY_DIR_NAME, private_key_name));
|
|
@@ -6,7 +6,7 @@ import { validateBySchema } from '../core/validation/validationWrapper.js';
|
|
|
6
6
|
import harperLogger from '../core/utility/logging/harper_logger.js';
|
|
7
7
|
import { ClientError } from '../core/utility/errors/hdbError.js';
|
|
8
8
|
import { CONFIG_PARAMS } from '../core/utility/hdbTerms.ts';
|
|
9
|
-
import env from '../core/utility/environment/environmentManager.js';
|
|
9
|
+
import * as env from '../core/utility/environment/environmentManager.js';
|
|
10
10
|
import { replicateOperation } from '../replication/replicator.ts';
|
|
11
11
|
|
|
12
12
|
// SSH key name can only be alphanumeric, dash and underscores
|