harper 5.1.20 → 5.2.0-alpha.5
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/agent/operations.ts +13 -16
- package/components/Application.ts +188 -7
- package/components/ApplicationScope.ts +3 -0
- package/components/Scope.ts +12 -0
- package/components/anthropic/index.ts +9 -2
- package/components/bedrock/index.ts +25 -2
- package/components/componentLoader.ts +56 -7
- package/components/componentSecrets.ts +451 -0
- package/components/deploymentRecorder.ts +7 -1
- package/components/mcp/adapters/fastify.ts +3 -0
- package/components/mcp/adapters/harperHttp.ts +3 -0
- package/components/mcp/audit.ts +21 -6
- package/components/mcp/customResourceRegistry.ts +17 -38
- package/components/mcp/listChanged.ts +37 -20
- package/components/mcp/quota.ts +145 -0
- package/components/mcp/rateLimit.ts +152 -14
- package/components/mcp/resources.ts +2 -4
- package/components/mcp/toolRegistry.ts +73 -4
- package/components/mcp/tools/application.ts +77 -8
- package/components/mcp/tools/operations.ts +106 -36
- package/components/mcp/tools/schemas/operationDescriptions.ts +4 -4
- package/components/mcp/tools/schemas/operations.ts +5 -0
- package/components/mcp/transport.ts +55 -4
- package/components/ollama/index.ts +6 -2
- package/components/openai/index.ts +9 -2
- package/components/operations.js +204 -10
- package/components/operationsValidation.js +173 -0
- package/components/secretOperations.ts +498 -0
- package/config/configUtils.ts +25 -1
- package/config-app.schema.json +81 -0
- package/config-root.schema.json +8 -1
- package/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
- package/dataLayer/readAuditLog.ts +14 -0
- package/dataLayer/schemaDescribe.ts +1 -0
- package/dist/agent/operations.d.ts +7 -4
- package/dist/agent/operations.js +13 -15
- package/dist/agent/operations.js.map +1 -1
- package/dist/components/Application.d.ts +25 -2
- package/dist/components/Application.js +166 -7
- package/dist/components/Application.js.map +1 -1
- package/dist/components/ApplicationScope.d.ts +2 -0
- package/dist/components/ApplicationScope.js +3 -0
- package/dist/components/ApplicationScope.js.map +1 -1
- package/dist/components/Scope.d.ts +8 -0
- package/dist/components/Scope.js +11 -0
- package/dist/components/Scope.js.map +1 -1
- package/dist/components/anthropic/index.d.ts +4 -1
- package/dist/components/anthropic/index.js +4 -2
- package/dist/components/anthropic/index.js.map +1 -1
- package/dist/components/bedrock/index.d.ts +4 -1
- package/dist/components/bedrock/index.js +22 -2
- package/dist/components/bedrock/index.js.map +1 -1
- package/dist/components/componentLoader.d.ts +2 -0
- package/dist/components/componentLoader.js +52 -10
- package/dist/components/componentLoader.js.map +1 -1
- package/dist/components/componentSecrets.d.ts +63 -0
- package/dist/components/componentSecrets.js +405 -0
- package/dist/components/componentSecrets.js.map +1 -0
- package/dist/components/deploymentRecorder.d.ts +3 -0
- package/dist/components/deploymentRecorder.js +4 -3
- package/dist/components/deploymentRecorder.js.map +1 -1
- package/dist/components/mcp/adapters/fastify.d.ts +2 -0
- package/dist/components/mcp/adapters/fastify.js +1 -0
- package/dist/components/mcp/adapters/fastify.js.map +1 -1
- package/dist/components/mcp/adapters/harperHttp.d.ts +2 -0
- package/dist/components/mcp/adapters/harperHttp.js +1 -0
- package/dist/components/mcp/adapters/harperHttp.js.map +1 -1
- package/dist/components/mcp/audit.d.ts +2 -2
- package/dist/components/mcp/audit.js +20 -5
- package/dist/components/mcp/audit.js.map +1 -1
- package/dist/components/mcp/customResourceRegistry.d.ts +5 -12
- package/dist/components/mcp/customResourceRegistry.js +15 -30
- package/dist/components/mcp/customResourceRegistry.js.map +1 -1
- package/dist/components/mcp/listChanged.d.ts +7 -2
- package/dist/components/mcp/listChanged.js +28 -0
- package/dist/components/mcp/listChanged.js.map +1 -1
- package/dist/components/mcp/quota.d.ts +31 -0
- package/dist/components/mcp/quota.js +155 -0
- package/dist/components/mcp/quota.js.map +1 -0
- package/dist/components/mcp/rateLimit.d.ts +19 -3
- package/dist/components/mcp/rateLimit.js +129 -13
- package/dist/components/mcp/rateLimit.js.map +1 -1
- package/dist/components/mcp/resources.js.map +1 -1
- package/dist/components/mcp/toolRegistry.d.ts +39 -1
- package/dist/components/mcp/toolRegistry.js +60 -5
- package/dist/components/mcp/toolRegistry.js.map +1 -1
- package/dist/components/mcp/tools/application.d.ts +8 -1
- package/dist/components/mcp/tools/application.js +65 -5
- package/dist/components/mcp/tools/application.js.map +1 -1
- package/dist/components/mcp/tools/operations.d.ts +15 -3
- package/dist/components/mcp/tools/operations.js +99 -38
- package/dist/components/mcp/tools/operations.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operationDescriptions.js +4 -4
- package/dist/components/mcp/tools/schemas/operationDescriptions.js.map +1 -1
- package/dist/components/mcp/tools/schemas/operations.js +4 -0
- package/dist/components/mcp/tools/schemas/operations.js.map +1 -1
- package/dist/components/mcp/transport.d.ts +6 -0
- package/dist/components/mcp/transport.js +47 -3
- package/dist/components/mcp/transport.js.map +1 -1
- package/dist/components/ollama/index.d.ts +4 -1
- package/dist/components/ollama/index.js +4 -2
- package/dist/components/ollama/index.js.map +1 -1
- package/dist/components/openai/index.d.ts +4 -1
- package/dist/components/openai/index.js +4 -2
- package/dist/components/openai/index.js.map +1 -1
- package/dist/components/operations.d.ts +39 -0
- package/dist/components/operations.js +194 -2
- package/dist/components/operations.js.map +1 -1
- package/dist/components/operationsValidation.d.ts +38 -0
- package/dist/components/operationsValidation.js +155 -0
- package/dist/components/operationsValidation.js.map +1 -1
- package/dist/components/secretOperations.d.ts +113 -0
- package/dist/components/secretOperations.js +475 -0
- package/dist/components/secretOperations.js.map +1 -0
- package/dist/config/configUtils.d.ts +4 -1
- package/dist/config/configUtils.js +18 -1
- package/dist/config/configUtils.js.map +1 -1
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js +4 -3
- package/dist/dataLayer/harperBridge/lmdbBridge/lmdbUtility/initializePaths.js.map +1 -1
- package/dist/dataLayer/readAuditLog.js +11 -0
- package/dist/dataLayer/readAuditLog.js.map +1 -1
- package/dist/dataLayer/schemaDescribe.js +2 -0
- package/dist/dataLayer/schemaDescribe.js.map +1 -1
- package/dist/globals.d.ts +1 -1
- package/dist/globals.js +1 -0
- package/dist/globals.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/json/systemSchema.json +38 -0
- package/dist/resources/DatabaseTransaction.d.ts +31 -3
- package/dist/resources/DatabaseTransaction.js +190 -29
- package/dist/resources/DatabaseTransaction.js.map +1 -1
- package/dist/resources/LMDBTransaction.d.ts +1 -1
- package/dist/resources/LMDBTransaction.js +43 -5
- package/dist/resources/LMDBTransaction.js.map +1 -1
- package/dist/resources/PrimaryRocksDatabase.d.ts +51 -0
- package/dist/resources/PrimaryRocksDatabase.js +194 -0
- package/dist/resources/PrimaryRocksDatabase.js.map +1 -0
- package/dist/resources/RecordEncoder.d.ts +1 -0
- package/dist/resources/RecordEncoder.js +81 -75
- package/dist/resources/RecordEncoder.js.map +1 -1
- package/dist/resources/RequestTarget.d.ts +19 -0
- package/dist/resources/RequestTarget.js.map +1 -1
- package/dist/resources/Resource.d.ts +0 -1
- package/dist/resources/Resource.js +103 -16
- package/dist/resources/Resource.js.map +1 -1
- package/dist/resources/ResourceInterface.d.ts +6 -2
- package/dist/resources/ResourceInterface.js.map +1 -1
- package/dist/resources/Resources.js.map +1 -1
- package/dist/resources/Table.d.ts +6 -4
- package/dist/resources/Table.js +247 -24
- package/dist/resources/Table.js.map +1 -1
- package/dist/resources/analytics/read.js +25 -28
- package/dist/resources/analytics/read.js.map +1 -1
- package/dist/resources/blob.js +165 -22
- package/dist/resources/blob.js.map +1 -1
- package/dist/resources/crdt.d.ts +2 -0
- package/dist/resources/crdt.js +45 -36
- package/dist/resources/crdt.js.map +1 -1
- package/dist/resources/databases.d.ts +1 -0
- package/dist/resources/databases.js +134 -7
- package/dist/resources/databases.js.map +1 -1
- package/dist/resources/graphql.js +8 -0
- package/dist/resources/graphql.js.map +1 -1
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.d.ts +35 -5
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js +239 -14
- package/dist/resources/indexes/HierarchicalNavigableSmallWorld.js.map +1 -1
- package/dist/resources/jsResource.js +6 -0
- package/dist/resources/jsResource.js.map +1 -1
- package/dist/resources/loadEnv.js +30 -3
- package/dist/resources/loadEnv.js.map +1 -1
- package/dist/resources/login.js +2 -2
- package/dist/resources/login.js.map +1 -1
- package/dist/resources/models/Models.js +14 -3
- package/dist/resources/models/Models.js.map +1 -1
- package/dist/resources/models/embedHook.js +10 -2
- package/dist/resources/models/embedHook.js.map +1 -1
- package/dist/resources/models/openaiStream.d.ts +56 -0
- package/dist/resources/models/openaiStream.js +94 -0
- package/dist/resources/models/openaiStream.js.map +1 -0
- package/dist/resources/replayLogs.js +4 -3
- package/dist/resources/replayLogs.js.map +1 -1
- package/dist/resources/search.d.ts +1 -1
- package/dist/resources/search.js +104 -11
- package/dist/resources/search.js.map +1 -1
- package/dist/resources/secretDecryptor.d.ts +54 -0
- package/dist/resources/secretDecryptor.js +131 -0
- package/dist/resources/secretDecryptor.js.map +1 -0
- package/dist/resources/tracked.js +15 -5
- package/dist/resources/tracked.js.map +1 -1
- package/dist/security/auth.js +71 -8
- package/dist/security/auth.js.map +1 -1
- package/dist/security/jsLoader.js +11 -0
- package/dist/security/jsLoader.js.map +1 -1
- package/dist/security/tokenAuthentication.d.ts +9 -1
- package/dist/security/tokenAuthentication.js +31 -1
- package/dist/security/tokenAuthentication.js.map +1 -1
- package/dist/server/DurableSubscriptionsSession.d.ts +1 -1
- package/dist/server/DurableSubscriptionsSession.js +8 -4
- package/dist/server/DurableSubscriptionsSession.js.map +1 -1
- package/dist/server/REST.js +28 -9
- package/dist/server/REST.js.map +1 -1
- package/dist/server/fastifyRoutes.js +11 -1
- package/dist/server/fastifyRoutes.js.map +1 -1
- package/dist/server/graphqlQuerying.js +4 -3
- package/dist/server/graphqlQuerying.js.map +1 -1
- package/dist/server/http.d.ts +40 -2
- package/dist/server/http.js +560 -77
- package/dist/server/http.js.map +1 -1
- package/dist/server/itc/serverHandlers.js +64 -0
- package/dist/server/itc/serverHandlers.js.map +1 -1
- package/dist/server/liveSubscriptionAuth.d.ts +12 -0
- package/dist/server/liveSubscriptionAuth.js +140 -0
- package/dist/server/liveSubscriptionAuth.js.map +1 -0
- package/dist/server/loadRootComponents.js +2 -1
- package/dist/server/loadRootComponents.js.map +1 -1
- package/dist/server/middlewareChain.d.ts +44 -1
- package/dist/server/middlewareChain.js +86 -10
- package/dist/server/middlewareChain.js.map +1 -1
- package/dist/server/mqtt.js +2 -1
- package/dist/server/mqtt.js.map +1 -1
- package/dist/server/operationsServer.js +1 -1
- package/dist/server/operationsServer.js.map +1 -1
- package/dist/server/serverHelpers/Headers.d.ts +9 -0
- package/dist/server/serverHelpers/Headers.js +22 -0
- package/dist/server/serverHelpers/Headers.js.map +1 -1
- package/dist/server/serverHelpers/JSONStream.js +3 -3
- package/dist/server/serverHelpers/JSONStream.js.map +1 -1
- package/dist/server/serverHelpers/Request.d.ts +52 -1
- package/dist/server/serverHelpers/Request.js +122 -1
- package/dist/server/serverHelpers/Request.js.map +1 -1
- package/dist/server/serverHelpers/contentTypes.js +3 -8
- package/dist/server/serverHelpers/contentTypes.js.map +1 -1
- package/dist/server/serverHelpers/progressEmitter.d.ts +19 -0
- package/dist/server/serverHelpers/progressEmitter.js +52 -4
- package/dist/server/serverHelpers/progressEmitter.js.map +1 -1
- package/dist/server/serverHelpers/registeredOperations.d.ts +40 -0
- package/dist/server/serverHelpers/registeredOperations.js +286 -0
- package/dist/server/serverHelpers/registeredOperations.js.map +1 -0
- package/dist/server/serverHelpers/serverHandlers.js +11 -5
- package/dist/server/serverHelpers/serverHandlers.js.map +1 -1
- package/dist/server/serverHelpers/serverUtilities.d.ts +1 -0
- package/dist/server/serverHelpers/serverUtilities.js +67 -5
- package/dist/server/serverHelpers/serverUtilities.js.map +1 -1
- package/dist/server/serverHelpers/uwsServer.d.ts +80 -0
- package/dist/server/serverHelpers/uwsServer.js +433 -0
- package/dist/server/serverHelpers/uwsServer.js.map +1 -0
- package/dist/server/static.d.ts +0 -15
- package/dist/server/static.js +161 -2
- package/dist/server/static.js.map +1 -1
- package/dist/server/status/index.d.ts +4 -1
- package/dist/server/status/index.js +64 -4
- package/dist/server/status/index.js.map +1 -1
- package/dist/server/threads/manageThreads.d.ts +10 -0
- package/dist/server/threads/manageThreads.js +107 -4
- package/dist/server/threads/manageThreads.js.map +1 -1
- package/dist/server/threads/socketRouter.js +5 -1
- package/dist/server/threads/socketRouter.js.map +1 -1
- package/dist/server/threads/threadServer.js +92 -14
- package/dist/server/threads/threadServer.js.map +1 -1
- package/dist/upgrade/directives/5-2-0.d.ts +7 -0
- package/dist/upgrade/directives/5-2-0.js +108 -0
- package/dist/upgrade/directives/5-2-0.js.map +1 -0
- package/dist/upgrade/directives/directivesController.js +2 -1
- package/dist/upgrade/directives/directivesController.js.map +1 -1
- package/dist/utility/common_utils.js +5 -0
- package/dist/utility/common_utils.js.map +1 -1
- package/dist/utility/envFile.d.ts +41 -0
- package/dist/utility/envFile.js +221 -0
- package/dist/utility/envFile.js.map +1 -0
- package/dist/utility/globalSchema.d.ts +9 -0
- package/dist/utility/hdbTerms.d.ts +25 -0
- package/dist/utility/hdbTerms.js +31 -0
- package/dist/utility/hdbTerms.js.map +1 -1
- package/dist/utility/logging/harper_logger.d.ts +21 -0
- package/dist/utility/logging/harper_logger.js +160 -8
- package/dist/utility/logging/harper_logger.js.map +1 -1
- package/dist/utility/logging/logRotator.js +29 -17
- package/dist/utility/logging/logRotator.js.map +1 -1
- package/dist/utility/logging/readLog.d.ts +1 -1
- package/dist/utility/logging/readLog.js +305 -2
- package/dist/utility/logging/readLog.js.map +1 -1
- package/dist/utility/operationPermissions.d.ts +18 -0
- package/dist/utility/operationPermissions.js +35 -1
- package/dist/utility/operationPermissions.js.map +1 -1
- package/dist/utility/operation_authorization.d.ts +17 -0
- package/dist/utility/operation_authorization.js +38 -0
- package/dist/utility/operation_authorization.js.map +1 -1
- package/dist/utility/secretEnvelope.d.ts +30 -0
- package/dist/utility/secretEnvelope.js +94 -0
- package/dist/utility/secretEnvelope.js.map +1 -0
- package/dist/utility/signalling.d.ts +7 -0
- package/dist/utility/signalling.js +16 -0
- package/dist/utility/signalling.js.map +1 -1
- package/dist/validation/configValidator.js +70 -24
- package/dist/validation/configValidator.js.map +1 -1
- package/index.ts +4 -0
- package/json/systemSchema.json +38 -0
- package/npm-shrinkwrap.json +15066 -9347
- package/package.json +13 -8
- package/resources/DESIGN.md +15 -12
- package/resources/DatabaseTransaction.ts +206 -37
- package/resources/LMDBTransaction.ts +43 -9
- package/resources/PrimaryRocksDatabase.ts +201 -0
- package/resources/RecordEncoder.ts +81 -69
- package/resources/RequestTarget.ts +21 -0
- package/resources/Resource.ts +109 -25
- package/resources/ResourceInterface.ts +6 -2
- package/resources/Resources.ts +1 -3
- package/resources/Table.ts +238 -29
- package/resources/analytics/read.ts +25 -30
- package/resources/blob.ts +159 -23
- package/resources/crdt.ts +37 -31
- package/resources/databases.ts +143 -6
- package/resources/graphql.ts +8 -0
- package/resources/indexes/HierarchicalNavigableSmallWorld.ts +251 -17
- package/resources/jsResource.ts +6 -0
- package/resources/loadEnv.ts +34 -3
- package/resources/login.ts +2 -2
- package/resources/models/Models.ts +19 -3
- package/resources/models/embedHook.ts +13 -2
- package/resources/models/openaiStream.ts +133 -0
- package/resources/replayLogs.ts +4 -3
- package/resources/search.ts +113 -11
- package/resources/secretDecryptor.ts +159 -0
- package/resources/tracked.ts +24 -17
- package/security/auth.ts +70 -10
- package/security/jsLoader.ts +12 -0
- package/security/tokenAuthentication.ts +42 -1
- package/server/DESIGN.md +10 -0
- package/server/DurableSubscriptionsSession.ts +8 -4
- package/server/REST.ts +26 -9
- package/server/fastifyRoutes.ts +10 -1
- package/server/graphqlQuerying.ts +4 -3
- package/server/http.ts +563 -77
- package/server/itc/serverHandlers.js +70 -0
- package/server/liveSubscriptionAuth.ts +152 -0
- package/server/loadRootComponents.js +2 -1
- package/server/middlewareChain.ts +107 -17
- package/server/mqtt.ts +2 -1
- package/server/operationsServer.ts +2 -2
- package/server/serverHelpers/Headers.ts +24 -0
- package/server/serverHelpers/JSONStream.ts +3 -3
- package/server/serverHelpers/Request.ts +127 -0
- package/server/serverHelpers/contentTypes.ts +3 -8
- package/server/serverHelpers/progressEmitter.ts +55 -5
- package/server/serverHelpers/registeredOperations.ts +259 -0
- package/server/serverHelpers/serverHandlers.js +11 -5
- package/server/serverHelpers/serverUtilities.ts +88 -5
- package/server/serverHelpers/uwsServer.ts +488 -0
- package/server/static.ts +180 -2
- package/server/status/index.ts +72 -4
- package/server/threads/manageThreads.js +102 -4
- package/server/threads/socketRouter.ts +5 -1
- package/server/threads/threadServer.js +93 -10
- package/studio/web/assets/{Chat-SdD1EZca.js → Chat-Cv_2paZE.js} +2 -2
- package/studio/web/assets/{Chat-SdD1EZca.js.map → Chat-Cv_2paZE.js.map} +1 -1
- package/studio/web/assets/{FloatingChat-GMq6tHK9.js → FloatingChat-CPyPIcVR.js} +4 -4
- package/studio/web/assets/{FloatingChat-GMq6tHK9.js.map → FloatingChat-CPyPIcVR.js.map} +1 -1
- package/studio/web/assets/{applications-B5hhv7uA.js → applications-C0jT2vdZ.js} +2 -2
- package/studio/web/assets/{applications-B5hhv7uA.js.map → applications-C0jT2vdZ.js.map} +1 -1
- package/studio/web/assets/{index-VFcpNWgq.js → index-D_GKOkhn.js} +6 -6
- package/studio/web/assets/index-D_GKOkhn.js.map +1 -0
- package/studio/web/assets/{index.lazy-DgcJojIA.js → index.lazy-CAmCIA65.js} +4 -4
- package/studio/web/assets/{index.lazy-DgcJojIA.js.map → index.lazy-CAmCIA65.js.map} +1 -1
- package/studio/web/assets/{profile-BqN-8vzm.js → profile-CaF-4aZe.js} +2 -2
- package/studio/web/assets/{profile-BqN-8vzm.js.map → profile-CaF-4aZe.js.map} +1 -1
- package/studio/web/assets/{setComponentFile-CHFvFq9u.js → setComponentFile-DLW1DHCt.js} +2 -2
- package/studio/web/assets/{setComponentFile-CHFvFq9u.js.map → setComponentFile-DLW1DHCt.js.map} +1 -1
- package/studio/web/assets/{setup-CQ3vWJSr.js → setup-TGCErIhq.js} +2 -2
- package/studio/web/assets/{setup-CQ3vWJSr.js.map → setup-TGCErIhq.js.map} +1 -1
- package/studio/web/assets/{status-BsW5fjuh.js → status-DG0Maoao.js} +2 -2
- package/studio/web/assets/{status-BsW5fjuh.js.map → status-DG0Maoao.js.map} +1 -1
- package/studio/web/assets/{swagger-ui-react-DITdeB9-.js → swagger-ui-react-8T4SgQ1m.js} +2 -2
- package/studio/web/assets/{swagger-ui-react-DITdeB9-.js.map → swagger-ui-react-8T4SgQ1m.js.map} +1 -1
- package/studio/web/assets/{tsMode-Dyph-OUs.js → tsMode-DJ6Sl24Q.js} +2 -2
- package/studio/web/assets/{tsMode-Dyph-OUs.js.map → tsMode-DJ6Sl24Q.js.map} +1 -1
- package/studio/web/assets/{useEntityRestURL-D0QTUqex.js → useEntityRestURL-JO2mfWTQ.js} +2 -2
- package/studio/web/assets/{useEntityRestURL-D0QTUqex.js.map → useEntityRestURL-JO2mfWTQ.js.map} +1 -1
- package/studio/web/index.html +1 -1
- package/upgrade/directives/5-2-0.ts +82 -0
- package/upgrade/directives/directivesController.ts +2 -1
- package/utility/common_utils.ts +5 -0
- package/utility/envFile.ts +218 -0
- package/utility/hdbTerms.ts +31 -0
- package/utility/logging/harper_logger.ts +156 -8
- package/utility/logging/logRotator.ts +24 -14
- package/utility/logging/readLog.ts +323 -2
- package/utility/operationPermissions.ts +35 -1
- package/utility/operation_authorization.ts +74 -1
- package/utility/secretEnvelope.ts +113 -0
- package/utility/signalling.ts +15 -0
- package/validation/configValidator.ts +78 -25
- package/studio/web/assets/index-VFcpNWgq.js.map +0 -1
package/dist/server/static.js
CHANGED
|
@@ -7,6 +7,8 @@ exports.handleApplication = handleApplication;
|
|
|
7
7
|
const node_fs_1 = require("node:fs");
|
|
8
8
|
const node_path_1 = require("node:path");
|
|
9
9
|
const resolveBaseURLPath_ts_1 = require("../components/resolveBaseURLPath.js");
|
|
10
|
+
const common_utils_ts_1 = require("../utility/common_utils.js");
|
|
11
|
+
const micromatch_1 = require("micromatch");
|
|
10
12
|
const send_1 = __importDefault(require("send"));
|
|
11
13
|
/**
|
|
12
14
|
* The static plugin handles serving static files from the respective application directory.
|
|
@@ -16,13 +18,126 @@ const send_1 = __importDefault(require("send"));
|
|
|
16
18
|
* - `index`: If enabled, it will serve `index.html` files from directories.
|
|
17
19
|
* - `extensions`: An array of file extensions to try when serving files. If a file is not found, it will try appending each extension in order. For example, if set to `['html'], and the request is `/page`, it will try `/page.html` if `/page` is not found.
|
|
18
20
|
* - `fallthrough`: If true, it will fall through to the next handler if the file is not found. If false, it will return a 404 error.
|
|
21
|
+
* - `maxAge`: Freshness lifetime for served files — a number of seconds or a duration string
|
|
22
|
+
* (`'5m'`, `'1d'`). Emitted as `Cache-Control: public, max-age=<seconds>`. Defaults to 0
|
|
23
|
+
* (revalidate every request via the ETag/Last-Modified that are always emitted).
|
|
24
|
+
* - `immutable`: If true, adds the `immutable` directive to `Cache-Control` — for content-hashed
|
|
25
|
+
* assets that never change under the same URL. Requires `maxAge` to be meaningful.
|
|
26
|
+
* - `cacheControl`: Full `Cache-Control` override string (takes precedence over `maxAge`/`immutable`),
|
|
27
|
+
* or `false` to suppress the header entirely. Static files are served before authentication, so
|
|
28
|
+
* they are public by construction — do not put per-user content behind this handler.
|
|
29
|
+
* - `cacheOverrides`: A map of glob pattern → partial cache options (`maxAge` / `immutable` /
|
|
30
|
+
* `cacheControl`), letting specific files opt out of the top-level defaults. The typical case is
|
|
31
|
+
* long-lived `immutable` defaults for content-hashed assets while `index.html` gets a short window
|
|
32
|
+
* or `stale-while-revalidate`. Patterns are matched (via `micromatch`, same engine as `files`)
|
|
33
|
+
* against the mount-relative URL path **and** the served file's basename — so `index.html` also
|
|
34
|
+
* targets the directory-index (`/`) serve. Entries are tested in config order and the first match
|
|
35
|
+
* wins; each is a partial (keys present replace the default, absent keys inherit), with the same
|
|
36
|
+
* `cacheControl`-beats-`maxAge`/`immutable` precedence as the top level. Example:
|
|
37
|
+
* ```yaml
|
|
38
|
+
* static:
|
|
39
|
+
* files: 'web/**'
|
|
40
|
+
* maxAge: 1y
|
|
41
|
+
* immutable: true
|
|
42
|
+
* cacheOverrides:
|
|
43
|
+
* 'index.html': { cacheControl: 'public, max-age=0, stale-while-revalidate=60' }
|
|
44
|
+
* '*.html': { maxAge: 5m, immutable: false }
|
|
45
|
+
* ```
|
|
19
46
|
* - `notFound`: Can be specified as a string to serve a custom 404 page, or an object with `file` and `statusCode` properties to serve a custom file with a specific status code. This is useful for hosting SPAs that use client-side routing. Make sure to set `fallthrough` to `false`!
|
|
47
|
+
* - `before` / `after`: Position this handler in the HTTP middleware chain relative to another named
|
|
48
|
+
* handler. By default the handler runs `before: 'authentication'` — and therefore before the REST
|
|
49
|
+
* handler — so plain file requests skip credential parsing. That default means a `fallthrough: false`
|
|
50
|
+
* catch-all answers GETs for exported REST resources too; an SPA with history-mode routing should set
|
|
51
|
+
* `after: 'rest'` so the API is matched first and only unmatched URLs receive the `notFound` fallback.
|
|
52
|
+
* `before: false` clears the default without adding a new constraint (registration order applies).
|
|
53
|
+
* Handler names are the component config keys as registered (e.g. `rest`, not the legacy `REST` alias);
|
|
54
|
+
* a name that matches no registered handler is ignored, with a warning logged by the middleware chain.
|
|
55
|
+
* Ordering is applied when the component loads; changing `before`/`after` triggers a component restart.
|
|
20
56
|
*
|
|
21
57
|
* This plugin dynamically updates its behavior based on the current configuration file. Users can make updates and immediately see the changes reflect in the next request.
|
|
22
58
|
*
|
|
23
59
|
* Updates to the `files` option will clear the in-memory maps and allow them to regenerate based on the new configuration (since the default EntryHandler will regenerate anyways).
|
|
24
60
|
* Updates to `urlPath` request a restart: the HTTP route mount is registered once at load and cannot be re-registered on a live server (#1583).
|
|
25
61
|
*/
|
|
62
|
+
/**
|
|
63
|
+
* Resolve the effective cache-header inputs for a given served file: the live top-level
|
|
64
|
+
* `maxAge`/`immutable`/`cacheControl` options, with the first matching `cacheOverrides` entry layered
|
|
65
|
+
* on top (a partial — keys present replace the default, absent keys inherit). Patterns are matched
|
|
66
|
+
* (via `micromatch`, same engine as `files`) against the mount-relative URL path and the file's
|
|
67
|
+
* basename, so `index.html` also targets the directory-index (`/`) serve.
|
|
68
|
+
*/
|
|
69
|
+
function resolveCacheOptions(scope, urlKey, basename) {
|
|
70
|
+
let maxAge = scope.options.get(['maxAge']);
|
|
71
|
+
let immutable = scope.options.get(['immutable']);
|
|
72
|
+
let cacheControl = scope.options.get(['cacheControl']);
|
|
73
|
+
const overrides = scope.options.get(['cacheOverrides']);
|
|
74
|
+
if (overrides !== undefined) {
|
|
75
|
+
if (typeof overrides !== 'object' || overrides === null || Array.isArray(overrides)) {
|
|
76
|
+
throw new Error(`Invalid cacheOverrides option: ${overrides}. Must be a map of glob pattern to cache options.`);
|
|
77
|
+
}
|
|
78
|
+
for (const pattern of Object.keys(overrides)) {
|
|
79
|
+
if ((0, micromatch_1.isMatch)(urlKey, pattern) || (0, micromatch_1.isMatch)(basename, pattern)) {
|
|
80
|
+
const override = overrides[pattern];
|
|
81
|
+
if (typeof override !== 'object' || override === null || Array.isArray(override)) {
|
|
82
|
+
throw new Error(`Invalid cacheOverrides['${pattern}'] value: ${override}. Must be an object with maxAge/immutable/cacheControl.`);
|
|
83
|
+
}
|
|
84
|
+
// partial merge: only keys present in the override replace the top-level default
|
|
85
|
+
if ('maxAge' in override)
|
|
86
|
+
maxAge = override.maxAge;
|
|
87
|
+
if ('immutable' in override)
|
|
88
|
+
immutable = override.immutable;
|
|
89
|
+
if ('cacheControl' in override)
|
|
90
|
+
cacheControl = override.cacheControl;
|
|
91
|
+
break; // first match wins
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
immutable = immutable ?? false;
|
|
96
|
+
if (maxAge !== undefined && typeof maxAge !== 'number' && typeof maxAge !== 'string') {
|
|
97
|
+
throw new Error(`Invalid maxAge option: ${maxAge}. Must be a number of seconds or a duration string like '5m'.`);
|
|
98
|
+
}
|
|
99
|
+
const maxAgeMs = maxAge === undefined ? 0 : (0, common_utils_ts_1.convertToMS)(maxAge);
|
|
100
|
+
if (Number.isNaN(maxAgeMs)) {
|
|
101
|
+
throw new Error(`Invalid maxAge option: ${maxAge}. Must be a number of seconds or a duration string like '5m'.`);
|
|
102
|
+
}
|
|
103
|
+
if (typeof immutable !== 'boolean') {
|
|
104
|
+
throw new Error(`Invalid immutable option: ${immutable}. Must be a boolean.`);
|
|
105
|
+
}
|
|
106
|
+
if (cacheControl !== undefined && typeof cacheControl !== 'string' && cacheControl !== false) {
|
|
107
|
+
throw new Error(`Invalid cacheControl option: ${cacheControl}. Must be a string or false.`);
|
|
108
|
+
}
|
|
109
|
+
const customCacheControl = typeof cacheControl === 'string' ? cacheControl : undefined;
|
|
110
|
+
return { cacheControlDisabled: cacheControl === false, maxAgeMs, immutable, customCacheControl };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Serve a file through `send`, applying the plugin's cache-header options (read live from the
|
|
114
|
+
* component config, like `fallthrough`, and layered with any matching `cacheOverrides` entry).
|
|
115
|
+
* `cacheControl` as a string overrides `maxAge`/`immutable` via send's `headers` event;
|
|
116
|
+
* `cacheControl: false` suppresses the header entirely. Applied only to the main file serve — the
|
|
117
|
+
* `notFound` fallback keeps send's default `max-age=0`, which is the right policy for SPA index
|
|
118
|
+
* fallbacks.
|
|
119
|
+
*/
|
|
120
|
+
function serveFile(req, path, scope) {
|
|
121
|
+
// The staticFiles map keys are the mount-relative URL path (leading slash stripped for matching);
|
|
122
|
+
// for a directory-index serve req.pathname is the directory, so also match the served basename.
|
|
123
|
+
const urlKey = typeof req.pathname === 'string' ? req.pathname.replace(/^\//, '') : '';
|
|
124
|
+
const basename = path.slice(Math.max(path.lastIndexOf('/'), path.lastIndexOf('\\')) + 1);
|
|
125
|
+
const { cacheControlDisabled, maxAgeMs, immutable, customCacheControl } = resolveCacheOptions(scope, urlKey, basename);
|
|
126
|
+
const stream = (0, send_1.default)(req, path, {
|
|
127
|
+
// suppress send's own header when we set a full override below (or when disabled)
|
|
128
|
+
cacheControl: cacheControlDisabled || customCacheControl !== undefined ? false : true,
|
|
129
|
+
maxAge: maxAgeMs,
|
|
130
|
+
immutable,
|
|
131
|
+
});
|
|
132
|
+
// an empty-string override intentionally behaves like `false` (send's header is suppressed
|
|
133
|
+
// above and no override is written)
|
|
134
|
+
if (customCacheControl) {
|
|
135
|
+
stream.on('headers', (response) => {
|
|
136
|
+
response.setHeader('Cache-Control', customCacheControl);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
return stream;
|
|
140
|
+
}
|
|
26
141
|
function handleApplication(scope) {
|
|
27
142
|
// in-memory map of static files
|
|
28
143
|
// keys are the URL paths relative to the mount base, values are the absolute paths to the files
|
|
@@ -32,6 +147,28 @@ function handleApplication(scope) {
|
|
|
32
147
|
// cannot be re-registered at runtime. Capture the matching base once so map keys always agree
|
|
33
148
|
// with the registered route (#1583).
|
|
34
149
|
const baseURLPath = (0, resolveBaseURLPath_ts_1.resolveBaseURLPath)(scope.pluginName, scope.options.getAll()?.urlPath);
|
|
150
|
+
// A bare `before:` / `after:` key in YAML parses as null — treat it as unset, like before this
|
|
151
|
+
// option was validated.
|
|
152
|
+
const before = scope.options.get(['before']) ?? undefined;
|
|
153
|
+
const after = scope.options.get(['after']) ?? undefined;
|
|
154
|
+
validateOrderingOption('before', before, true);
|
|
155
|
+
validateOrderingOption('after', after, false);
|
|
156
|
+
// Default to the pre-authentication hoist only when no ordering was configured at all.
|
|
157
|
+
const noOrderingConfigured = before === undefined && after === undefined;
|
|
158
|
+
// With the default ordering this handler answers unmatched GETs ahead of the REST handler, so a
|
|
159
|
+
// `fallthrough: false` catch-all makes any exported REST resources unreachable over GET.
|
|
160
|
+
// Reads the live option values (not the registration-time ones above): a config save can change
|
|
161
|
+
// the ordering options together with `fallthrough`, and this re-runs from the change listener.
|
|
162
|
+
const warnIfBlockingRest = () => {
|
|
163
|
+
const liveBefore = scope.options.get(['before']) ?? undefined;
|
|
164
|
+
const liveAfter = scope.options.get(['after']) ?? undefined;
|
|
165
|
+
if (liveAfter === undefined &&
|
|
166
|
+
(liveBefore === undefined || liveBefore === 'authentication') &&
|
|
167
|
+
scope.options.get(['fallthrough']) === false) {
|
|
168
|
+
scope.logger.warn(`The static handler runs before authentication and REST by default, so \`fallthrough: false\` answers every unmatched GET itself — including GETs for any exported REST resources. If this application serves an API, add \`after: 'rest'\` to the static options so API requests are matched first, or remove \`fallthrough: false\`.`);
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
warnIfBlockingRest();
|
|
35
172
|
scope.options.on('change', (key) => {
|
|
36
173
|
if (key[0] === 'files') {
|
|
37
174
|
// If the files option changes, clear the maps and let the entry handler regenerate them
|
|
@@ -45,6 +182,16 @@ function handleApplication(scope) {
|
|
|
45
182
|
scope.requestRestart();
|
|
46
183
|
return;
|
|
47
184
|
}
|
|
185
|
+
if (key[0] === 'fallthrough') {
|
|
186
|
+
warnIfBlockingRest();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// `before`/`after` are consumed once at registration; the middleware chain can only pick
|
|
190
|
+
// up a new ordering by reloading the component. (Scope's own auto-restart on option
|
|
191
|
+
// changes is bypassed once a plugin registers its own 'change' listener, as we do above.)
|
|
192
|
+
if (key[0] === 'before' || key[0] === 'after') {
|
|
193
|
+
scope.requestRestart();
|
|
194
|
+
}
|
|
48
195
|
});
|
|
49
196
|
// Handle entry events for the default entry handler based on the `files` and `urlPath` options
|
|
50
197
|
scope.handleEntry((entry) => {
|
|
@@ -160,7 +307,7 @@ function handleApplication(scope) {
|
|
|
160
307
|
// The benefit to using `send` is that it handles a lot of edge cases and headers for us.
|
|
161
308
|
return {
|
|
162
309
|
handlesHeaders: true,
|
|
163
|
-
body: (
|
|
310
|
+
body: serveFile(req, (0, node_fs_1.realpathSync)(staticFile), scope),
|
|
164
311
|
};
|
|
165
312
|
}
|
|
166
313
|
// If fallthrough is true pass along the request to the next handler
|
|
@@ -186,7 +333,19 @@ function handleApplication(scope) {
|
|
|
186
333
|
handlesHeaders: true,
|
|
187
334
|
body: (0, send_1.default)(req, (0, node_fs_1.realpathSync)(notFoundPath)),
|
|
188
335
|
};
|
|
189
|
-
}, {
|
|
336
|
+
}, {
|
|
337
|
+
// `after` (e.g. `after: 'rest'`) must suppress the default pre-authentication hoist —
|
|
338
|
+
// combining the two constraints would be a cycle, which falls back to registration order.
|
|
339
|
+
before: typeof before === 'string' ? before : noOrderingConfigured ? 'authentication' : undefined,
|
|
340
|
+
after: after,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
function validateOrderingOption(name, value, allowFalse) {
|
|
344
|
+
if (value === undefined || (typeof value === 'string' && value.length > 0))
|
|
345
|
+
return;
|
|
346
|
+
if (allowFalse && value === false)
|
|
347
|
+
return;
|
|
348
|
+
throw new Error(`Invalid \`${name}\` option: ${value}. Must be the name of another handler${allowFalse ? ', or false to clear the default ordering' : ''}.`);
|
|
190
349
|
}
|
|
191
350
|
function validateNotFoundOption(notFound) {
|
|
192
351
|
if (notFound === undefined || typeof notFound === 'string')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../server/static.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../server/static.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export type { StatusId, StatusRecord, StatusValueMap } from './definitions.ts';
|
|
|
5
5
|
export { STATUS_IDS, DEFAULT_STATUS_ID } from './definitions.ts';
|
|
6
6
|
type StatusRequestBody = {
|
|
7
7
|
id: StatusId;
|
|
8
|
+
middleware?: boolean;
|
|
8
9
|
};
|
|
9
10
|
type StatusWriteRequestBody<T extends StatusId = StatusId> = {
|
|
10
11
|
id?: T;
|
|
@@ -21,6 +22,8 @@ interface AllStatusSummary {
|
|
|
21
22
|
systemStatus: Promise<AsyncIterable<StatusRecord>>;
|
|
22
23
|
componentStatus: AggregatedComponentStatusWithName[];
|
|
23
24
|
restartRequired: boolean;
|
|
25
|
+
middlewareChains?: MiddlewareChainsSummary | null;
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
type MiddlewareChainsSummary = ReturnType<typeof import('../http.ts').describeMiddlewareChains>;
|
|
28
|
+
declare function getStatus({ id, middleware }: Partial<StatusRequestBody>): Promise<StatusRecord | AllStatusSummary>;
|
|
26
29
|
declare function setStatus<T extends StatusId = StatusId>({ status, id, }: StatusWriteRequestBody<T>): Promise<StatusRecord<T>>;
|
|
@@ -11,6 +11,9 @@ const statusValidator_ts_1 = require("../../validation/statusValidator.js");
|
|
|
11
11
|
const definitions_ts_1 = require("./definitions.js");
|
|
12
12
|
const index_ts_1 = require("../../components/status/index.js");
|
|
13
13
|
const requestRestart_ts_1 = require("../../components/requestRestart.js");
|
|
14
|
+
const itc_js_1 = require("../threads/itc.js");
|
|
15
|
+
const manageThreads_js_1 = require("../threads/manageThreads.js");
|
|
16
|
+
const hdbTerms_ts_1 = require("../../utility/hdbTerms.js");
|
|
14
17
|
var definitions_ts_2 = require("./definitions.js");
|
|
15
18
|
Object.defineProperty(exports, "STATUS_IDS", { enumerable: true, get: function () { return definitions_ts_2.STATUS_IDS; } });
|
|
16
19
|
Object.defineProperty(exports, "DEFAULT_STATUS_ID", { enumerable: true, get: function () { return definitions_ts_2.DEFAULT_STATUS_ID; } });
|
|
@@ -53,7 +56,61 @@ function clearStatus({ id }) {
|
|
|
53
56
|
statusLogger.debug?.('clearStatus', id);
|
|
54
57
|
return getStatusTable().delete(id);
|
|
55
58
|
}
|
|
56
|
-
|
|
59
|
+
let nextChainsRequestId = 1;
|
|
60
|
+
let chainsResponseListenerAttached = false;
|
|
61
|
+
const pendingChainsRequests = new Map();
|
|
62
|
+
function attachChainsResponseListener() {
|
|
63
|
+
if (chainsResponseListenerAttached)
|
|
64
|
+
return;
|
|
65
|
+
(0, manageThreads_js_1.onMessageByType)(hdbTerms_ts_1.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_RESPONSE, ({ message }) => {
|
|
66
|
+
const resolve = pendingChainsRequests.get(message.requestId);
|
|
67
|
+
if (resolve) {
|
|
68
|
+
pendingChainsRequests.delete(message.requestId);
|
|
69
|
+
resolve(message.chains);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
chainsResponseListenerAttached = true;
|
|
73
|
+
}
|
|
74
|
+
// App HTTP middleware is only registered on worker threads, so when get_status runs on the main
|
|
75
|
+
// thread we ask an HTTP worker for its resolved chains (all workers register identically). Returns
|
|
76
|
+
// null if no worker answers within the timeout — mirrors queryWorkerForOpenApi in operationsServer.
|
|
77
|
+
function queryWorkerForMiddlewareChains() {
|
|
78
|
+
attachChainsResponseListener();
|
|
79
|
+
const requestId = nextChainsRequestId++;
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
const timeoutHandle = setTimeout(() => {
|
|
82
|
+
pendingChainsRequests.delete(requestId);
|
|
83
|
+
resolve(null);
|
|
84
|
+
}, 5000);
|
|
85
|
+
pendingChainsRequests.set(requestId, (chains) => {
|
|
86
|
+
clearTimeout(timeoutHandle);
|
|
87
|
+
resolve(chains);
|
|
88
|
+
});
|
|
89
|
+
(0, itc_js_1.sendItcEvent)({ type: hdbTerms_ts_1.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_REQUEST, message: { requestId } }).catch(() => {
|
|
90
|
+
clearTimeout(timeoutHandle);
|
|
91
|
+
pendingChainsRequests.delete(requestId);
|
|
92
|
+
resolve(null);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
// Introspect the resolved HTTP/upgrade/WebSocket middleware order (#1573). In a multi-worker
|
|
97
|
+
// deployment the app middleware is registered on the HTTP worker threads while the main thread
|
|
98
|
+
// carries only the operations-API middleware, so when an HTTP worker exists we fetch the chains from
|
|
99
|
+
// one over ITC. With no HTTP worker this thread is the app server itself (single-thread mode, or a
|
|
100
|
+
// worker serving the request) and reports locally. Job workers don't serve HTTP, so they're ignored.
|
|
101
|
+
async function getMiddlewareChains() {
|
|
102
|
+
try {
|
|
103
|
+
if (manageThreads_js_1.workers.some((worker) => worker.name === hdbTerms_ts_1.THREAD_TYPES.HTTP))
|
|
104
|
+
return await queryWorkerForMiddlewareChains();
|
|
105
|
+
const { describeMiddlewareChains } = await import("../http.js");
|
|
106
|
+
return describeMiddlewareChains();
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
statusLogger.debug?.('getMiddlewareChains failed', error);
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function getAllStatus(includeMiddleware = false) {
|
|
57
114
|
statusLogger.debug?.('getAllStatus');
|
|
58
115
|
const statusRecords = getStatusTable().search([]);
|
|
59
116
|
// Get aggregated component statuses from all threads
|
|
@@ -64,16 +121,19 @@ async function getAllStatus() {
|
|
|
64
121
|
}));
|
|
65
122
|
// Get restart flag status
|
|
66
123
|
const restartRequired = (0, requestRestart_ts_1.restartNeeded)();
|
|
67
|
-
|
|
124
|
+
const summary = {
|
|
68
125
|
systemStatus: statusRecords,
|
|
69
126
|
componentStatus: componentStatusArray,
|
|
70
127
|
restartRequired,
|
|
71
128
|
};
|
|
129
|
+
if (includeMiddleware)
|
|
130
|
+
summary.middlewareChains = await getMiddlewareChains();
|
|
131
|
+
return summary;
|
|
72
132
|
}
|
|
73
|
-
function getStatus({ id }) {
|
|
133
|
+
function getStatus({ id, middleware }) {
|
|
74
134
|
if (!id) {
|
|
75
135
|
statusLogger.debug?.('getStatus', 'all');
|
|
76
|
-
return getAllStatus();
|
|
136
|
+
return getAllStatus(middleware === true);
|
|
77
137
|
}
|
|
78
138
|
statusLogger.debug?.('getStatus', id);
|
|
79
139
|
return getStatusTable().get(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/status/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/status/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,16 @@ export function setMainIsWorker(isWorker: any): void;
|
|
|
25
25
|
export function setTerminateTimeout(newTimeout: any): void;
|
|
26
26
|
export function extendShutdownDeadline(deadlineMs: any): void;
|
|
27
27
|
export function restoreShutdownDeadline(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Register a provider that contributes an extra `workerData` property to every worker spawned
|
|
30
|
+
* from this thread. `provider(options)` receives the startWorker options (`options.name` is the
|
|
31
|
+
* thread type, e.g. 'http' or 'job') and returns the value to place at `workerData[name]`, or
|
|
32
|
+
* undefined to skip that worker. Values must be structured-cloneable; a provider that throws or
|
|
33
|
+
* returns a non-cloneable value is logged and skipped so it can never break a spawn.
|
|
34
|
+
* Returns a function that unregisters the provider.
|
|
35
|
+
*/
|
|
36
|
+
export function registerWorkerDataProvider(name: any, provider: any): () => void;
|
|
37
|
+
export function onThreadExit(listener: any): void;
|
|
28
38
|
export let getThreadInfo: any;
|
|
29
39
|
export function watchDir(dir: any, beforeRestartCallback: any): Promise<void>;
|
|
30
40
|
import { Worker } from "node:worker_threads";
|
|
@@ -123,6 +123,8 @@ module.exports = {
|
|
|
123
123
|
setTerminateTimeout,
|
|
124
124
|
extendShutdownDeadline,
|
|
125
125
|
restoreShutdownDeadline,
|
|
126
|
+
registerWorkerDataProvider,
|
|
127
|
+
onThreadExit,
|
|
126
128
|
restartNumber: workerData?.restartNumber || 1,
|
|
127
129
|
};
|
|
128
130
|
connectedPorts.onMessageByType = onMessageByType;
|
|
@@ -167,6 +169,63 @@ function setMainIsWorker(isWorker) {
|
|
|
167
169
|
module.exports.threadsHaveStarted();
|
|
168
170
|
}
|
|
169
171
|
let workerCount = 1; // should be assigned when workers are created
|
|
172
|
+
// Every workerData key core itself produces or consumes — providers may not collide with these.
|
|
173
|
+
// Covers the keys startWorker spreads below plus keys read elsewhere: `noServerStart` is set by
|
|
174
|
+
// the embedding entry point (index.ts) and read by threadServer.js to skip startServers(); a
|
|
175
|
+
// provider shadowing it would wedge HTTP worker startup.
|
|
176
|
+
const RESERVED_WORKER_DATA_KEYS = [
|
|
177
|
+
'addPorts',
|
|
178
|
+
'addThreadIds',
|
|
179
|
+
'workerIndex',
|
|
180
|
+
'workerCount',
|
|
181
|
+
'name',
|
|
182
|
+
'restartNumber',
|
|
183
|
+
'ticketKeys',
|
|
184
|
+
'noServerStart',
|
|
185
|
+
'__proto__', // never a legitimate payload name; spread would define it as an own property
|
|
186
|
+
];
|
|
187
|
+
const workerDataProviders = new Map();
|
|
188
|
+
/**
|
|
189
|
+
* Register a provider that contributes an extra `workerData` property to every worker spawned
|
|
190
|
+
* from this thread. `provider(options)` receives the startWorker options (`options.name` is the
|
|
191
|
+
* thread type, e.g. 'http' or 'job') and returns the value to place at `workerData[name]`, or
|
|
192
|
+
* undefined to skip that worker. Values must be structured-cloneable; a provider that throws or
|
|
193
|
+
* returns a non-cloneable value is logged and skipped so it can never break a spawn.
|
|
194
|
+
* Returns a function that unregisters the provider.
|
|
195
|
+
*/
|
|
196
|
+
function registerWorkerDataProvider(name, provider) {
|
|
197
|
+
if (RESERVED_WORKER_DATA_KEYS.includes(name) || workerDataProviders.has(name)) {
|
|
198
|
+
throw new Error(`workerData provider name '${name}' is already in use`);
|
|
199
|
+
}
|
|
200
|
+
if (typeof provider !== 'function')
|
|
201
|
+
throw new Error('workerData provider must be a function');
|
|
202
|
+
workerDataProviders.set(name, provider);
|
|
203
|
+
return () => {
|
|
204
|
+
if (workerDataProviders.get(name) === provider)
|
|
205
|
+
workerDataProviders.delete(name);
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
function collectProvidedWorkerData(options) {
|
|
209
|
+
if (workerDataProviders.size === 0)
|
|
210
|
+
return undefined;
|
|
211
|
+
let provided;
|
|
212
|
+
for (const [name, provider] of workerDataProviders) {
|
|
213
|
+
try {
|
|
214
|
+
const value = provider(options);
|
|
215
|
+
if (value === undefined)
|
|
216
|
+
continue;
|
|
217
|
+
// Use the clone, not the original: this both pre-flights cloneability (so a bad value
|
|
218
|
+
// can't break the Worker spawn) and detaches the payload from accessor-backed objects
|
|
219
|
+
// or later mutation that could still throw inside new Worker(). Null prototype so a
|
|
220
|
+
// provider name can never collide with Object.prototype members.
|
|
221
|
+
(provided ??= Object.create(null))[name] = structuredClone(value);
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
harperLogger.error(`workerData provider '${name}' failed and will be skipped for this worker:`, error);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return provided;
|
|
228
|
+
}
|
|
170
229
|
let ticketKeys;
|
|
171
230
|
function getTicketKeys() {
|
|
172
231
|
if (ticketKeys)
|
|
@@ -204,6 +263,11 @@ listenersByType.set(hdbTerms.ITC_EVENT_TYPES.USER, null);
|
|
|
204
263
|
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.COMPONENT_STATUS_REQUEST, null);
|
|
205
264
|
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.RESOURCE_OPENAPI_REQUEST, null);
|
|
206
265
|
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.RESOURCE_OPENAPI_RESPONSE, null);
|
|
266
|
+
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_REQUEST, null);
|
|
267
|
+
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.MIDDLEWARE_CHAINS_RESPONSE, null);
|
|
268
|
+
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.OPERATION_REGISTERED, null);
|
|
269
|
+
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.OPERATION_EXECUTE_REQUEST, null);
|
|
270
|
+
listenersByType.set(hdbTerms.ITC_EVENT_TYPES.OPERATION_EXECUTE_RESPONSE, null);
|
|
207
271
|
function startWorker(path, options = {}) {
|
|
208
272
|
// Take a percentage of total memory to determine the max memory for each thread. The percentage is based
|
|
209
273
|
// on the thread count. Generally, it is unrealistic to efficiently use the majority of total memory for a single
|
|
@@ -270,6 +334,7 @@ function startWorker(path, options = {}) {
|
|
|
270
334
|
argv: process.argv.slice(2),
|
|
271
335
|
// pass these in synchronously to the worker so it has them on startup:
|
|
272
336
|
workerData: {
|
|
337
|
+
...collectProvidedWorkerData(options),
|
|
273
338
|
addPorts: portsToSend,
|
|
274
339
|
addThreadIds: channelsToConnect.map((channel) => channel.existingPort.threadId),
|
|
275
340
|
workerIndex: options.workerIndex,
|
|
@@ -363,10 +428,16 @@ startReplacementThreads = true) {
|
|
|
363
428
|
// make a copy of the workers before iterating them, as the workers array mutates a lot during this
|
|
364
429
|
let waitingToFinish = []; // promises for workers we have shut down and are waiting to exit
|
|
365
430
|
// We can only start the replacement *before* the old worker releases its port when the OS lets
|
|
366
|
-
// both listen on the same port at once (SO_REUSEPORT). Without that — Windows (no SO_REUSEPORT)
|
|
367
|
-
//
|
|
368
|
-
//
|
|
369
|
-
|
|
431
|
+
// both listen on the same port at once (SO_REUSEPORT). Without that — Windows (no SO_REUSEPORT),
|
|
432
|
+
// macOS (unreliable SO_REUSEPORT, so workers bind exclusively), and Bun — the replacement can't
|
|
433
|
+
// bind a port the old worker still holds: its EADDRINUSE would be swallowed and the port left
|
|
434
|
+
// unbound once the old worker exits (this silently killed worker-owned listeners like MQTT on
|
|
435
|
+
// macOS after every component-reload restart). So there we keep the original ordering: shut the
|
|
436
|
+
// old worker down first (server.close() releases its ports immediately), then start the
|
|
437
|
+
// replacement — an unavoidable brief gap, but only for worker-owned listeners, since the main
|
|
438
|
+
// thread keeps serving the HTTP ports throughout. This ordering is also what lets
|
|
439
|
+
// listenOnPorts() treat a dedicated listener's EADDRINUSE as an external conflict.
|
|
440
|
+
const canPreStartReplacement = process.platform !== 'win32' && process.platform !== 'darwin' && !isBun;
|
|
370
441
|
for (let worker of workers.slice(0)) {
|
|
371
442
|
if ((name && worker.name !== name) || worker.wasShutdown)
|
|
372
443
|
continue; // filter by type, if specified
|
|
@@ -747,11 +818,38 @@ else {
|
|
|
747
818
|
getThreadInfo = getChildWorkerInfo;
|
|
748
819
|
}
|
|
749
820
|
module.exports.getThreadInfo = getThreadInfo;
|
|
821
|
+
// Listeners notified when a connected thread's port closes (worker exit/restart), so
|
|
822
|
+
// modules holding per-thread state (e.g. registeredOperations' registry and in-flight
|
|
823
|
+
// forwards) can clean up.
|
|
824
|
+
const threadExitListeners = [];
|
|
825
|
+
function onThreadExit(listener) {
|
|
826
|
+
threadExitListeners.push(listener);
|
|
827
|
+
}
|
|
828
|
+
// Thread ids already reported to threadExitListeners, so a dead worker is only reported once
|
|
829
|
+
// regardless of which of the two removal paths below observes it first. Node worker_threads
|
|
830
|
+
// ids are monotonically increasing and never reused within a process, so this never needs
|
|
831
|
+
// pruning (unbounded growth is one entry per worker restart over the process lifetime).
|
|
832
|
+
const notifiedDeadThreadIds = new Set();
|
|
833
|
+
function notifyThreadExit(deadThreadId) {
|
|
834
|
+
if (deadThreadId == null || notifiedDeadThreadIds.has(deadThreadId))
|
|
835
|
+
return;
|
|
836
|
+
notifiedDeadThreadIds.add(deadThreadId);
|
|
837
|
+
for (const listener of threadExitListeners) {
|
|
838
|
+
try {
|
|
839
|
+
listener(deadThreadId);
|
|
840
|
+
}
|
|
841
|
+
catch (error) {
|
|
842
|
+
harperLogger.error(error);
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
750
846
|
function removePort(port, deadThreadId) {
|
|
751
847
|
const idx = connectedPorts.indexOf(port);
|
|
752
848
|
if (idx === -1)
|
|
753
849
|
return;
|
|
754
850
|
connectedPorts.splice(idx, 1);
|
|
851
|
+
if (deadThreadId != null)
|
|
852
|
+
notifyThreadExit(deadThreadId);
|
|
755
853
|
// Notify remaining peers to remove this dead sibling port. In Bun, sibling
|
|
756
854
|
// MessagePorts don't emit 'close' when a peer worker exits, so we broadcast
|
|
757
855
|
// a REMOVE_PORT message from here (which fires reliably on Worker 'exit')
|
|
@@ -790,6 +888,11 @@ function addPort(port, keepRef, isJobWorker) {
|
|
|
790
888
|
const idx = connectedPorts.findIndex((p) => p.threadId === message.threadId);
|
|
791
889
|
if (idx !== -1)
|
|
792
890
|
connectedPorts.splice(idx, 1);
|
|
891
|
+
// A sibling's port-to-the-dead-worker can close (and broadcast this) before this
|
|
892
|
+
// thread's OWN port to that worker fires its 'close'/'exit' — at which point
|
|
893
|
+
// removePort() would no-op (already spliced) and threadExitListeners would never
|
|
894
|
+
// fire. Notify here too; notifyThreadExit dedupes so it isn't reported twice.
|
|
895
|
+
notifyThreadExit(message.threadId);
|
|
793
896
|
}
|
|
794
897
|
else {
|
|
795
898
|
notifyMessageListeners(message, port);
|