@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
package/dist/core/server/http.js
CHANGED
|
@@ -36,23 +36,35 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.universalHeaders = void 0;
|
|
39
|
+
exports.bunServeConfigs = exports.universalHeaders = void 0;
|
|
40
|
+
exports.registerUdsCleanupPaths = registerUdsCleanupPaths;
|
|
41
|
+
exports.cleanupUdsFiles = cleanupUdsFiles;
|
|
42
|
+
exports.writeUdsMetadata = writeUdsMetadata;
|
|
43
|
+
exports.cleanupSocketsDirectory = cleanupSocketsDirectory;
|
|
40
44
|
exports.handleApplication = handleApplication;
|
|
41
45
|
exports.getHttpOptions = getHttpOptions;
|
|
42
46
|
exports.deliverSocket = deliverSocket;
|
|
43
47
|
exports.proxyRequest = proxyRequest;
|
|
44
48
|
exports.registerServer = registerServer;
|
|
45
49
|
exports.httpServer = httpServer;
|
|
50
|
+
exports.registerBunFastifyInstance = registerBunFastifyInstance;
|
|
51
|
+
exports.enableProxyProtocol = enableProxyProtocol;
|
|
46
52
|
exports.logRequest = logRequest;
|
|
47
53
|
exports.getRequestId = getRequestId;
|
|
54
|
+
// @ts-nocheck
|
|
55
|
+
/**
|
|
56
|
+
* This module represents the HTTP component for Harper, and receives the HTTP options and uses them to configure
|
|
57
|
+
* HTTP servers
|
|
58
|
+
*/
|
|
59
|
+
const rocksdb_js_1 = require("@harperfast/rocksdb-js");
|
|
48
60
|
const node_net_1 = require("node:net");
|
|
49
|
-
const
|
|
61
|
+
const harper_logger_ts_1 = __importDefault(require("../utility/logging/harper_logger.js"));
|
|
50
62
|
const node_worker_threads_1 = require("node:worker_threads");
|
|
51
|
-
const
|
|
63
|
+
const env = __importStar(require("../utility/environment/environmentManager.js"));
|
|
52
64
|
const terms = __importStar(require("../utility/hdbTerms.js"));
|
|
53
65
|
const configUtils_js_1 = require("../config/configUtils.js");
|
|
54
66
|
const manageThreads_js_1 = require("./threads/manageThreads.js");
|
|
55
|
-
const
|
|
67
|
+
const keys_ts_1 = require("../security/keys.js");
|
|
56
68
|
const node_http2_1 = require("node:http2");
|
|
57
69
|
const node_https_1 = require("node:https");
|
|
58
70
|
const node_http_1 = require("node:http");
|
|
@@ -61,12 +73,15 @@ const Headers_ts_1 = require("./serverHelpers/Headers.js");
|
|
|
61
73
|
const blob_ts_1 = require("../resources/blob.js");
|
|
62
74
|
const write_ts_1 = require("../resources/analytics/write.js");
|
|
63
75
|
const node_stream_1 = require("node:stream");
|
|
76
|
+
const node_fs_1 = require("node:fs");
|
|
77
|
+
const node_path_1 = require("node:path");
|
|
64
78
|
const Server_ts_1 = require("./Server.js");
|
|
65
79
|
const serverRegistry_ts_1 = require("./serverRegistry.js");
|
|
66
80
|
const componentLoader_ts_1 = require("../components/componentLoader.js");
|
|
67
81
|
const throttle_ts_1 = require("./throttle.js");
|
|
82
|
+
const middlewareChain_ts_1 = require("./middlewareChain.js");
|
|
68
83
|
const ws_1 = require("ws");
|
|
69
|
-
const { errorToString } =
|
|
84
|
+
const { errorToString } = harper_logger_ts_1.default;
|
|
70
85
|
Server_ts_1.server.http = httpServer;
|
|
71
86
|
Server_ts_1.server.request = onRequest;
|
|
72
87
|
Server_ts_1.server.ws = onWebSocket;
|
|
@@ -75,6 +90,85 @@ const websocketServers = {};
|
|
|
75
90
|
const httpServers = {}, httpChain = {}, httpResponders = [];
|
|
76
91
|
let httpOptions = {};
|
|
77
92
|
exports.universalHeaders = [];
|
|
93
|
+
// Bun-specific: stores fetch handler configs per port, used by threadServer.js to call Bun.serve()
|
|
94
|
+
exports.bunServeConfigs = {};
|
|
95
|
+
// Bun-specific: stores non-function listeners (e.g. Fastify servers) per port for fallback delegation
|
|
96
|
+
const bunFallbackServers = {};
|
|
97
|
+
const udsCleanupPaths = [];
|
|
98
|
+
function registerUdsCleanupPaths(socketPath, yamlPath) {
|
|
99
|
+
udsCleanupPaths.push({ socketPath, yamlPath });
|
|
100
|
+
}
|
|
101
|
+
function cleanupUdsFiles() {
|
|
102
|
+
for (const { socketPath, yamlPath } of udsCleanupPaths) {
|
|
103
|
+
try {
|
|
104
|
+
(0, node_fs_1.unlinkSync)(socketPath);
|
|
105
|
+
}
|
|
106
|
+
catch { }
|
|
107
|
+
try {
|
|
108
|
+
(0, node_fs_1.unlinkSync)(yamlPath);
|
|
109
|
+
}
|
|
110
|
+
catch { }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/** Write YAML metadata for a UDS mirror socket, describing the TLS certs from the corresponding secure server. */
|
|
114
|
+
function writeUdsMetadata(yamlPath, port, secureServer) {
|
|
115
|
+
const contexts = secureServer.secureContexts;
|
|
116
|
+
let yaml = `pid: ${process.pid}\ntid: ${(0, rocksdb_js_1.currentThreadId)()}\nport: ${port}\n`;
|
|
117
|
+
yaml += `certificates:\n`;
|
|
118
|
+
if (contexts?.size > 0) {
|
|
119
|
+
const seen = new Set();
|
|
120
|
+
for (const [, ctx] of contexts) {
|
|
121
|
+
if (seen.has(ctx.name))
|
|
122
|
+
continue;
|
|
123
|
+
seen.add(ctx.name);
|
|
124
|
+
yaml += ` - name: ${JSON.stringify(ctx.name)}\n`;
|
|
125
|
+
yaml += ` hostnames:\n`;
|
|
126
|
+
for (const [h, c] of contexts) {
|
|
127
|
+
if (c.name === ctx.name)
|
|
128
|
+
yaml += ` - ${JSON.stringify(h)}\n`;
|
|
129
|
+
}
|
|
130
|
+
if (ctx.options.key_file) {
|
|
131
|
+
yaml += ` privateKeyFile: ${JSON.stringify((0, node_path_1.join)(env.get(terms.CONFIG_PARAMS.ROOTPATH), 'keys', ctx.options.key_file))}\n`;
|
|
132
|
+
}
|
|
133
|
+
if (ctx.options.cert) {
|
|
134
|
+
yaml += ` certificate: |\n`;
|
|
135
|
+
for (const line of ctx.options.cert.trimEnd().split('\n')) {
|
|
136
|
+
yaml += ` ${line}\n`;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (ctx.certificateAuthorities?.length > 0) {
|
|
140
|
+
yaml += ` certificateAuthorities:\n`;
|
|
141
|
+
for (const [, ca] of ctx.certificateAuthorities) {
|
|
142
|
+
yaml += ` - |\n`;
|
|
143
|
+
for (const line of ca.trimEnd().split('\n')) {
|
|
144
|
+
yaml += ` ${line}\n`;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
(0, node_fs_1.writeFileSync)(yamlPath, yaml);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
harper_logger_ts_1.default.error('Error writing UDS metadata to ' + yamlPath, error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Clean all files in the sockets directory. Call from main thread on process startup. */
|
|
158
|
+
function cleanupSocketsDirectory() {
|
|
159
|
+
if (!env.get(terms.CONFIG_PARAMS.TLS_UNIXDOMAINSOCKETS))
|
|
160
|
+
return;
|
|
161
|
+
const socketsDir = (0, node_path_1.join)(env.getHdbBasePath(), 'sockets');
|
|
162
|
+
try {
|
|
163
|
+
for (const file of (0, node_fs_1.readdirSync)(socketsDir)) {
|
|
164
|
+
try {
|
|
165
|
+
(0, node_fs_1.unlinkSync)((0, node_path_1.join)(socketsDir, file));
|
|
166
|
+
}
|
|
167
|
+
catch { }
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch { }
|
|
171
|
+
}
|
|
78
172
|
function handleApplication(scope) {
|
|
79
173
|
httpOptions = scope.options.getAll();
|
|
80
174
|
scope.options.on('change', (_key) => {
|
|
@@ -120,7 +214,7 @@ function deliverSocket(fdOrSocket, port, data) {
|
|
|
120
214
|
else if (retries < 5)
|
|
121
215
|
retry(retries + 1);
|
|
122
216
|
else {
|
|
123
|
-
|
|
217
|
+
harper_logger_ts_1.default.error(`Server on port ${port} was not registered`);
|
|
124
218
|
socket.destroy();
|
|
125
219
|
}
|
|
126
220
|
}, 1000);
|
|
@@ -188,7 +282,7 @@ function proxyRequest(message) {
|
|
|
188
282
|
function registerServer(server, port, checkPort = true) {
|
|
189
283
|
if (!port) {
|
|
190
284
|
// if no port is provided, default to custom functions port
|
|
191
|
-
port =
|
|
285
|
+
port = env.get(terms.CONFIG_PARAMS.HTTP_PORT);
|
|
192
286
|
}
|
|
193
287
|
const existingServer = serverRegistry_ts_1.SERVERS[port];
|
|
194
288
|
if (existingServer) {
|
|
@@ -225,15 +319,15 @@ function getPorts(options) {
|
|
|
225
319
|
if (ports.length === 0) {
|
|
226
320
|
// if no port is provided, default to http port
|
|
227
321
|
ports = [];
|
|
228
|
-
if (
|
|
322
|
+
if (env.get(terms.CONFIG_PARAMS.HTTP_PORT) != null)
|
|
229
323
|
ports.push({
|
|
230
|
-
port:
|
|
231
|
-
secure:
|
|
324
|
+
port: env.get(terms.CONFIG_PARAMS.HTTP_PORT),
|
|
325
|
+
secure: env.get(terms.CONFIG_PARAMS.CUSTOMFUNCTIONS_NETWORK_HTTPS),
|
|
232
326
|
});
|
|
233
|
-
if (
|
|
234
|
-
ports.push({ port:
|
|
327
|
+
if (env.get(terms.CONFIG_PARAMS.HTTP_SECUREPORT) != null)
|
|
328
|
+
ports.push({ port: env.get(terms.CONFIG_PARAMS.HTTP_SECUREPORT), secure: true });
|
|
235
329
|
}
|
|
236
|
-
if (options?.usageType === 'operations-api' &&
|
|
330
|
+
if (options?.usageType === 'operations-api' && env.get(terms.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET)) {
|
|
237
331
|
ports.push({
|
|
238
332
|
port: (0, configUtils_js_1.getConfigPath)(terms.CONFIG_PARAMS.OPERATIONSAPI_NETWORK_DOMAINSOCKET),
|
|
239
333
|
secure: false,
|
|
@@ -244,9 +338,23 @@ function getPorts(options) {
|
|
|
244
338
|
function httpServer(listener, options) {
|
|
245
339
|
const servers = [];
|
|
246
340
|
for (const { port, secure } of getPorts(options)) {
|
|
247
|
-
|
|
341
|
+
const getServer = Request_ts_1.isBun ? getBunHTTPServer : getHTTPServer;
|
|
342
|
+
servers.push(getServer(port, secure, options));
|
|
248
343
|
if (typeof listener === 'function') {
|
|
249
|
-
|
|
344
|
+
const entry = {
|
|
345
|
+
listener,
|
|
346
|
+
port: options?.port || port,
|
|
347
|
+
name: options?.name ?? (0, componentLoader_ts_1.getComponentName)(),
|
|
348
|
+
before: options?.before,
|
|
349
|
+
after: options?.after,
|
|
350
|
+
urlPath: options?.urlPath || undefined,
|
|
351
|
+
host: options?.host || undefined,
|
|
352
|
+
};
|
|
353
|
+
httpResponders[options?.runFirst ? 'unshift' : 'push'](entry);
|
|
354
|
+
}
|
|
355
|
+
else if (Request_ts_1.isBun) {
|
|
356
|
+
// On Bun, store non-function listeners (e.g. Fastify's http.Server) for fallback delegation
|
|
357
|
+
bunFallbackServers[port] = listener;
|
|
250
358
|
}
|
|
251
359
|
else {
|
|
252
360
|
listener.isSecure = secure;
|
|
@@ -263,9 +371,9 @@ function getHTTPServer(port, secure, options) {
|
|
|
263
371
|
if (!httpServers[port]) {
|
|
264
372
|
// TODO: These should all come from httpOptions or operationsApiOptions
|
|
265
373
|
const serverPrefix = isOperationsServer ? 'operationsApi_network' : (usageType ?? 'http');
|
|
266
|
-
const keepAliveTimeout =
|
|
267
|
-
const requestTimeout =
|
|
268
|
-
const headersTimeout =
|
|
374
|
+
const keepAliveTimeout = env.get(serverPrefix + '_keepAliveTimeout');
|
|
375
|
+
const requestTimeout = env.get(serverPrefix + '_timeout');
|
|
376
|
+
const headersTimeout = env.get(serverPrefix + '_headersTimeout');
|
|
269
377
|
const options = {
|
|
270
378
|
keepAliveTimeout,
|
|
271
379
|
headersTimeout,
|
|
@@ -276,16 +384,16 @@ function getHTTPServer(port, secure, options) {
|
|
|
276
384
|
noDelay: true, // don't delay for Nagle's algorithm, it is a relic of the past that slows things down: https://brooker.co.za/blog/2024/05/09/nagle.html
|
|
277
385
|
keepAlive: true,
|
|
278
386
|
keepAliveInitialDelay: 600, // lower the initial delay to 10 minutes, we want to be proactive about closing unused connections
|
|
279
|
-
maxHeaderSize:
|
|
387
|
+
maxHeaderSize: env.get(terms.CONFIG_PARAMS.HTTP_MAXHEADERSIZE),
|
|
280
388
|
};
|
|
281
|
-
const mtls =
|
|
282
|
-
const mtlsRequired =
|
|
389
|
+
const mtls = env.get(serverPrefix + '_mtls');
|
|
390
|
+
const mtlsRequired = env.get(serverPrefix + '_mtls_required');
|
|
283
391
|
let http2;
|
|
284
392
|
if (secure) {
|
|
285
|
-
const tlsConfig =
|
|
393
|
+
const tlsConfig = env.get('tls');
|
|
286
394
|
// check if we want to enable HTTP/2; operations server doesn't use HTTP/2 because it doesn't allow the
|
|
287
395
|
// ALPNCallback to work with our custom protocol for replication
|
|
288
|
-
http2 =
|
|
396
|
+
http2 = env.get(serverPrefix + '_http2');
|
|
289
397
|
// If we are in secure mode, we use HTTP/2 (createSecureServer from http2), with back-compat support
|
|
290
398
|
// HTTP/1. We do not use HTTP/2 for insecure mode for a few reasons: browsers do not support insecure
|
|
291
399
|
// HTTP/2. We have seen slower performance with HTTP/2, when used for directly benchmarking. We have
|
|
@@ -296,7 +404,7 @@ function getHTTPServer(port, secure, options) {
|
|
|
296
404
|
rejectUnauthorized: Boolean(mtlsRequired),
|
|
297
405
|
requestCert: Boolean(mtls || isMtls),
|
|
298
406
|
ticketKeys: (0, manageThreads_js_1.getTicketKeys)(),
|
|
299
|
-
SNICallback: (0,
|
|
407
|
+
SNICallback: (0, keys_ts_1.createTLSSelector)(usageType ?? 'server', mtls),
|
|
300
408
|
ciphers: tlsConfig.ciphers ?? tlsConfig[0]?.ciphers,
|
|
301
409
|
});
|
|
302
410
|
}
|
|
@@ -454,12 +562,12 @@ function getHTTPServer(port, secure, options) {
|
|
|
454
562
|
// a status code is interpreted as an expected error, so just info or warn, otherwise log as error
|
|
455
563
|
if (error.statusCode) {
|
|
456
564
|
if (error.statusCode === 500)
|
|
457
|
-
|
|
565
|
+
harper_logger_ts_1.default.warn(error);
|
|
458
566
|
else
|
|
459
|
-
|
|
567
|
+
harper_logger_ts_1.default.info(error);
|
|
460
568
|
}
|
|
461
569
|
else
|
|
462
|
-
|
|
570
|
+
harper_logger_ts_1.default.error(error);
|
|
463
571
|
}
|
|
464
572
|
};
|
|
465
573
|
// create a throttled version of the request handler, so we can throttle POST requests
|
|
@@ -468,7 +576,7 @@ function getHTTPServer(port, secure, options) {
|
|
|
468
576
|
nodeResponse.statusCode = 503;
|
|
469
577
|
nodeResponse.end('Service unavailable, exceeded request queue limit');
|
|
470
578
|
(0, write_ts_1.recordAction)(true, 'service-unavailable', port);
|
|
471
|
-
},
|
|
579
|
+
}, env.get(serverPrefix + '_requestQueueLimit'));
|
|
472
580
|
const server = (httpServers[port] = (secure ? (http2 ? node_http2_1.createSecureServer : node_https_1.createServer) : node_http_1.createServer)(options, (nodeRequest, nodeResponse) => {
|
|
473
581
|
// throttle the requests that can make data modifications because they are more likely to be slow and we don't
|
|
474
582
|
// want to block or slow down other activity
|
|
@@ -505,24 +613,289 @@ function getHTTPServer(port, secure, options) {
|
|
|
505
613
|
server.isSecure = true;
|
|
506
614
|
}
|
|
507
615
|
registerServer(server, port);
|
|
616
|
+
// macOS doesn't support SO_REUSEPORT on all socket types; operations API also doesn't need it
|
|
617
|
+
if (isOperationsServer || process.platform === 'darwin')
|
|
618
|
+
server.noReusePort = true;
|
|
619
|
+
// Operations API domain socket connections bypass auth (equivalent to local access)
|
|
620
|
+
if (isOperationsServer && String(port).includes('/'))
|
|
621
|
+
server.bypassLocalAuth = true;
|
|
622
|
+
// Create a corresponding Unix Domain Socket mirror for secure ports
|
|
623
|
+
if (secure && env.get(terms.CONFIG_PARAMS.TLS_UNIXDOMAINSOCKETS)) {
|
|
624
|
+
const socketsDir = (0, node_path_1.join)(env.getHdbBasePath(), 'sockets');
|
|
625
|
+
(0, node_fs_1.mkdirSync)(socketsDir, { recursive: true });
|
|
626
|
+
const socketName = `${(0, manageThreads_js_1.getWorkerIndex)()}-${port}`;
|
|
627
|
+
const udsPath = (0, node_path_1.join)(socketsDir, `${socketName}.sock`);
|
|
628
|
+
const yamlPath = (0, node_path_1.join)(socketsDir, `${socketName}.yaml`);
|
|
629
|
+
// Create a plain HTTP server (no TLS) with the same request handler
|
|
630
|
+
const udsServer = (0, node_http_1.createServer)({
|
|
631
|
+
keepAliveTimeout,
|
|
632
|
+
headersTimeout,
|
|
633
|
+
requestTimeout,
|
|
634
|
+
highWaterMark: 128 * 1024,
|
|
635
|
+
noDelay: true,
|
|
636
|
+
keepAlive: true,
|
|
637
|
+
keepAliveInitialDelay: 600,
|
|
638
|
+
maxHeaderSize: env.get(terms.CONFIG_PARAMS.HTTP_MAXHEADERSIZE),
|
|
639
|
+
}, (nodeRequest, nodeResponse) => {
|
|
640
|
+
const method = nodeRequest.method;
|
|
641
|
+
if (method === 'GET' || method === 'OPTIONS' || method === 'HEAD')
|
|
642
|
+
requestHandler(nodeRequest, nodeResponse);
|
|
643
|
+
else
|
|
644
|
+
throttledRequestHandler(nodeRequest, nodeResponse);
|
|
645
|
+
});
|
|
646
|
+
udsServer.isPerThreadSocket = true;
|
|
647
|
+
enableProxyProtocol(udsServer);
|
|
648
|
+
serverRegistry_ts_1.SERVERS[udsPath] = udsServer;
|
|
649
|
+
registerUdsCleanupPaths(udsPath, yamlPath);
|
|
650
|
+
const writeMetadata = () => writeUdsMetadata(yamlPath, port, server);
|
|
651
|
+
options.SNICallback.ready.then(writeMetadata);
|
|
652
|
+
server.secureContextsListeners.push(writeMetadata);
|
|
653
|
+
}
|
|
508
654
|
}
|
|
509
655
|
return httpServers[port];
|
|
510
656
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
657
|
+
/**
|
|
658
|
+
* Bun-specific HTTP server setup. Instead of creating a Node http.Server, we store a fetch handler config
|
|
659
|
+
* that will be passed to Bun.serve() when listenOnPorts() is called in threadServer.js.
|
|
660
|
+
*/
|
|
661
|
+
function getBunHTTPServer(port, secure, options) {
|
|
662
|
+
const { usageType } = options || {};
|
|
663
|
+
const isOperationsServer = usageType === 'operations-api';
|
|
664
|
+
(0, serverRegistry_ts_1.setPortServerMap)(port, { protocol_name: secure ? 'HTTPS' : 'HTTP', name: (0, componentLoader_ts_1.getComponentName)() });
|
|
665
|
+
if (!httpServers[port]) {
|
|
666
|
+
const serverPrefix = isOperationsServer ? 'operationsApi_network' : (usageType ?? 'http');
|
|
667
|
+
const fetchHandler = async (webRequest, bunServer) => {
|
|
668
|
+
const startTime = performance.now();
|
|
669
|
+
let requestId = 0;
|
|
670
|
+
try {
|
|
671
|
+
const request = new Request_ts_1.BunRequest(webRequest, bunServer, secure);
|
|
672
|
+
if (isOperationsServer)
|
|
673
|
+
request.isOperationsServer = true;
|
|
674
|
+
if (httpOptions.logging?.id)
|
|
675
|
+
request.requestId = requestId = getRequestId();
|
|
676
|
+
let response = await httpChain[port](request);
|
|
677
|
+
if (!response) {
|
|
678
|
+
response = unhandled(request);
|
|
679
|
+
}
|
|
680
|
+
if (!response.headers?.set) {
|
|
681
|
+
response.headers = new Headers_ts_1.Headers(response.headers);
|
|
682
|
+
}
|
|
683
|
+
for (let [key, value] of exports.universalHeaders) {
|
|
684
|
+
response.headers.set(key, value);
|
|
685
|
+
}
|
|
686
|
+
if (response.status === -1) {
|
|
687
|
+
const fallbackServer = bunFallbackServers[port];
|
|
688
|
+
if (fallbackServer) {
|
|
689
|
+
// Delegate to the fallback server (e.g. Fastify) via node:http compatibility.
|
|
690
|
+
// We create a Node-compatible IncomingMessage/ServerResponse and emit 'request'
|
|
691
|
+
// on the fallback server, then capture the response.
|
|
692
|
+
return await bunDelegateToNodeServer(fallbackServer, webRequest, request);
|
|
693
|
+
}
|
|
694
|
+
logBunRequest(request, 404, requestId, performance.now() - startTime);
|
|
695
|
+
return new Response('Not found\n', { status: 404 });
|
|
696
|
+
}
|
|
697
|
+
const status = response.status || 200;
|
|
698
|
+
const endTime = performance.now();
|
|
699
|
+
const executionTime = endTime - startTime;
|
|
700
|
+
let body = response.body;
|
|
701
|
+
const responseHeaders = new globalThis.Headers();
|
|
702
|
+
if (!response.handlesHeaders) {
|
|
703
|
+
const headers = response.headers || new Headers_ts_1.Headers();
|
|
704
|
+
let serverTiming = `hdb;dur=${executionTime.toFixed(2)}`;
|
|
705
|
+
if (response.wasCacheMiss) {
|
|
706
|
+
serverTiming += ', miss';
|
|
707
|
+
}
|
|
708
|
+
(0, Headers_ts_1.appendHeader)(headers, 'Server-Timing', serverTiming, true);
|
|
709
|
+
// Convert Harper Headers to Web Headers
|
|
710
|
+
if (headers[Symbol.iterator]) {
|
|
711
|
+
for (const [name, value] of headers) {
|
|
712
|
+
if (Array.isArray(value)) {
|
|
713
|
+
for (const v of value)
|
|
714
|
+
responseHeaders.append(name, v);
|
|
715
|
+
}
|
|
716
|
+
else if (value != null) {
|
|
717
|
+
responseHeaders.set(name, String(value));
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
if (!body) {
|
|
722
|
+
if (request.method !== 'HEAD') {
|
|
723
|
+
responseHeaders.set('Content-Length', '0');
|
|
724
|
+
}
|
|
725
|
+
body = null;
|
|
726
|
+
}
|
|
727
|
+
else if (body.length >= 0) {
|
|
728
|
+
if (typeof body === 'string')
|
|
729
|
+
responseHeaders.set('Content-Length', String(Buffer.byteLength(body)));
|
|
730
|
+
else
|
|
731
|
+
responseHeaders.set('Content-Length', String(body.length));
|
|
732
|
+
}
|
|
733
|
+
else if (body instanceof blob_ts_1.Blob) {
|
|
734
|
+
if (body.size)
|
|
735
|
+
responseHeaders.set('Content-Length', String(body.size));
|
|
736
|
+
body = body.stream();
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
// Propagate Connection: close so Bun closes the TCP connection after this response,
|
|
740
|
+
// preventing stale keep-alive sockets from causing silent hangs on subsequent requests.
|
|
741
|
+
if (webRequest.headers.get('connection')?.toLowerCase() === 'close') {
|
|
742
|
+
responseHeaders.set('connection', 'close');
|
|
743
|
+
}
|
|
744
|
+
const handlerPath = request.handlerPath;
|
|
745
|
+
const method = request.method;
|
|
746
|
+
(0, write_ts_1.recordAction)(executionTime, 'duration', handlerPath, method, response.wasCacheMiss == undefined ? undefined : response.wasCacheMiss ? 'cache-miss' : 'cache-hit');
|
|
747
|
+
(0, write_ts_1.recordActionBinary)(status < 400, 'success', handlerPath, method);
|
|
748
|
+
(0, write_ts_1.recordActionBinary)(1, 'response_' + status, handlerPath, method);
|
|
749
|
+
logBunRequest(request, status, requestId, executionTime);
|
|
750
|
+
// Convert body to something Bun's Response can accept
|
|
751
|
+
if (body instanceof ReadableStream) {
|
|
752
|
+
return new Response(body, { status, headers: responseHeaders });
|
|
753
|
+
}
|
|
754
|
+
if (body?.[Symbol.iterator] || body?.[Symbol.asyncIterator]) {
|
|
755
|
+
body = node_stream_1.Readable.from(body);
|
|
756
|
+
}
|
|
757
|
+
if (body?.pipe) {
|
|
758
|
+
// Some streams (e.g. SendStream from 'send') call setHeader/writeHead on the
|
|
759
|
+
// pipe destination, expecting an http.ServerResponse. Use a Writable with a
|
|
760
|
+
// minimal shim so those calls capture headers, and buffer the data before
|
|
761
|
+
// returning a Response (avoids Readable.toWeb() compat issues with Bun).
|
|
762
|
+
const chunks = [];
|
|
763
|
+
const buffer = await new Promise((resolve, reject) => {
|
|
764
|
+
const dest = new node_stream_1.Writable({
|
|
765
|
+
write(chunk, _encoding, callback) {
|
|
766
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
767
|
+
callback();
|
|
768
|
+
},
|
|
769
|
+
final(callback) {
|
|
770
|
+
callback();
|
|
771
|
+
resolve(Buffer.concat(chunks));
|
|
772
|
+
},
|
|
773
|
+
});
|
|
774
|
+
Object.assign(dest, {
|
|
775
|
+
setHeader: (n, v) => responseHeaders.set(n, String(v)),
|
|
776
|
+
getHeader: (n) => responseHeaders.get(n),
|
|
777
|
+
removeHeader: (n) => responseHeaders.delete(n),
|
|
778
|
+
writeHead: (_s, hdrs) => {
|
|
779
|
+
if (hdrs)
|
|
780
|
+
for (const [k, v] of Object.entries(hdrs))
|
|
781
|
+
responseHeaders.set(k, String(v));
|
|
782
|
+
},
|
|
783
|
+
statusCode: status,
|
|
784
|
+
headersSent: false,
|
|
785
|
+
// 'on-finished' (used by 'send') checks msg.finished to see if stream is done.
|
|
786
|
+
// Writable.finished is undefined in Bun (not boolean), so isFinished() returns undefined
|
|
787
|
+
// which !== false, causing on-finished to call cleanup() immediately and destroy the
|
|
788
|
+
// ReadStream before data flows. Setting finished: false makes it wait for 'finish' event.
|
|
789
|
+
finished: false,
|
|
790
|
+
});
|
|
791
|
+
body.on('error', reject);
|
|
792
|
+
dest.on('error', reject);
|
|
793
|
+
body.pipe(dest);
|
|
794
|
+
});
|
|
795
|
+
responseHeaders.set('Content-Length', String(buffer.length));
|
|
796
|
+
return new Response(buffer, { status, headers: responseHeaders });
|
|
797
|
+
}
|
|
798
|
+
if (body?.then) {
|
|
799
|
+
body = await body;
|
|
800
|
+
}
|
|
801
|
+
return new Response(body, { status, headers: responseHeaders });
|
|
802
|
+
}
|
|
803
|
+
catch (error) {
|
|
804
|
+
const status = error.statusCode || 500;
|
|
805
|
+
logBunRequest(null, status, requestId, performance.now() - startTime);
|
|
806
|
+
if (error.statusCode) {
|
|
807
|
+
if (error.statusCode === 500)
|
|
808
|
+
harper_logger_ts_1.default.warn(error);
|
|
809
|
+
else
|
|
810
|
+
harper_logger_ts_1.default.info(error);
|
|
811
|
+
}
|
|
812
|
+
else
|
|
813
|
+
harper_logger_ts_1.default.error(error);
|
|
814
|
+
return new Response(errorToString(error), { status });
|
|
815
|
+
}
|
|
816
|
+
};
|
|
817
|
+
// Store the config for Bun.serve() — will be started by threadServer.js listenOnPorts()
|
|
818
|
+
const config = {
|
|
819
|
+
fetch: fetchHandler,
|
|
820
|
+
reusePort: process.platform !== 'darwin' && process.platform !== 'win32',
|
|
821
|
+
};
|
|
822
|
+
if (secure) {
|
|
823
|
+
// TLS config for Bun
|
|
824
|
+
const mtls = env.get(serverPrefix + '_mtls');
|
|
825
|
+
const tlsSelector = (0, keys_ts_1.createTLSSelector)(usageType ?? 'server', mtls);
|
|
826
|
+
// Create a pseudo-server object so the TLS selector can store secureContexts on it
|
|
827
|
+
const pseudoServer = { ports: [port], secureContexts: null, secureContextsListeners: [] };
|
|
828
|
+
tlsSelector.initialize(pseudoServer);
|
|
829
|
+
config.tlsSelector = tlsSelector;
|
|
830
|
+
config.pseudoServer = pseudoServer;
|
|
831
|
+
config.isSecure = true;
|
|
832
|
+
}
|
|
833
|
+
// Operations API domain socket connections bypass auth
|
|
834
|
+
if (isOperationsServer && String(port).includes('/'))
|
|
835
|
+
config.bypassLocalAuth = true;
|
|
836
|
+
exports.bunServeConfigs[port] = config;
|
|
837
|
+
httpServers[port] = config; // sentinel so we don't create twice
|
|
838
|
+
}
|
|
839
|
+
return httpServers[port];
|
|
840
|
+
}
|
|
841
|
+
/**
|
|
842
|
+
* Bridge a Bun fetch request to a Node.js http.Server (e.g. Fastify) by using Fastify's inject()
|
|
843
|
+
* method to send the request through its internal router without needing a real socket.
|
|
844
|
+
*/
|
|
845
|
+
let bunFastifyInstances = {};
|
|
846
|
+
function registerBunFastifyInstance(port, instance) {
|
|
847
|
+
bunFastifyInstances[port] = instance;
|
|
848
|
+
}
|
|
849
|
+
const INTERNAL_USER_HEADER = 'x-harper-internal-pre-auth-user';
|
|
850
|
+
async function bunDelegateToNodeServer(nodeServer, webRequest, bunRequest) {
|
|
851
|
+
// Check if there's a Fastify instance registered for this port (preferred path)
|
|
852
|
+
for (const port in bunFallbackServers) {
|
|
853
|
+
if (bunFallbackServers[port] === nodeServer && bunFastifyInstances[port]) {
|
|
854
|
+
const fastify = bunFastifyInstances[port];
|
|
855
|
+
const url = new URL(webRequest.url);
|
|
856
|
+
const body = webRequest.body ? Buffer.from(await webRequest.arrayBuffer()) : undefined;
|
|
857
|
+
const headers = {};
|
|
858
|
+
webRequest.headers.forEach((value, key) => {
|
|
859
|
+
// Strip any forged pre-auth header from real clients
|
|
860
|
+
if (key.toLowerCase() !== INTERNAL_USER_HEADER)
|
|
861
|
+
headers[key] = value;
|
|
862
|
+
});
|
|
863
|
+
// If Harper's auth middleware authenticated this request without credentials (e.g. via
|
|
864
|
+
// AUTHORIZE_LOCAL for loopback connections in dev mode), pass the user so Fastify can
|
|
865
|
+
// skip its own auth. Only applies when there is no Authorization header — if credentials
|
|
866
|
+
// were provided, let Fastify's Passport validate them normally.
|
|
867
|
+
if (bunRequest?.user && !headers['authorization']) {
|
|
868
|
+
headers[INTERNAL_USER_HEADER] = JSON.stringify(bunRequest.user);
|
|
869
|
+
}
|
|
870
|
+
const injectResult = await fastify.inject({
|
|
871
|
+
method: webRequest.method,
|
|
872
|
+
url: url.pathname + url.search,
|
|
873
|
+
headers,
|
|
874
|
+
payload: body,
|
|
875
|
+
});
|
|
876
|
+
const webHeaders = new globalThis.Headers();
|
|
877
|
+
for (const [k, v] of Object.entries(injectResult.headers)) {
|
|
878
|
+
if (v != null)
|
|
879
|
+
webHeaders.set(k, Array.isArray(v) ? v.join(', ') : String(v));
|
|
880
|
+
}
|
|
881
|
+
// Propagate Connection: close so Bun closes the TCP connection after this response,
|
|
882
|
+
// preventing stale keep-alive sockets from causing silent hangs on subsequent requests.
|
|
883
|
+
if (webRequest.headers.get('connection')?.toLowerCase() === 'close') {
|
|
884
|
+
webHeaders.set('connection', 'close');
|
|
885
|
+
}
|
|
886
|
+
return new Response(injectResult.rawPayload?.length > 0 ? injectResult.rawPayload : null, {
|
|
887
|
+
status: injectResult.statusCode,
|
|
888
|
+
headers: webHeaders,
|
|
889
|
+
});
|
|
523
890
|
}
|
|
524
891
|
}
|
|
525
|
-
return
|
|
892
|
+
// No Fastify instance found — return 404
|
|
893
|
+
return new Response('Not found\n', { status: 404 });
|
|
894
|
+
}
|
|
895
|
+
function makeCallbackChain(responders, portNum, requestArgIndex = 0) {
|
|
896
|
+
return (0, middlewareChain_ts_1.makeCallbackChain)(responders, portNum, unhandled, () => {
|
|
897
|
+
harper_logger_ts_1.default.warn(`Cycle detected in middleware before/after ordering on port ${portNum}; falling back to registration order.`);
|
|
898
|
+
}, requestArgIndex);
|
|
526
899
|
}
|
|
527
900
|
function unhandled(request) {
|
|
528
901
|
if (request.user) {
|
|
@@ -551,7 +924,16 @@ Object.defineProperty(node_http_1.IncomingMessage.prototype, 'upgrade', {
|
|
|
551
924
|
const upgradeListeners = [], upgradeChains = {};
|
|
552
925
|
function onUpgrade(listener, options) {
|
|
553
926
|
for (const { port } of getPorts(options)) {
|
|
554
|
-
|
|
927
|
+
const entry = {
|
|
928
|
+
listener,
|
|
929
|
+
port: options?.port || port,
|
|
930
|
+
name: options?.name ?? (0, componentLoader_ts_1.getComponentName)(),
|
|
931
|
+
before: options?.before,
|
|
932
|
+
after: options?.after,
|
|
933
|
+
urlPath: options?.urlPath || undefined,
|
|
934
|
+
host: options?.host || undefined,
|
|
935
|
+
};
|
|
936
|
+
upgradeListeners[options?.runFirst ? 'unshift' : 'push'](entry);
|
|
555
937
|
upgradeChains[port] = makeCallbackChain(upgradeListeners, port);
|
|
556
938
|
}
|
|
557
939
|
}
|
|
@@ -581,11 +963,11 @@ function onWebSocket(listener, options) {
|
|
|
581
963
|
const request = new Request_ts_1.Request(incomingMessage);
|
|
582
964
|
request.isWebSocket = true;
|
|
583
965
|
const chainCompletion = httpChain[port](request);
|
|
584
|
-
|
|
966
|
+
harper_logger_ts_1.default.debug('Received WS connection, calling listeners', websocketListeners);
|
|
585
967
|
websocketChains[port](ws, request, chainCompletion);
|
|
586
968
|
}
|
|
587
969
|
catch (error) {
|
|
588
|
-
|
|
970
|
+
harper_logger_ts_1.default.warn('Error in handling WS connection', error);
|
|
589
971
|
}
|
|
590
972
|
});
|
|
591
973
|
// Add the default upgrade handler if it doesn't exist.
|
|
@@ -610,13 +992,94 @@ function onWebSocket(listener, options) {
|
|
|
610
992
|
});
|
|
611
993
|
}
|
|
612
994
|
servers.push(server);
|
|
613
|
-
|
|
614
|
-
|
|
995
|
+
const wsEntry = {
|
|
996
|
+
listener,
|
|
997
|
+
port: options?.port || port,
|
|
998
|
+
name: options?.name ?? (0, componentLoader_ts_1.getComponentName)(),
|
|
999
|
+
before: options?.before,
|
|
1000
|
+
after: options?.after,
|
|
1001
|
+
urlPath: options?.urlPath || undefined,
|
|
1002
|
+
host: options?.host || undefined,
|
|
1003
|
+
};
|
|
1004
|
+
websocketListeners[options?.runFirst ? 'unshift' : 'push'](wsEntry);
|
|
1005
|
+
websocketChains[port] = makeCallbackChain(websocketListeners, port, 1);
|
|
615
1006
|
// mqtt doesn't invoke the http handler so this needs to be here to load up the http chains.
|
|
616
1007
|
httpChain[port] = makeCallbackChain(httpResponders, port);
|
|
617
1008
|
}
|
|
618
1009
|
return servers;
|
|
619
1010
|
}
|
|
1011
|
+
// PROXY protocol v1 max header length per spec: 108 bytes
|
|
1012
|
+
const PROXY_V1_MAX_HEADER = 108;
|
|
1013
|
+
const PROXY_V1_PREFIX = Buffer.from('PROXY ');
|
|
1014
|
+
function enableProxyProtocol(httpServer) {
|
|
1015
|
+
// In Node.js v24+, the HTTP parser's data path goes through the C++ stream layer
|
|
1016
|
+
// and does not call socket.emit('data') via JavaScript method dispatch.
|
|
1017
|
+
// Overriding socket.emit or socket.push has no effect on the HTTP parser's data intake.
|
|
1018
|
+
//
|
|
1019
|
+
// Instead: use process.nextTick inside the 'connection' handler to wrap the HTTP
|
|
1020
|
+
// parser's 'data' listener after it has been registered (synchronously, by the HTTP
|
|
1021
|
+
// parser's own 'connection' handler which runs right after ours).
|
|
1022
|
+
// process.nextTick fires before any I/O callbacks, so it is guaranteed to run before
|
|
1023
|
+
// the first network data chunk reaches the socket — making the interception race-free.
|
|
1024
|
+
httpServer.prependListener('connection', (socket) => {
|
|
1025
|
+
process.nextTick(() => {
|
|
1026
|
+
// Capture the HTTP parser's 'data' listener(s) registered during this connection event.
|
|
1027
|
+
const dataListeners = socket.listeners('data');
|
|
1028
|
+
if (dataListeners.length === 0)
|
|
1029
|
+
return;
|
|
1030
|
+
socket.removeAllListeners('data');
|
|
1031
|
+
const forward = (chunk) => {
|
|
1032
|
+
for (const listener of dataListeners)
|
|
1033
|
+
listener.call(socket, chunk);
|
|
1034
|
+
};
|
|
1035
|
+
let headerHandled = false;
|
|
1036
|
+
// Accumulates a possibly-split PROXY header. Raw protocols (MQTT/replication) can't
|
|
1037
|
+
// recover from a corrupted first packet, so we must not forward a partial header —
|
|
1038
|
+
// the line can arrive across multiple data events.
|
|
1039
|
+
let pending = null;
|
|
1040
|
+
socket.on('data', (chunk) => {
|
|
1041
|
+
if (headerHandled)
|
|
1042
|
+
return forward(chunk);
|
|
1043
|
+
if (pending)
|
|
1044
|
+
chunk = Buffer.concat([pending, chunk]);
|
|
1045
|
+
// Compare against "PROXY " for as many bytes as we have so far.
|
|
1046
|
+
const cmpLen = Math.min(PROXY_V1_PREFIX.length, chunk.length);
|
|
1047
|
+
if (chunk.compare(PROXY_V1_PREFIX, 0, cmpLen, 0, cmpLen) !== 0) {
|
|
1048
|
+
// Not a PROXY v1 header — forward everything unchanged.
|
|
1049
|
+
headerHandled = true;
|
|
1050
|
+
pending = null;
|
|
1051
|
+
return forward(chunk);
|
|
1052
|
+
}
|
|
1053
|
+
const header = chunk.toString('latin1', 0, Math.min(PROXY_V1_MAX_HEADER, chunk.length));
|
|
1054
|
+
const eol = header.indexOf('\r\n');
|
|
1055
|
+
if (eol === -1) {
|
|
1056
|
+
// Header not complete yet. Keep buffering until the CRLF arrives, unless we've
|
|
1057
|
+
// passed the spec max without one — then it isn't a valid PROXY header.
|
|
1058
|
+
if (chunk.length < PROXY_V1_MAX_HEADER) {
|
|
1059
|
+
pending = chunk;
|
|
1060
|
+
return;
|
|
1061
|
+
}
|
|
1062
|
+
headerHandled = true;
|
|
1063
|
+
pending = null;
|
|
1064
|
+
return forward(chunk);
|
|
1065
|
+
}
|
|
1066
|
+
// Complete header: "PROXY TCP4 <src-ip> <dst-ip> <src-port> <dst-port>"
|
|
1067
|
+
headerHandled = true;
|
|
1068
|
+
pending = null;
|
|
1069
|
+
const parts = header.slice(0, eol).split(' ');
|
|
1070
|
+
if (parts.length === 6) {
|
|
1071
|
+
// Override the UDS socket's undefined remoteAddress/remotePort with the real client values.
|
|
1072
|
+
Object.defineProperty(socket, 'remoteAddress', { value: parts[2], configurable: true });
|
|
1073
|
+
Object.defineProperty(socket, 'remotePort', { value: parseInt(parts[4], 10), configurable: true });
|
|
1074
|
+
}
|
|
1075
|
+
// Forward only the bytes after the PROXY header to the protocol parser.
|
|
1076
|
+
const rest = chunk.subarray(eol + 2);
|
|
1077
|
+
if (rest.length > 0)
|
|
1078
|
+
forward(rest);
|
|
1079
|
+
});
|
|
1080
|
+
});
|
|
1081
|
+
});
|
|
1082
|
+
}
|
|
620
1083
|
function defaultNotFound(request, response) {
|
|
621
1084
|
if (response.headersSent || response.writableEnded)
|
|
622
1085
|
return;
|
|
@@ -625,11 +1088,24 @@ function defaultNotFound(request, response) {
|
|
|
625
1088
|
logRequest(request, 404, 0, request.requestId);
|
|
626
1089
|
}
|
|
627
1090
|
let httpLogger;
|
|
1091
|
+
function logBunRequest(request, status, requestId, executionTime) {
|
|
1092
|
+
const logging = httpOptions.logging;
|
|
1093
|
+
if (logging) {
|
|
1094
|
+
if (!httpLogger) {
|
|
1095
|
+
httpLogger = harper_logger_ts_1.default.forComponent('http');
|
|
1096
|
+
}
|
|
1097
|
+
const level = status < 400 ? 'info' : status === 500 ? 'error' : 'warn';
|
|
1098
|
+
const method = request?.method || '?';
|
|
1099
|
+
const url = request?.url || '?';
|
|
1100
|
+
const protocol = request?.protocol === 'https' ? 'HTTPS' : 'HTTP';
|
|
1101
|
+
httpLogger[level]?.(`${method} ${url} ${protocol}/1.1${logging.headers && request?.headers ? ' ' + headersToString(request.headers.asObject || {}) : ''} ${status}${logging.timing && executionTime ? ' ' + executionTime.toFixed(2) + 'ms' : ''}${requestId ? ' id: ' + requestId : ''}`);
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
628
1104
|
function logRequest(nodeRequest, status, requestId, executionTime) {
|
|
629
1105
|
const logging = httpOptions.logging;
|
|
630
1106
|
if (logging) {
|
|
631
1107
|
if (!httpLogger) {
|
|
632
|
-
httpLogger =
|
|
1108
|
+
httpLogger = harper_logger_ts_1.default.forComponent('http');
|
|
633
1109
|
}
|
|
634
1110
|
const level = status < 400 ? 'info' : status === 500 ? 'error' : 'warn';
|
|
635
1111
|
httpLogger[level]?.(`${nodeRequest.method} ${nodeRequest.url} ${nodeRequest.socket.encrypted ? 'HTTPS' : 'HTTP'}/${nodeRequest.httpVersion}${logging.headers ? ' ' + headersToString(nodeRequest.headers) : ''} ${status}${logging.timing && executionTime ? ' ' + executionTime.toFixed(2) + 'ms' : ''}${requestId ? ' id: ' + requestId : ''}`);
|