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
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { UwsRequest } from './Request.ts';
|
|
3
|
+
import { Headers } from './Headers.ts';
|
|
4
|
+
type UwsApp = any;
|
|
5
|
+
export interface UwsServerOptions {
|
|
6
|
+
/** Bind a Unix domain socket at this path (the symphony-fronted topology). */
|
|
7
|
+
socketPath?: string;
|
|
8
|
+
/** Bind a TCP port instead of a UDS (plaintext HTTP, e.g. the main http port). */
|
|
9
|
+
port?: number;
|
|
10
|
+
/** Optional host/interface for the TCP bind (defaults to all interfaces). */
|
|
11
|
+
host?: string;
|
|
12
|
+
secure?: boolean;
|
|
13
|
+
/** httpChain[port]-style handler: (request) => Harper response descriptor (or undefined). */
|
|
14
|
+
handler: (request: UwsRequest) => Promise<HarperResponse | undefined> | HarperResponse | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Coarse socket-level ceiling on request-body bytes (default 100 MiB, matching ws maxPayload). The
|
|
17
|
+
* real per-request limit is enforced downstream by streamToBuffer (HTTP_MAXREQUESTBODYSIZE); this
|
|
18
|
+
* only guards against an unconsumed body growing unbounded, since uWS gives no inbound backpressure.
|
|
19
|
+
*/
|
|
20
|
+
maxBodyBytes?: number;
|
|
21
|
+
/** Max WebSocket frame payload; falls back to maxBodyBytes when unset. */
|
|
22
|
+
wsMaxPayload?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Optional WebSocket handler. When provided, uWS accepts upgrades on this app/port and calls this
|
|
25
|
+
* with a ws-library-shaped {@link UwsWebSocket} adapter plus the captured upgrade request, so
|
|
26
|
+
* Harper's existing websocket chain (auth + listeners) runs unchanged.
|
|
27
|
+
*/
|
|
28
|
+
wsHandler?: (ws: UwsWebSocket, upgrade: UwsUpgrade) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface UwsUpgrade {
|
|
31
|
+
url: string;
|
|
32
|
+
headers: Record<string, string | string[]>;
|
|
33
|
+
ip: string;
|
|
34
|
+
adapter?: UwsWebSocket;
|
|
35
|
+
}
|
|
36
|
+
export interface HarperResponse {
|
|
37
|
+
status?: number;
|
|
38
|
+
headers?: Headers | Record<string, string | string[]>;
|
|
39
|
+
body?: string | Buffer | Uint8Array | Iterable<any> | AsyncIterable<any> | {
|
|
40
|
+
pipe?: any;
|
|
41
|
+
} | null;
|
|
42
|
+
handlesHeaders?: boolean;
|
|
43
|
+
wasCacheMiss?: boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare function createUwsServer(options: UwsServerOptions): Promise<{
|
|
46
|
+
app: UwsApp;
|
|
47
|
+
close: () => void;
|
|
48
|
+
}>;
|
|
49
|
+
/**
|
|
50
|
+
* A backpressure-aware stand-in for the `ws` library's underlying socket. Harper's WS consumers read
|
|
51
|
+
* `remoteAddress` and gate on `writableNeedDrain` / `'drain'`; uWS surfaces those via getBufferedAmount()
|
|
52
|
+
* and the behavior's drain callback.
|
|
53
|
+
*/
|
|
54
|
+
declare class UwsSocketShim extends EventEmitter {
|
|
55
|
+
#private;
|
|
56
|
+
remoteAddress: string;
|
|
57
|
+
constructor(raw: any);
|
|
58
|
+
get writableNeedDrain(): boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Adapts a uWS WebSocket to the subset of the `ws` library's WebSocket interface that Harper's WS
|
|
62
|
+
* consumers use (MQTT-over-WS in server/mqtt.ts, subscriptions in server/REST.ts): send/close/
|
|
63
|
+
* terminate/ping, the 'message'/'close'/'error' events, `_socket`, and `readyState`. This lets the
|
|
64
|
+
* existing websocket chain run unchanged on the uWS transport.
|
|
65
|
+
*/
|
|
66
|
+
export declare class UwsWebSocket extends EventEmitter {
|
|
67
|
+
#private;
|
|
68
|
+
_socket: UwsSocketShim;
|
|
69
|
+
binaryType: string;
|
|
70
|
+
constructor(raw: any);
|
|
71
|
+
get readyState(): number;
|
|
72
|
+
send(data: any, optionsOrCb?: any, maybeCb?: any): void;
|
|
73
|
+
close(code?: number, reason?: string): void;
|
|
74
|
+
terminate(): void;
|
|
75
|
+
ping(): void;
|
|
76
|
+
_message(message: ArrayBuffer, isBinary: boolean): void;
|
|
77
|
+
_drain(): void;
|
|
78
|
+
_closed(code: number, message: ArrayBuffer): void;
|
|
79
|
+
}
|
|
80
|
+
export {};
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
3
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
4
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
5
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
return path;
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.UwsWebSocket = void 0;
|
|
12
|
+
exports.createUwsServer = createUwsServer;
|
|
13
|
+
/**
|
|
14
|
+
* uWebSockets.js HTTP server adapter (#914, github.com/HarperFast/harper, default-off backend).
|
|
15
|
+
*
|
|
16
|
+
* Creates a non-SSL uWS App — on a Unix domain socket (`socketPath`) or a TCP port (`port`) —
|
|
17
|
+
* and bridges each request through Harper's existing pipeline: it builds a {@link UwsRequest}
|
|
18
|
+
* (same duck-typed shape as BunRequest), invokes the supplied `handler` (i.e. `httpChain[port]`),
|
|
19
|
+
* and serializes the returned Harper response descriptor back onto the uWS HttpResponse.
|
|
20
|
+
* Streaming/SSE bodies are written incrementally with backpressure; a WebSocket `wsHandler`
|
|
21
|
+
* (when supplied) accepts upgrades via native app.ws() bridged through {@link UwsWebSocket}.
|
|
22
|
+
*
|
|
23
|
+
* Two topologies, both gated default-off in http.ts:
|
|
24
|
+
* - HARPER_UWS_UDS: the plaintext-UDS-behind-symphony mirror — TLS/mTLS/HTTP-2 terminated by
|
|
25
|
+
* symphony upstream, real client IP via X-Forwarded-For, so this server never touches certs.
|
|
26
|
+
* - HARPER_UWS_HTTP: a direct plaintext TCP HTTP port (real peer IP from the socket).
|
|
27
|
+
*
|
|
28
|
+
* `uWebSockets.js` is an optionalDependency (ABI/platform-specific, built by CI).
|
|
29
|
+
*/
|
|
30
|
+
const node_http_1 = require("node:http");
|
|
31
|
+
const node_events_1 = require("node:events");
|
|
32
|
+
const Request_ts_1 = require("./Request.js");
|
|
33
|
+
const Headers_ts_1 = require("./Headers.js");
|
|
34
|
+
const when_ts_1 = require("../../utility/when.js");
|
|
35
|
+
const hdbError_ts_1 = require("../../utility/errors/hdbError.js");
|
|
36
|
+
// uWS writeStatus() needs a full "<code> <reason>" line; an empty reason phrase is rejected by
|
|
37
|
+
// some reverse-proxy parsers, so fall back to "Unknown" for codes Node doesn't know.
|
|
38
|
+
const statusText = (s) => `${s} ${node_http_1.STATUS_CODES[s] ?? 'Unknown'}`;
|
|
39
|
+
async function createUwsServer(options) {
|
|
40
|
+
const { default: uWS } = await import(__rewriteRelativeImportExtension('uWebSockets.js'));
|
|
41
|
+
const { socketPath, port, host, secure = false, handler, wsHandler, wsMaxPayload, maxBodyBytes = 100 * 1024 * 1024, } = options;
|
|
42
|
+
const app = uWS.App();
|
|
43
|
+
// Accept WebSocket upgrades on this app/port when a ws handler is supplied. Registered before the
|
|
44
|
+
// HTTP routes so uWS routes upgrade requests here; normal requests still fall through to app.get/any.
|
|
45
|
+
if (wsHandler)
|
|
46
|
+
registerWsBehavior(app, wsHandler, wsMaxPayload ?? maxBodyBytes);
|
|
47
|
+
const onRequest = (res, req, hasBody) => {
|
|
48
|
+
// uWS HttpRequest is only valid synchronously inside this callback — copy everything now.
|
|
49
|
+
const method = req.getMethod().toUpperCase();
|
|
50
|
+
const query = req.getQuery();
|
|
51
|
+
const url = req.getUrl() + (query ? '?' + query : '');
|
|
52
|
+
const headers = {};
|
|
53
|
+
req.forEach((k, v) => {
|
|
54
|
+
// uWS calls this once per header line, so preserve repeats (e.g. multiple Cookie/Forwarded).
|
|
55
|
+
const existing = headers[k];
|
|
56
|
+
if (existing === undefined)
|
|
57
|
+
headers[k] = v;
|
|
58
|
+
else if (Array.isArray(existing))
|
|
59
|
+
existing.push(v);
|
|
60
|
+
else
|
|
61
|
+
headers[k] = [existing, v];
|
|
62
|
+
});
|
|
63
|
+
// Capture the peer address synchronously (res is only valid in this callback). Only populated for
|
|
64
|
+
// the direct-TCP path, where it's authoritative; behind symphony on a UDS it's left unset so the
|
|
65
|
+
// real client IP comes from X-Forwarded-For (UwsRequest.ip falls back to XFF only when no socket
|
|
66
|
+
// address is set). request.ip feeds local-auth (security/auth.ts AUTHORIZE_LOCAL), rate limiting,
|
|
67
|
+
// and logging.
|
|
68
|
+
const ip = port != null ? normalizeAddress(Buffer.from(res.getRemoteAddressAsText()).toString()) : undefined;
|
|
69
|
+
const ac = new AbortController();
|
|
70
|
+
res.onAborted(() => ac.abort());
|
|
71
|
+
// Once a response has been committed (handler result, error, or a 413), writing again to the
|
|
72
|
+
// same uWS response is invalid and aborts the process — so every write site guards on this in
|
|
73
|
+
// addition to ac.signal.aborted (which only covers a client-side teardown, not our own writes).
|
|
74
|
+
let responseCompleted = false;
|
|
75
|
+
const dispatch = (body) => {
|
|
76
|
+
const request = new Request_ts_1.UwsRequest({ method, url, headers, secure, body, signal: ac.signal, ip });
|
|
77
|
+
// when() keeps a synchronously-returning handler synchronous (no extra microtask/promise).
|
|
78
|
+
(0, when_ts_1.when)(handler(request), (response) => {
|
|
79
|
+
if (ac.signal.aborted || responseCompleted)
|
|
80
|
+
return;
|
|
81
|
+
responseCompleted = true;
|
|
82
|
+
writeResponse(res, response, ac.signal, method);
|
|
83
|
+
}, (error) => {
|
|
84
|
+
if (ac.signal.aborted || responseCompleted)
|
|
85
|
+
return;
|
|
86
|
+
responseCompleted = true;
|
|
87
|
+
const status = (error && error.statusCode) || 500;
|
|
88
|
+
res.cork(() => {
|
|
89
|
+
res.writeStatus(statusText(status));
|
|
90
|
+
res.writeHeader('content-type', 'text/plain');
|
|
91
|
+
res.end(String((error && error.message) || error));
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
if (hasBody) {
|
|
96
|
+
// Stream the body: dispatch immediately with a push-based Readable and feed each chunk in as it
|
|
97
|
+
// arrives, so consumers (streamToBuffer, streaming deserializers) don't wait on — or hold — the
|
|
98
|
+
// whole body. streamToBuffer owns concatenation and the configurable per-request size limit;
|
|
99
|
+
// maxBodyBytes is only the coarse ceiling below, since uWS offers no way to pause the socket.
|
|
100
|
+
const body = new Request_ts_1.UwsRequestBody();
|
|
101
|
+
let total = 0;
|
|
102
|
+
let ended = false;
|
|
103
|
+
// Only surface a teardown as a stream 'error' when a consumer is listening; destroying with an
|
|
104
|
+
// error and no 'error' listener would throw. An unconsumed body just gets its chunks released.
|
|
105
|
+
const tearDown = (error) => {
|
|
106
|
+
if (ended || body.destroyed)
|
|
107
|
+
return;
|
|
108
|
+
ended = true;
|
|
109
|
+
body.destroy(error && body.listenerCount('error') > 0 ? error : undefined);
|
|
110
|
+
};
|
|
111
|
+
ac.signal.addEventListener('abort', () => tearDown(new Error('request aborted')), { once: true });
|
|
112
|
+
res.onData((chunk, isLast) => {
|
|
113
|
+
if (ended || body.destroyed)
|
|
114
|
+
return;
|
|
115
|
+
total += chunk.byteLength;
|
|
116
|
+
if (total > maxBodyBytes) {
|
|
117
|
+
// Only send 413 if nothing has been written yet: the handler may have already responded
|
|
118
|
+
// (or streamed) without consuming the body, and writing to that completed response aborts.
|
|
119
|
+
if (!ac.signal.aborted && !responseCompleted) {
|
|
120
|
+
responseCompleted = true;
|
|
121
|
+
res.cork(() => res.writeStatus('413 Payload Too Large').end());
|
|
122
|
+
}
|
|
123
|
+
tearDown(new hdbError_ts_1.ClientError(`Request body exceeds ${maxBodyBytes} bytes`, 413));
|
|
124
|
+
ac.abort();
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// uWS neuters/reuses the ArrayBuffer once this callback returns, and the body is read
|
|
128
|
+
// asynchronously by the consumer — so copy the bytes out now. `Buffer.from(arrayBuffer)`
|
|
129
|
+
// would alias uWS's memory; wrapping in a Uint8Array first forces an owned copy.
|
|
130
|
+
body.push(Buffer.from(new Uint8Array(chunk)));
|
|
131
|
+
if (isLast) {
|
|
132
|
+
ended = true;
|
|
133
|
+
body.push(null);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
dispatch(body);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
dispatch(undefined);
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
// Route the known-bodyless methods so they dispatch immediately, and treat everything else —
|
|
143
|
+
// including non-standard body-bearing methods like QUERY (REST vector search) — as having a
|
|
144
|
+
// body. uWS still fires onData(len=0, isLast=true) for a bodyless request that lands on the
|
|
145
|
+
// any() fallback, so this can't stall the connection.
|
|
146
|
+
const bodyless = (res, req) => onRequest(res, req, false);
|
|
147
|
+
const withBody = (res, req) => onRequest(res, req, true);
|
|
148
|
+
app.get('/*', bodyless);
|
|
149
|
+
app.head('/*', bodyless);
|
|
150
|
+
app.options('/*', bodyless);
|
|
151
|
+
app.connect('/*', bodyless);
|
|
152
|
+
app.trace('/*', bodyless);
|
|
153
|
+
app.any('/*', withBody);
|
|
154
|
+
await new Promise((resolve, reject) => {
|
|
155
|
+
const onListen = (listenSocket) => listenSocket ? resolve() : reject(new Error(`uWS failed to bind ${host ?? ''}:${port ?? socketPath}`));
|
|
156
|
+
// uWS shares the port across workers (SO_REUSEPORT) by default, matching the Node reusePort path.
|
|
157
|
+
if (port != null) {
|
|
158
|
+
if (host)
|
|
159
|
+
app.listen(host, port, onListen);
|
|
160
|
+
else
|
|
161
|
+
app.listen(port, onListen);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
app.listen_unix(onListen, socketPath);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
return {
|
|
168
|
+
app,
|
|
169
|
+
close: () => app.close(),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Write every response header except Content-Length (uWS derives that from end(body); for streaming
|
|
173
|
+
// there is no fixed length and it must be omitted so uWS uses chunked transfer encoding).
|
|
174
|
+
function writeHeaders(res, headers) {
|
|
175
|
+
// WHATWG Headers comma-join Set-Cookie on iteration, which merges multiple cookies into one and
|
|
176
|
+
// corrupts values containing commas (e.g. `expires=` dates). Emit them individually via
|
|
177
|
+
// getSetCookie() and skip the joined entry from the main loop. A Harper Headers has no
|
|
178
|
+
// getSetCookie(); it stores multiple cookies as an array, handled by the Array.isArray branch.
|
|
179
|
+
const setCookies = typeof headers.getSetCookie === 'function' ? headers.getSetCookie() : null;
|
|
180
|
+
for (const [name, value] of headers) {
|
|
181
|
+
const lower = name.toLowerCase();
|
|
182
|
+
if (lower === 'content-length')
|
|
183
|
+
continue;
|
|
184
|
+
if (setCookies && lower === 'set-cookie')
|
|
185
|
+
continue;
|
|
186
|
+
if (Array.isArray(value))
|
|
187
|
+
for (const v of value)
|
|
188
|
+
res.writeHeader(name, String(v));
|
|
189
|
+
else if (value != null)
|
|
190
|
+
res.writeHeader(name, String(value));
|
|
191
|
+
}
|
|
192
|
+
if (setCookies)
|
|
193
|
+
for (const cookie of setCookies)
|
|
194
|
+
res.writeHeader('set-cookie', cookie);
|
|
195
|
+
}
|
|
196
|
+
function writeResponse(res, response, signal, method) {
|
|
197
|
+
if (!response) {
|
|
198
|
+
res.cork(() => res.writeStatus('404 Not Found').end('Not found\n'));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const status = response.status || 200;
|
|
202
|
+
// A HEAD response must carry no body. The REST layer already nulls it, but uWS (unlike Node's
|
|
203
|
+
// ServerResponse) has no HEAD guard, so enforce it here for any handler that returns one.
|
|
204
|
+
const isHead = method === 'HEAD';
|
|
205
|
+
const body = isHead ? null : response.body;
|
|
206
|
+
// Normalize headers to something iterable with .get. Keep an existing Headers-like object
|
|
207
|
+
// (Harper or WHATWG) as-is — converting a WHATWG Headers via `new Headers()` would comma-join
|
|
208
|
+
// Set-Cookie on iteration before writeHeaders can split it back out via getSetCookie(). Only
|
|
209
|
+
// plain objects get wrapped.
|
|
210
|
+
const rawHeaders = response.headers;
|
|
211
|
+
const headers = rawHeaders && typeof rawHeaders.get === 'function' && rawHeaders[Symbol.iterator]
|
|
212
|
+
? rawHeaders
|
|
213
|
+
: new Headers_ts_1.Headers(rawHeaders);
|
|
214
|
+
// Streaming body (Node stream / normalized async-iterable): write incrementally with backpressure.
|
|
215
|
+
if (body != null && typeof body.pipe === 'function') {
|
|
216
|
+
streamResponse(res, status, headers, body, signal);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
res.cork(() => {
|
|
220
|
+
res.writeStatus(statusText(status));
|
|
221
|
+
writeHeaders(res, headers);
|
|
222
|
+
if (body == null)
|
|
223
|
+
res.end();
|
|
224
|
+
else
|
|
225
|
+
res.end(body); // string | Buffer | Uint8Array
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Stream a Node Readable to the uWS response with backpressure. uWS only flushes the status/headers
|
|
230
|
+
* on the first body write, so for text/event-stream (SSE) — where the client must see the stream
|
|
231
|
+
* open before any event — we emit a spec-valid comment line to force the flush. Client disconnect
|
|
232
|
+
* (via `signal`) or a source error destroys the source and stops writing (writing to an aborted uWS
|
|
233
|
+
* response is invalid).
|
|
234
|
+
*/
|
|
235
|
+
function streamResponse(res, status, headers, source, signal) {
|
|
236
|
+
let finished = false;
|
|
237
|
+
const finish = (endResponse) => {
|
|
238
|
+
if (finished)
|
|
239
|
+
return;
|
|
240
|
+
finished = true;
|
|
241
|
+
signal?.removeEventListener('abort', onAbort);
|
|
242
|
+
if (endResponse)
|
|
243
|
+
res.cork(() => res.end());
|
|
244
|
+
};
|
|
245
|
+
function onAbort() {
|
|
246
|
+
if (finished)
|
|
247
|
+
return;
|
|
248
|
+
finished = true;
|
|
249
|
+
source.destroy?.();
|
|
250
|
+
}
|
|
251
|
+
if (signal?.aborted)
|
|
252
|
+
return onAbort();
|
|
253
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
254
|
+
const isSse = String(headers.get('content-type') ?? '').includes('text/event-stream');
|
|
255
|
+
res.cork(() => {
|
|
256
|
+
res.writeStatus(statusText(status));
|
|
257
|
+
writeHeaders(res, headers);
|
|
258
|
+
if (isSse)
|
|
259
|
+
res.write(':\n\n'); // SSE comment: flushes headers immediately, ignored by clients
|
|
260
|
+
});
|
|
261
|
+
source.on('data', (chunk) => {
|
|
262
|
+
if (finished)
|
|
263
|
+
return;
|
|
264
|
+
let ok = true;
|
|
265
|
+
res.cork(() => {
|
|
266
|
+
ok = res.write(chunk);
|
|
267
|
+
});
|
|
268
|
+
if (!ok) {
|
|
269
|
+
// Backpressure: pause the source until uWS drains, then resume.
|
|
270
|
+
source.pause();
|
|
271
|
+
res.onWritable(() => {
|
|
272
|
+
if (!finished)
|
|
273
|
+
source.resume();
|
|
274
|
+
return true;
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
source.once('end', () => finish(true));
|
|
279
|
+
source.once('error', () => finish(true)); // headers already sent; just terminate the response
|
|
280
|
+
}
|
|
281
|
+
// Normalize uWS's remote-address text (raw IPv6 form, IPv4-mapped for v4 peers) to a readable IP.
|
|
282
|
+
function normalizeAddress(text) {
|
|
283
|
+
const mapped = /^0000:0000:0000:0000:0000:ffff:([0-9a-f]{4}):([0-9a-f]{4})$/.exec(text);
|
|
284
|
+
if (mapped) {
|
|
285
|
+
const hi = parseInt(mapped[1], 16);
|
|
286
|
+
const lo = parseInt(mapped[2], 16);
|
|
287
|
+
return `${hi >> 8}.${hi & 0xff}.${lo >> 8}.${lo & 0xff}`;
|
|
288
|
+
}
|
|
289
|
+
return text;
|
|
290
|
+
}
|
|
291
|
+
function registerWsBehavior(app, wsHandler, maxPayload) {
|
|
292
|
+
app.ws('/*', {
|
|
293
|
+
maxPayload,
|
|
294
|
+
// Capture the upgrade request synchronously (uWS's HttpRequest is only valid here) and upgrade.
|
|
295
|
+
// Auth runs after open() in the ws chain, matching the Node path (which upgrades then authorizes).
|
|
296
|
+
upgrade: (res, req, context) => {
|
|
297
|
+
const query = req.getQuery();
|
|
298
|
+
const url = req.getUrl() + (query ? '?' + query : '');
|
|
299
|
+
const headers = {};
|
|
300
|
+
req.forEach((k, v) => {
|
|
301
|
+
const existing = headers[k];
|
|
302
|
+
if (existing === undefined)
|
|
303
|
+
headers[k] = v;
|
|
304
|
+
else if (Array.isArray(existing))
|
|
305
|
+
existing.push(v);
|
|
306
|
+
else
|
|
307
|
+
headers[k] = [existing, v];
|
|
308
|
+
});
|
|
309
|
+
const ip = normalizeAddress(Buffer.from(res.getRemoteAddressAsText()).toString());
|
|
310
|
+
const upgradeData = { url, headers, ip };
|
|
311
|
+
res.upgrade(upgradeData, req.getHeader('sec-websocket-key'), req.getHeader('sec-websocket-protocol'), req.getHeader('sec-websocket-extensions'), context);
|
|
312
|
+
},
|
|
313
|
+
open: (ws) => {
|
|
314
|
+
const data = ws.getUserData();
|
|
315
|
+
const adapter = new UwsWebSocket(ws);
|
|
316
|
+
adapter._socket.remoteAddress = data.ip;
|
|
317
|
+
data.adapter = adapter;
|
|
318
|
+
wsHandler(adapter, data);
|
|
319
|
+
},
|
|
320
|
+
message: (ws, message, isBinary) => ws.getUserData().adapter?._message(message, isBinary),
|
|
321
|
+
drain: (ws) => ws.getUserData().adapter?._drain(),
|
|
322
|
+
close: (ws, code, message) => ws.getUserData().adapter?._closed(code, message),
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* A backpressure-aware stand-in for the `ws` library's underlying socket. Harper's WS consumers read
|
|
327
|
+
* `remoteAddress` and gate on `writableNeedDrain` / `'drain'`; uWS surfaces those via getBufferedAmount()
|
|
328
|
+
* and the behavior's drain callback.
|
|
329
|
+
*/
|
|
330
|
+
class UwsSocketShim extends node_events_1.EventEmitter {
|
|
331
|
+
remoteAddress = '';
|
|
332
|
+
#raw;
|
|
333
|
+
constructor(raw) {
|
|
334
|
+
super();
|
|
335
|
+
this.#raw = raw;
|
|
336
|
+
}
|
|
337
|
+
get writableNeedDrain() {
|
|
338
|
+
try {
|
|
339
|
+
return this.#raw.getBufferedAmount() > 0;
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Adapts a uWS WebSocket to the subset of the `ws` library's WebSocket interface that Harper's WS
|
|
348
|
+
* consumers use (MQTT-over-WS in server/mqtt.ts, subscriptions in server/REST.ts): send/close/
|
|
349
|
+
* terminate/ping, the 'message'/'close'/'error' events, `_socket`, and `readyState`. This lets the
|
|
350
|
+
* existing websocket chain run unchanged on the uWS transport.
|
|
351
|
+
*/
|
|
352
|
+
class UwsWebSocket extends node_events_1.EventEmitter {
|
|
353
|
+
#raw;
|
|
354
|
+
#open = true;
|
|
355
|
+
#closeEmitted = false;
|
|
356
|
+
_socket;
|
|
357
|
+
binaryType = 'nodebuffer';
|
|
358
|
+
constructor(raw) {
|
|
359
|
+
super();
|
|
360
|
+
this.#raw = raw;
|
|
361
|
+
this._socket = new UwsSocketShim(raw);
|
|
362
|
+
}
|
|
363
|
+
get readyState() {
|
|
364
|
+
return this.#open ? 1 /* OPEN */ : 3; /* CLOSED */
|
|
365
|
+
}
|
|
366
|
+
send(data, optionsOrCb, maybeCb) {
|
|
367
|
+
// ws-library signature is send(data[, options][, callback]); tolerate either arrangement.
|
|
368
|
+
const cb = typeof optionsOrCb === 'function' ? optionsOrCb : typeof maybeCb === 'function' ? maybeCb : undefined;
|
|
369
|
+
if (!this.#open) {
|
|
370
|
+
cb?.(new Error('WebSocket is not open'));
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
try {
|
|
374
|
+
const isBinary = typeof data !== 'string';
|
|
375
|
+
const payload = isBinary && !Buffer.isBuffer(data) && !(data instanceof Uint8Array) ? Buffer.from(data) : data;
|
|
376
|
+
this.#raw.send(payload, isBinary);
|
|
377
|
+
cb?.();
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
cb?.(error);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
close(code, reason) {
|
|
384
|
+
if (!this.#open)
|
|
385
|
+
return;
|
|
386
|
+
this.#open = false;
|
|
387
|
+
try {
|
|
388
|
+
if (code != null)
|
|
389
|
+
this.#raw.end(code, reason);
|
|
390
|
+
else
|
|
391
|
+
this.#raw.end();
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
/* already closed by the peer */
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
terminate() {
|
|
398
|
+
if (!this.#open)
|
|
399
|
+
return;
|
|
400
|
+
this.#open = false;
|
|
401
|
+
try {
|
|
402
|
+
this.#raw.close();
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
/* already closed */
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
ping() {
|
|
409
|
+
try {
|
|
410
|
+
this.#raw.ping();
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
/* not open */
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
// uWS behavior hooks:
|
|
417
|
+
_message(message, isBinary) {
|
|
418
|
+
// Copy out of uWS's buffer — it's neutered once this callback returns and consumers read async.
|
|
419
|
+
this.emit('message', Buffer.from(new Uint8Array(message)), isBinary);
|
|
420
|
+
}
|
|
421
|
+
_drain() {
|
|
422
|
+
this._socket.emit('drain');
|
|
423
|
+
}
|
|
424
|
+
_closed(code, message) {
|
|
425
|
+
this.#open = false;
|
|
426
|
+
if (this.#closeEmitted)
|
|
427
|
+
return;
|
|
428
|
+
this.#closeEmitted = true;
|
|
429
|
+
this.emit('close', code, message ? Buffer.from(new Uint8Array(message)) : Buffer.alloc(0));
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
exports.UwsWebSocket = UwsWebSocket;
|
|
433
|
+
//# sourceMappingURL=uwsServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uwsServer.js","sourceRoot":"","sources":["../../../server/serverHelpers/uwsServer.ts"],"names":[],"mappings":"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"}
|
package/dist/server/static.d.ts
CHANGED
|
@@ -1,17 +1,2 @@
|
|
|
1
1
|
import { Scope } from '../components/Scope';
|
|
2
|
-
/**
|
|
3
|
-
* The static plugin handles serving static files from the respective application directory.
|
|
4
|
-
* It uses the default `EntryHandler` configured via `files` and `urlPath` to watch for file changes and updates the in-memory map of static files.
|
|
5
|
-
*
|
|
6
|
-
* Additionally, it supports additional options:
|
|
7
|
-
* - `index`: If enabled, it will serve `index.html` files from directories.
|
|
8
|
-
* - `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.
|
|
9
|
-
* - `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.
|
|
10
|
-
* - `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`!
|
|
11
|
-
*
|
|
12
|
-
* 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.
|
|
13
|
-
*
|
|
14
|
-
* 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).
|
|
15
|
-
* 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).
|
|
16
|
-
*/
|
|
17
2
|
export declare function handleApplication(scope: Scope): void;
|