@memberjunction/server 6.2.0-edge.5 → 6.2.0-edge.7
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 +96 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/agentSessions/BridgeHostInstance.d.ts +8 -3
- package/dist/agentSessions/BridgeHostInstance.d.ts.map +1 -1
- package/dist/agentSessions/BridgeHostInstance.js +14 -4
- package/dist/agentSessions/BridgeHostInstance.js.map +1 -1
- package/dist/agentSessions/HandoffOfferExpiry.d.ts +10 -0
- package/dist/agentSessions/HandoffOfferExpiry.d.ts.map +1 -0
- package/dist/agentSessions/HandoffOfferExpiry.js +18 -0
- package/dist/agentSessions/HandoffOfferExpiry.js.map +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js +1 -0
- package/dist/agentSessions/ReturningVisitorRecap.js.map +1 -1
- package/dist/agentSessions/SessionJanitor.d.ts +34 -11
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +88 -44
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +29 -9
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +62 -16
- package/dist/agentSessions/SessionManager.js.map +1 -1
- package/dist/agentSessions/conversationBrowsers.d.ts +61 -0
- package/dist/agentSessions/conversationBrowsers.d.ts.map +1 -0
- package/dist/agentSessions/conversationBrowsers.js +118 -0
- package/dist/agentSessions/conversationBrowsers.js.map +1 -0
- package/dist/agentSessions/sessionDeadline.d.ts +43 -0
- package/dist/agentSessions/sessionDeadline.d.ts.map +1 -0
- package/dist/agentSessions/sessionDeadline.js +68 -0
- package/dist/agentSessions/sessionDeadline.js.map +1 -0
- package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.js +5 -4
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.d.ts.map +1 -1
- package/dist/auth/AuthProviderCatalogRouter.js +2 -0
- package/dist/auth/AuthProviderCatalogRouter.js.map +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +51 -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/loginEmailResolution.d.ts +41 -0
- package/dist/auth/loginEmailResolution.d.ts.map +1 -0
- package/dist/auth/loginEmailResolution.js +47 -0
- package/dist/auth/loginEmailResolution.js.map +1 -0
- package/dist/auth/magicLink/MagicLinkKeys.d.ts +51 -3
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +130 -13
- package/dist/auth/magicLink/MagicLinkKeys.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.d.ts +3 -0
- package/dist/auth/magicLink/MagicLinkRouter.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkRouter.js +23 -5
- package/dist/auth/magicLink/MagicLinkRouter.js.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.d.ts +39 -5
- package/dist/auth/magicLink/MagicLinkService.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkService.js +221 -9
- package/dist/auth/magicLink/MagicLinkService.js.map +1 -1
- package/dist/auth/magicLink/index.d.ts +1 -1
- package/dist/auth/magicLink/index.d.ts.map +1 -1
- package/dist/auth/magicLink/index.js +1 -1
- package/dist/auth/magicLink/index.js.map +1 -1
- package/dist/auth/magicLink/redeemLanding.d.ts +2 -2
- package/dist/auth/magicLink/redeemLanding.d.ts.map +1 -1
- package/dist/auth/magicLink/redeemLanding.js +7 -4
- package/dist/auth/magicLink/redeemLanding.js.map +1 -1
- package/dist/auth/magicLink/types.d.ts +39 -3
- package/dist/auth/magicLink/types.d.ts.map +1 -1
- package/dist/auth/magicLink/types.js +0 -4
- package/dist/auth/magicLink/types.js.map +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +1 -0
- package/dist/auth/newUsers.js.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/backgroundSweepConfigUnits.d.ts +231 -0
- package/dist/backgroundSweepConfigUnits.d.ts.map +1 -0
- package/dist/backgroundSweepConfigUnits.js +180 -0
- package/dist/backgroundSweepConfigUnits.js.map +1 -0
- 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 +1402 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +5 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +64 -12
- package/dist/context.js.map +1 -1
- package/dist/coreRoutes.d.ts +3 -1
- package/dist/coreRoutes.d.ts.map +1 -1
- package/dist/coreRoutes.js +20 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +863 -14
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +4167 -62
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/CacheInvalidationResolver.d.ts +50 -30
- package/dist/generic/CacheInvalidationResolver.d.ts.map +1 -1
- package/dist/generic/CacheInvalidationResolver.js +154 -79
- package/dist/generic/CacheInvalidationResolver.js.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts +11 -0
- package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js +29 -1
- 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 +93 -11
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +114 -29
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +509 -220
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +15 -3
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +126 -20
- 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/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +262 -84
- package/dist/index.js.map +1 -1
- package/dist/integration/ConnectionPause.d.ts +121 -0
- package/dist/integration/ConnectionPause.d.ts.map +1 -0
- package/dist/integration/ConnectionPause.js +183 -0
- package/dist/integration/ConnectionPause.js.map +1 -0
- package/dist/integration/CustomColumnPromoter.d.ts +72 -6
- package/dist/integration/CustomColumnPromoter.d.ts.map +1 -1
- package/dist/integration/CustomColumnPromoter.js +93 -47
- package/dist/integration/CustomColumnPromoter.js.map +1 -1
- package/dist/integration/EntityMapLifecycle.d.ts +78 -4
- package/dist/integration/EntityMapLifecycle.d.ts.map +1 -1
- package/dist/integration/EntityMapLifecycle.js +199 -5
- package/dist/integration/EntityMapLifecycle.js.map +1 -1
- package/dist/integration/InactiveRowWarnings.d.ts +31 -0
- package/dist/integration/InactiveRowWarnings.d.ts.map +1 -1
- package/dist/integration/InactiveRowWarnings.js +29 -0
- package/dist/integration/InactiveRowWarnings.js.map +1 -1
- package/dist/integration/ObjectNamesByID.d.ts +28 -0
- package/dist/integration/ObjectNamesByID.d.ts.map +1 -0
- package/dist/integration/ObjectNamesByID.js +87 -0
- package/dist/integration/ObjectNamesByID.js.map +1 -0
- package/dist/integration/PostRestartIntrospect.d.ts +26 -0
- package/dist/integration/PostRestartIntrospect.d.ts.map +1 -0
- package/dist/integration/PostRestartIntrospect.js +27 -0
- package/dist/integration/PostRestartIntrospect.js.map +1 -0
- package/dist/integration/RSUPostRestartProgress.d.ts +176 -0
- package/dist/integration/RSUPostRestartProgress.d.ts.map +1 -0
- package/dist/integration/RSUPostRestartProgress.js +323 -0
- package/dist/integration/RSUPostRestartProgress.js.map +1 -0
- package/dist/integration/RSUProgressBridge.d.ts +41 -2
- package/dist/integration/RSUProgressBridge.d.ts.map +1 -1
- package/dist/integration/RSUProgressBridge.js +84 -1
- package/dist/integration/RSUProgressBridge.js.map +1 -1
- package/dist/integration/RunArtifactAuthorization.d.ts +39 -0
- package/dist/integration/RunArtifactAuthorization.d.ts.map +1 -0
- package/dist/integration/RunArtifactAuthorization.js +45 -0
- package/dist/integration/RunArtifactAuthorization.js.map +1 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts +9 -0
- package/dist/integration/SchemaRefreshLaunch.d.ts.map +1 -1
- package/dist/integration/SchemaRefreshLaunch.js +3 -2
- package/dist/integration/SchemaRefreshLaunch.js.map +1 -1
- package/dist/integration/ScopedFieldsForBuild.d.ts +46 -0
- package/dist/integration/ScopedFieldsForBuild.d.ts.map +1 -0
- package/dist/integration/ScopedFieldsForBuild.js +91 -0
- package/dist/integration/ScopedFieldsForBuild.js.map +1 -0
- package/dist/integration/TargetConfigGuard.d.ts +40 -0
- package/dist/integration/TargetConfigGuard.d.ts.map +1 -0
- package/dist/integration/TargetConfigGuard.js +40 -0
- package/dist/integration/TargetConfigGuard.js.map +1 -0
- 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/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/ownedRealtimeSession.d.ts +8 -6
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +14 -6
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +103 -11
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +147 -22
- 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 +203 -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/visitorIdentity.d.ts.map +1 -1
- package/dist/realtimeWidget/visitorIdentity.js +1 -0
- package/dist/realtimeWidget/visitorIdentity.js.map +1 -1
- package/dist/realtimeWidget/widgetCore.d.ts +20 -1
- package/dist/realtimeWidget/widgetCore.d.ts.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +21 -8
- 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 +3 -1
- package/dist/realtimeWidget/widgetGuestElevation.js.map +1 -1
- package/dist/requestOrigin.d.ts +22 -0
- package/dist/requestOrigin.d.ts.map +1 -0
- package/dist/requestOrigin.js +60 -0
- package/dist/requestOrigin.js.map +1 -0
- 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 +44 -17
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +2 -1
- package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -1
- package/dist/resolvers/ConversationRunEventsResolver.js +2 -0
- package/dist/resolvers/ConversationRunEventsResolver.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/ExecuteRemoteOperationResolver.d.ts +6 -0
- package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -1
- package/dist/resolvers/ExecuteRemoteOperationResolver.js +30 -7
- package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts +28 -0
- package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
- package/dist/resolvers/FetchEntityVectorsResolver.js +117 -21
- 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 +5 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +13 -4
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +401 -11
- package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
- package/dist/resolvers/IntegrationDiscoveryResolver.js +2713 -1290
- package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts.map +1 -1
- package/dist/resolvers/MCPResolver.js +13 -2
- package/dist/resolvers/MCPResolver.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.map +1 -1
- package/dist/resolvers/QueryResolver.js +20 -6
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts +38 -0
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +184 -88
- 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/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +1 -0
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +22 -2
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +118 -33
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts +62 -10
- package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
- package/dist/resolvers/RemoteBrowserActionResolver.js +224 -39
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +80 -16
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +388 -125
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +5 -3
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +19 -18
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +7 -5
- 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/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +4 -0
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.d.ts.map +1 -1
- package/dist/resolvers/TestQuerySQLResolver.js +1 -0
- package/dist/resolvers/TestQuerySQLResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +17 -2
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +60 -15
- 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/meetingRecordingRegistration.d.ts.map +1 -1
- package/dist/resolvers/meetingRecordingRegistration.js +2 -0
- package/dist/resolvers/meetingRecordingRegistration.js.map +1 -1
- 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/MediaAccessKeys.d.ts.map +1 -1
- package/dist/rest/MediaAccessKeys.js +6 -2
- package/dist/rest/MediaAccessKeys.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -1
- package/dist/rest/OAuthCallbackHandler.js +11 -5
- package/dist/rest/OAuthCallbackHandler.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 +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +6 -8
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +6 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +24 -6
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +3 -1
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +11 -2
- package/dist/rest/setupRESTEndpoints.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/DurableEntityActionTaskSubmitter.d.ts.map +1 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js +6 -1
- package/dist/services/DurableEntityActionTaskSubmitter.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +2 -26
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/TaskGraphAgentRunner.d.ts +6 -0
- package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphAgentRunner.js +38 -0
- package/dist/services/TaskGraphAgentRunner.js.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.d.ts +5 -0
- package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +43 -15
- package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +2 -1
- package/dist/services/WorkQueueHostService.d.ts.map +1 -1
- package/dist/services/WorkQueueHostService.js +19 -4
- package/dist/services/WorkQueueHostService.js.map +1 -1
- package/dist/services/workQueueConfig.d.ts +2 -2
- package/dist/services/workQueueConfig.js +5 -5
- package/dist/services/workQueueConfig.js.map +1 -1
- package/dist/sharedCache.js +1 -1
- package/dist/sharedCache.js.map +1 -1
- package/dist/types.d.ts +40 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +98 -98
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActionResolver.fieldSecurity.test.ts +237 -0
- package/src/__tests__/ActiveOperations.test.ts +68 -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 +150 -0
- package/src/__tests__/AssertTargetConfigs.test.ts +75 -0
- package/src/__tests__/BatchApplyParity.test.ts +109 -0
- package/src/__tests__/BridgeHostInstance.test.ts +42 -0
- package/src/__tests__/CollectInactiveRowWarnings.test.ts +115 -0
- package/src/__tests__/ConnectionPause.test.ts +192 -0
- package/src/__tests__/ConnectionPauseResolver.test.ts +166 -0
- package/src/__tests__/ConnectionPauseSave.test.ts +143 -0
- package/src/__tests__/CustomColumnPromoterCompletion.test.ts +142 -0
- package/src/__tests__/CustomColumnPromoterOnePass.test.ts +15 -1
- package/src/__tests__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityCommunicationsResolver.actingUser.test.ts +151 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/EvolutionActsOnWhatItDetects.test.ts +113 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -0
- package/src/__tests__/FetchEntityVectorsResolver.test.ts +206 -3
- package/src/__tests__/FileResolver.fieldSecurity.test.ts +82 -0
- package/src/__tests__/HandoffOfferExpiry.test.ts +40 -0
- package/src/__tests__/IntegrationRunArtifactAuthorization.test.ts +126 -0
- package/src/__tests__/MagicLinkKeys.test.ts +102 -0
- package/src/__tests__/MediaAccessKeys.test.ts +57 -10
- package/src/__tests__/NewArrivalsDefaultDisabled.test.ts +50 -0
- package/src/__tests__/ObjectNamesByID.test.ts +176 -0
- package/src/__tests__/PipelineProgressResolver.filter.test.ts +58 -0
- package/src/__tests__/PostRestartMapsInCatalogScope.test.ts +146 -0
- package/src/__tests__/QuerySystemUserResolver.childRows.test.ts +80 -0
- package/src/__tests__/QuerySystemUserResolver.collision.test.ts +200 -0
- package/src/__tests__/QuerySystemUserResolver.fieldSecurity.test.ts +49 -0
- package/src/__tests__/QuerySystemUserResolver.permissions.test.ts +132 -0
- package/src/__tests__/RESTEndpointHandler.test.ts +25 -0
- package/src/__tests__/RSUPostRestartProgress.test.ts +343 -0
- package/src/__tests__/RSUProgressBridge.test.ts +188 -5
- package/src/__tests__/RSUStartupSweepWiring.test.ts +30 -0
- package/src/__tests__/ReactivateRefreshMessage.test.ts +10 -3
- package/src/__tests__/RealtimeClientSessionResolver.configTamper.test.ts +23 -3
- package/src/__tests__/RealtimeClientSessionResolver.test.ts +346 -46
- package/src/__tests__/{RefreshAdoptsNewColumns.test.ts → RefreshReportsNewColumns.test.ts} +25 -16
- package/src/__tests__/RemoteBrowserActionRecovery.test.ts +287 -0
- package/src/__tests__/RemoteBrowserActionResolver.goalRunLink.test.ts +3 -0
- package/src/__tests__/RemoteBrowserActionResolver.ownership.test.ts +100 -0
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +344 -14
- package/src/__tests__/ResolverBase.deleteReturnProjection.test.ts +52 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +227 -0
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +83 -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 +72 -13
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.conversationWriter.test.ts +210 -0
- package/src/__tests__/RunAIAgentResolver.fireAndForgetCompletion.test.ts +209 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +19 -27
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +10 -2
- package/src/__tests__/RunAIAgentResolver.serverReply.test.ts +358 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +91 -13
- package/src/__tests__/RunTemplateResolver.test.ts +35 -2
- package/src/__tests__/RunViewResolver.cacheCheckForwarding.test.ts +11 -0
- package/src/__tests__/SchemaEvolutionCustomColumns.test.ts +119 -0
- package/src/__tests__/SchemaRefreshLaunch.test.ts +24 -2
- package/src/__tests__/ScopedFieldsForBuild.test.ts +192 -0
- package/src/__tests__/SessionJanitor.test.ts +195 -4
- package/src/__tests__/SessionManager.test.ts +164 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +114 -3
- package/src/__tests__/TransactionGroupResolver.fieldSecurity.test.ts +199 -0
- package/src/__tests__/UserViewResolver.updateWhereClause.test.ts +15 -0
- package/src/__tests__/ViewOperationsHandler.test.ts +9 -7
- package/src/__tests__/WidgetSessionService.test.ts +583 -4
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/apiRootBoot.test.ts +1 -1
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/buildMagicLinkSessionUser.test.ts +96 -0
- package/src/__tests__/cacheBroadcastProviders.test.ts +403 -0
- package/src/__tests__/cacheInvalidationRecordData.test.ts +45 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/fieldSecurityFixtures.ts +91 -0
- package/src/__tests__/globalCors.test.ts +3 -3
- package/src/__tests__/localDevAuth.test.ts +196 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/orphanedConversationDetailReconciler.test.ts +10 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/pushStatusResolver.filter.test.ts +57 -1
- package/src/__tests__/realtimeRecordingHandler.test.ts +24 -2
- 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 +224 -7
- package/src/__tests__/realtimeSessions/sessionConfigStamps.test.ts +1 -1
- package/src/__tests__/realtimeSessions/verificationWorkflow.test.ts +25 -4
- package/src/__tests__/requestOrigin.test.ts +104 -0
- 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__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sessionUserClone.test.ts +5 -1
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/startupSweepOrder.test.ts +40 -0
- package/src/__tests__/unifiedAuth.test.ts +101 -1
- package/src/__tests__/widgetGuestElevation.test.ts +2 -0
- package/src/agentSessions/BridgeHostInstance.ts +20 -5
- package/src/agentSessions/HandoffOfferExpiry.ts +18 -0
- package/src/agentSessions/ReturningVisitorRecap.ts +1 -0
- package/src/agentSessions/SessionJanitor.ts +95 -45
- package/src/agentSessions/SessionManager.ts +73 -20
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/AuthProviderCatalogRouter.ts +3 -0
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/index.ts +56 -12
- package/src/auth/initializeProviders.ts +43 -1
- package/src/auth/localDevAuth.ts +528 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +147 -15
- package/src/auth/magicLink/MagicLinkRouter.ts +33 -6
- package/src/auth/magicLink/MagicLinkService.ts +250 -10
- package/src/auth/magicLink/index.ts +1 -1
- package/src/auth/magicLink/redeemLanding.ts +7 -4
- package/src/auth/magicLink/types.ts +38 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/auth/sessionUserClone.ts +3 -2
- package/src/backgroundSweepConfigUnits.ts +213 -0
- 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 +138 -0
- package/src/context.ts +71 -14
- package/src/coreRoutes.ts +29 -7
- package/src/generated/graphql-schemas/__mj.ts +4145 -1193
- package/src/generic/CacheInvalidationResolver.ts +135 -78
- package/src/generic/OrphanedConversationDetailReconciler.ts +36 -3
- package/src/generic/PubSubManager.ts +54 -1
- package/src/generic/PushStatusResolver.ts +108 -11
- package/src/generic/ResolverBase.ts +635 -234
- package/src/generic/RunViewResolver.ts +176 -64
- package/src/generic/actionOutputFieldSecurity.ts +75 -0
- package/src/generic/fieldSecurityTransport.ts +62 -0
- package/src/index.ts +310 -85
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +129 -54
- package/src/integration/EntityMapLifecycle.ts +229 -6
- package/src/integration/InactiveRowWarnings.ts +50 -0
- package/src/integration/ObjectNamesByID.ts +97 -0
- package/src/integration/PostRestartIntrospect.ts +49 -0
- package/src/integration/RSUPostRestartProgress.ts +359 -0
- package/src/integration/RSUProgressBridge.ts +85 -2
- package/src/integration/RunArtifactAuthorization.ts +65 -0
- package/src/integration/SchemaRefreshLaunch.ts +12 -2
- package/src/integration/ScopedFieldsForBuild.ts +113 -0
- package/src/integration/TargetConfigGuard.ts +71 -0
- package/src/logging/variablesLoggingMiddleware.ts +59 -3
- package/src/realtimeSessions/README.md +7 -3
- package/src/realtimeSessions/SessionVerificationPortsBase.ts +1 -0
- package/src/realtimeSessions/ownedRealtimeSession.ts +16 -6
- package/src/realtimeSessions/sessionAccess.ts +211 -25
- 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 +254 -17
- package/src/realtimeWidget/host-identity.ts +1 -1
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +34 -9
- package/src/realtimeWidget/widgetGuestElevation.ts +3 -1
- package/src/requestOrigin.ts +64 -0
- 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 +50 -18
- package/src/resolvers/AutotagPipelineResolver.ts +2 -1
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/EntityCommunicationsResolver.ts +56 -15
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/FetchEntityVectorsResolver.ts +132 -21
- package/src/resolvers/FileCategoryResolver.ts +1 -0
- package/src/resolvers/FileResolver.ts +14 -4
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1570 -209
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/MergeRecordsResolver.ts +23 -2
- package/src/resolvers/PipelineProgressResolver.ts +12 -3
- package/src/resolvers/QueryResolver.ts +20 -6
- package/src/resolvers/QuerySystemUserResolver.ts +207 -99
- package/src/resolvers/RSUResolver.ts +12 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +144 -40
- package/src/resolvers/RemoteBrowserActionResolver.ts +252 -37
- package/src/resolvers/RunAIAgentResolver.ts +518 -163
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +9 -5
- package/src/resolvers/RunTestResolver.ts +3 -1
- package/src/resolvers/SyncDataResolver.ts +4 -0
- package/src/resolvers/TestQuerySQLResolver.ts +1 -0
- package/src/resolvers/TransactionGroupResolver.ts +66 -15
- package/src/resolvers/UserViewResolver.ts +2 -1
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +43 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/rest/EntityCRUDHandler.ts +22 -5
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RESTEndpointHandler.ts +8 -5
- package/src/rest/RealtimeRecordingHandler.ts +9 -10
- package/src/rest/ViewOperationsHandler.ts +26 -7
- package/src/rest/setupRESTEndpoints.ts +11 -2
- package/src/serverRoleConfigUnits.ts +48 -0
- package/src/services/DurableEntityActionTaskSubmitter.ts +10 -2
- package/src/services/TaskGraphActionRunner.ts +2 -23
- package/src/services/TaskGraphAgentRunner.ts +43 -0
- package/src/services/TaskGraphContinuationDeliverer.ts +53 -20
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +41 -1
- package/src/services/TaskOrchestration-Integration.md +0 -188
package/src/config.ts
CHANGED
|
@@ -5,6 +5,15 @@ import { LogError, LogStatus, LogStatusEx } from '@memberjunction/core';
|
|
|
5
5
|
import { mergeConfigs, parseBooleanEnv } from '@memberjunction/config';
|
|
6
6
|
import { TelemetryEnabledDefault } from './telemetryConfigUnits.js';
|
|
7
7
|
import { RealtimeEnabledDefault } from './realtimeConfigUnits.js';
|
|
8
|
+
import { ResolveServerRole, type ServerRole } from './serverRoleConfigUnits.js';
|
|
9
|
+
import {
|
|
10
|
+
AgentRunWatchdogDefaultsFromEnv,
|
|
11
|
+
AgentRunWatchdogSchema,
|
|
12
|
+
AgentSessionsDefaultsFromEnv,
|
|
13
|
+
AgentSessionsSchema,
|
|
14
|
+
ConversationDetailReconcilerDefaultsFromEnv,
|
|
15
|
+
ConversationDetailReconcilerSchema,
|
|
16
|
+
} from './backgroundSweepConfigUnits.js';
|
|
8
17
|
|
|
9
18
|
const explorer = cosmiconfigSync('mj', { searchStrategy: 'global' });
|
|
10
19
|
|
|
@@ -316,6 +325,45 @@ const cacheSettingsSchema = z.object({
|
|
|
316
325
|
* for it. 0 disables the turn-taking. Default: 30.
|
|
317
326
|
*/
|
|
318
327
|
startupWarmupLeaseSeconds: z.number().int().nonnegative().optional().default(30),
|
|
328
|
+
/**
|
|
329
|
+
* Pluggable cache invalidation broadcast topology configuration.
|
|
330
|
+
* Defaults to `'SequencedRoleBucket'` (Topology 1 Monotonic Sequence Ring Buffer + Topology 2
|
|
331
|
+
* Role-Fingerprint $O(\text{Roles})$ evaluation & shaping memoizer).
|
|
332
|
+
*/
|
|
333
|
+
broadcast: z
|
|
334
|
+
.object({
|
|
335
|
+
provider: z.string().optional().default('SequencedRoleBucket'),
|
|
336
|
+
ringBufferSize: z.number().int().positive().optional().default(5000),
|
|
337
|
+
excludedEntities: z.array(z.string()).optional().default([]),
|
|
338
|
+
azureWebPubSub: z
|
|
339
|
+
.object({
|
|
340
|
+
endpoint: z.string().optional(),
|
|
341
|
+
hubName: z.string().optional(),
|
|
342
|
+
accessKey: z.string().optional(),
|
|
343
|
+
tokenTtlMinutes: z.number().positive().optional(),
|
|
344
|
+
})
|
|
345
|
+
.optional(),
|
|
346
|
+
awsIoTCore: z
|
|
347
|
+
.object({
|
|
348
|
+
endpoint: z.string().optional(),
|
|
349
|
+
region: z.string().optional(),
|
|
350
|
+
topicPrefix: z.string().optional(),
|
|
351
|
+
accessKeyId: z.string().optional(),
|
|
352
|
+
secretAccessKey: z.string().optional(),
|
|
353
|
+
tokenTtlSeconds: z.number().positive().optional(),
|
|
354
|
+
})
|
|
355
|
+
.optional(),
|
|
356
|
+
gcpPubSub: z
|
|
357
|
+
.object({
|
|
358
|
+
projectId: z.string().optional(),
|
|
359
|
+
topicPrefix: z.string().optional(),
|
|
360
|
+
gatewayUrl: z.string().optional(),
|
|
361
|
+
signingSecret: z.string().optional(),
|
|
362
|
+
tokenTtlSeconds: z.number().positive().optional(),
|
|
363
|
+
})
|
|
364
|
+
.optional(),
|
|
365
|
+
})
|
|
366
|
+
.optional(),
|
|
319
367
|
});
|
|
320
368
|
|
|
321
369
|
const loggingSettingsSchema = z.object({
|
|
@@ -466,6 +514,13 @@ const magicLinkSchema = z.object({
|
|
|
466
514
|
* returns the token as JSON. Append `?format=json` to force JSON regardless.
|
|
467
515
|
*/
|
|
468
516
|
explorerUrl: z.string().optional(),
|
|
517
|
+
/**
|
|
518
|
+
* Explicit frontend origins permitted for per-invite `RedirectUrl` targets (in addition to
|
|
519
|
+
* `explorerUrl` and concrete non-wildcard entries in `cors.allowedOrigins`). Wildcard `'*'`
|
|
520
|
+
* entries are always ignored so deployments using the default `cors.allowedOrigins: ['*']`
|
|
521
|
+
* never expose an open redirect carrying session tokens.
|
|
522
|
+
*/
|
|
523
|
+
allowedRedirectOrigins: z.array(z.string()).optional(),
|
|
469
524
|
}).passthrough();
|
|
470
525
|
|
|
471
526
|
/**
|
|
@@ -831,6 +886,44 @@ const identityVerificationSchema = z.object({
|
|
|
831
886
|
}).optional().default({}),
|
|
832
887
|
}).passthrough();
|
|
833
888
|
|
|
889
|
+
/**
|
|
890
|
+
* Remote browsers a TEXT conversation opens (`<mj-conversation-chat-area [AllowRemoteBrowser]>`), whose
|
|
891
|
+
* agents drive them through the `browser_*` tools. Realtime calls' browsers are not affected.
|
|
892
|
+
*
|
|
893
|
+
* Off by default: until `enabled` is true, every remote-browser operation on a conversation is refused,
|
|
894
|
+
* since each browser is a server Chromium process or a billed hosted session.
|
|
895
|
+
*/
|
|
896
|
+
const conversationBrowserSchema = z.object({
|
|
897
|
+
/** Master switch. When false, no conversation can open a browser. */
|
|
898
|
+
enabled: zodBooleanWithTransforms().default(false),
|
|
899
|
+
/** Also let anonymous principals (public widget guests, anonymous magic links) open one. */
|
|
900
|
+
allowAnonymous: zodBooleanWithTransforms().default(false),
|
|
901
|
+
/** Most conversation browsers one user (or one anonymous guest) may hold at once. Default 2. */
|
|
902
|
+
maxPerUser: z.coerce.number().int().positive().optional().default(2),
|
|
903
|
+
/**
|
|
904
|
+
* Most conversation browsers all anonymous guests together may hold at once, since a guest can start a
|
|
905
|
+
* new guest scope cheaply (limited only by the per-IP rate limit). Applies only with `allowAnonymous`. Default 4.
|
|
906
|
+
*/
|
|
907
|
+
maxAnonymousTotal: z.coerce.number().int().positive().optional().default(4),
|
|
908
|
+
/**
|
|
909
|
+
* Minutes unused after which a conversation browser is ended (a reloaded or closed tab never ends its own).
|
|
910
|
+
* Used means an agent or the user acts on it, or its open drawer polls for a snapshot; a drawer showing a
|
|
911
|
+
* pushed screencast with nothing else happening counts as unused. Default 15.
|
|
912
|
+
*/
|
|
913
|
+
idleMinutes: z.coerce.number().positive().optional().default(15),
|
|
914
|
+
/**
|
|
915
|
+
* Private hosts a conversation browser may still reach, as `host` or `host:port` (e.g. `localhost:4200`).
|
|
916
|
+
* Every other loopback, link-local or private-network HOSTNAME is refused (private IPv4 and IPv6 ranges,
|
|
917
|
+
* `localhost`, names under `.local`, `.localdomain`, `.internal`, `.intranet`, `.lan`, `.corp`, `.home`,
|
|
918
|
+
* `.home.arpa`, `.private` and `.svc`, and the Docker, Kubernetes and cloud-metadata names), including where
|
|
919
|
+
* a main-frame redirect lands, and in popups the page opens. This is a best-effort hostname check. Gets through: a public name that resolves to a
|
|
920
|
+
* private address, WebSockets, service-worker fetches, an iframe whose source redirects to a private
|
|
921
|
+
* host, redirects of the page's own requests, and the redirect request itself (only where it lands is
|
|
922
|
+
* refused). For real isolation, run the browsers under network egress rules. Default none.
|
|
923
|
+
*/
|
|
924
|
+
allowedPrivateHosts: z.array(z.string()).optional().default([]),
|
|
925
|
+
}).passthrough();
|
|
926
|
+
|
|
834
927
|
const realtimeSchema = z.object({
|
|
835
928
|
/** Master switch. When false, the WebRTC SDP broker router is not mounted. Defaults to true. */
|
|
836
929
|
enabled: zodBooleanWithTransforms().default(true),
|
|
@@ -841,11 +934,21 @@ const realtimeSchema = z.object({
|
|
|
841
934
|
* is assembled anyway as `Partial` (gaps become silence). Defaults to 90.
|
|
842
935
|
*/
|
|
843
936
|
recordingAssemblyGraceSeconds: z.coerce.number().positive().optional().default(90),
|
|
937
|
+
/** Remote browsers that text conversations open (off by default). */
|
|
938
|
+
conversationBrowser: conversationBrowserSchema.optional().default({}),
|
|
939
|
+
}).passthrough();
|
|
940
|
+
|
|
941
|
+
const devAuthSchema = z.object({
|
|
942
|
+
/** Master switch for local-only development JWT auth (`MJ_DEV_AUTH_ENABLED=true`). Forbidden when NODE_ENV=production. */
|
|
943
|
+
enabled: zodBooleanWithTransforms().default(false),
|
|
944
|
+
/** Optional default email for `/auth/dev-login` when no email is specified in the request body. */
|
|
945
|
+
defaultEmail: z.string().optional(),
|
|
844
946
|
}).passthrough();
|
|
845
947
|
|
|
846
948
|
const configInfoSchema = z.object({
|
|
847
949
|
userHandling: userHandlingInfoSchema,
|
|
848
950
|
magicLink: magicLinkSchema.optional().default({}),
|
|
951
|
+
devAuth: devAuthSchema.optional().default({}),
|
|
849
952
|
widget: widgetSchema.optional().default({}),
|
|
850
953
|
telephony: telephonySchema.optional().default({}),
|
|
851
954
|
realtime: realtimeSchema.optional().default({}),
|
|
@@ -856,6 +959,9 @@ const configInfoSchema = z.object({
|
|
|
856
959
|
authProviders: z.array(authProviderSchema).optional(),
|
|
857
960
|
componentRegistries: z.array(componentRegistrySchema).optional(),
|
|
858
961
|
scheduledJobs: scheduledJobsSchema.optional().default({}),
|
|
962
|
+
agentSessions: AgentSessionsSchema.optional().default({}),
|
|
963
|
+
agentRunWatchdog: AgentRunWatchdogSchema.optional().default({}),
|
|
964
|
+
conversationDetailReconciler: ConversationDetailReconcilerSchema.optional().default({}),
|
|
859
965
|
integrationSyncWorker: integrationSyncWorkerSchema.optional().default({}),
|
|
860
966
|
workQueue: WorkQueueSchema.optional().default({}),
|
|
861
967
|
telemetry: telemetrySchema.optional().default({}),
|
|
@@ -905,13 +1011,24 @@ const configInfoSchema = z.object({
|
|
|
905
1011
|
.transform((val) => z.record(z.string()).parse(JSON.parse(val)))
|
|
906
1012
|
.optional(),
|
|
907
1013
|
mjCoreSchema: z.string(),
|
|
1014
|
+
/**
|
|
1015
|
+
* Server execution role for horizontal scaling:
|
|
1016
|
+
* - `'all'` (default): runs both interactive HTTP/GraphQL/WebSocket handlers and background worker loops.
|
|
1017
|
+
* - `'api'`: runs interactive HTTP/GraphQL/WebSocket handlers only; background worker loops are skipped.
|
|
1018
|
+
* - `'worker'`: runs background worker loops (`ScheduledJobsService`, `IntegrationSyncWorkerService`,
|
|
1019
|
+
* `StartTaskGraphDispatcher`, `StartWorkQueueHost`, `SessionJanitor`, reconcilers).
|
|
1020
|
+
*/
|
|
1021
|
+
serverRole: z.enum(['all', 'api', 'worker']).optional().default('all'),
|
|
908
1022
|
});
|
|
909
1023
|
|
|
1024
|
+
export type { ServerRole };
|
|
1025
|
+
|
|
910
1026
|
export type UserHandlingInfo = z.infer<typeof userHandlingInfoSchema>;
|
|
911
1027
|
export type MagicLinkConfig = z.infer<typeof magicLinkSchema>;
|
|
912
1028
|
export type WidgetConfig = z.infer<typeof widgetSchema>;
|
|
913
1029
|
export type TelephonyConfig = z.infer<typeof telephonySchema>;
|
|
914
1030
|
export type RealtimeConfig = z.infer<typeof realtimeSchema>;
|
|
1031
|
+
export type ConversationBrowserConfig = z.infer<typeof conversationBrowserSchema>;
|
|
915
1032
|
export type IdentityVerificationConfig = z.infer<typeof identityVerificationSchema>;
|
|
916
1033
|
export type TwilioTelephonyConfig = z.infer<typeof twilioTelephonySchema>;
|
|
917
1034
|
export type VonageTelephonyConfig = z.infer<typeof vonageTelephonySchema>;
|
|
@@ -976,6 +1093,7 @@ export const DEFAULT_SERVER_CONFIG: Partial<ConfigInfo> = {
|
|
|
976
1093
|
enableIntrospection: process.env.ENABLE_INTROSPECTION === 'true',
|
|
977
1094
|
apiKey: process.env.MJ_API_KEY,
|
|
978
1095
|
websiteRunFromPackage: process.env.WEBSITE_RUN_FROM_PACKAGE ? parseInt(process.env.WEBSITE_RUN_FROM_PACKAGE, 10) : undefined,
|
|
1096
|
+
serverRole: ResolveServerRole(process.env.MJ_SERVER_ROLE),
|
|
979
1097
|
|
|
980
1098
|
// User handling defaults
|
|
981
1099
|
userHandling: {
|
|
@@ -1055,6 +1173,16 @@ export const DEFAULT_SERVER_CONFIG: Partial<ConfigInfo> = {
|
|
|
1055
1173
|
staleLockCleanupInterval: 300000
|
|
1056
1174
|
},
|
|
1057
1175
|
|
|
1176
|
+
// Background sweeps that query the database on a timer (session janitor, bridge and conversation-
|
|
1177
|
+
// detail reconcilers, agent-run watchdog). Defaults are the values MJAPI always used; each has an
|
|
1178
|
+
// env override (MJ_SESSION_JANITOR_*, MJ_BRIDGE_RECONCILER_*, MJ_CONVERSATION_DETAIL_RECONCILER_*,
|
|
1179
|
+
// MJ_AGENT_RUN_WATCHDOG_SWEEP_INTERVAL_MS), read here rather than in the schema because this object
|
|
1180
|
+
// is the merge base (see the telemetry note below). A bad value fails startup, naming the variable.
|
|
1181
|
+
// guides/SERVERLESS_DATABASE_AUTO_PAUSE_GUIDE.md lists every switch.
|
|
1182
|
+
agentSessions: AgentSessionsDefaultsFromEnv(process.env),
|
|
1183
|
+
conversationDetailReconciler: ConversationDetailReconcilerDefaultsFromEnv(process.env),
|
|
1184
|
+
agentRunWatchdog: AgentRunWatchdogDefaultsFromEnv(process.env),
|
|
1185
|
+
|
|
1058
1186
|
// Integration sync worker defaults (off — syncs run inline unless a worker is enabled)
|
|
1059
1187
|
integrationSyncWorker: {
|
|
1060
1188
|
enabled: false,
|
|
@@ -1187,6 +1315,16 @@ export function LoadConfig() {
|
|
|
1187
1315
|
LogError('Error parsing config file', null, JSON.stringify(configParsing.error.issues, null, 2));
|
|
1188
1316
|
throw new Error('Configuration validation failed');
|
|
1189
1317
|
}
|
|
1318
|
+
|
|
1319
|
+
const rawDevAuthEnv = process.env.MJ_DEV_AUTH_ENABLED?.trim().toLowerCase();
|
|
1320
|
+
const isDevAuthEnabled =
|
|
1321
|
+
rawDevAuthEnv === 'true' || rawDevAuthEnv === '1' || configParsing.data.devAuth?.enabled === true;
|
|
1322
|
+
if (isDevAuthEnabled && process.env.NODE_ENV?.trim().toLowerCase() === 'production') {
|
|
1323
|
+
throw new Error(
|
|
1324
|
+
'[SECURITY] Local dev auth (MJ_DEV_AUTH_ENABLED) is strictly forbidden when NODE_ENV=production. Refusing to start.'
|
|
1325
|
+
);
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1190
1328
|
return configParsing.data;
|
|
1191
1329
|
}
|
|
1192
1330
|
|
package/src/context.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { AuthenticationError, AuthorizationError } from 'type-graphql';
|
|
|
7
7
|
import sql from 'mssql';
|
|
8
8
|
import { GetSigningKeys, GetSystemUser, GetValidationOptions, VerifyUserRecord, ExtractUserInfoFromPayload } from './auth/index.js';
|
|
9
9
|
import { CloneUserForSessionContext } from './auth/sessionUserClone.js';
|
|
10
|
+
import { EmailsMatch, ResolveUserLookupEmail, type LoginEmailResolution } from './auth/loginEmailResolution.js';
|
|
10
11
|
import { GetAPIKeyActingContextResolver } from './auth/actingContextResolver.js';
|
|
11
12
|
import { TokenExpiredError, AuthProviderFactory } from '@memberjunction/auth-providers';
|
|
12
13
|
import { AuthCache } from './cache.js';
|
|
@@ -15,13 +16,15 @@ import { BuildPostgreSQLConnectionConfig, PostgreSQLReadOnlyPool, ResolvePostgre
|
|
|
15
16
|
import { BuildBoundaryLogPayload } from './logging/boundaryLogPayload.js';
|
|
16
17
|
import { StartupLogger } from './logging/StartupLogger.js';
|
|
17
18
|
import { DataSourceInfo, UserPayload } from './types.js';
|
|
19
|
+
import { ReadRequestOrigin } from './requestOrigin.js';
|
|
18
20
|
import { GetReadOnlyDataSource, GetReadWriteDataSource } from './util.js';
|
|
19
21
|
import { v4 as uuidv4 } from 'uuid';
|
|
20
22
|
import e from 'express';
|
|
21
23
|
import type { RequestHandler, Request, Response, NextFunction } from 'express';
|
|
22
24
|
import { DatabaseProviderBase, UserInfo, type IMetadataProvider, type MagicLinkScope, type ReturningVisitorContext, type WidgetGuestContext } from '@memberjunction/core';
|
|
23
25
|
import { SQLServerDataProvider, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
|
|
24
|
-
import {
|
|
26
|
+
import { PostgreSQLDataProvider, PostgreSQLProviderConfigData } from '@memberjunction/postgresql-dataprovider';
|
|
27
|
+
import { Metadata, IsValidTimeZone, TIME_ZONE_HEADER } from '@memberjunction/core';
|
|
25
28
|
import { IdentityClaimEngineServer } from '@memberjunction/core-entities-server';
|
|
26
29
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
27
30
|
import { UserCache, resolveDbPlatformFromEnv } from '@memberjunction/generic-database-provider';
|
|
@@ -145,6 +148,28 @@ async function writeSessionAudit(args: {
|
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
|
|
151
|
+
/**
|
|
152
|
+
* Logs a session whose User record is not the identity its token carries, and returns whether that
|
|
153
|
+
* is the case. Runs once per issued token (inside the session-audit dedup). A `USER_EMAIL_MAP`
|
|
154
|
+
* rewrite is reported as such; any other difference means the lookup reached another person's
|
|
155
|
+
* record. Anonymous magic-link sessions run as a synthetic principal by design and are skipped.
|
|
156
|
+
*/
|
|
157
|
+
function reportIdentityMismatch(loginEmail: LoginEmailResolution, sessionUser: UserInfo): boolean {
|
|
158
|
+
if (sessionUser.IsMagicLinkAnonymous || EmailsMatch(loginEmail.TokenEmail, sessionUser.Email)) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
if (loginEmail.Remapped) {
|
|
162
|
+
console.warn(
|
|
163
|
+
`[Auth] USER_EMAIL_MAP remapped login '${loginEmail.TokenEmail}' to '${loginEmail.LookupEmail}'; the session runs as user ${sessionUser.ID} (${sessionUser.Email})`,
|
|
164
|
+
);
|
|
165
|
+
} else {
|
|
166
|
+
console.warn(
|
|
167
|
+
`[Auth] Login identity '${loginEmail.TokenEmail ?? ''}' resolved to user ${sessionUser.ID} with a different email (${sessionUser.Email}); check the User records for this address`,
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
|
|
148
173
|
/** Best-effort failure audit: decodes the attempted identity, dedupes, attributes to the system user. */
|
|
149
174
|
async function auditLoginFailure(
|
|
150
175
|
bearerToken: string | undefined,
|
|
@@ -204,12 +229,17 @@ async function auditLoginFailure(
|
|
|
204
229
|
// userRecord may be a SHARED cached instance (e.g. multiple recruiters on one per-company
|
|
205
230
|
// link) — mutating it would leak one session's scope to another. Non-magic-link sessions,
|
|
206
231
|
// and named sessions with no resource scope, are returned untouched.
|
|
207
|
-
function
|
|
232
|
+
export function BuildMagicLinkSessionUser(userRecord: UserInfo, payload: jwt.JwtPayload): UserInfo {
|
|
208
233
|
if (payload['mj_magic_link'] !== true) {
|
|
209
234
|
return userRecord;
|
|
210
235
|
}
|
|
211
236
|
const md = Metadata.Provider; // global-provider-ok: server-side magic-link session built under the server's single default provider
|
|
212
237
|
const isAnon = payload['mj_anon'] === true;
|
|
238
|
+
const rawSid = payload['mj_sid'];
|
|
239
|
+
const mjSid = typeof rawSid === 'string' ? rawSid.trim() : '';
|
|
240
|
+
if (isAnon && !mjSid) {
|
|
241
|
+
throw new AuthenticationError('Anonymous magic-link session token is missing required mj_sid claim');
|
|
242
|
+
}
|
|
213
243
|
const scopes = payload['mj_scopes'];
|
|
214
244
|
|
|
215
245
|
// Per-session resource scope (single-resource share; multi-resource union is a follow-on).
|
|
@@ -279,6 +309,7 @@ function buildMagicLinkSessionUser(userRecord: UserInfo, payload: jwt.JwtPayload
|
|
|
279
309
|
// Mark the session so the CurrentUser field resolver serves these synthesized roles
|
|
280
310
|
// (the shared Anonymous principal holds none in the DB). See UserInfo.IsMagicLinkAnonymous.
|
|
281
311
|
sessionUser.IsMagicLinkAnonymous = true;
|
|
312
|
+
sessionUser.AnonymousVisitorID = mjSid;
|
|
282
313
|
}
|
|
283
314
|
return sessionUser;
|
|
284
315
|
}
|
|
@@ -420,7 +451,7 @@ export const GetUserPayload = async (
|
|
|
420
451
|
// very often the SHARED UserCache instance, and stamping it in place
|
|
421
452
|
// leaks one session's row-filter bindings / acting context to every
|
|
422
453
|
// concurrent session of the same user (same pattern as
|
|
423
|
-
//
|
|
454
|
+
// BuildMagicLinkSessionUser — see sessionUserClone.ts).
|
|
424
455
|
const userRecord = CloneUserForSessionContext(resolvedUser);
|
|
425
456
|
|
|
426
457
|
// Row-filter bindings for this key, rebuilt PER REQUEST from the
|
|
@@ -486,7 +517,11 @@ export const GetUserPayload = async (
|
|
|
486
517
|
throw new AuthenticationError('Missing token');
|
|
487
518
|
}
|
|
488
519
|
|
|
489
|
-
const
|
|
520
|
+
const cachedAuth = AuthCache.get(token);
|
|
521
|
+
const payload =
|
|
522
|
+
cachedAuth && typeof cachedAuth === 'object'
|
|
523
|
+
? cachedAuth
|
|
524
|
+
: jwt.decode(token);
|
|
490
525
|
if (!payload || typeof payload === 'string') {
|
|
491
526
|
throw new AuthenticationError('Invalid token payload');
|
|
492
527
|
}
|
|
@@ -498,7 +533,7 @@ export const GetUserPayload = async (
|
|
|
498
533
|
throw new TokenExpiredError(expiryDate);
|
|
499
534
|
}
|
|
500
535
|
|
|
501
|
-
if (!
|
|
536
|
+
if (!cachedAuth) {
|
|
502
537
|
const issuer = payload.iss;
|
|
503
538
|
if (!issuer) {
|
|
504
539
|
console.warn('No issuer claim on token');
|
|
@@ -513,12 +548,13 @@ export const GetUserPayload = async (
|
|
|
513
548
|
}
|
|
514
549
|
|
|
515
550
|
await verifyAsync(issuer, token);
|
|
516
|
-
AuthCache.set(token,
|
|
551
|
+
AuthCache.set(token, payload);
|
|
517
552
|
}
|
|
518
553
|
|
|
519
554
|
// Use provider to extract user information
|
|
520
555
|
const userInfo = ExtractUserInfoFromPayload(payload);
|
|
521
|
-
const
|
|
556
|
+
const loginEmail = ResolveUserLookupEmail(userInfo, userEmailMap);
|
|
557
|
+
const email = loginEmail.LookupEmail;
|
|
522
558
|
|
|
523
559
|
const userRecord = await VerifyUserRecord(
|
|
524
560
|
email,
|
|
@@ -540,11 +576,12 @@ export const GetUserPayload = async (
|
|
|
540
576
|
// Anonymous principal with an in-memory UserInfo carrying the claimed role(s), so
|
|
541
577
|
// the session enforces exactly the link's granted scope (no DB accretion). No-op
|
|
542
578
|
// for everything else.
|
|
543
|
-
const sessionUser =
|
|
579
|
+
const sessionUser = BuildMagicLinkSessionUser(userRecord, payload);
|
|
544
580
|
|
|
545
581
|
// Session-established audit — once per issued token (deduped), fire-and-forget so
|
|
546
582
|
// it never adds latency to the request. The dedup mark is set synchronously here.
|
|
547
583
|
if (markSessionAuditSeen(sessionAuditKey('sess', payload))) {
|
|
584
|
+
const identityMismatch = reportIdentityMismatch(loginEmail, sessionUser);
|
|
548
585
|
void writeSessionAudit({
|
|
549
586
|
user: sessionUser,
|
|
550
587
|
auditTypeName: SESSION_AUDIT_TYPE,
|
|
@@ -552,7 +589,16 @@ export const GetUserPayload = async (
|
|
|
552
589
|
payload,
|
|
553
590
|
requestContext,
|
|
554
591
|
requestDomain,
|
|
555
|
-
description:
|
|
592
|
+
description: identityMismatch
|
|
593
|
+
? `Session established via ${payload.iss ?? 'unknown provider'}: token identity '${loginEmail.TokenEmail ?? ''}' runs as user '${sessionUser.Email}'`
|
|
594
|
+
: `Session established via ${payload.iss ?? 'unknown provider'}`,
|
|
595
|
+
extraDetails: {
|
|
596
|
+
tokenEmail: loginEmail.TokenEmail ?? null,
|
|
597
|
+
lookupEmail: loginEmail.LookupEmail ?? null,
|
|
598
|
+
resolvedUserEmail: sessionUser.Email ?? null,
|
|
599
|
+
remappedByUserEmailMap: loginEmail.Remapped,
|
|
600
|
+
identityMismatch,
|
|
601
|
+
},
|
|
556
602
|
});
|
|
557
603
|
}
|
|
558
604
|
|
|
@@ -626,6 +672,15 @@ function parseRequestHostname(origin: string | undefined): string | undefined {
|
|
|
626
672
|
}
|
|
627
673
|
}
|
|
628
674
|
|
|
675
|
+
/**
|
|
676
|
+
* The caller's IANA time zone from the `x-mj-timezone` header, or undefined when the header is
|
|
677
|
+
* absent, repeated, or names no zone this runtime knows (callers then use UTC).
|
|
678
|
+
*/
|
|
679
|
+
function readTimeZoneHeader(req: IncomingMessage): string | undefined {
|
|
680
|
+
const value = req.headers[TIME_ZONE_HEADER];
|
|
681
|
+
return typeof value === 'string' && IsValidTimeZone(value) ? value : undefined;
|
|
682
|
+
}
|
|
683
|
+
|
|
629
684
|
function extractAuthInputs(req: IncomingMessage): {
|
|
630
685
|
bearerToken: string;
|
|
631
686
|
sessionId: string;
|
|
@@ -633,6 +688,7 @@ function extractAuthInputs(req: IncomingMessage): {
|
|
|
633
688
|
systemApiKey: string;
|
|
634
689
|
userApiKey: string;
|
|
635
690
|
requestContext: RequestContext;
|
|
691
|
+
timeZone: string | undefined;
|
|
636
692
|
} {
|
|
637
693
|
const sessionIdRaw = req.headers['x-session-id'];
|
|
638
694
|
const requestDomain = parseRequestHostname(req.headers.origin);
|
|
@@ -657,6 +713,7 @@ function extractAuthInputs(req: IncomingMessage): {
|
|
|
657
713
|
systemApiKey,
|
|
658
714
|
userApiKey,
|
|
659
715
|
requestContext,
|
|
716
|
+
timeZone: readTimeZoneHeader(req),
|
|
660
717
|
};
|
|
661
718
|
}
|
|
662
719
|
|
|
@@ -681,7 +738,7 @@ export function CreateUnifiedAuthMiddleware(
|
|
|
681
738
|
}
|
|
682
739
|
|
|
683
740
|
try {
|
|
684
|
-
const { bearerToken, sessionId, requestDomain, systemApiKey, userApiKey, requestContext } =
|
|
741
|
+
const { bearerToken, sessionId, requestDomain, systemApiKey, userApiKey, requestContext, timeZone } =
|
|
685
742
|
extractAuthInputs(req);
|
|
686
743
|
|
|
687
744
|
const userPayload = await GetUserPayload(
|
|
@@ -699,6 +756,9 @@ export function CreateUnifiedAuthMiddleware(
|
|
|
699
756
|
res.status(401).json({ error: 'Invalid token' });
|
|
700
757
|
return;
|
|
701
758
|
}
|
|
759
|
+
if (timeZone) {
|
|
760
|
+
userPayload.TimeZone = timeZone;
|
|
761
|
+
}
|
|
702
762
|
|
|
703
763
|
// Attach to request for downstream consumers
|
|
704
764
|
req.userPayload = userPayload;
|
|
@@ -782,6 +842,7 @@ export const ContextFunction =
|
|
|
782
842
|
userPayload,
|
|
783
843
|
providers,
|
|
784
844
|
ClientIp: expressReq.ip,
|
|
845
|
+
RequestOrigin: ReadRequestOrigin(req.headers.origin),
|
|
785
846
|
};
|
|
786
847
|
};
|
|
787
848
|
|
|
@@ -836,8 +897,6 @@ export async function CreateReadOnlyProvider(dataSources: DataSourceInfo[]): Pro
|
|
|
836
897
|
* from the primary provider to avoid pool exhaustion.
|
|
837
898
|
*/
|
|
838
899
|
async function createPostgresProvider(): Promise<DatabaseProviderBase> {
|
|
839
|
-
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
|
|
840
|
-
|
|
841
900
|
const pgProvider = new PostgreSQLDataProvider();
|
|
842
901
|
const pgConfig = new PostgreSQLProviderConfigData(
|
|
843
902
|
BuildPostgreSQLConnectionConfig(ResolvePostgreSQLEndpoint(), configInfo.databaseSettings, 'api'),
|
|
@@ -872,8 +931,6 @@ async function tryCreateReadOnlyPostgresProvider(): Promise<DatabaseProviderBase
|
|
|
872
931
|
}
|
|
873
932
|
|
|
874
933
|
try {
|
|
875
|
-
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
|
|
876
|
-
|
|
877
934
|
const roProvider = new PostgreSQLDataProvider();
|
|
878
935
|
const roConfig = new PostgreSQLProviderConfigData(
|
|
879
936
|
BuildPostgreSQLConnectionConfig({ ...ResolvePostgreSQLEndpoint(), ...credentials }, configInfo.databaseSettings, 'read-only'),
|
package/src/coreRoutes.ts
CHANGED
|
@@ -19,18 +19,20 @@ import { CreateOAuthCallbackHandler } from './rest/OAuthCallbackHandler.js';
|
|
|
19
19
|
import { CreateSignatureWebhookHandler } from './rest/SignatureWebhookHandler.js';
|
|
20
20
|
import { CreateMediaStreamRouter } from './rest/MediaStreamHandler.js';
|
|
21
21
|
import { CreateRealtimeSdpBrokerRouter } from './rest/RealtimeSdpBrokerHandler.js';
|
|
22
|
-
import { CreateMagicLinkHandler, CreateMagicLinkJwksRouter, RegisterMagicLinkAuthProvider, MAGIC_LINK_MOUNT_PATH } from './auth/magicLink/index.js';
|
|
22
|
+
import { CreateMagicLinkHandler, CreateMagicLinkJwksRouter, MagicLinkService, RegisterMagicLinkAuthProvider, MAGIC_LINK_MOUNT_PATH } from './auth/magicLink/index.js';
|
|
23
23
|
import { CreateWidgetHandler, WIDGET_MOUNT_PATH } from './realtimeWidget/index.js';
|
|
24
24
|
import { CreateRealtimeVerifyRouter, REALTIME_VERIFY_MOUNT_PATH, RealtimeSessionVerificationService } from './realtimeSessions/index.js';
|
|
25
25
|
import { CreateAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth/AuthProviderCatalogRouter.js';
|
|
26
|
+
import { AssertLocalDevAuthAllowed, IsLocalDevAuthEnabled, RegisterLocalDevAuthProvider } from './auth/localDevAuth.js';
|
|
26
27
|
import type { StartupLogger } from './logging/StartupLogger.js';
|
|
27
28
|
|
|
28
29
|
type RouteLog = Pick<StartupLogger, 'LogIf'>;
|
|
29
30
|
|
|
30
|
-
/** Routers the public mounts create
|
|
31
|
+
/** Routers (and host services) the public mounts create for post-auth mounting and extension sharing. */
|
|
31
32
|
export interface CoreAuthenticatedRouters {
|
|
32
33
|
OAuth?: Router;
|
|
33
34
|
MagicLink?: Router;
|
|
35
|
+
MagicLinkService?: MagicLinkService;
|
|
34
36
|
Widget?: Router;
|
|
35
37
|
}
|
|
36
38
|
|
|
@@ -61,12 +63,28 @@ export function MountPublicCoreRoutes(app: Application, publicUrl: string, log:
|
|
|
61
63
|
log.LogIf('verbose', `[Realtime] WebRTC SDP broker registered at ${ApiRoute(REALTIME_SDP_EXCHANGE_PATH)}`);
|
|
62
64
|
}
|
|
63
65
|
|
|
64
|
-
|
|
66
|
+
const magicLink = mountMagicLinkPublic(app, publicUrl, log);
|
|
67
|
+
routers.MagicLink = magicLink?.authenticatedRouter;
|
|
68
|
+
routers.MagicLinkService = magicLink?.service;
|
|
65
69
|
routers.Widget = mountWidgetPublic(app, publicUrl, log);
|
|
70
|
+
mountLocalDevAuthPublic(app, publicUrl, log);
|
|
66
71
|
mountRealtimeVerify(app, log);
|
|
67
72
|
return routers;
|
|
68
73
|
}
|
|
69
74
|
|
|
75
|
+
function mountLocalDevAuthPublic(app: Application, publicUrl: string, log: RouteLog): void {
|
|
76
|
+
AssertLocalDevAuthAllowed();
|
|
77
|
+
if (!IsLocalDevAuthEnabled()) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
RegisterLocalDevAuthProvider(publicUrl);
|
|
81
|
+
if (!configInfo.magicLink?.enabled && !configInfo.widget?.enabled) {
|
|
82
|
+
app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), CreateMagicLinkJwksRouter());
|
|
83
|
+
log.LogIf('verbose', `[LocalDevAuth] Published RS256 signing key at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/jwks.json`);
|
|
84
|
+
}
|
|
85
|
+
log.LogIf('verbose', `[LocalDevAuth] Local dev auth routes enabled at ${ApiRoute(AUTH_CATALOG_MOUNT_PATH)}/dev-login (localhost only)`);
|
|
86
|
+
}
|
|
87
|
+
|
|
70
88
|
function mountOAuthCallback(app: Application, publicUrl: string, log: RouteLog): Router | undefined {
|
|
71
89
|
if (!publicUrl) {
|
|
72
90
|
return undefined;
|
|
@@ -84,16 +102,20 @@ function mountOAuthCallback(app: Application, publicUrl: string, log: RouteLog):
|
|
|
84
102
|
return authenticatedRouter;
|
|
85
103
|
}
|
|
86
104
|
|
|
87
|
-
/** Public magic-link router (JWKS + redeem). The invite-creation router
|
|
88
|
-
function mountMagicLinkPublic(
|
|
105
|
+
/** Public magic-link router (JWKS + redeem). The invite-creation router + service are returned for post-auth / extensions. */
|
|
106
|
+
function mountMagicLinkPublic(
|
|
107
|
+
app: Application,
|
|
108
|
+
publicUrl: string,
|
|
109
|
+
log: RouteLog,
|
|
110
|
+
): { authenticatedRouter: Router; service: MagicLinkService } | undefined {
|
|
89
111
|
if (!configInfo.magicLink?.enabled) {
|
|
90
112
|
return undefined;
|
|
91
113
|
}
|
|
92
|
-
const { publicRouter, authenticatedRouter } = CreateMagicLinkHandler(publicUrl, configInfo.magicLink);
|
|
114
|
+
const { publicRouter, authenticatedRouter, service } = CreateMagicLinkHandler(publicUrl, configInfo.magicLink);
|
|
93
115
|
RegisterMagicLinkAuthProvider(publicUrl, configInfo.magicLink);
|
|
94
116
|
app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), publicRouter);
|
|
95
117
|
log.LogIf('verbose', `[MagicLink] Public routes registered at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/redeem and ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/jwks.json`);
|
|
96
|
-
return authenticatedRouter;
|
|
118
|
+
return { authenticatedRouter, service };
|
|
97
119
|
}
|
|
98
120
|
|
|
99
121
|
/**
|