@harperfast/harper-pro 5.0.30 → 5.1.0-beta.2
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 +94 -6
- package/core/DESIGN.md +36 -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 +134 -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 +17 -24
- 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 +132 -18
- package/core/components/anthropic/index.ts +547 -0
- package/core/components/bedrock/index.ts +823 -0
- package/core/components/componentLoader.ts +64 -32
- package/core/components/deployLifecycle.ts +161 -0
- package/core/components/deploymentOperations.ts +173 -0
- package/core/components/deploymentRecorder.ts +427 -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 +607 -0
- package/core/components/mcp/session.ts +151 -0
- package/core/components/mcp/sessionRegistry.ts +140 -0
- package/core/components/mcp/toolRegistry.ts +294 -0
- package/core/components/mcp/tools/application.ts +761 -0
- package/core/components/mcp/tools/operations.ts +311 -0
- package/core/components/mcp/tools/schemas/derive.ts +356 -0
- package/core/components/mcp/tools/schemas/operationDescriptions.ts +241 -0
- package/core/components/mcp/tools/schemas/operations.ts +301 -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 +217 -60
- package/core/components/operationsValidation.js +12 -4
- 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 +9087 -4345
- 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 +41 -39
- package/core/resources/RequestTarget.ts +2 -0
- package/core/resources/Resource.ts +96 -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 +13 -4
- package/core/resources/Table.ts +440 -223
- package/core/resources/analytics/metadata.ts +1 -0
- package/core/resources/analytics/read.ts +99 -10
- package/core/resources/analytics/write.ts +240 -17
- package/core/resources/auditStore.ts +30 -19
- package/core/resources/blob.ts +53 -53
- package/core/resources/dataLoader.ts +4 -4
- package/core/resources/databases.ts +208 -74
- package/core/resources/graphql.ts +267 -165
- package/core/resources/indexes/HierarchicalNavigableSmallWorld.ts +310 -65
- package/core/resources/indexes/vector.ts +17 -0
- package/core/resources/jsonSchemaTypes.ts +102 -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/openApi.ts +65 -31
- package/core/resources/replayLogs.ts +20 -9
- package/core/resources/replayLogsGuards.ts +45 -0
- package/core/resources/roles.ts +62 -67
- package/core/resources/search.ts +355 -135
- package/core/resources/tracked.ts +18 -9
- 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 +3 -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/static/defaultConfig.yaml +0 -1
- 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-1-0.ts +89 -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} +6 -54
- 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 +54 -1
- package/core/utility/install/checkJWTTokensExist.js +1 -1
- package/core/utility/install/{installer.js → installer.ts} +86 -62
- 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 +57 -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} +137 -90
- package/core/utility/logging/{logRotator.js → logRotator.ts} +15 -18
- 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 +44 -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 +123 -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 +14 -22
- package/dist/core/bin/upgrade.js.map +1 -1
- 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 +112 -12
- 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 +65 -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 +425 -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 +526 -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 +177 -0
- package/dist/core/components/mcp/toolRegistry.js.map +1 -0
- package/dist/core/components/mcp/tools/application.js +660 -0
- package/dist/core/components/mcp/tools/application.js.map +1 -0
- package/dist/core/components/mcp/tools/operations.js +331 -0
- package/dist/core/components/mcp/tools/operations.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/derive.js +291 -0
- package/dist/core/components/mcp/tools/schemas/derive.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/operationDescriptions.js +179 -0
- package/dist/core/components/mcp/tools/schemas/operationDescriptions.js.map +1 -0
- package/dist/core/components/mcp/tools/schemas/operations.js +299 -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 +205 -52
- package/dist/core/components/operations.js.map +1 -1
- package/dist/core/components/operationsValidation.js +13 -4
- package/dist/core/components/operationsValidation.js.map +1 -1
- 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 +38 -38
- package/dist/core/resources/RecordEncoder.js.map +1 -1
- package/dist/core/resources/RequestTarget.js.map +1 -1
- package/dist/core/resources/Resource.js +43 -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 +10 -3
- package/dist/core/resources/RocksTransactionLogStore.js.map +1 -1
- package/dist/core/resources/Table.js +306 -116
- 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 +69 -8
- 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 +16 -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 +175 -59
- package/dist/core/resources/databases.js.map +1 -1
- package/dist/core/resources/graphql.js +267 -173
- package/dist/core/resources/graphql.js.map +1 -1
- package/dist/core/resources/indexes/HierarchicalNavigableSmallWorld.js +327 -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/jsonSchemaTypes.js +78 -0
- package/dist/core/resources/jsonSchemaTypes.js.map +1 -0
- 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/openApi.js +74 -34
- package/dist/core/resources/openApi.js.map +1 -1
- package/dist/core/resources/replayLogs.js +7 -1
- package/dist/core/resources/replayLogs.js.map +1 -1
- package/dist/core/resources/replayLogsGuards.js +47 -0
- package/dist/core/resources/replayLogsGuards.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 +23 -15
- 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 +46 -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-1-0.js +114 -0
- package/dist/core/upgrade/directives/5-1-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 +55 -60
- 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 +54 -1
- 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 +136 -73
- 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 +68 -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 +177 -82
- package/dist/core/utility/logging/harper_logger.js.map +1 -1
- package/dist/core/utility/logging/logRotator.js +67 -32
- 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 +80 -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 +171 -41
- 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 +56 -28
- package/dist/replication/replicator.js.map +1 -1
- package/dist/replication/setNode.js +24 -4
- package/dist/replication/setNode.js.map +1 -1
- package/dist/replication/subscriptionManager.js +195 -16
- 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 +9032 -4334
- package/package.json +17 -12
- package/replication/DESIGN.md +139 -0
- package/replication/knownNodes.ts +165 -44
- package/replication/replicationConnection.ts +475 -92
- package/replication/replicator.ts +54 -27
- package/replication/setNode.ts +29 -10
- package/replication/subscriptionManager.ts +227 -21
- package/security/certificate.ts +8 -4
- package/security/sshKeyOperations.ts +1 -1
- package/static/defaultConfig.yaml +1 -0
- package/studio/web/assets/{index-CybLScHg.js → index-Dqr9oVhe.js} +5 -5
- package/studio/web/assets/index-Dqr9oVhe.js.map +1 -0
- package/studio/web/assets/{index.lazy-DKx5-iXF.js → index.lazy-CpKcKb7M.js} +2 -2
- package/studio/web/assets/{index.lazy-DKx5-iXF.js.map → index.lazy-CpKcKb7M.js.map} +1 -1
- package/studio/web/assets/{profile-BOjes0Wl.js → profile-C1cujdsg.js} +2 -2
- package/studio/web/assets/{profile-BOjes0Wl.js.map → profile-C1cujdsg.js.map} +1 -1
- package/studio/web/assets/{status-EWKUIrjT.js → status-CTiIIQlY.js} +2 -2
- package/studio/web/assets/{status-EWKUIrjT.js.map → status-CTiIIQlY.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-CybLScHg.js.map +0 -1
|
@@ -2,62 +2,69 @@
|
|
|
2
2
|
|
|
3
3
|
const { isMainThread, parentPort, threadId, workerData } = require('node:worker_threads');
|
|
4
4
|
const { createServer: createSocketServer } = require('node:net');
|
|
5
|
-
const { unlinkSync, existsSync } = require('fs');
|
|
5
|
+
const { unlinkSync, existsSync, mkdirSync } = require('fs');
|
|
6
|
+
const { join } = require('path');
|
|
6
7
|
let componentsLoadedResolve;
|
|
7
8
|
exports.whenComponentsLoaded = new Promise((resolve) => {
|
|
8
9
|
componentsLoadedResolve = resolve;
|
|
9
10
|
});
|
|
10
11
|
|
|
11
|
-
const harperLogger = require('../../utility/logging/harper_logger.
|
|
12
|
-
const env = require('../../utility/environment/environmentManager.
|
|
12
|
+
const harperLogger = require('../../utility/logging/harper_logger.ts');
|
|
13
|
+
const env = require('../../utility/environment/environmentManager.ts');
|
|
13
14
|
const terms = require('../../utility/hdbTerms.ts');
|
|
14
15
|
const { server } = require('../Server.ts');
|
|
15
16
|
let { createServer: createSecureSocketServer } = require('node:tls');
|
|
16
17
|
const { restartNumber, getWorkerIndex } = require('./manageThreads.js');
|
|
17
|
-
const {
|
|
18
|
-
const {
|
|
19
|
-
const {
|
|
18
|
+
const { realExit } = require('./workerProcessGuard.ts');
|
|
19
|
+
const { isBun } = require('../serverHelpers/Request.ts');
|
|
20
|
+
const { createTLSSelector } = require('../../security/keys.ts');
|
|
21
|
+
const { startupLog } = require('../../bin/run.ts');
|
|
20
22
|
const { SERVERS, setPortServerMap, portServer } = require('../serverRegistry.ts');
|
|
21
23
|
const httpComponent = require('../http.ts');
|
|
22
24
|
const globals = require('../../globals.js');
|
|
23
25
|
|
|
24
26
|
const debugThreads = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG);
|
|
25
|
-
const
|
|
27
|
+
const isWindows = process.platform === 'win32';
|
|
26
28
|
server.socket = onSocket;
|
|
27
29
|
|
|
28
|
-
if (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
if (!isBun) {
|
|
31
|
+
if (debugThreads) {
|
|
32
|
+
let port;
|
|
33
|
+
if (isMainThread) {
|
|
34
|
+
port = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_PORT) ?? 9229;
|
|
35
|
+
const closeInspector = () => {
|
|
36
|
+
try {
|
|
37
|
+
require('inspector').close();
|
|
38
|
+
} catch (error) {
|
|
39
|
+
harperLogger.info('Could not close debugger', error);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
for (const signal of ['SIGINT', 'SIGTERM', 'SIGQUIT', 'exit']) {
|
|
43
|
+
process.on(signal, closeInspector);
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
const startingPort = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);
|
|
47
|
+
if (startingPort && getWorkerIndex() >= 0) {
|
|
48
|
+
port = startingPort + getWorkerIndex();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (port) {
|
|
52
|
+
const host = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_HOST);
|
|
53
|
+
const waitForDebugger = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);
|
|
33
54
|
try {
|
|
34
|
-
require('inspector').
|
|
55
|
+
require('inspector').open(port, host, waitForDebugger);
|
|
35
56
|
} catch (error) {
|
|
36
|
-
harperLogger.
|
|
57
|
+
harperLogger.trace(`Could not start debugging on port ${port}, you may already be debugging:`, error.message);
|
|
37
58
|
}
|
|
38
|
-
});
|
|
39
|
-
} else {
|
|
40
|
-
const startingPort = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_STARTINGPORT);
|
|
41
|
-
if (startingPort && getWorkerIndex() >= 0) {
|
|
42
|
-
port = startingPort + getWorkerIndex();
|
|
43
59
|
}
|
|
44
|
-
}
|
|
45
|
-
if (port) {
|
|
46
|
-
const host = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_HOST);
|
|
47
|
-
const waitForDebugger = env.get(terms.CONFIG_PARAMS.THREADS_DEBUG_WAITFORDEBUGGER);
|
|
60
|
+
} else if (process.env.DEV_MODE && isMainThread) {
|
|
48
61
|
try {
|
|
49
|
-
require('inspector').open(
|
|
62
|
+
require('inspector').open(9229);
|
|
50
63
|
} catch (error) {
|
|
51
|
-
|
|
64
|
+
if (restartNumber <= 1)
|
|
65
|
+
harperLogger.trace('Could not start debugging on port 9229, you may already be debugging:', error.message);
|
|
52
66
|
}
|
|
53
67
|
}
|
|
54
|
-
} else if (process.env.DEV_MODE && isMainThread) {
|
|
55
|
-
try {
|
|
56
|
-
require('inspector').open(9229);
|
|
57
|
-
} catch (error) {
|
|
58
|
-
if (restartNumber <= 1)
|
|
59
|
-
harperLogger.trace('Could not start debugging on port 9229, you may already be debugging:', error.message);
|
|
60
|
-
}
|
|
61
68
|
}
|
|
62
69
|
|
|
63
70
|
process.on('uncaughtException', (error) => {
|
|
@@ -66,10 +73,86 @@ process.on('uncaughtException', (error) => {
|
|
|
66
73
|
if (error.message === 'write EIO') return; // that means the terminal is closed
|
|
67
74
|
harperLogger.error('uncaughtException', error);
|
|
68
75
|
});
|
|
76
|
+
// In both Node.js 15+ and Bun, an unhandled promise rejection exits the worker unless a
|
|
77
|
+
// handler is registered. Without this, any async path that rejects without being caught
|
|
78
|
+
// (e.g. a cache-update commit error when the caller has already resolved) will kill the
|
|
79
|
+
// worker thread. Mirror the uncaughtException behavior: log and continue.
|
|
80
|
+
process.on('unhandledRejection', (reason) => {
|
|
81
|
+
if (reason?.isHandled) return;
|
|
82
|
+
harperLogger.error('unhandledRejection', reason);
|
|
83
|
+
});
|
|
69
84
|
env.initSync();
|
|
70
85
|
exports.globals = globals;
|
|
71
86
|
exports.listenOnPorts = listenOnPorts;
|
|
72
87
|
exports.startServers = startServers;
|
|
88
|
+
exports.closeServers = closeServers;
|
|
89
|
+
|
|
90
|
+
function closeServers() {
|
|
91
|
+
if (isBun) {
|
|
92
|
+
// Bun servers use .stop() for graceful shutdown
|
|
93
|
+
for (let port in SERVERS) {
|
|
94
|
+
const server = SERVERS[port];
|
|
95
|
+
if (server?.stop) {
|
|
96
|
+
server.stop();
|
|
97
|
+
} else if (server?.close) {
|
|
98
|
+
server.close();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Give pending requests time to finish, then exit
|
|
102
|
+
return new Promise((resolve) => setTimeout(resolve, 5000).unref());
|
|
103
|
+
}
|
|
104
|
+
const promises = [];
|
|
105
|
+
for (let port in SERVERS) {
|
|
106
|
+
const server = SERVERS[port];
|
|
107
|
+
if (server.closeIdleConnections) {
|
|
108
|
+
// Here we attempt to gracefully close all outstanding keep-alive connections,
|
|
109
|
+
// repeatedly closing any connections that are idle. This allows any active requests
|
|
110
|
+
// to finish sending their response, then we close their connections.
|
|
111
|
+
let symbols = Object.getOwnPropertySymbols(server);
|
|
112
|
+
let connectionsSymbol = symbols.find((symbol) => symbol.description.includes('connections'));
|
|
113
|
+
let closeAttempts = 0;
|
|
114
|
+
let timer = setInterval(() => {
|
|
115
|
+
closeAttempts++;
|
|
116
|
+
const forceClose = closeAttempts >= 100;
|
|
117
|
+
if (!server[connectionsSymbol]) {
|
|
118
|
+
if (forceClose) server.closeAllConnections?.();
|
|
119
|
+
clearInterval(timer);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const connections = server[connectionsSymbol][forceClose ? 'all' : 'idle']?.() || [];
|
|
123
|
+
if (connections.length === 0) {
|
|
124
|
+
if (forceClose) clearInterval(timer);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (closeAttempts === 1) harperLogger.info(`Closing ${connections.length} idle connections`);
|
|
128
|
+
else if (forceClose) harperLogger.warn(`Forcefully closing ${connections.length} active connections`);
|
|
129
|
+
for (let i = 0, l = connections.length; i < l; i++) {
|
|
130
|
+
const socket = connections[i].socket;
|
|
131
|
+
if (socket._httpMessage && !socket._httpMessage.finished && !forceClose) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (forceClose) socket.destroySoon();
|
|
135
|
+
else socket.end('HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n');
|
|
136
|
+
}
|
|
137
|
+
}, 25).unref();
|
|
138
|
+
}
|
|
139
|
+
// And we tell the server not to accept any more incoming connections
|
|
140
|
+
promises.push(
|
|
141
|
+
new Promise((resolve) => {
|
|
142
|
+
server.close?.(() => {
|
|
143
|
+
resolve();
|
|
144
|
+
});
|
|
145
|
+
// We hope for a graceful exit once all connections have been closed, and no
|
|
146
|
+
// more incoming connections are accepted, but if we need to, we eventually will exit
|
|
147
|
+
setTimeout(() => {
|
|
148
|
+
if (!server.cantCleanupProperly) harperLogger.warn('Had to forcefully exit the server', port, threadId);
|
|
149
|
+
resolve();
|
|
150
|
+
}, 5000).unref();
|
|
151
|
+
})
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
return Promise.all(promises);
|
|
155
|
+
}
|
|
73
156
|
|
|
74
157
|
function startServers() {
|
|
75
158
|
const rootPath = env.get(terms.CONFIG_PARAMS.ROOTPATH);
|
|
@@ -85,66 +168,16 @@ function startServers() {
|
|
|
85
168
|
.then(() => {
|
|
86
169
|
parentPort
|
|
87
170
|
?.on('message', (message) => {
|
|
88
|
-
|
|
89
|
-
if (fd) {
|
|
90
|
-
// Create a socket from the file descriptor for the socket that was routed to us.
|
|
91
|
-
httpComponent.deliverSocket(fd, port, data);
|
|
92
|
-
} else if (message.requestId) {
|
|
93
|
-
// Windows doesn't support passing file descriptors, so we have to resort to manually proxying the socket
|
|
94
|
-
// data for each request
|
|
95
|
-
httpComponent.proxyRequest(message);
|
|
96
|
-
} else if (message.type === terms.ITC_EVENT_TYPES.SHUTDOWN) {
|
|
171
|
+
if (message.type === terms.ITC_EVENT_TYPES.SHUTDOWN) {
|
|
97
172
|
harperLogger.trace('received shutdown request', threadId);
|
|
98
173
|
// shutdown (for these threads) means stop listening for incoming requests (finish what we are working) and
|
|
99
174
|
// close connections as possible, then let the event loop complete
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// to finish sending their response, then we close their connections.
|
|
107
|
-
let symbols = Object.getOwnPropertySymbols(server);
|
|
108
|
-
let connectionsSymbol = symbols.find((symbol) => symbol.description.includes('connections'));
|
|
109
|
-
let closeAttempts = 0;
|
|
110
|
-
let timer = setInterval(() => {
|
|
111
|
-
closeAttempts++;
|
|
112
|
-
const forceClose = closeAttempts >= 100;
|
|
113
|
-
if (!server[connectionsSymbol]) {
|
|
114
|
-
if (forceClose) server.closeAllConnections?.();
|
|
115
|
-
clearInterval(timer);
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
const connections = server[connectionsSymbol][forceClose ? 'all' : 'idle']?.() || [];
|
|
119
|
-
if (connections.length === 0) {
|
|
120
|
-
if (forceClose) clearInterval(timer);
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
if (closeAttempts === 1) harperLogger.info(`Closing ${connections.length} idle connections`);
|
|
124
|
-
else if (forceClose) harperLogger.warn(`Forcefully closing ${connections.length} active connections`);
|
|
125
|
-
for (let i = 0, l = connections.length; i < l; i++) {
|
|
126
|
-
const socket = connections[i].socket;
|
|
127
|
-
if (socket._httpMessage && !socket._httpMessage.finished && !forceClose) {
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
if (forceClose) socket.destroySoon();
|
|
131
|
-
else socket.end('HTTP/1.1 408 Request Timeout\r\nConnection: close\r\n\r\n');
|
|
132
|
-
}
|
|
133
|
-
}, 25).unref();
|
|
134
|
-
}
|
|
135
|
-
// And we tell the server not to accept any more incoming connections
|
|
136
|
-
server.close?.(() => {
|
|
137
|
-
clearInterval(closeAllTimer);
|
|
138
|
-
// We hope for a graceful exit once all connections have been closed, and no
|
|
139
|
-
// more incoming connections are accepted, but if we need to, we eventually will exit
|
|
140
|
-
setTimeout(() => {
|
|
141
|
-
console.log('forced close server', port, threadId);
|
|
142
|
-
if (!server.cantCleanupProperly) harperLogger.warn('Had to forcefully exit the thread', threadId);
|
|
143
|
-
process.exit(0);
|
|
144
|
-
}, 5000).unref();
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
if (debugThreads || process.env.DEV_MODE) {
|
|
175
|
+
closeServers().then(() => {
|
|
176
|
+
realExit(0);
|
|
177
|
+
});
|
|
178
|
+
// Clean up per-thread UDS socket and metadata files
|
|
179
|
+
httpComponent.cleanupUdsFiles();
|
|
180
|
+
if (!isBun && (debugThreads || process.env.DEV_MODE)) {
|
|
148
181
|
try {
|
|
149
182
|
require('inspector').close();
|
|
150
183
|
} catch (error) {
|
|
@@ -154,10 +187,7 @@ function startServers() {
|
|
|
154
187
|
}
|
|
155
188
|
})
|
|
156
189
|
.ref(); // use this to keep the thread running until we are ready to shutdown and clean up handles
|
|
157
|
-
|
|
158
|
-
if (createReuseportFd && !sessionAffinity) {
|
|
159
|
-
listening = listenOnPorts();
|
|
160
|
-
}
|
|
190
|
+
const listening = listenOnPorts();
|
|
161
191
|
|
|
162
192
|
// notify that we are now ready to start receiving requests
|
|
163
193
|
Promise.resolve(listening).then(() => {
|
|
@@ -172,15 +202,34 @@ function startServers() {
|
|
|
172
202
|
});
|
|
173
203
|
});
|
|
174
204
|
componentsLoadedResolve(loaded);
|
|
205
|
+
// Clean up UDS files and force-close Bun server connections on unexpected exit.
|
|
206
|
+
// Without the stop(true) call, clients holding keep-alive connections to a dead Bun
|
|
207
|
+
// worker never receive a FIN/RST and hang indefinitely waiting for a response.
|
|
208
|
+
process.on('exit', () => {
|
|
209
|
+
if (isBun) {
|
|
210
|
+
for (const port in SERVERS) {
|
|
211
|
+
const srv = SERVERS[port];
|
|
212
|
+
if (srv?.stop) {
|
|
213
|
+
try {
|
|
214
|
+
srv.stop(true); // force-close all connections immediately
|
|
215
|
+
} catch {}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
httpComponent.cleanupUdsFiles();
|
|
220
|
+
});
|
|
175
221
|
return loaded;
|
|
176
222
|
}
|
|
223
|
+
let listening;
|
|
177
224
|
function listenOnPorts() {
|
|
178
|
-
|
|
225
|
+
if (isBun) return listenOnPortsBun();
|
|
226
|
+
if (listening) return Promise.all(listening); // already set up
|
|
227
|
+
listening = [];
|
|
179
228
|
for (let port in SERVERS) {
|
|
180
229
|
const server = SERVERS[port];
|
|
181
230
|
|
|
182
231
|
// If server is unix domain socket
|
|
183
|
-
if (port.includes?.('/')
|
|
232
|
+
if (port.includes?.('/')) {
|
|
184
233
|
if (existsSync(port)) unlinkSync(port);
|
|
185
234
|
listening.push(
|
|
186
235
|
new Promise((resolve, reject) => {
|
|
@@ -207,15 +256,15 @@ function listenOnPorts() {
|
|
|
207
256
|
try {
|
|
208
257
|
const lastColon = port.lastIndexOf(':');
|
|
209
258
|
if (lastColon > 0)
|
|
210
|
-
if
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
else
|
|
218
|
-
|
|
259
|
+
// if there is a colon, we assume it is a host:port pair, and then strip brackets as that is a common way to
|
|
260
|
+
// specify an IPv6 address
|
|
261
|
+
listen_on = {
|
|
262
|
+
host: port.slice(0, lastColon).replace(/[[\]]/g, ''),
|
|
263
|
+
port: +port.slice(lastColon + 1),
|
|
264
|
+
reusePort: !isWindows && !server.noReusePort,
|
|
265
|
+
};
|
|
266
|
+
else listen_on = { port: +port, host: '::', reusePort: !isWindows && !server.noReusePort };
|
|
267
|
+
if (isNaN(listen_on.port)) continue;
|
|
219
268
|
} catch (error) {
|
|
220
269
|
harperLogger.error(`Unable to bind to port ${port}`, error);
|
|
221
270
|
continue;
|
|
@@ -227,12 +276,174 @@ function listenOnPorts() {
|
|
|
227
276
|
resolve({ port, name: server.name, protocol_name: server.protocol_name });
|
|
228
277
|
harperLogger.trace('Listening on port ' + port, threadId);
|
|
229
278
|
})
|
|
230
|
-
.on('error',
|
|
279
|
+
.on('error', (err) => {
|
|
280
|
+
// Node.js before v20.11.1 does not properly support reusePort for net.Server —
|
|
281
|
+
// workers receive EADDRINUSE even though the main thread bound with reusePort: true.
|
|
282
|
+
// Resolve rather than reject so the worker can proceed, matching the same graceful
|
|
283
|
+
// handling already present in listenOnPortsBun().
|
|
284
|
+
if (err.code === 'EADDRINUSE') resolve({ port, name: server.name, protocol_name: server.protocol_name });
|
|
285
|
+
else reject(err);
|
|
286
|
+
});
|
|
231
287
|
})
|
|
232
288
|
);
|
|
233
289
|
}
|
|
234
290
|
return Promise.all(listening);
|
|
235
291
|
}
|
|
292
|
+
|
|
293
|
+
async function listenOnPortsBun() {
|
|
294
|
+
const isMac = process.platform === 'darwin';
|
|
295
|
+
const bunServeConfigs = httpComponent.bunServeConfigs;
|
|
296
|
+
for (let port in bunServeConfigs) {
|
|
297
|
+
const config = bunServeConfigs[port];
|
|
298
|
+
const threadRange = env.get(terms.CONFIG_PARAMS.HTTP_THREADRANGE);
|
|
299
|
+
if (threadRange) {
|
|
300
|
+
let threadRangeArray = typeof threadRange === 'string' ? threadRange.split('-') : threadRange;
|
|
301
|
+
let threadIndex = getWorkerIndex();
|
|
302
|
+
if (threadIndex < threadRangeArray[0] || threadIndex > threadRangeArray[1]) {
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
// Parse "host:port" strings the same way as listenOnPorts() does for Node
|
|
308
|
+
let portHostname;
|
|
309
|
+
let portNumber;
|
|
310
|
+
const lastColon = String(port).lastIndexOf(':');
|
|
311
|
+
if (lastColon > 0 && !String(port).startsWith('/')) {
|
|
312
|
+
portHostname = String(port).slice(0, lastColon).replace(/[[\]]/g, '');
|
|
313
|
+
portNumber = +String(port).slice(lastColon + 1);
|
|
314
|
+
} else {
|
|
315
|
+
portNumber = +port;
|
|
316
|
+
}
|
|
317
|
+
const serveOptions = {
|
|
318
|
+
port: portNumber,
|
|
319
|
+
reusePort: !isWindows && !isMac,
|
|
320
|
+
fetch: config.fetch,
|
|
321
|
+
};
|
|
322
|
+
if (portHostname) serveOptions.hostname = portHostname;
|
|
323
|
+
// Add TLS config if this is a secure server
|
|
324
|
+
if (config.isSecure && config.tlsSelector) {
|
|
325
|
+
// Wait for TLS certs to be loaded
|
|
326
|
+
const defaultContext = await config.tlsSelector.ready;
|
|
327
|
+
if (defaultContext) {
|
|
328
|
+
serveOptions.tls = {
|
|
329
|
+
cert: defaultContext.options.cert,
|
|
330
|
+
key: defaultContext.options.key,
|
|
331
|
+
};
|
|
332
|
+
// Bun expects ca as string or array of strings; only include if valid
|
|
333
|
+
let ca = defaultContext.options.ca;
|
|
334
|
+
if (ca) {
|
|
335
|
+
if (Array.isArray(ca)) ca = ca.filter((entry) => typeof entry === 'string');
|
|
336
|
+
if (typeof ca === 'string' || (Array.isArray(ca) && ca.length > 0)) {
|
|
337
|
+
serveOptions.tls.ca = ca;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// Set up listener for cert updates to reload TLS
|
|
342
|
+
const pseudoServer = config.pseudoServer;
|
|
343
|
+
if (pseudoServer?.secureContextsListeners) {
|
|
344
|
+
pseudoServer.secureContextsListeners.push(() => {
|
|
345
|
+
const updatedCtx = config.tlsSelector.defaultContext;
|
|
346
|
+
if (updatedCtx && SERVERS[port]?.reload) {
|
|
347
|
+
const tlsUpdate = {
|
|
348
|
+
cert: updatedCtx.options.cert,
|
|
349
|
+
key: updatedCtx.options.key,
|
|
350
|
+
};
|
|
351
|
+
let ca = updatedCtx.options.ca;
|
|
352
|
+
if (ca) {
|
|
353
|
+
if (Array.isArray(ca)) ca = ca.filter((entry) => typeof entry === 'string');
|
|
354
|
+
if (typeof ca === 'string' || (Array.isArray(ca) && ca.length > 0)) {
|
|
355
|
+
tlsUpdate.ca = ca;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
SERVERS[port].reload({ tls: tlsUpdate });
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Add WebSocket handlers if configured
|
|
364
|
+
if (config.websocket) {
|
|
365
|
+
serveOptions.websocket = config.websocket;
|
|
366
|
+
}
|
|
367
|
+
// If this is a unix domain socket path
|
|
368
|
+
if (String(port).includes('/')) {
|
|
369
|
+
if (existsSync(port)) unlinkSync(port);
|
|
370
|
+
serveOptions.unix = port;
|
|
371
|
+
delete serveOptions.port;
|
|
372
|
+
}
|
|
373
|
+
if (isNaN(serveOptions.port)) continue;
|
|
374
|
+
const bunServer = Bun.serve(serveOptions);
|
|
375
|
+
SERVERS[port] = bunServer;
|
|
376
|
+
harperLogger.trace('Bun listening on port ' + port, threadId);
|
|
377
|
+
|
|
378
|
+
// Create a corresponding Unix Domain Socket mirror for secure ports
|
|
379
|
+
if (config.isSecure && env.get(terms.CONFIG_PARAMS.TLS_UNIXDOMAINSOCKETS)) {
|
|
380
|
+
const socketsDir = join(env.getHdbBasePath(), 'sockets');
|
|
381
|
+
mkdirSync(socketsDir, { recursive: true });
|
|
382
|
+
const socketName = `${getWorkerIndex()}-${port}`;
|
|
383
|
+
const udsPath = join(socketsDir, `${socketName}.sock`);
|
|
384
|
+
const yamlPath = join(socketsDir, `${socketName}.yaml`);
|
|
385
|
+
if (existsSync(udsPath)) unlinkSync(udsPath);
|
|
386
|
+
|
|
387
|
+
// Create a plain HTTP Bun server on the UDS (no TLS)
|
|
388
|
+
const udsServer = Bun.serve({
|
|
389
|
+
unix: udsPath,
|
|
390
|
+
fetch: config.fetch,
|
|
391
|
+
websocket: config.websocket,
|
|
392
|
+
});
|
|
393
|
+
SERVERS[udsPath] = udsServer;
|
|
394
|
+
httpComponent.registerUdsCleanupPaths(udsPath, yamlPath);
|
|
395
|
+
|
|
396
|
+
const writeMetadata = () => httpComponent.writeUdsMetadata(yamlPath, port, config.pseudoServer);
|
|
397
|
+
config.tlsSelector.ready.then(writeMetadata);
|
|
398
|
+
config.pseudoServer?.secureContextsListeners?.push(writeMetadata);
|
|
399
|
+
harperLogger.info('Domain socket listening on ' + udsPath);
|
|
400
|
+
}
|
|
401
|
+
} catch (error) {
|
|
402
|
+
harperLogger.error(`Unable to start Bun server on port ${port}`, error);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
// Also start any non-HTTP servers (raw socket servers) that were registered in SERVERS
|
|
406
|
+
const listening = [];
|
|
407
|
+
for (let port in SERVERS) {
|
|
408
|
+
const server = SERVERS[port];
|
|
409
|
+
// Skip Bun servers (they're already listening) and config objects
|
|
410
|
+
if (server?.stop || bunServeConfigs[port]) continue;
|
|
411
|
+
if (server?.listen) {
|
|
412
|
+
if (port.includes?.('/')) {
|
|
413
|
+
if (existsSync(port)) unlinkSync(port);
|
|
414
|
+
listening.push(
|
|
415
|
+
new Promise((resolve, reject) => {
|
|
416
|
+
server
|
|
417
|
+
.listen({ path: port }, () => {
|
|
418
|
+
resolve({ port });
|
|
419
|
+
harperLogger.info('Domain socket listening on ' + port);
|
|
420
|
+
})
|
|
421
|
+
.on('error', reject);
|
|
422
|
+
})
|
|
423
|
+
);
|
|
424
|
+
} else {
|
|
425
|
+
const lastColon = String(port).lastIndexOf(':');
|
|
426
|
+
const rawHostname = lastColon > 0 ? String(port).slice(0, lastColon).replace(/[[\]]/g, '') : null;
|
|
427
|
+
const portNum = lastColon > 0 ? +String(port).slice(lastColon + 1) : +port;
|
|
428
|
+
listening.push(
|
|
429
|
+
new Promise((resolve, reject) => {
|
|
430
|
+
server
|
|
431
|
+
.listen({ port: portNum, host: rawHostname || (isMac ? '0.0.0.0' : '::') }, () => {
|
|
432
|
+
resolve({ port });
|
|
433
|
+
harperLogger.trace('Listening on port ' + port, threadId);
|
|
434
|
+
})
|
|
435
|
+
.on('error', (err) => {
|
|
436
|
+
// Another worker already bound this port — that's fine
|
|
437
|
+
if (err.code === 'EADDRINUSE') resolve({ port });
|
|
438
|
+
else reject(err);
|
|
439
|
+
});
|
|
440
|
+
})
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
return Promise.all(listening);
|
|
446
|
+
}
|
|
236
447
|
if (!isMainThread && !workerData?.noServerStart) {
|
|
237
448
|
startServers();
|
|
238
449
|
}
|
|
@@ -264,7 +475,35 @@ function onSocket(listener, options) {
|
|
|
264
475
|
listener
|
|
265
476
|
);
|
|
266
477
|
SNICallback.initialize(socketServer);
|
|
478
|
+
socketServer.noReusePort = true;
|
|
267
479
|
SERVERS[options.securePort] = socketServer;
|
|
480
|
+
|
|
481
|
+
// Create a corresponding Unix Domain Socket mirror for the secure socket
|
|
482
|
+
if (env.get(terms.CONFIG_PARAMS.TLS_UNIXDOMAINSOCKETS)) {
|
|
483
|
+
const socketsDir = join(env.getHdbBasePath(), 'sockets');
|
|
484
|
+
mkdirSync(socketsDir, { recursive: true });
|
|
485
|
+
const socketName = `${getWorkerIndex()}-${options.securePort}`;
|
|
486
|
+
const udsPath = join(socketsDir, `${socketName}.sock`);
|
|
487
|
+
const yamlPath = join(socketsDir, `${socketName}.yaml`);
|
|
488
|
+
|
|
489
|
+
const udsServer = createSocketServer(listener, {
|
|
490
|
+
noDelay: true,
|
|
491
|
+
keepAlive: true,
|
|
492
|
+
keepAliveInitialDelay: 600,
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
udsServer.isPerThreadSocket = true;
|
|
496
|
+
// Strip the PROXY v1 header a fronting proxy (e.g. symphony) prepends, same as the
|
|
497
|
+
// HTTP UDS mirror. Without this the header is fed to the protocol parser (e.g. MQTT),
|
|
498
|
+
// corrupting the first packet.
|
|
499
|
+
httpComponent.enableProxyProtocol(udsServer);
|
|
500
|
+
SERVERS[udsPath] = udsServer;
|
|
501
|
+
httpComponent.registerUdsCleanupPaths(udsPath, yamlPath);
|
|
502
|
+
|
|
503
|
+
const writeMetadata = () => httpComponent.writeUdsMetadata(yamlPath, options.securePort, socketServer);
|
|
504
|
+
SNICallback.ready.then(writeMetadata);
|
|
505
|
+
socketServer.secureContextsListeners.push(writeMetadata);
|
|
506
|
+
}
|
|
268
507
|
}
|
|
269
508
|
if (options.port) {
|
|
270
509
|
setPortServerMap(options.port, { protocol_name: 'TCP', name: getComponentName() });
|
|
@@ -273,6 +512,7 @@ function onSocket(listener, options) {
|
|
|
273
512
|
keepAlive: true,
|
|
274
513
|
keepAliveInitialDelay: 600,
|
|
275
514
|
});
|
|
515
|
+
socketServer.noReusePort = true;
|
|
276
516
|
SERVERS[options.port] = socketServer;
|
|
277
517
|
}
|
|
278
518
|
return socketServer;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker thread process guard.
|
|
3
|
+
*
|
|
4
|
+
* Components loaded into Harper workers (Next.js, in particular) register
|
|
5
|
+
* their own `unhandledRejection` handler that explicitly calls
|
|
6
|
+
* `process.exit()`. That terminates the entire worker — including
|
|
7
|
+
* replication and unrelated components — for what is logically an
|
|
8
|
+
* application-level error.
|
|
9
|
+
*
|
|
10
|
+
* In worker threads, this module:
|
|
11
|
+
* - Intercepts `process.exit()` so component code cannot terminate the
|
|
12
|
+
* worker. The original exit is preserved as `process._realExit` (and
|
|
13
|
+
* as the exported `realExit()` helper) for Harper internal callers
|
|
14
|
+
* that legitimately need to terminate the worker (shutdown,
|
|
15
|
+
* FORCE_EXIT under Bun, etc.).
|
|
16
|
+
* - Registers an `unhandledRejection` listener so the default Node.js
|
|
17
|
+
* terminate-on-unhandled-rejection behavior is suppressed when no
|
|
18
|
+
* other component handler exists.
|
|
19
|
+
*
|
|
20
|
+
* On the main thread this module is a no-op except for exposing
|
|
21
|
+
* `process._realExit` so internal callers can use the same name regardless
|
|
22
|
+
* of thread.
|
|
23
|
+
*
|
|
24
|
+
* Harper-internal callers that intentionally want to terminate should use
|
|
25
|
+
* the exported `realExit()` helper. It falls back to `process.exit` when
|
|
26
|
+
* the guard has not been loaded (e.g., CLI bin scripts), so the helper is
|
|
27
|
+
* always safe to call.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { isMainThread, threadId } from 'node:worker_threads';
|
|
31
|
+
import * as harperLogger from '../../utility/logging/harper_logger.ts';
|
|
32
|
+
|
|
33
|
+
declare global {
|
|
34
|
+
namespace NodeJS {
|
|
35
|
+
interface Process {
|
|
36
|
+
_realExit: (code?: number) => never;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const realExitImpl = process.exit.bind(process) as (code?: number) => never;
|
|
42
|
+
|
|
43
|
+
// Expose the real exit on every thread so internal Harper callers have a
|
|
44
|
+
// stable name to use regardless of which thread they run on. Make it
|
|
45
|
+
// non-writable so component code cannot accidentally reassign it, but leave
|
|
46
|
+
// it configurable so test doubles (sinon, etc.) can stub it.
|
|
47
|
+
if (!process._realExit) {
|
|
48
|
+
Object.defineProperty(process, '_realExit', {
|
|
49
|
+
value: realExitImpl,
|
|
50
|
+
writable: false,
|
|
51
|
+
configurable: true,
|
|
52
|
+
enumerable: false,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Terminate the current process for real, bypassing the worker process
|
|
58
|
+
* guard's `process.exit` override. Safe to call from any thread — falls
|
|
59
|
+
* back to `process.exit` when the guard has not been loaded yet (e.g.,
|
|
60
|
+
* CLI bin scripts).
|
|
61
|
+
*/
|
|
62
|
+
export function realExit(code?: number): never {
|
|
63
|
+
// Prefer the (non-writable) `process._realExit` so test doubles that
|
|
64
|
+
// stub `_realExit` can intercept Harper-intentional exits. Fall back
|
|
65
|
+
// to `process.exit` when the guard hasn't been loaded.
|
|
66
|
+
return (process._realExit ?? process.exit)(code);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (!isMainThread) {
|
|
70
|
+
// Replace the public process.exit. Component code calling this — directly
|
|
71
|
+
// or via a framework's `unhandledRejection` handler — should not be able
|
|
72
|
+
// to terminate the worker.
|
|
73
|
+
const interceptedExit = ((code?: number): never => {
|
|
74
|
+
const callSite = new Error('process.exit() intercepted').stack;
|
|
75
|
+
harperLogger.error(
|
|
76
|
+
`process.exit(${code ?? ''}) called in worker thread ${threadId} — ignored to keep Harper alive. ` +
|
|
77
|
+
`Use process._realExit() for legitimate internal shutdown.\n${callSite}`
|
|
78
|
+
);
|
|
79
|
+
// `never` is a structural lie here; we return undefined. Callers that
|
|
80
|
+
// rely on `process.exit` being terminal (e.g. dead-code analysis after
|
|
81
|
+
// the call) will see execution continue, which is the desired
|
|
82
|
+
// resilience behavior.
|
|
83
|
+
return undefined as never;
|
|
84
|
+
}) as typeof process.exit;
|
|
85
|
+
process.exit = interceptedExit;
|
|
86
|
+
|
|
87
|
+
// Defense in depth: if no other listener is registered, Node.js terminates
|
|
88
|
+
// the process on an unhandled rejection. Register a logging listener so the
|
|
89
|
+
// worker survives even when no component handler is loaded.
|
|
90
|
+
process.on('unhandledRejection', (reason) => {
|
|
91
|
+
harperLogger.error(`unhandledRejection in worker thread ${threadId}:`, reason);
|
|
92
|
+
});
|
|
93
|
+
}
|
package/core/server/throttle.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { logger } from '../utility/logging/logger.ts';
|
|
2
|
+
import { Session, url as inspectorURL } from 'node:inspector';
|
|
2
3
|
const MAX_EVENT_DELAY_TIME = 3000;
|
|
3
4
|
const DEFAULT_MAX_QUEUE_TIME = 20_000; // 20 seconds
|
|
4
5
|
let lastWarning = 0;
|
|
@@ -71,3 +72,20 @@ setInterval(() => {
|
|
|
71
72
|
}
|
|
72
73
|
lastEventQueueCheck = now;
|
|
73
74
|
}, EVENT_QUEUE_MONITORING_INTERVAL).unref();
|
|
75
|
+
|
|
76
|
+
// Reset lastEventQueueCheck if we are resuming from the debugger
|
|
77
|
+
// so the event loop lag check ignores breakpoint pauses
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
// wait for any debugger to register and then see if the inspector/debugger is actually enabled
|
|
80
|
+
if (inspectorURL()) {
|
|
81
|
+
const session = new Session();
|
|
82
|
+
session.connect();
|
|
83
|
+
session.post('Debugger.enable');
|
|
84
|
+
session.on('inspectorNotification', ({ method }) => {
|
|
85
|
+
if (method === 'Debugger.resumed') {
|
|
86
|
+
// reset if we are resuming
|
|
87
|
+
lastEventQueueCheck = performance.now();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}, 1);
|