@memberjunction/server 6.2.0-edge.4 → 6.2.0-edge.6
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/README.md +47 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +91 -30
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +311 -81
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +17 -3
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +44 -10
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/apiRoot.d.ts +32 -0
- package/dist/apiRoot.d.ts.map +1 -0
- package/dist/apiRoot.js +67 -0
- package/dist/apiRoot.js.map +1 -0
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +27 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/LoginScreenEngine.d.ts +22 -0
- package/dist/auth/LoginScreenEngine.d.ts.map +1 -0
- package/dist/auth/LoginScreenEngine.js +57 -0
- package/dist/auth/LoginScreenEngine.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +52 -10
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +10 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +37 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/localDevAuth.d.ts +79 -0
- package/dist/auth/localDevAuth.d.ts.map +1 -0
- package/dist/auth/localDevAuth.js +439 -0
- package/dist/auth/localDevAuth.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +2 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +3 -2
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +12 -0
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.d.ts +1 -1
- package/dist/auth/sessionUserClone.d.ts.map +1 -1
- package/dist/auth/sessionUserClone.js +3 -2
- package/dist/auth/sessionUserClone.js.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts +292 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +442 -0
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -0
- package/dist/broadcast/index.d.ts +6 -0
- package/dist/broadcast/index.d.ts.map +1 -0
- package/dist/broadcast/index.js +6 -0
- package/dist/broadcast/index.js.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts +43 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js +144 -0
- package/dist/broadcast/providers/AWSIoTCoreBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts +46 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js +149 -0
- package/dist/broadcast/providers/AzureWebPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts +49 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js +131 -0
- package/dist/broadcast/providers/GCPPubSubBroadcastProvider.js.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts +24 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.d.ts.map +1 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js +51 -0
- package/dist/broadcast/providers/SequencedRoleBucketBroadcastProvider.js.map +1 -0
- package/dist/cache.d.ts +3 -2
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js.map +1 -1
- package/dist/config.d.ts +632 -22
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +104 -4
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +3 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +29 -8
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +29 -0
- package/dist/coreRoutes.d.ts.map +1 -0
- package/dist/coreRoutes.js +156 -0
- package/dist/coreRoutes.js.map +1 -0
- package/dist/generated/graphql-schemas/__mj.d.ts +1016 -29
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +5125 -434
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +85 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +175 -60
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +2 -0
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/PubSubManager.d.ts +10 -0
- package/dist/generic/PubSubManager.d.ts.map +1 -1
- package/dist/generic/PubSubManager.js +44 -1
- package/dist/generic/PubSubManager.js.map +1 -1
- package/dist/generic/PushStatusResolver.d.ts +39 -6
- package/dist/generic/PushStatusResolver.d.ts.map +1 -1
- package/dist/generic/PushStatusResolver.js +94 -12
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +168 -69
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +464 -405
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +11 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +91 -13
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/generic/actionOutputFieldSecurity.d.ts +26 -0
- package/dist/generic/actionOutputFieldSecurity.d.ts.map +1 -0
- package/dist/generic/actionOutputFieldSecurity.js +47 -0
- package/dist/generic/actionOutputFieldSecurity.js.map +1 -0
- package/dist/generic/fieldSecurityTransport.d.ts +30 -0
- package/dist/generic/fieldSecurityTransport.d.ts.map +1 -0
- package/dist/generic/fieldSecurityTransport.js +30 -0
- package/dist/generic/fieldSecurityTransport.js.map +1 -0
- package/dist/globalCors.d.ts +33 -0
- package/dist/globalCors.d.ts.map +1 -0
- package/dist/globalCors.js +58 -0
- package/dist/globalCors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +230 -222
- package/dist/index.js.map +1 -1
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +6 -1
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.d.ts +12 -0
- package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
- package/dist/logging/variablesLoggingMiddleware.js +50 -1
- package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
- package/dist/multiTenancy/index.d.ts.map +1 -1
- package/dist/multiTenancy/index.js +22 -2
- package/dist/multiTenancy/index.js.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js +2 -1
- package/dist/realtimeSessions/RealtimeSessionVerificationService.js.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.d.ts.map +1 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js +2 -1
- package/dist/realtimeSessions/RealtimeVerifyRouter.js.map +1 -1
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts +100 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.d.ts.map +1 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js +173 -0
- package/dist/realtimeSessions/RecordingAssemblyScheduler.js.map +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.d.ts.map +1 -1
- package/dist/realtimeSessions/SessionVerificationPortsBase.js +1 -0
- package/dist/realtimeSessions/SessionVerificationPortsBase.js.map +1 -1
- package/dist/realtimeSessions/index.d.ts +2 -0
- package/dist/realtimeSessions/index.d.ts.map +1 -1
- package/dist/realtimeSessions/index.js +2 -0
- package/dist/realtimeSessions/index.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts +32 -0
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js +56 -0
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -0
- package/dist/realtimeSessions/sessionAccess.d.ts +91 -8
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +127 -20
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js +1 -1
- package/dist/realtimeSessions/sessionConfigStamps.js.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.d.ts.map +1 -1
- package/dist/realtimeSessions/subscriptionAuthorization.js +5 -2
- package/dist/realtimeSessions/subscriptionAuthorization.js.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.d.ts +2 -0
- package/dist/realtimeSessions/verificationWorkflow.d.ts.map +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js +1 -1
- package/dist/realtimeSessions/verificationWorkflow.js.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetRouter.js +19 -3
- package/dist/realtimeWidget/WidgetRouter.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts +67 -7
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +201 -19
- package/dist/realtimeWidget/WidgetSessionService.js.map +1 -1
- package/dist/realtimeWidget/host-identity.d.ts +1 -1
- package/dist/realtimeWidget/host-identity.js +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +17 -1
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +2 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +19 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +63 -12
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +1 -0
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.d.ts +18 -4
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +32 -8
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts +10 -4
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +40 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts +5 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.js +9 -7
- package/dist/resolvers/ArtifactFileResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts +8 -4
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +6 -6
- package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +24 -3
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +57 -8
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +13 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.js +50 -14
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +2 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +3 -2
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +46 -3
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +211 -50
- package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -0
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +87 -11
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +292 -105
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +33 -7
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +117 -38
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -3
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +49 -9
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +8 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +31 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.d.ts +6 -0
- package/dist/resolvers/PipelineProgressResolver.d.ts.map +1 -1
- package/dist/resolvers/PipelineProgressResolver.js +5 -3
- package/dist/resolvers/PipelineProgressResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts +2 -0
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +33 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +2 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +15 -6
- package/dist/resolvers/QuerySystemUserResolver.js.map +1 -1
- package/dist/resolvers/RSUResolver.d.ts.map +1 -1
- package/dist/resolvers/RSUResolver.js +12 -0
- package/dist/resolvers/RSUResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +18 -10
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +92 -54
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +11 -9
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +56 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +241 -67
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +4 -4
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +3 -1
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts +12 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeStreamResolver.js +15 -2
- package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +2 -3
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts +2 -1
- package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskGraphFrameResolver.js +28 -1
- package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts +24 -0
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +66 -13
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +34 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +150 -27
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js +2 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/resolvers/agent-run-data-guard.d.ts +31 -0
- package/dist/resolvers/agent-run-data-guard.d.ts.map +1 -0
- package/dist/resolvers/agent-run-data-guard.js +72 -0
- package/dist/resolvers/agent-run-data-guard.js.map +1 -0
- package/dist/rest/EntityCRUDHandler.d.ts +6 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +19 -5
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +8 -5
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.d.ts +49 -0
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -0
- package/dist/rest/RealtimeRecordingHandler.js +383 -0
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +9 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +43 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +6 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +6 -0
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/serverExtensionReservedRoots.d.ts +12 -10
- package/dist/serverExtensionReservedRoots.d.ts.map +1 -1
- package/dist/serverExtensionReservedRoots.js +14 -17
- package/dist/serverExtensionReservedRoots.js.map +1 -1
- package/dist/serverRoleConfigUnits.d.ts +29 -0
- package/dist/serverRoleConfigUnits.d.ts.map +1 -0
- package/dist/serverRoleConfigUnits.js +33 -0
- package/dist/serverRoleConfigUnits.js.map +1 -0
- package/dist/services/MJStorageBlobStore.d.ts +8 -1
- package/dist/services/MJStorageBlobStore.d.ts.map +1 -1
- package/dist/services/MJStorageBlobStore.js +25 -19
- package/dist/services/MJStorageBlobStore.js.map +1 -1
- package/dist/services/StartTaskGraphDispatcher.js +2 -2
- package/dist/services/StartTaskGraphDispatcher.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +5 -3
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -5
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +14 -2
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +157 -9
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +59 -2
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +626 -16
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/sharedCache.d.ts.map +1 -1
- package/dist/sharedCache.js +3 -0
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +23 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +99 -98
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/AdhocQueryResolver.dialect.test.ts +137 -0
- package/src/__tests__/AgentRunStatusPublisher.test.ts +49 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +137 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DatasetResolver.itemFilters.test.ts +201 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityRecordNameResolver.rowSecurity.test.ts +152 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +369 -18
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/FileResolver.storageAccess.test.ts +562 -0
- package/src/__tests__/GetDataContextDataResolver.sqlItems.test.ts +416 -0
- package/src/__tests__/ListOperationsResolver.adhocScreen.test.ts +137 -0
- package/src/__tests__/LoginScreenEngine.test.ts +86 -0
- package/src/__tests__/MJStorageBlobStore.storageGate.test.ts +63 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +324 -46
- package/src/__tests__/RecordingAssemblyScheduler.test.ts +178 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +98 -0
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +133 -2
- package/src/__tests__/ResolverBase.balancedClause.test.ts +155 -0
- package/src/__tests__/ResolverBase.clauseUnscopedRead.test.ts +127 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +243 -7
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +176 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +5 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +23 -1
- package/src/__tests__/ResolverBase.publishStatusUpdate.test.ts +68 -0
- package/src/__tests__/ResolverBase.userViewCacheAndDedup.test.ts +130 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +69 -13
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +20 -28
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +264 -0
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +4 -1
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/RunViewResolver.cacheCheckScreen.test.ts +165 -0
- package/src/__tests__/SearchKnowledgeStreamResolver.test.ts +161 -0
- package/src/__tests__/SessionJanitor.test.ts +365 -10
- package/src/__tests__/SessionManager.test.ts +122 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +25 -0
- package/src/__tests__/TaskGraphAgentRunner.test.ts +266 -0
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +468 -23
- package/src/__tests__/TaskGraphFrameResolver.test.ts +22 -0
- package/src/__tests__/TestQuerySQLResolver.test.ts +274 -0
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/TransactionGroupResolver.refusals.test.ts +98 -1
- package/src/__tests__/UpdateMJDataContextItem.oldValues.test.ts +220 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.clauseScreen.test.ts +157 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +7 -2
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/agent-run-data-guard.test.ts +130 -0
- package/src/__tests__/apiRootBoot.test.ts +202 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +109 -0
- package/src/__tests__/conversationRunEvents.test.ts +56 -14
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +217 -0
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/multiTenancy.postgresRewrite.test.ts +181 -0
- package/src/__tests__/multiTenancy.security.test.ts +51 -0
- package/src/__tests__/multiTenancy.test.ts +1 -1
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +39 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +64 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +669 -0
- package/src/__tests__/realtimeSessions/RealtimeSessionEventsResolver.test.ts +29 -1
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.anonymous.test.ts +31 -0
- package/src/__tests__/realtimeSessions/ownedRealtimeSession.namedScoped.test.ts +37 -0
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +146 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/resolverBase.cloudEventChangedFields.test.ts +157 -0
- package/src/__tests__/resolverBase.fieldSecurityTransport.test.ts +222 -0
- package/src/__tests__/resolverBase.fls.test.ts +146 -97
- package/src/__tests__/restTransport.fieldSecurity.test.ts +148 -0
- package/src/__tests__/runParamsTimeZone.test.ts +179 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +100 -0
- package/src/__tests__/runViewProperties.test.ts +114 -0
- package/src/__tests__/scalabilityBenchmarks.test.ts +765 -0
- package/src/__tests__/scalabilityDatabaseIntegration.test.ts +207 -0
- package/src/__tests__/serverExtensionHostOverlay.test.ts +66 -0
- package/src/__tests__/serverExtensionReservedRoots.test.ts +11 -98
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +5 -3
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +28 -0
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/SessionJanitor.ts +369 -93
- package/src/agentSessions/SessionManager.ts +45 -10
- package/src/apiRoot.ts +78 -0
- package/src/auth/AuthProviderCatalogRouter.ts +29 -0
- package/src/auth/LoginScreenEngine.ts +50 -0
- package/src/auth/index.ts +57 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +2 -2
- package/src/auth/magicLink/MagicLinkRouter.ts +3 -2
- package/src/auth/magicLink/types.ts +10 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +674 -0
- package/src/broadcast/index.ts +5 -0
- package/src/broadcast/providers/AWSIoTCoreBroadcastProvider.ts +180 -0
- package/src/broadcast/providers/AzureWebPubSubBroadcastProvider.ts +182 -0
- package/src/broadcast/providers/GCPPubSubBroadcastProvider.ts +169 -0
- package/src/broadcast/providers/SequencedRoleBucketBroadcastProvider.ts +57 -0
- package/src/cache.ts +2 -1
- package/src/config.ts +115 -5
- package/src/context.ts +32 -8
- package/src/coreRoutes.ts +181 -0
- package/src/generated/graphql-schemas/__mj.ts +3684 -284
- package/src/generic/CacheInvalidationResolver.ts +172 -60
- package/src/generic/OrphanedConversationDetailReconciler.ts +4 -2
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +109 -12
- package/src/generic/ResolverBase.ts +540 -431
- package/src/generic/RunViewResolver.ts +97 -15
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/globalCors.ts +71 -0
- package/src/index.ts +239 -238
- package/src/integration/CustomColumnPromoter.ts +6 -1
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/multiTenancy/index.ts +24 -2
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/RealtimeSessionVerificationService.ts +2 -1
- package/src/realtimeSessions/RealtimeVerifyRouter.ts +2 -1
- package/src/realtimeSessions/RecordingAssemblyScheduler.ts +234 -0
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/index.ts +2 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +69 -0
- package/src/realtimeSessions/sessionAccess.ts +183 -23
- package/src/realtimeSessions/sessionConfigStamps.ts +1 -1
- package/src/realtimeSessions/subscriptionAuthorization.ts +4 -2
- package/src/realtimeSessions/verificationWorkflow.ts +3 -1
- package/src/realtimeWidget/WidgetRouter.ts +22 -4
- package/src/realtimeWidget/WidgetSessionService.ts +252 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/widgetCore.ts +30 -1
- package/src/realtimeWidget/widgetGuestElevation.ts +2 -1
- package/src/resolvers/ActionResolver.ts +78 -15
- package/src/resolvers/AdhocQueryResolver.ts +1 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +36 -8
- package/src/resolvers/AgentSessionResolver.ts +46 -18
- package/src/resolvers/ArtifactFileResolver.ts +9 -8
- package/src/resolvers/ConversationRunEventsResolver.ts +15 -11
- package/src/resolvers/DatasetResolver.ts +70 -10
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/EntityRecordNameResolver.ts +3 -2
- package/src/resolvers/FetchEntityVectorsResolver.ts +248 -55
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +334 -109
- package/src/resolvers/GetDataContextDataResolver.ts +139 -41
- package/src/resolvers/GetDataResolver.ts +6 -3
- package/src/resolvers/IntegrationDiscoveryResolver.ts +53 -9
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +31 -6
- package/src/resolvers/QuerySystemUserResolver.ts +15 -6
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +114 -66
- package/src/resolvers/RemoteBrowserActionResolver.ts +15 -10
- package/src/resolvers/RunAIAgentResolver.ts +296 -85
- package/src/resolvers/RunTemplateResolver.ts +6 -4
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SearchKnowledgeStreamResolver.ts +19 -3
- package/src/resolvers/SqlLoggingConfigResolver.ts +2 -4
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TaskGraphFrameResolver.ts +33 -1
- package/src/resolvers/TestQuerySQLResolver.ts +69 -13
- package/src/resolvers/TransactionGroupResolver.ts +185 -30
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.validation.test.ts +95 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/agent-run-data-guard.ts +89 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +467 -0
- package/src/rest/ViewOperationsHandler.ts +52 -18
- package/src/rest/setupRESTEndpoints.ts +6 -0
- package/src/serverExtensionReservedRoots.ts +14 -17
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/MJStorageBlobStore.ts +31 -30
- package/src/services/StartTaskGraphDispatcher.ts +2 -2
- package/src/services/TaskGraphActionRunner.ts +25 -5
- package/src/services/TaskGraphAgentRunner.ts +188 -11
- package/src/services/TaskGraphContinuationDeliverer.ts +738 -16
- package/src/sharedCache.ts +3 -0
- package/src/types.ts +23 -1
package/dist/index.js
CHANGED
|
@@ -35,27 +35,23 @@ import { BuildPostgreSQLConnectionConfig, DescribeReadOnlyLoginOverreach, Postgr
|
|
|
35
35
|
import { default as jwt } from 'jsonwebtoken';
|
|
36
36
|
import { contextFunction, CreateReadOnlyProvider, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
|
|
37
37
|
import { requireSystemUserDirective, publicDirective } from './directives/index.js';
|
|
38
|
-
import {
|
|
38
|
+
import { ApplyRootVariablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
39
39
|
import { auditResolversForUndecoratedArgs } from './logging/bootAudit.js';
|
|
40
40
|
import { StartupLogger } from './logging/StartupLogger.js';
|
|
41
41
|
import { AuthProviderFactory } from '@memberjunction/auth-providers';
|
|
42
42
|
import createMSSQLConfig from './orm.js';
|
|
43
43
|
import { setupRESTEndpoints } from './rest/setupRESTEndpoints.js';
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
48
|
-
import {
|
|
49
|
-
import { createMagicLinkHandler, createMagicLinkJwksRouter, registerMagicLinkAuthProvider, MAGIC_LINK_MOUNT_PATH } from './auth/magicLink/index.js';
|
|
50
|
-
import { createWidgetHandler, WIDGET_MOUNT_PATH } from './realtimeWidget/index.js';
|
|
51
|
-
import { CreateRealtimeVerifyRouter, REALTIME_VERIFY_MOUNT_PATH, RealtimeSessionEventService, RealtimeSessionVerificationService, ParseReplicatedRealtimeSessionEvent, } from './realtimeSessions/index.js';
|
|
44
|
+
import { CreateRealtimeRecordingRouter, REALTIME_RECORDING_MOUNT_PATH } from './rest/RealtimeRecordingHandler.js';
|
|
45
|
+
import { LoadOwnedRealtimeSession } from './realtimeSessions/ownedRealtimeSession.js';
|
|
46
|
+
import { AuthorizeAnonymousRoomSessions, LoadSessionConversationScope } from './realtimeSessions/sessionAccess.js';
|
|
47
|
+
import { RecordingAssemblyScheduler } from './realtimeSessions/RecordingAssemblyScheduler.js';
|
|
48
|
+
import { RealtimeSessionEventService, ParseReplicatedRealtimeSessionEvent, } from './realtimeSessions/index.js';
|
|
52
49
|
import { resolve } from 'node:path';
|
|
53
50
|
import { DataSourceInfo, raiseEvent } from './types.js';
|
|
54
51
|
import { ScheduledJobsService } from './services/ScheduledJobsService.js';
|
|
55
52
|
import { IntegrationSyncWorkerService } from './services/IntegrationSyncWorkerService.js';
|
|
56
53
|
import { LocalCacheManager, TelemetryManager, LogStatus, LogError, SetVerboseLogging } from '@memberjunction/core';
|
|
57
54
|
import { validateAuthProvidersRegistered } from './auth/index.js';
|
|
58
|
-
import { createAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth/AuthProviderCatalogRouter.js';
|
|
59
55
|
import { GetAPIKeyEngine } from '@memberjunction/api-keys';
|
|
60
56
|
import { ActionEngineServer } from '@memberjunction/actions';
|
|
61
57
|
import { CreateAdhocSQLAuthorizer } from './resolvers/AdhocQueryResolver.js';
|
|
@@ -63,11 +59,11 @@ import { CacheManagerConfigFromSettings, CreateSharedCacheFromEnvironment, Start
|
|
|
63
59
|
import { PubSubManager } from './generic/PubSubManager.js';
|
|
64
60
|
import { ReconcileOrphanedConversationDetails } from './generic/OrphanedConversationDetailReconciler.js';
|
|
65
61
|
import { HANDOFF_OFFER_FANOUT_CHANNEL, HANDOFF_OFFER_TOPIC, SetHandoffOfferPublishHook, ParseReplicatedHandoffOfferUpdate, } from './resolvers/HumanHandoffResolver.js';
|
|
66
|
-
import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
67
|
-
import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
|
|
62
|
+
import { RoomAuthorizationService, RoomHandoffEngine } from '@memberjunction/livekit-room-server';
|
|
63
|
+
import { IntegrationProgressEmitter, SweepInterruptedRuns } from '@memberjunction/integration-progress-artifacts';
|
|
68
64
|
import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
|
|
69
65
|
import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
|
|
70
|
-
import { ClientToolRequestManager, AgentRunWatchdog } from '@memberjunction/ai-agents';
|
|
66
|
+
import { ClientToolRequestManager, AgentRunWatchdog, SqlRealtimeRecordingLedger } from '@memberjunction/ai-agents';
|
|
71
67
|
import { BindBridgeEngineHostInstance, SessionJanitor, SetHostInstancePort, StartBridgeOrphanReconciliation } from './agentSessions/index.js';
|
|
72
68
|
import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
|
|
73
69
|
import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
|
|
@@ -76,12 +72,20 @@ import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
|
|
|
76
72
|
import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
|
|
77
73
|
import { ConnectorFactory, IntegrationEngine } from '@memberjunction/integration-engine';
|
|
78
74
|
import { CronExpressionHelper } from '@memberjunction/scheduling-engine';
|
|
79
|
-
import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath } from '@memberjunction/server-extensions-core';
|
|
80
|
-
import {
|
|
75
|
+
import { ServerExtensionLoader, mergeServerExtensionConfigs, prepareServerExtensionConfigs, describeServerExtensionMount, InstallMediaUpgradeDispatcher, IsGraphQLWsPath, GetCorsOwningServerExtensionRoots } from '@memberjunction/server-extensions-core';
|
|
76
|
+
import { CreateExtensionOwnedPreflightFallback, CreateGlobalCorsMiddleware } from './globalCors.js';
|
|
77
|
+
import { CoreReservedServerExtensionRoots } from './serverExtensionReservedRoots.js';
|
|
78
|
+
import { ApiRoute, ApiRootPath, ConfiguredPublicUrl } from './apiRoot.js';
|
|
79
|
+
import { MountHealthcheckRoute, MountPublicCoreRoutes, MountExtensionHealthRoute, MountAuthCatalogRoute, MountAuthenticatedCoreRoutes } from './coreRoutes.js';
|
|
81
80
|
import { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
|
|
82
81
|
import { CreateMetadataRefreshSignalHandler, METADATA_REFRESH_SIGNAL } from './metadataRefreshSignal.js';
|
|
82
|
+
import { CacheInvalidationBroadcastManager } from './broadcast/index.js';
|
|
83
|
+
import { ResolveServerRole, ShouldRunBackgroundWorkers } from './serverRoleConfigUnits.js';
|
|
83
84
|
const cacheRefreshInterval = configInfo.databaseSettings.metadataCacheRefreshInterval;
|
|
84
85
|
export { MetadataCacheRefreshIntervalSeconds } from './providerConfigUnits.js';
|
|
86
|
+
export * from './serverRoleConfigUnits.js';
|
|
87
|
+
export * from './broadcast/index.js';
|
|
88
|
+
export { ApplyRootVariablesLoggingMiddleware } from './logging/variablesLoggingMiddleware.js';
|
|
85
89
|
/**
|
|
86
90
|
* Returns the configured database platform from the `DB_PLATFORM` environment
|
|
87
91
|
* variable, falling back to `'sqlserver'` when the env var is unset. An
|
|
@@ -110,6 +114,7 @@ export { Int, Float, ID } from 'type-graphql';
|
|
|
110
114
|
export { NewUserBase } from './auth/newUsers.js';
|
|
111
115
|
export { CreateIsolatedProvider } from './isolatedProvider.js';
|
|
112
116
|
export { configInfo, DEFAULT_SERVER_CONFIG } from './config.js';
|
|
117
|
+
export { ApiRoute, ApiRootPath, ConfiguredPublicUrl, JoinApiRoute, NormalizeApiRootPath } from './apiRoot.js';
|
|
113
118
|
export { ServerExtensionLoader, BaseServerExtension, DefaultServerExtensionServiceRegistry } from '@memberjunction/server-extensions-core';
|
|
114
119
|
export * from './directives/index.js';
|
|
115
120
|
export { NoLog, hasNoLogParameter, getNoLogFields } from './logging/NoLog.js';
|
|
@@ -199,6 +204,7 @@ export * from './resolvers/FileCategoryResolver.js';
|
|
|
199
204
|
export * from './resolvers/FileResolver.js';
|
|
200
205
|
export * from './rest/MediaAccessKeys.js';
|
|
201
206
|
export * from './rest/MediaStreamHandler.js';
|
|
207
|
+
export * from './rest/RealtimeRecordingHandler.js';
|
|
202
208
|
export * from './resolvers/InfoResolver.js';
|
|
203
209
|
export * from './resolvers/PotentialDuplicateRecordResolver.js';
|
|
204
210
|
export * from './resolvers/DuplicateEntryCheckResolver.js';
|
|
@@ -232,7 +238,15 @@ const localPath = (p) => {
|
|
|
232
238
|
const resolvedPath = resolve(dirname, p);
|
|
233
239
|
return resolvedPath;
|
|
234
240
|
};
|
|
235
|
-
|
|
241
|
+
/**
|
|
242
|
+
* Creates the Express application MJServer serves on. `X-Powered-By` is disabled: it only
|
|
243
|
+
* advertises the framework to scanners. {@link Serve} disables it again on a host-supplied app.
|
|
244
|
+
*/
|
|
245
|
+
export const CreateApp = () => {
|
|
246
|
+
const app = express();
|
|
247
|
+
app.disable('x-powered-by');
|
|
248
|
+
return app;
|
|
249
|
+
};
|
|
236
250
|
/** @deprecated Use {@link CreateApp}. */
|
|
237
251
|
export const createApp = CreateApp;
|
|
238
252
|
/**
|
|
@@ -350,6 +364,9 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
350
364
|
SetHostInstancePort(graphqlPort);
|
|
351
365
|
// The realtime bridge engine stamps its bridge rows with the same identity and reconciles orphans by it (#5310).
|
|
352
366
|
BindBridgeEngineHostInstance();
|
|
367
|
+
// An anonymous visitor may join only the LiveKit agent-session room it owns by scope; the room gate cannot import
|
|
368
|
+
// this package's session-access decision, so it is handed in here, before any resolver runs (MJ#6044).
|
|
369
|
+
RoomAuthorizationService.Instance.SetAnonymousSessionOwnerCheck(AuthorizeAnonymousRoomSessions);
|
|
353
370
|
// Level-gated startup logger. Resolves verbosity from telemetry.level (single
|
|
354
371
|
// operator knob). At `standard` (default), per-phase timings are collapsed into
|
|
355
372
|
// the one-line summary; at `verbose`+ each phase prints inline as before.
|
|
@@ -402,6 +419,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
402
419
|
// Every API pool carries the statement and idle-in-transaction timeouts from connection #1.
|
|
403
420
|
const pgConnectionConfig = BuildPostgreSQLConnectionConfig(pgEndpoint, configInfo.databaseSettings, 'api');
|
|
404
421
|
const pgPool = new pg.default.Pool(ToPGPoolConfig(pgConnectionConfig));
|
|
422
|
+
// An idle connection the server drops is emitted on the pool; without a listener Node exits.
|
|
423
|
+
pgPool.on('error', (err) => console.error('[PostgreSQL pool] Idle connection error (connection evicted):', err.message));
|
|
405
424
|
// Verify connection
|
|
406
425
|
const testClient = await pgPool.connect();
|
|
407
426
|
await testClient.query('SELECT 1');
|
|
@@ -417,6 +436,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
417
436
|
...ToPGPoolConfig(BuildPostgreSQLConnectionConfig({ ...pgEndpoint, ...pgReadOnlyCredentials }, configInfo.databaseSettings, 'read-only')),
|
|
418
437
|
types: MJPostgresTypes,
|
|
419
438
|
});
|
|
439
|
+
readOnlyPgPool.on('error', (err) => console.error('[PostgreSQL read-only pool] Idle connection error (connection evicted):', err.message));
|
|
420
440
|
const readOnlyTestClient = await readOnlyPgPool.connect();
|
|
421
441
|
try {
|
|
422
442
|
for (const warning of await DescribeReadOnlyLoginOverreach(readOnlyTestClient, mj_core_schema)) {
|
|
@@ -487,6 +507,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
487
507
|
// long CodeGen timeout rather than the API one, as the SQL Server CodeGen pool does.
|
|
488
508
|
const codegenPgConnectionConfig = BuildPostgreSQLConnectionConfig({ ...pgEndpoint, User: pgCodegenUser, Password: pgCodegenPass }, configInfo.databaseSettings, 'codegen');
|
|
489
509
|
const codegenPgPool = new pg.default.Pool(ToPGPoolConfig(codegenPgConnectionConfig));
|
|
510
|
+
codegenPgPool.on('error', (err) => console.error('[PostgreSQL CodeGen pool] Idle connection error (connection evicted):', err.message));
|
|
490
511
|
const codegenTestClient = await codegenPgPool.connect();
|
|
491
512
|
await codegenTestClient.query('SELECT 1');
|
|
492
513
|
codegenTestClient.release();
|
|
@@ -514,7 +535,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
514
535
|
});
|
|
515
536
|
startupLog.LogIf('verbose', 'RSU in-process CodeGen runner initialized (PostgreSQL).');
|
|
516
537
|
// Inject CodeGen output paths for targeted git staging
|
|
517
|
-
const { initializeConfig } = await import('@memberjunction/codegen-lib');
|
|
538
|
+
const { initializeConfig, ResolveAdditionalSchemaInfoPath } = await import('@memberjunction/codegen-lib');
|
|
518
539
|
const cgConfig = initializeConfig(rsuWorkDir);
|
|
519
540
|
const outputPaths = (cgConfig.output ?? []).map((o) => o.directory);
|
|
520
541
|
RuntimeSchemaManager.Instance.SetCodeGenOutputPaths(outputPaths);
|
|
@@ -522,9 +543,12 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
522
543
|
// Point RSU's soft PK/FK writer at the SAME file CodeGen reads (mj.config.cjs
|
|
523
544
|
// `additionalSchemaInfo`), or RSU writes soft PKs to its own default path while
|
|
524
545
|
// CodeGen reads a different one and skips integration tables with "No primary key found".
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
546
|
+
// Inject the ABSOLUTE path CodeGen resolves (env override, else relative to the mj.config
|
|
547
|
+
// file's directory) so RSU, the resolvers and CodeGen agree whatever their cwd (#5858).
|
|
548
|
+
const resolvedSchemaInfoPath = ResolveAdditionalSchemaInfoPath();
|
|
549
|
+
if (resolvedSchemaInfoPath) {
|
|
550
|
+
RuntimeSchemaManager.Instance.SetAdditionalSchemaInfoPath(resolvedSchemaInfoPath);
|
|
551
|
+
startupLog.LogIf('verbose', `RSU additionalSchemaInfo path: ${resolvedSchemaInfoPath}`);
|
|
528
552
|
}
|
|
529
553
|
else if (RuntimeSchemaManager.Instance.IsEnabled) {
|
|
530
554
|
// U5 — boot-time assert: RSU is enabled but CodeGen has NO additionalSchemaInfo path
|
|
@@ -532,7 +556,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
532
556
|
// resolved soft PK would be silently lost ("No primary key found" per table). LOUD,
|
|
533
557
|
// named, and actionable — grep for RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE.
|
|
534
558
|
console.error(`[RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE] Runtime Schema Update is ENABLED but mj.config.cjs has no ` +
|
|
535
|
-
`'additionalSchemaInfo' setting — RSU writes soft PK/FK definitions to '${
|
|
559
|
+
`'additionalSchemaInfo' setting (and RSU_ADDITIONAL_SCHEMA_INFO_PATH is unset) — RSU writes soft PK/FK definitions to '${RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath}' ` +
|
|
536
560
|
`while CodeGen reads none, so resolved soft primary keys will be silently LOST at codegen time. ` +
|
|
537
561
|
`Set 'additionalSchemaInfo' in mj.config.cjs to the same file so the write path and read path agree.`);
|
|
538
562
|
}
|
|
@@ -642,7 +666,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
642
666
|
});
|
|
643
667
|
startupLog.LogIf('verbose', 'RSU in-process CodeGen runner initialized.');
|
|
644
668
|
// Inject CodeGen output paths for targeted git staging
|
|
645
|
-
const { initializeConfig } = await import('@memberjunction/codegen-lib');
|
|
669
|
+
const { initializeConfig, ResolveAdditionalSchemaInfoPath } = await import('@memberjunction/codegen-lib');
|
|
646
670
|
const codegenConfig = initializeConfig(rsuWorkDir);
|
|
647
671
|
const outputPaths = (codegenConfig.output ?? []).map((o) => o.directory);
|
|
648
672
|
RuntimeSchemaManager.Instance.SetCodeGenOutputPaths(outputPaths);
|
|
@@ -651,14 +675,17 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
651
675
|
// `additionalSchemaInfo`). Without this, RSU writes soft PKs to its own default
|
|
652
676
|
// path while CodeGen reads a different one and skips every integration table
|
|
653
677
|
// with "No primary key found".
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
678
|
+
// Inject the ABSOLUTE path CodeGen resolves (env override, else relative to the mj.config
|
|
679
|
+
// file's directory) so RSU, the resolvers and CodeGen agree whatever their cwd (#5858).
|
|
680
|
+
const resolvedSchemaInfoPath = ResolveAdditionalSchemaInfoPath();
|
|
681
|
+
if (resolvedSchemaInfoPath) {
|
|
682
|
+
RuntimeSchemaManager.Instance.SetAdditionalSchemaInfoPath(resolvedSchemaInfoPath);
|
|
683
|
+
startupLog.LogIf('verbose', `RSU additionalSchemaInfo path: ${resolvedSchemaInfoPath}`);
|
|
657
684
|
}
|
|
658
685
|
else if (RuntimeSchemaManager.Instance.IsEnabled) {
|
|
659
686
|
// U5 — boot-time assert: write path ≠ read path (see the PostgreSQL branch for detail).
|
|
660
687
|
console.error(`[RSU_ADDITIONAL_SCHEMA_INFO_DIVERGENCE] Runtime Schema Update is ENABLED but mj.config.cjs has no ` +
|
|
661
|
-
`'additionalSchemaInfo' setting — RSU writes soft PK/FK definitions to '${
|
|
688
|
+
`'additionalSchemaInfo' setting (and RSU_ADDITIONAL_SCHEMA_INFO_PATH is unset) — RSU writes soft PK/FK definitions to '${RuntimeSchemaManager.Instance.AdditionalSchemaInfoPath}' ` +
|
|
662
689
|
`while CodeGen reads none, so resolved soft primary keys will be silently LOST at codegen time. ` +
|
|
663
690
|
`Set 'additionalSchemaInfo' in mj.config.cjs to the same file so the write path and read path agree.`);
|
|
664
691
|
}
|
|
@@ -707,6 +734,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
707
734
|
if (sharedCache) {
|
|
708
735
|
await LocalCacheManager.Instance.SetStorageProvider(sharedCache);
|
|
709
736
|
}
|
|
737
|
+
// The derived per-entry ceiling, so the boot log says what the largest cacheable entry actually is.
|
|
738
|
+
startupLog.LogIf('verbose', `LocalCacheManager: largest cacheable entry ${Math.floor(LocalCacheManager.Instance.MaxEntrySizeBytes / 1024 / 1024)} MB (maxEntryPercentOfCache: ${configInfo.cacheSettings?.maxEntryPercentOfCache ?? 'auto'})`);
|
|
710
739
|
const engineSweepMs = StartEngineSweeper(configInfo.cacheSettings);
|
|
711
740
|
startupLog.LogIf('verbose', engineSweepMs > 0 ? `Engine/database sweep every ${engineSweepMs / 1000}s` : 'Engine/database sweep disabled');
|
|
712
741
|
const userCacheCheckMs = StartUserCacheChecks(configInfo.cacheSettings);
|
|
@@ -857,6 +886,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
857
886
|
// config.ts loads and validates at module scope, so importing it there would pull full config
|
|
858
887
|
// validation into every import chain that touches the resolver, unit tests included.
|
|
859
888
|
ConfigureRecordDataBroadcast(configInfo.cacheSettings?.recordDataBroadcastEntities);
|
|
889
|
+
CacheInvalidationBroadcastManager.Instance.Configure(configInfo.cacheSettings?.broadcast);
|
|
860
890
|
// Global listener: broadcast CACHE_INVALIDATION to all browser clients whenever
|
|
861
891
|
// ANY BaseEntity save/delete occurs on this server — regardless of whether it
|
|
862
892
|
// originated from a GraphQL mutation or internal server-side code (agents, actions,
|
|
@@ -877,7 +907,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
877
907
|
// Opt-in only: this event reaches every connected client unfiltered, and this listener
|
|
878
908
|
// fires for server-internal saves too (agents, actions, orchestrator), which are exactly
|
|
879
909
|
// the ones no browser session asked for.
|
|
880
|
-
recordData: beEvent.type === 'save' && MayBroadcastRecordData(entityName)
|
|
910
|
+
recordData: beEvent.type === 'save' && MayBroadcastRecordData(entityName, beEvent.baseEntity.EntityInfo)
|
|
911
|
+
// fls-guard: MayBroadcastRecordData refuses FLS entities and Record Changes
|
|
881
912
|
? JSON.stringify(beEvent.baseEntity.GetAll())
|
|
882
913
|
: undefined,
|
|
883
914
|
});
|
|
@@ -925,7 +956,6 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
925
956
|
scalarsMap: [{ type: Date, scalar: GraphQLTimestamp }],
|
|
926
957
|
emitSchemaFile: websiteRunFromPackage !== 1,
|
|
927
958
|
pubSub,
|
|
928
|
-
globalMiddlewares: [variablesLoggingMiddleware],
|
|
929
959
|
});
|
|
930
960
|
const buildMs = performance.now() - tBuild;
|
|
931
961
|
if (cpuProf && profSession) {
|
|
@@ -946,6 +976,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
946
976
|
// and aren't @NoLog-marked. No-op in default config (logVariables=false).
|
|
947
977
|
auditResolversForUndecoratedArgs();
|
|
948
978
|
const tTransform = performance.now();
|
|
979
|
+
schema = ApplyRootVariablesLoggingMiddleware(schema);
|
|
949
980
|
schema = requireSystemUserDirective.transformer(schema);
|
|
950
981
|
schema = publicDirective.transformer(schema);
|
|
951
982
|
// Apply middleware-contributed schema transformers (after built-in directive transformers)
|
|
@@ -1074,6 +1105,8 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1074
1105
|
const apolloServer = buildApolloServer({ schema }, { httpServer, serverCleanup }, mwApolloPlugins.length > 0 ? mwApolloPlugins : undefined);
|
|
1075
1106
|
await apolloServer.start();
|
|
1076
1107
|
// Fix #8: Add compression for better throughput performance
|
|
1108
|
+
// Never advertise the framework (`X-Powered-By: Express`) — the host may have passed its own app.
|
|
1109
|
+
app.disable('x-powered-by');
|
|
1077
1110
|
app.use(compression({
|
|
1078
1111
|
// Don't compress responses smaller than 1KB
|
|
1079
1112
|
threshold: 1024,
|
|
@@ -1093,102 +1126,21 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1093
1126
|
// High compression level (good balance between CPU and compression ratio)
|
|
1094
1127
|
level: 6
|
|
1095
1128
|
}));
|
|
1096
|
-
// Health check
|
|
1097
|
-
//
|
|
1098
|
-
|
|
1099
|
-
// clients (e.g. MJExplorer's connectivity poller) can read the response.
|
|
1100
|
-
app.get('/healthcheck', cors(), (_req, res) => {
|
|
1101
|
-
res.status(200).json({ status: 'ok' });
|
|
1102
|
-
});
|
|
1129
|
+
// Health check — before every middleware contribution and the auth middleware, so cloud platform
|
|
1130
|
+
// probes never generate auth noise. Every core route mounts under MJAPI_BASE_PATH (see apiRoot.ts).
|
|
1131
|
+
MountHealthcheckRoute(app);
|
|
1103
1132
|
// Apply middleware-contributed pre-auth handlers (after compression, before routes)
|
|
1104
1133
|
for (const mw of mwPreAuth) {
|
|
1105
1134
|
app.use(mw);
|
|
1106
1135
|
}
|
|
1107
|
-
// ───
|
|
1108
|
-
|
|
1136
|
+
// ─── Public core routes (unauthenticated, registered BEFORE auth) ─────
|
|
1137
|
+
// OAuth callback, eSignature, media, realtime SDP broker, magic-link, widget, realtime verify — see
|
|
1138
|
+
// coreRoutes.ts. New custom routes belong in Server Extensions, never in serve().
|
|
1139
|
+
// oauthPublicUrl is the configured public URL, derived as it always was; it is also the magic-link JWT
|
|
1140
|
+
// issuer, so it stays untrimmed. Outward links use ApiRoute(…, { absolute: true }) instead.
|
|
1141
|
+
const oauthPublicUrl = ConfiguredPublicUrl();
|
|
1109
1142
|
startupLog.LogIf('verbose', `[OAuth] publicUrl: ${oauthPublicUrl}`);
|
|
1110
|
-
|
|
1111
|
-
if (oauthPublicUrl) {
|
|
1112
|
-
const { callbackRouter, authenticatedRouter } = createOAuthCallbackHandler({
|
|
1113
|
-
publicUrl: oauthPublicUrl,
|
|
1114
|
-
successRedirectUrl: `${oauthPublicUrl}/oauth/success`,
|
|
1115
|
-
errorRedirectUrl: `${oauthPublicUrl}/oauth/error`,
|
|
1116
|
-
// Constrains where a caller-supplied frontendReturnUrl may point (open-redirect guard).
|
|
1117
|
-
allowedFrontendOrigins: configInfo.cors?.allowedOrigins ?? ['*']
|
|
1118
|
-
});
|
|
1119
|
-
oauthAuthenticatedRouter = authenticatedRouter;
|
|
1120
|
-
const oauthCors = cors();
|
|
1121
|
-
// OAuth callback is unauthenticated (called by external auth server)
|
|
1122
|
-
app.use('/oauth', oauthCors, callbackRouter);
|
|
1123
|
-
startupLog.LogIf('verbose', '[OAuth] Callback route registered at /oauth/callback');
|
|
1124
|
-
}
|
|
1125
|
-
// ─── Core HTTP Routes (Static Core Infrastructure) ─────────────────────────
|
|
1126
|
-
// IMPORTANT ARCHITECTURAL NOTE:
|
|
1127
|
-
// The route mounts below are strictly reserved for core framework infrastructure (OAuth, eSignature,
|
|
1128
|
-
// media streaming, realtime WebRTC broker, magic-link, widgets).
|
|
1129
|
-
// ALL new custom routes, external webhooks, vendor adapters, and application integrations MUST be
|
|
1130
|
-
// implemented as Server Extensions (subclasses of BaseServerExtension in @memberjunction/server-extensions-core)
|
|
1131
|
-
// mounted via ServerExtensionLoader — NEVER hardcoded as ad-hoc app.use() in serve().
|
|
1132
|
-
// See guides/SERVER_EXTENSIONS_GUIDE.md for complete patterns and best practices.
|
|
1133
|
-
// ─── eSignature webhook (unauthenticated, registered BEFORE auth) ─────
|
|
1134
|
-
// Called by external signature providers (DocuSign Connect, etc.) without an MJ bearer token.
|
|
1135
|
-
// The provider DRIVER verifies the payload signature/HMAC; MJ auth does not apply here.
|
|
1136
|
-
app.use('/esignature', cors(), createSignatureWebhookHandler());
|
|
1137
|
-
startupLog.LogIf('verbose', '[eSignature] Webhook route registered at /esignature/webhook/:driverKey');
|
|
1138
|
-
// ─── Authenticated media streaming (token-gated, registered BEFORE auth) ─────
|
|
1139
|
-
// The `?token=` query param (minted by CreateMediaAccessToken after a per-user permission
|
|
1140
|
-
// check) is the capability — the route verifies it itself, so it does NOT use the MJ bearer
|
|
1141
|
-
// auth middleware (an <audio>/<video> element can't send Authorization headers).
|
|
1142
|
-
app.use('/media', cors(), createMediaStreamRouter());
|
|
1143
|
-
startupLog.LogIf('verbose', '[Media] Streaming route registered at /media/:fileId');
|
|
1144
|
-
// ─── Realtime WebRTC SDP broker (ticket-gated, registered BEFORE auth) ───────
|
|
1145
|
-
if (configInfo.realtime?.enabled) {
|
|
1146
|
-
app.use(REALTIME_SDP_EXCHANGE_PATH, cors(), createRealtimeSdpBrokerRouter());
|
|
1147
|
-
startupLog.LogIf('verbose', `[Realtime] WebRTC SDP broker registered at ${REALTIME_SDP_EXCHANGE_PATH}`);
|
|
1148
|
-
}
|
|
1149
|
-
// ─── Magic-link routes (MJ-issued, app-scoped external access) ───────────
|
|
1150
|
-
// Public router (JWKS + redeem) mounts BEFORE the auth middleware; the
|
|
1151
|
-
// authenticated invite-creation router mounts AFTER it (see below).
|
|
1152
|
-
let widgetAuthenticatedRouter;
|
|
1153
|
-
let magicLinkAuthenticatedRouter;
|
|
1154
|
-
if (configInfo.magicLink?.enabled) {
|
|
1155
|
-
const { publicRouter, authenticatedRouter } = createMagicLinkHandler(oauthPublicUrl, configInfo.magicLink);
|
|
1156
|
-
magicLinkAuthenticatedRouter = authenticatedRouter;
|
|
1157
|
-
registerMagicLinkAuthProvider(oauthPublicUrl, configInfo.magicLink);
|
|
1158
|
-
app.use(MAGIC_LINK_MOUNT_PATH, cors(), publicRouter);
|
|
1159
|
-
startupLog.LogIf('verbose', `[MagicLink] Public routes registered at ${MAGIC_LINK_MOUNT_PATH}/redeem and ${MAGIC_LINK_MOUNT_PATH}/jwks.json`);
|
|
1160
|
-
}
|
|
1161
|
-
// ─── Public web widget: guest-session mint (PUBLIC, before auth mw) ───────
|
|
1162
|
-
// Visitors hold no MJ JWT yet, so POST /widget/session is public. It reuses the
|
|
1163
|
-
// magic-link RS256 key + `magic-link` auth provider (ensured idempotently inside
|
|
1164
|
-
// createWidgetHandler), so it stands on its own even if magicLink.enabled is false.
|
|
1165
|
-
if (configInfo.widget?.enabled) {
|
|
1166
|
-
const { publicRouter: widgetRouter, authenticatedRouter: widgetAuthRouter } = createWidgetHandler(oauthPublicUrl, configInfo.widget);
|
|
1167
|
-
widgetAuthenticatedRouter = widgetAuthRouter;
|
|
1168
|
-
app.use(WIDGET_MOUNT_PATH, cors(), widgetRouter);
|
|
1169
|
-
// The widget reuses the magic-link RS256 key + auth provider to validate guest
|
|
1170
|
-
// tokens, which validates by fetching the JWKS at MAGIC_LINK_MOUNT_PATH/jwks.json.
|
|
1171
|
-
// When magic-link itself is disabled its public router (which serves JWKS) never
|
|
1172
|
-
// mounts, so publish the key here — otherwise every guest token fails validation
|
|
1173
|
-
// (the auth middleware can't fetch the public key) and the widget 401s.
|
|
1174
|
-
if (!configInfo.magicLink?.enabled) {
|
|
1175
|
-
app.use(MAGIC_LINK_MOUNT_PATH, cors(), createMagicLinkJwksRouter());
|
|
1176
|
-
startupLog.LogIf('verbose', `[Widget] Published reused signing key at ${MAGIC_LINK_MOUNT_PATH}/jwks.json (magic-link flow disabled)`);
|
|
1177
|
-
}
|
|
1178
|
-
startupLog.LogIf('verbose', `[Widget] Public routes registered at ${WIDGET_MOUNT_PATH}/session and ${WIDGET_MOUNT_PATH}/session/refresh`);
|
|
1179
|
-
}
|
|
1180
|
-
// ─── Realtime identity verification: PUBLIC verify-link routes (before auth mw) ───
|
|
1181
|
-
// The person opening the emailed link holds no MJ token — the single-use token is the capability.
|
|
1182
|
-
// GET only renders a confirm button; the POST redeems (mail scanners GET every link). Mounted only
|
|
1183
|
-
// when verification is enabled AND able to send mail AND able to protect its codes (see
|
|
1184
|
-
// realtime.identityVerification config: communicationProvider + hmacSecret).
|
|
1185
|
-
if (configInfo.realtime?.identityVerification?.enabled && !RealtimeSessionVerificationService.Instance.IsEnabled) {
|
|
1186
|
-
console.warn('[RealtimeVerify] realtime.identityVerification.enabled is true but verification is unavailable: it needs a communicationProvider and an hmacSecret of at least 16 characters.');
|
|
1187
|
-
}
|
|
1188
|
-
if (RealtimeSessionVerificationService.Instance.IsEnabled) {
|
|
1189
|
-
app.use(REALTIME_VERIFY_MOUNT_PATH, cors(), CreateRealtimeVerifyRouter());
|
|
1190
|
-
startupLog.LogIf('verbose', `[RealtimeVerify] Public routes registered at ${REALTIME_VERIFY_MOUNT_PATH}/:token (GET) and ${REALTIME_VERIFY_MOUNT_PATH} (POST)`);
|
|
1191
|
-
}
|
|
1143
|
+
const coreAuthenticatedRouters = MountPublicCoreRoutes(app, oauthPublicUrl, startupLog);
|
|
1192
1144
|
// ─── Server extensions loader & shared service registry ───────────────────
|
|
1193
1145
|
const extensionLoader = new ServerExtensionLoader();
|
|
1194
1146
|
_currentExtensionLoader = extensionLoader;
|
|
@@ -1255,13 +1207,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1255
1207
|
const mergedHostExtensions = mergeServerExtensionConfigs(telephonyExtensionConfigs, rawHostExtensions);
|
|
1256
1208
|
// Open App packages publish their extensions; host mj.config.cjs overlays by DriverClass
|
|
1257
1209
|
// (and remains the only source for host-only extensions such as Slack/Teams).
|
|
1258
|
-
//
|
|
1259
|
-
//
|
|
1260
|
-
//
|
|
1210
|
+
// Every RootPath is relative to MJAPI_BASE_PATH: apiRootPath composes the real mount path, and
|
|
1211
|
+
// extraReservedRoots (also relative) must list every core mount in coreRoutes.ts, otherwise an
|
|
1212
|
+
// Open App can claim it.
|
|
1261
1213
|
const extensionConfigs = prepareServerExtensionConfigs(mergeServerExtensionConfigs(options?.serverExtensions ?? [], mergedHostExtensions), {
|
|
1262
1214
|
onInvalid: (message) => LogError(message),
|
|
1263
1215
|
onOverlap: (message) => LogStatus(message),
|
|
1264
|
-
extraReservedRoots:
|
|
1216
|
+
extraReservedRoots: CoreReservedServerExtensionRoots(),
|
|
1217
|
+
apiRootPath: ApiRootPath(),
|
|
1265
1218
|
});
|
|
1266
1219
|
for (const cfg of extensionConfigs) {
|
|
1267
1220
|
LogStatus(`Server extension ${describeServerExtensionMount(cfg)}`);
|
|
@@ -1270,28 +1223,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1270
1223
|
// Without this, the browser blocks 401 responses from the auth middleware
|
|
1271
1224
|
// because they lack Access-Control-Allow-Origin headers, preventing the
|
|
1272
1225
|
// client from reading the error code and triggering token refresh.
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
//
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
app.use(cors({
|
|
1282
|
-
origin: (origin, callback) => {
|
|
1283
|
-
// Allow all origins when ['*'] (default/backward-compatible),
|
|
1284
|
-
// or when no Origin header (server-to-server calls).
|
|
1285
|
-
if (corsWildcard || !origin || corsAllowed.includes(origin)) {
|
|
1286
|
-
callback(null, true);
|
|
1287
|
-
}
|
|
1288
|
-
else {
|
|
1289
|
-
callback(new Error(`Origin ${origin} not allowed by CORS`));
|
|
1290
|
-
}
|
|
1291
|
-
},
|
|
1292
|
-
credentials: corsWildcard ? false : (configInfo.cors?.allowCredentials ?? true),
|
|
1293
|
-
maxAge: configInfo.cors?.maxAge ?? 86400,
|
|
1294
|
-
}));
|
|
1226
|
+
// Extensions that declare `OwnsCORS: true` (ServerExtensionConfig) are exempt: the global
|
|
1227
|
+
// middleware skips their RootPaths so it neither reflects an origin onto their responses nor
|
|
1228
|
+
// answers their preflights — the extension's own OPTIONS handling and origin policy run instead.
|
|
1229
|
+
const corsOwnedExtensionRoots = GetCorsOwningServerExtensionRoots(extensionConfigs);
|
|
1230
|
+
if (corsOwnedExtensionRoots.length > 0) {
|
|
1231
|
+
LogStatus(`Global CORS skips extension-owned roots: ${corsOwnedExtensionRoots.join(', ')}`);
|
|
1232
|
+
}
|
|
1233
|
+
app.use(CreateGlobalCorsMiddleware(configInfo.cors, corsOwnedExtensionRoots));
|
|
1295
1234
|
// ─── Pre-auth server extensions (before auth — extensions handle their own auth) ─────
|
|
1296
1235
|
// Slack uses HMAC signature verification, Teams uses Bot Framework JWT validation.
|
|
1297
1236
|
// These must be registered before the unified auth middleware so webhook
|
|
@@ -1301,21 +1240,11 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1301
1240
|
phase: 'pre-auth',
|
|
1302
1241
|
httpServer,
|
|
1303
1242
|
publicUrl: oauthPublicUrl,
|
|
1243
|
+
apiRootPath: ApiRootPath(),
|
|
1304
1244
|
});
|
|
1305
1245
|
}
|
|
1306
|
-
|
|
1307
|
-
app
|
|
1308
|
-
const results = await extensionLoader.HealthCheckAll();
|
|
1309
|
-
const allHealthy = results.length === 0 || results.every(r => r.Healthy);
|
|
1310
|
-
res.status(allHealthy ? 200 : 503).json({ extensions: results });
|
|
1311
|
-
});
|
|
1312
|
-
// ─── Public authentication-provider catalog (PUBLIC, before auth mw) ──────
|
|
1313
|
-
// The browser needs the provider list BEFORE it holds a token, so this is necessarily
|
|
1314
|
-
// unauthenticated and must mount ahead of the auth middleware. It publishes only the
|
|
1315
|
-
// non-secret allow-list (see AuthProviderEngine.GetPublicCatalog) — the same values a
|
|
1316
|
-
// single-provider SPA already compiled into its bundle.
|
|
1317
|
-
app.use(AUTH_CATALOG_MOUNT_PATH, cors(), createAuthProviderCatalogRouter());
|
|
1318
|
-
startupLog.LogIf('verbose', `[Auth] Public provider catalog registered at ${AUTH_CATALOG_MOUNT_PATH}/providers`);
|
|
1246
|
+
MountExtensionHealthRoute(app, extensionLoader);
|
|
1247
|
+
MountAuthCatalogRoute(app, startupLog);
|
|
1319
1248
|
// ─── Unified auth middleware (replaces both REST authMiddleware and contextFunction auth) ─────
|
|
1320
1249
|
app.use(CreateUnifiedAuthMiddleware(dataSources));
|
|
1321
1250
|
// ─── Post-auth middleware from BaseServerMiddleware plugins ─────
|
|
@@ -1325,23 +1254,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1325
1254
|
for (const mw of mwPostAuth) {
|
|
1326
1255
|
app.use(mw);
|
|
1327
1256
|
}
|
|
1328
|
-
// ───
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
startupLog.LogIf('verbose', `[MagicLink] Authenticated route registered at ${MAGIC_LINK_MOUNT_PATH}/create`);
|
|
1338
|
-
}
|
|
1339
|
-
// ─── Widget authenticated route (RV4 resolve-identity) ────────────────────
|
|
1340
|
-
// Mounts after the unified auth middleware so a verified visitor (post magic-link upgrade) can
|
|
1341
|
-
// promote their anonymous returning-visitor trail to the verified record.
|
|
1342
|
-
if (widgetAuthenticatedRouter) {
|
|
1343
|
-
app.use(WIDGET_MOUNT_PATH, cors(), widgetAuthenticatedRouter);
|
|
1344
|
-
startupLog.LogIf('verbose', `[Widget] Authenticated route registered at ${WIDGET_MOUNT_PATH}/resolve-identity`);
|
|
1257
|
+
// ─── Authenticated core routes: OAuth status/initiate/exchange, magic-link create, widget resolve-identity ─────
|
|
1258
|
+
MountAuthenticatedCoreRoutes(app, coreAuthenticatedRouters, startupLog);
|
|
1259
|
+
// ─── Realtime recording shards + terminal signal (authenticated, owner-gated) ─────
|
|
1260
|
+
// The browser uploads a client-direct call's recording as Opus shards and a keepalive terminal request;
|
|
1261
|
+
// assembly runs off the request path on the scheduler. Needs a SQL provider: the ledger calls procs.
|
|
1262
|
+
if (configInfo.realtime?.enabled) {
|
|
1263
|
+
if (mountRealtimeRecordingRoutes(app)) {
|
|
1264
|
+
startupLog.LogIf('verbose', `[Realtime] Recording routes registered at ${ApiRoute(REALTIME_RECORDING_MOUNT_PATH)}/:agentSessionId/shard/:index and /end`);
|
|
1265
|
+
}
|
|
1345
1266
|
}
|
|
1346
1267
|
// ─── Post-auth server extensions ──────────────────────────────────────────
|
|
1347
1268
|
// Extensions declaring Phase: 'post-auth' mount after the unified auth middleware
|
|
@@ -1351,14 +1272,22 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1351
1272
|
phase: 'post-auth',
|
|
1352
1273
|
httpServer,
|
|
1353
1274
|
publicUrl: oauthPublicUrl,
|
|
1275
|
+
apiRootPath: ApiRootPath(),
|
|
1354
1276
|
});
|
|
1355
1277
|
}
|
|
1278
|
+
// Every extension has now had its chance at the request: a preflight under an extension-owned
|
|
1279
|
+
// root that none of them answered is refused here, instead of falling through to the GraphQL
|
|
1280
|
+
// mount's cors(), which would approve it for every origin.
|
|
1281
|
+
if (corsOwnedExtensionRoots.length > 0) {
|
|
1282
|
+
app.use(CreateExtensionOwnedPreflightFallback(corsOwnedExtensionRoots));
|
|
1283
|
+
}
|
|
1356
1284
|
// ─── Cross-extension lifecycle hook: OnAllExtensionsMounted ───────────────
|
|
1357
1285
|
// Called after all extensions across both pre-auth and post-auth phases are mounted.
|
|
1358
1286
|
// Extensions can wire themselves to services registered by other extensions or core.
|
|
1359
1287
|
await extensionLoader.NotifyAllExtensionsMounted({
|
|
1360
1288
|
httpServer,
|
|
1361
1289
|
publicUrl: oauthPublicUrl,
|
|
1290
|
+
apiRootPath: ApiRootPath(),
|
|
1362
1291
|
});
|
|
1363
1292
|
// Install the single path-routing WebSocket-upgrade dispatcher AFTER all extensions across both
|
|
1364
1293
|
// pre-auth and post-auth phases have mounted and registered their media WSS routes. ws 8.x has each
|
|
@@ -1394,11 +1323,29 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1394
1323
|
// No per-route authMiddleware needed — unified auth middleware already ran
|
|
1395
1324
|
setupRESTEndpoints(app, restApiConfig);
|
|
1396
1325
|
// ─── GraphQL middleware (contextFunction reads req.userPayload, no re-auth) ─────
|
|
1397
|
-
app.use(graphqlRootPath, cors(
|
|
1326
|
+
app.use(graphqlRootPath, cors({
|
|
1327
|
+
exposedHeaders: ['X-MJ-Cache-Seq', 'X-MJ-Server-ID'],
|
|
1328
|
+
}), BodyParser.json({ limit: '50mb' }),
|
|
1398
1329
|
// Express 5 leaves req.body as undefined for non-JSON or empty bodies;
|
|
1399
1330
|
// Apollo Server's expressMiddleware requires req.body to be defined.
|
|
1400
|
-
|
|
1401
|
-
|
|
1331
|
+
// Also piggyback the latest monotonic cache invalidation sequence and server process ID
|
|
1332
|
+
// onto every GraphQL HTTP response so clients can detect and recover missed invalidations.
|
|
1333
|
+
(req, res, next) => {
|
|
1334
|
+
if (req.body === undefined)
|
|
1335
|
+
req.body = {};
|
|
1336
|
+
const broadcastProvider = CacheInvalidationBroadcastManager.Instance.Provider;
|
|
1337
|
+
res.setHeader('X-MJ-Cache-Seq', String(broadcastProvider.CurrentSequence));
|
|
1338
|
+
res.setHeader('X-MJ-Server-ID', broadcastProvider.ServerProcessID);
|
|
1339
|
+
const originalWriteHead = res.writeHead.bind(res);
|
|
1340
|
+
res.writeHead = ((...args) => {
|
|
1341
|
+
if (!res.headersSent) {
|
|
1342
|
+
res.setHeader('X-MJ-Cache-Seq', String(broadcastProvider.CurrentSequence));
|
|
1343
|
+
res.setHeader('X-MJ-Server-ID', broadcastProvider.ServerProcessID);
|
|
1344
|
+
}
|
|
1345
|
+
return originalWriteHead(...args);
|
|
1346
|
+
});
|
|
1347
|
+
next();
|
|
1348
|
+
}, expressMiddleware(apolloServer, {
|
|
1402
1349
|
context: contextFunction({
|
|
1403
1350
|
setupComplete$,
|
|
1404
1351
|
dataSource: extendConnectionPoolWithQuery(dataSources[0].dataSource), // default read-write data source
|
|
@@ -1409,9 +1356,24 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1409
1356
|
for (const mw of mwPostRoute) {
|
|
1410
1357
|
app.use(mw);
|
|
1411
1358
|
}
|
|
1359
|
+
const serverRole = ResolveServerRole(configInfo.serverRole ?? process.env.MJ_SERVER_ROLE);
|
|
1360
|
+
const runBackgroundWorkers = ShouldRunBackgroundWorkers(serverRole);
|
|
1361
|
+
if (!runBackgroundWorkers) {
|
|
1362
|
+
LogStatus(`[ServerRole] Running in '${serverRole}' mode — background worker services are disabled on this replica.`);
|
|
1363
|
+
}
|
|
1364
|
+
// Close out run artifacts a dead process left open, BEFORE anything below can start a new run.
|
|
1365
|
+
//
|
|
1366
|
+
// A killed process (OOM killer, SIGKILL, host reboot) never writes its run's terminal result, so
|
|
1367
|
+
// the run reads as in-flight forever: the wizard spins, the active-operations panel shows a step
|
|
1368
|
+
// that will never advance, and no failure is reported anywhere. Sound only before the first new
|
|
1369
|
+
// run: artifacts are process-local, so anything still in flight as THIS process starts belongs
|
|
1370
|
+
// to a process that no longer exists. That is why it runs here, ahead of the scheduler, the
|
|
1371
|
+
// integration sync worker (its Start() polls immediately), the HTTP listener (a request can
|
|
1372
|
+
// start a discovery) and pending RSU work, and why it is awaited. It needs none of them.
|
|
1373
|
+
await SweepInterruptedRuns(undefined, msg => console.warn(msg));
|
|
1412
1374
|
// Initialize and start scheduled jobs service if enabled
|
|
1413
1375
|
let scheduledJobsService = null;
|
|
1414
|
-
if (configInfo.scheduledJobs?.enabled) {
|
|
1376
|
+
if (runBackgroundWorkers && configInfo.scheduledJobs?.enabled) {
|
|
1415
1377
|
try {
|
|
1416
1378
|
scheduledJobsService = new ScheduledJobsService(configInfo.scheduledJobs);
|
|
1417
1379
|
await scheduledJobsService.Initialize();
|
|
@@ -1425,7 +1387,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1425
1387
|
// Initialize and start the integration sync worker if enabled (PR 1 item 8).
|
|
1426
1388
|
// Off by default — deployments that don't opt in keep running syncs inline.
|
|
1427
1389
|
let integrationSyncWorker = null;
|
|
1428
|
-
if (configInfo.integrationSyncWorker?.enabled) {
|
|
1390
|
+
if (runBackgroundWorkers && configInfo.integrationSyncWorker?.enabled) {
|
|
1429
1391
|
try {
|
|
1430
1392
|
integrationSyncWorker = new IntegrationSyncWorkerService(configInfo.integrationSyncWorker);
|
|
1431
1393
|
await integrationSyncWorker.Initialize();
|
|
@@ -1459,47 +1421,49 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1459
1421
|
startupLog.SetScheduledJobCount(scheduledJobsService.GetStatus().activeJobs);
|
|
1460
1422
|
}
|
|
1461
1423
|
startupLog.PrintSummary();
|
|
1462
|
-
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1463
|
-
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`));
|
|
1464
|
-
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1465
1424
|
const resumeUser = UserCache.Instance.GetSystemUser();
|
|
1466
|
-
if (
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
//
|
|
1501
|
-
|
|
1502
|
-
|
|
1425
|
+
if (runBackgroundWorkers) {
|
|
1426
|
+
// Process pending RSU work from pre-restart (entity maps, field maps, sync)
|
|
1427
|
+
processRSUPendingWork().catch(err => console.warn(`RSU pending work processing failed: ${err}`));
|
|
1428
|
+
// Resume any integration syncs that were orphaned by the previous process restart
|
|
1429
|
+
if (resumeUser) {
|
|
1430
|
+
IntegrationEngine.Instance.ResumeOrphanedSyncs(resumeUser)
|
|
1431
|
+
.catch(err => console.warn(`[IntegrationEngine] Orphaned sync resume failed: ${err}`));
|
|
1432
|
+
}
|
|
1433
|
+
// Force-fail any agent runs left 'Running' by a process that died (restart/crash/OOM) or whose
|
|
1434
|
+
// terminal-state write never landed. Staleness-based, so it never touches runs another healthy
|
|
1435
|
+
// instance is still heart-beating. The watchdog also self-registers for graceful-shutdown
|
|
1436
|
+
// cancellation (via ShutdownRegistry) once it begins tracking this process's first live run.
|
|
1437
|
+
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1438
|
+
const sweepUser = resumeUser;
|
|
1439
|
+
const sweepProvider = Metadata.Provider; // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
|
|
1440
|
+
AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser)
|
|
1441
|
+
.catch(err => console.warn(`[AgentRunWatchdog] Startup sweep failed: ${err}`));
|
|
1442
|
+
// The watchdog repairs the RUN; nothing repaired the conversation detail, which is the row the
|
|
1443
|
+
// chat actually renders from (MJ #4222). A process that dies mid-run leaves a terminal run
|
|
1444
|
+
// beside a message that still claims to be generating, and it spins forever for anyone who
|
|
1445
|
+
// opens it. Runs at boot (closes restart orphans) and on a timer (closes mid-life orphans),
|
|
1446
|
+
// mirroring the watchdog's own two-phase shape.
|
|
1447
|
+
const reconcileOrphans = () => ReconcileOrphanedConversationDetails(sweepProvider, sweepUser)
|
|
1448
|
+
.catch(err => console.warn(`[OrphanDetailReconciler] Pass failed: ${err}`));
|
|
1449
|
+
void reconcileOrphans();
|
|
1450
|
+
const orphanDetailTimer = setInterval(() => void reconcileOrphans(), ORPHAN_DETAIL_SWEEP_INTERVAL_MS);
|
|
1451
|
+
ShutdownRegistry.Instance.Register({
|
|
1452
|
+
ShutdownName: 'OrphanDetailReconciler',
|
|
1453
|
+
Shutdown: () => { clearInterval(orphanDetailTimer); },
|
|
1454
|
+
});
|
|
1455
|
+
}
|
|
1456
|
+
// Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then a periodic tick
|
|
1457
|
+
// that closes stale and over-deadline sessions and rebuilds lost realtime recordings from their
|
|
1458
|
+
// crash-recovery shards (storage reads and writes). Self-registers with ShutdownRegistry, so its timer
|
|
1459
|
+
// is cleared by the gracefulShutdown drain below (no explicit Stop() wiring needed here).
|
|
1460
|
+
if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — boot-time session janitor uses the server's own provider
|
|
1461
|
+
SessionJanitor.Instance.Start(Metadata.Provider, resumeUser) // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1462
|
+
.catch(err => console.warn(`[SessionJanitor] Startup failed: ${err}`));
|
|
1463
|
+
// The bridge engine's orphan reconcile likewise starts only now that this process holds its port, so it can't
|
|
1464
|
+
// take the live bridges of another MJAPI still serving that port for its own orphans (#5310).
|
|
1465
|
+
StartBridgeOrphanReconciliation(Metadata.Provider, resumeUser); // global-provider-ok: server-owned background reconciler runs under the server's provider + system user
|
|
1466
|
+
}
|
|
1503
1467
|
}
|
|
1504
1468
|
// Launch the durable task-graph dispatcher: claim Pending tasks, execute them with a fresh
|
|
1505
1469
|
// provider each, and reconcile claims orphaned by a crash. Without this nothing ever picks up a
|
|
@@ -1528,7 +1492,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1528
1492
|
SuppressTaskGraphSubmission('MJ_DISABLE_TASK_GRAPH_DISPATCHER=1 is set on this host');
|
|
1529
1493
|
LogStatus('[TaskGraphDispatcher] Disabled by MJ_DISABLE_TASK_GRAPH_DISPATCHER=1 — this process will neither accept nor execute task graphs.');
|
|
1530
1494
|
}
|
|
1531
|
-
else if (resumeUser && taskGraphPool instanceof sql.ConnectionPool) {
|
|
1495
|
+
else if (runBackgroundWorkers && resumeUser && taskGraphPool instanceof sql.ConnectionPool) {
|
|
1532
1496
|
StartTaskGraphDispatcher(taskGraphPool, resumeUser)
|
|
1533
1497
|
.catch(err => console.warn(`[TaskGraphDispatcher] Startup failed: ${err}`));
|
|
1534
1498
|
}
|
|
@@ -1537,7 +1501,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
|
|
|
1537
1501
|
// ShutdownAll() drains it (up to 2 × shutdownDrainMs) before the HTTP server closes.
|
|
1538
1502
|
// Not awaited: a slow engine load must not delay readiness, and a failure never stops the API.
|
|
1539
1503
|
const workQueueProvider = Metadata.Provider; // global-provider-ok: server startup — the work-queue host runs on the server's own provider
|
|
1540
|
-
if (configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1504
|
+
if (runBackgroundWorkers && configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
|
|
1541
1505
|
const workQueuePool = dataSources[0]?.dataSource;
|
|
1542
1506
|
const providerSource = new MJServerWorkQueueProviderSource(workQueuePool instanceof sql.ConnectionPool ? workQueuePool : null, workQueueProvider);
|
|
1543
1507
|
StartWorkQueueHost(configInfo.workQueue, workQueueProvider, providerSource)
|
|
@@ -1986,4 +1950,48 @@ function createMSSQLCompatPool(pgPool) {
|
|
|
1986
1950
|
};
|
|
1987
1951
|
return wrapper;
|
|
1988
1952
|
}
|
|
1953
|
+
// Defined below serve() on purpose: serverExtensionReservedRoots.test.ts treats every app.use() that appears
|
|
1954
|
+
// textually before the unified auth middleware as a pre-auth mount, and these routes are mounted post-auth.
|
|
1955
|
+
/**
|
|
1956
|
+
* Mounts the realtime recording shard/terminal routes (post-auth) and starts the assembly scheduler they
|
|
1957
|
+
* hand work to. Skipped, with a warning, when the server's provider is not a SQL provider (the ledger calls
|
|
1958
|
+
* stored procedures). Without a system user the routes still store shards, and the janitor assembles them.
|
|
1959
|
+
* Returns whether the routes were mounted.
|
|
1960
|
+
*/
|
|
1961
|
+
function mountRealtimeRecordingRoutes(app) {
|
|
1962
|
+
const provider = Metadata.Provider; // global-provider-ok: REST endpoint — no per-request provider injection in REST middleware yet; the ledger's procs run as the server's SQL login either way
|
|
1963
|
+
if (!(provider instanceof DatabaseProviderBase)) {
|
|
1964
|
+
console.warn('[Realtime] Recording routes not mounted: the server provider is not a DatabaseProviderBase');
|
|
1965
|
+
return false;
|
|
1966
|
+
}
|
|
1967
|
+
const graceMs = () => configInfo.realtime.recordingAssemblyGraceSeconds * 1000;
|
|
1968
|
+
const systemUser = UserCache.Instance.GetSystemUser();
|
|
1969
|
+
const runWorkers = ShouldRunBackgroundWorkers(ResolveServerRole(configInfo.serverRole ?? process.env.MJ_SERVER_ROLE));
|
|
1970
|
+
if (systemUser && runWorkers) {
|
|
1971
|
+
RecordingAssemblyScheduler.Instance.Start({ Provider: provider, SystemUser: systemUser, GraceMs: graceMs });
|
|
1972
|
+
}
|
|
1973
|
+
else if (!systemUser) {
|
|
1974
|
+
LogError('[Realtime] Recording assembly scheduler not started: no system user; the session janitor assembles recordings instead');
|
|
1975
|
+
}
|
|
1976
|
+
app.use(ApiRoute(REALTIME_RECORDING_MOUNT_PATH), cors(), CreateRealtimeRecordingRouter({
|
|
1977
|
+
ResolveCaller: req => {
|
|
1978
|
+
const user = req.userPayload?.userRecord;
|
|
1979
|
+
return user ? { ContextUser: user, Provider: provider } : null;
|
|
1980
|
+
},
|
|
1981
|
+
LoadOwnedSession: LoadOwnedRealtimeSession,
|
|
1982
|
+
LoadConversationScope: LoadSessionConversationScope,
|
|
1983
|
+
CreateLedger: (ledgerProvider, contextUser) => new SqlRealtimeRecordingLedger(ledgerProvider, contextUser),
|
|
1984
|
+
Scheduler: RecordingAssemblyScheduler.Instance,
|
|
1985
|
+
GraceMs: graceMs,
|
|
1986
|
+
SystemUser: () => UserCache.Instance.GetSystemUser() ?? null,
|
|
1987
|
+
}));
|
|
1988
|
+
return true;
|
|
1989
|
+
}
|
|
1990
|
+
// Public-edge building blocks for Open Apps that run their own pre-auth edge and mint
|
|
1991
|
+
// scope-limited guest sessions (e.g. a ballot edge: verify a credential, then mint a short-lived
|
|
1992
|
+
// session scoped to one resource). They are the same pieces WidgetSessionService uses; a generic
|
|
1993
|
+
// public-widget session mint remains the long-term replacement.
|
|
1994
|
+
export { BuildSessionClaims, MagicLinkKeyManager, MagicLinkService, HashToken, GenerateRawToken } from './auth/magicLink/index.js';
|
|
1995
|
+
export { VerifyHostAssertion } from './realtimeWidget/host-identity.js';
|
|
1996
|
+
export { IsScopeLimitedPrincipal } from './auth/scopeLimitedPrincipal.js';
|
|
1989
1997
|
//# sourceMappingURL=index.js.map
|