@memberjunction/server 6.2.0-edge.6 → 6.2.0-edge.8
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 +69 -0
- 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 +31 -8
- package/dist/agentSessions/SessionJanitor.d.ts.map +1 -1
- package/dist/agentSessions/SessionJanitor.js +85 -41
- package/dist/agentSessions/SessionJanitor.js.map +1 -1
- package/dist/agentSessions/SessionManager.d.ts +14 -4
- package/dist/agentSessions/SessionManager.d.ts.map +1 -1
- package/dist/agentSessions/SessionManager.js +28 -4
- 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/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 +50 -2
- package/dist/auth/magicLink/MagicLinkKeys.d.ts.map +1 -1
- package/dist/auth/magicLink/MagicLinkKeys.js +129 -12
- 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 +27 -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/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.map +1 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js +2 -1
- package/dist/broadcast/BaseCacheInvalidationBroadcastProvider.js.map +1 -1
- package/dist/config.d.ts +906 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +59 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +41 -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 +6 -4
- package/dist/coreRoutes.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +1072 -5
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +10174 -4618
- package/dist/generated/graphql-schemas/__mj.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 +27 -1
- package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +50 -5
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +329 -132
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +4 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +47 -7
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/globalCors.d.ts.map +1 -1
- package/dist/globalCors.js +1 -0
- package/dist/globalCors.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +201 -43
- 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 +87 -46
- 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/StartupLogger.d.ts +50 -0
- package/dist/logging/StartupLogger.d.ts.map +1 -1
- package/dist/logging/StartupLogger.js +15 -22
- package/dist/logging/StartupLogger.js.map +1 -1
- package/dist/middleware/BaseServerMiddleware.d.ts +21 -3
- package/dist/middleware/BaseServerMiddleware.d.ts.map +1 -1
- package/dist/middleware/BaseServerMiddleware.js +4 -2
- package/dist/middleware/BaseServerMiddleware.js.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.d.ts.map +1 -1
- package/dist/realtimeSessions/ownedRealtimeSession.js +2 -3
- package/dist/realtimeSessions/ownedRealtimeSession.js.map +1 -1
- package/dist/realtimeSessions/sessionAccess.d.ts +15 -0
- package/dist/realtimeSessions/sessionAccess.d.ts.map +1 -1
- package/dist/realtimeSessions/sessionAccess.js +22 -0
- package/dist/realtimeSessions/sessionAccess.js.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.d.ts.map +1 -1
- package/dist/realtimeWidget/WidgetSessionService.js +2 -0
- package/dist/realtimeWidget/WidgetSessionService.js.map +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.map +1 -1
- package/dist/realtimeWidget/widgetCore.js +4 -7
- package/dist/realtimeWidget/widgetCore.js.map +1 -1
- package/dist/realtimeWidget/widgetGuestElevation.js +1 -0
- 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/AgentRunStatusPublisher.d.ts +10 -0
- package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -1
- package/dist/resolvers/AgentRunStatusPublisher.js +18 -2
- package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -1
- package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/AgentSessionResolver.js +6 -2
- package/dist/resolvers/AgentSessionResolver.js.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts +1 -1
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +61 -16
- 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/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/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +34 -13
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/InfoResolver.js +1 -1
- package/dist/resolvers/InfoResolver.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 +2690 -1305
- 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/QuerySystemUserResolver.d.ts +38 -1
- package/dist/resolvers/QuerySystemUserResolver.d.ts.map +1 -1
- package/dist/resolvers/QuerySystemUserResolver.js +181 -88
- package/dist/resolvers/QuerySystemUserResolver.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 +6 -0
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +36 -5
- 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 +217 -34
- package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +24 -8
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +185 -67
- 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 +3 -1
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +7 -8
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/TagGovernanceResolver.d.ts +12 -0
- package/dist/resolvers/TagGovernanceResolver.d.ts.map +1 -1
- package/dist/resolvers/TagGovernanceResolver.js +84 -0
- package/dist/resolvers/TagGovernanceResolver.js.map +1 -1
- package/dist/resolvers/TelemetryResolver.d.ts +13 -8
- package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
- package/dist/resolvers/TelemetryResolver.js +40 -9
- package/dist/resolvers/TelemetryResolver.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/resolvers/meetings/meetingMutations.d.ts.map +1 -1
- package/dist/resolvers/meetings/meetingMutations.js +34 -4
- package/dist/resolvers/meetings/meetingMutations.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/RealtimeRecordingHandler.d.ts +3 -3
- package/dist/rest/RealtimeRecordingHandler.d.ts.map +1 -1
- package/dist/rest/RealtimeRecordingHandler.js +2 -4
- package/dist/rest/RealtimeRecordingHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +2 -1
- 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/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.map +1 -1
- package/dist/services/TaskGraphContinuationDeliverer.js +1 -0
- 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 +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +55 -2
- package/dist/util.js.map +1 -1
- package/package.json +107 -100
- package/src/__tests__/APIKeyScopeAuth.test.ts +4 -8
- package/src/__tests__/ActiveOperations.test.ts +68 -0
- package/src/__tests__/AgentSessionResolver.ownership.test.ts +13 -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__/DeleteConnectionRemovesPerConnectionCatalog.test.ts +51 -0
- package/src/__tests__/DetachedDiscoveryStart.test.ts +65 -0
- package/src/__tests__/DurableEntityActionTaskSubmitter.test.ts +73 -0
- package/src/__tests__/EntityMapLifecycle.rekey.test.ts +252 -0
- package/src/__tests__/ExecuteRemoteOperationResolver.test.ts +213 -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__/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.permissions.test.ts +132 -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.test.ts +22 -0
- 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 +6 -4
- package/src/__tests__/RemoteBrowserAudioStream.test.ts +3 -0
- package/src/__tests__/RemoteBrowserSnapshot.test.ts +3 -0
- package/src/__tests__/ResolverBase.clientOldValues.test.ts +327 -26
- package/src/__tests__/ResolverBase.diagnosticSenderRegistrations.test.ts +26 -0
- package/src/__tests__/ResolverBase.encryptedApiZeroReencrypt.test.ts +307 -0
- package/src/__tests__/ResolverBase.entityMessageRelay.test.ts +53 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +60 -0
- package/src/__tests__/RunAIAgentResolver.branch.test.ts +4 -0
- package/src/__tests__/RunAIAgentResolver.consultPredecessor.test.ts +289 -0
- package/src/__tests__/RunAIAgentResolver.handoff.test.ts +649 -0
- package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +2 -0
- package/src/__tests__/RunAIAgentResolver.runDataGuard.test.ts +2 -0
- package/src/__tests__/RunAIAgentResolver.stoppedPredecessor.test.ts +87 -12
- package/src/__tests__/RunAIAgentResolver.streaming.test.ts +28 -4
- 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 +69 -0
- package/src/__tests__/TagGovernanceAndAutotagResolvers.test.ts +261 -0
- package/src/__tests__/TagGovernanceResolver.test.ts +60 -2
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +2 -2
- package/src/__tests__/TaskGraphAgentRunner.test.ts +272 -16
- package/src/__tests__/ViewOperationsHandler.test.ts +2 -5
- package/src/__tests__/WorkQueueHostService.test.ts +25 -7
- package/src/__tests__/backgroundSweepConfigUnits.test.ts +153 -0
- package/src/__tests__/contextRequestOrigin.test.ts +105 -0
- package/src/__tests__/conversationBrowsers.test.ts +62 -0
- package/src/__tests__/globalCors.test.ts +12 -0
- package/src/__tests__/magicLinkExtensionCapabilities.test.ts +413 -0
- package/src/__tests__/orphanedConversationDetailReconciler.start.test.ts +82 -0
- package/src/__tests__/ownedRealtimeSession.test.ts +14 -0
- package/src/__tests__/realtimeRecordingHandler.test.ts +7 -2
- package/src/__tests__/realtimeSessions/sessionAccess.test.ts +79 -1
- package/src/__tests__/requestOrigin.test.ts +104 -0
- package/src/__tests__/review-capture-valid-token-log.test.ts +98 -0
- package/src/__tests__/runStreams.fieldSecurity.test.ts +5 -5
- package/src/__tests__/securityHardeningPr6034.test.ts +120 -0
- package/src/__tests__/sessionDeadline.test.ts +51 -0
- package/src/__tests__/sharedCache.test.ts +11 -0
- package/src/__tests__/unifiedAuth.test.ts +73 -1
- 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 +92 -42
- package/src/agentSessions/SessionManager.ts +38 -8
- package/src/agentSessions/conversationBrowsers.ts +143 -0
- package/src/agentSessions/sessionDeadline.ts +81 -0
- package/src/auth/APIKeyScopeAuth.ts +5 -4
- package/src/auth/__tests__/loginEmailResolution.test.ts +67 -0
- package/src/auth/loginEmailResolution.ts +67 -0
- package/src/auth/magicLink/MagicLinkKeys.ts +146 -14
- 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 +28 -3
- package/src/auth/newUsers.ts +1 -0
- package/src/backgroundSweepConfigUnits.ts +213 -0
- package/src/broadcast/BaseCacheInvalidationBroadcastProvider.ts +2 -1
- package/src/config.ts +69 -0
- package/src/context.ts +46 -15
- package/src/coreRoutes.ts +14 -7
- package/src/generated/graphql-schemas/__mj.ts +10360 -6479
- package/src/generic/OrphanedConversationDetailReconciler.ts +32 -1
- package/src/generic/ResolverBase.ts +422 -143
- package/src/generic/RunViewResolver.ts +96 -49
- package/src/globalCors.ts +1 -0
- package/src/index.ts +246 -44
- package/src/integration/ConnectionPause.ts +222 -0
- package/src/integration/CustomColumnPromoter.ts +123 -53
- 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/StartupLogger.ts +24 -0
- package/src/middleware/BaseServerMiddleware.ts +20 -3
- package/src/realtimeSessions/ownedRealtimeSession.ts +2 -6
- package/src/realtimeSessions/sessionAccess.ts +30 -0
- package/src/realtimeWidget/WidgetSessionService.ts +2 -0
- package/src/realtimeWidget/visitorIdentity.ts +1 -0
- package/src/realtimeWidget/widgetCore.ts +4 -8
- package/src/realtimeWidget/widgetGuestElevation.ts +1 -0
- package/src/requestOrigin.ts +64 -0
- package/src/resolvers/AgentRunStatusPublisher.ts +27 -2
- package/src/resolvers/AgentSessionResolver.ts +6 -2
- package/src/resolvers/AutotagPipelineResolver.ts +59 -14
- package/src/resolvers/ConversationRunEventsResolver.ts +2 -0
- package/src/resolvers/ExecuteRemoteOperationResolver.ts +41 -9
- package/src/resolvers/GetDataResolver.ts +35 -13
- package/src/resolvers/InfoResolver.ts +1 -1
- package/src/resolvers/IntegrationDiscoveryResolver.ts +1522 -203
- package/src/resolvers/MCPResolver.ts +15 -2
- package/src/resolvers/QuerySystemUserResolver.ts +211 -100
- package/src/resolvers/RealtimeBridgeResolver.ts +1 -0
- package/src/resolvers/RealtimeClientSessionResolver.ts +40 -7
- package/src/resolvers/RemoteBrowserActionResolver.ts +242 -32
- package/src/resolvers/RunAIAgentResolver.ts +265 -86
- package/src/resolvers/RunAIPromptResolver.ts +18 -18
- package/src/resolvers/RunTemplateResolver.ts +3 -1
- package/src/resolvers/SqlLoggingConfigResolver.ts +7 -9
- package/src/resolvers/TagGovernanceResolver.ts +65 -0
- package/src/resolvers/TelemetryResolver.ts +44 -9
- package/src/resolvers/__tests__/GetDataResolver.tokens.test.ts +52 -0
- package/src/resolvers/meetingRecordingRegistration.ts +2 -0
- package/src/resolvers/meetings/meetingMutations.ts +37 -7
- package/src/rest/MediaAccessKeys.ts +6 -2
- package/src/rest/OAuthCallbackHandler.ts +13 -5
- package/src/rest/RealtimeRecordingHandler.ts +5 -9
- package/src/rest/ViewOperationsHandler.ts +2 -1
- package/src/rest/setupRESTEndpoints.ts +11 -2
- 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 +1 -0
- package/src/services/WorkQueueHostService.ts +26 -4
- package/src/services/workQueueConfig.ts +5 -5
- package/src/sharedCache.ts +1 -1
- package/src/types.ts +18 -0
- package/src/util.ts +55 -3
- package/src/services/TaskOrchestration-Integration.md +0 -188
package/src/config.ts
CHANGED
|
@@ -6,6 +6,14 @@ import { mergeConfigs, parseBooleanEnv } from '@memberjunction/config';
|
|
|
6
6
|
import { TelemetryEnabledDefault } from './telemetryConfigUnits.js';
|
|
7
7
|
import { RealtimeEnabledDefault } from './realtimeConfigUnits.js';
|
|
8
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';
|
|
9
17
|
|
|
10
18
|
const explorer = cosmiconfigSync('mj', { searchStrategy: 'global' });
|
|
11
19
|
|
|
@@ -506,6 +514,13 @@ const magicLinkSchema = z.object({
|
|
|
506
514
|
* returns the token as JSON. Append `?format=json` to force JSON regardless.
|
|
507
515
|
*/
|
|
508
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(),
|
|
509
524
|
}).passthrough();
|
|
510
525
|
|
|
511
526
|
/**
|
|
@@ -871,6 +886,44 @@ const identityVerificationSchema = z.object({
|
|
|
871
886
|
}).optional().default({}),
|
|
872
887
|
}).passthrough();
|
|
873
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
|
+
|
|
874
927
|
const realtimeSchema = z.object({
|
|
875
928
|
/** Master switch. When false, the WebRTC SDP broker router is not mounted. Defaults to true. */
|
|
876
929
|
enabled: zodBooleanWithTransforms().default(true),
|
|
@@ -881,6 +934,8 @@ const realtimeSchema = z.object({
|
|
|
881
934
|
* is assembled anyway as `Partial` (gaps become silence). Defaults to 90.
|
|
882
935
|
*/
|
|
883
936
|
recordingAssemblyGraceSeconds: z.coerce.number().positive().optional().default(90),
|
|
937
|
+
/** Remote browsers that text conversations open (off by default). */
|
|
938
|
+
conversationBrowser: conversationBrowserSchema.optional().default({}),
|
|
884
939
|
}).passthrough();
|
|
885
940
|
|
|
886
941
|
const devAuthSchema = z.object({
|
|
@@ -904,6 +959,9 @@ const configInfoSchema = z.object({
|
|
|
904
959
|
authProviders: z.array(authProviderSchema).optional(),
|
|
905
960
|
componentRegistries: z.array(componentRegistrySchema).optional(),
|
|
906
961
|
scheduledJobs: scheduledJobsSchema.optional().default({}),
|
|
962
|
+
agentSessions: AgentSessionsSchema.optional().default({}),
|
|
963
|
+
agentRunWatchdog: AgentRunWatchdogSchema.optional().default({}),
|
|
964
|
+
conversationDetailReconciler: ConversationDetailReconcilerSchema.optional().default({}),
|
|
907
965
|
integrationSyncWorker: integrationSyncWorkerSchema.optional().default({}),
|
|
908
966
|
workQueue: WorkQueueSchema.optional().default({}),
|
|
909
967
|
telemetry: telemetrySchema.optional().default({}),
|
|
@@ -970,6 +1028,7 @@ export type MagicLinkConfig = z.infer<typeof magicLinkSchema>;
|
|
|
970
1028
|
export type WidgetConfig = z.infer<typeof widgetSchema>;
|
|
971
1029
|
export type TelephonyConfig = z.infer<typeof telephonySchema>;
|
|
972
1030
|
export type RealtimeConfig = z.infer<typeof realtimeSchema>;
|
|
1031
|
+
export type ConversationBrowserConfig = z.infer<typeof conversationBrowserSchema>;
|
|
973
1032
|
export type IdentityVerificationConfig = z.infer<typeof identityVerificationSchema>;
|
|
974
1033
|
export type TwilioTelephonyConfig = z.infer<typeof twilioTelephonySchema>;
|
|
975
1034
|
export type VonageTelephonyConfig = z.infer<typeof vonageTelephonySchema>;
|
|
@@ -1114,6 +1173,16 @@ export const DEFAULT_SERVER_CONFIG: Partial<ConfigInfo> = {
|
|
|
1114
1173
|
staleLockCleanupInterval: 300000
|
|
1115
1174
|
},
|
|
1116
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
|
+
|
|
1117
1186
|
// Integration sync worker defaults (off — syncs run inline unless a worker is enabled)
|
|
1118
1187
|
integrationSyncWorker: {
|
|
1119
1188
|
enabled: false,
|
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,12 +16,14 @@ 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
|
-
import { DatabaseProviderBase, UserInfo, type IMetadataProvider, type MagicLinkScope, type ReturningVisitorContext, type WidgetGuestContext } from '@memberjunction/core';
|
|
24
|
+
import { DatabaseProviderBase, UserInfo, GetDiagnosticContext, type IMetadataProvider, type MagicLinkScope, type ReturningVisitorContext, type WidgetGuestContext } from '@memberjunction/core';
|
|
23
25
|
import { SQLServerDataProvider, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
|
|
26
|
+
import { PostgreSQLDataProvider, PostgreSQLProviderConfigData } from '@memberjunction/postgresql-dataprovider';
|
|
24
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';
|
|
@@ -46,7 +49,7 @@ function isDebugLogLevel(): boolean {
|
|
|
46
49
|
if (isDebugLevelCache === undefined) {
|
|
47
50
|
isDebugLevelCache = StartupLogger.resolveLevelFromConfig() === 'debug';
|
|
48
51
|
}
|
|
49
|
-
return isDebugLevelCache;
|
|
52
|
+
return isDebugLevelCache || GetDiagnosticContext()?.sessionId != null;
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
const SESSION_AUDIT_TYPE = 'Session Established';
|
|
@@ -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,
|
|
@@ -346,13 +371,6 @@ const verifyAsync = async (issuer: string, token: string): Promise<jwt.JwtPayloa
|
|
|
346
371
|
jwt.verify(token, GetSigningKeys(issuer), verifyOptions, (err, jwt) => {
|
|
347
372
|
if (jwt && typeof jwt !== 'string' && !err) {
|
|
348
373
|
const payload = jwt.payload ?? jwt;
|
|
349
|
-
|
|
350
|
-
// Per-request token confirmation — debug-only (one of the worst
|
|
351
|
-
// "constantly on" offenders on an authenticated server).
|
|
352
|
-
if (isDebugLogLevel()) {
|
|
353
|
-
const userInfo = ExtractUserInfoFromPayload(payload);
|
|
354
|
-
console.log(`Valid token: ${userInfo.fullName || 'Unknown'} (${userInfo.email || userInfo.preferredUsername || 'Unknown'})`);
|
|
355
|
-
}
|
|
356
374
|
resolve(payload);
|
|
357
375
|
} else {
|
|
358
376
|
console.warn('Invalid token');
|
|
@@ -528,7 +546,8 @@ export const GetUserPayload = async (
|
|
|
528
546
|
|
|
529
547
|
// Use provider to extract user information
|
|
530
548
|
const userInfo = ExtractUserInfoFromPayload(payload);
|
|
531
|
-
const
|
|
549
|
+
const loginEmail = ResolveUserLookupEmail(userInfo, userEmailMap);
|
|
550
|
+
const email = loginEmail.LookupEmail;
|
|
532
551
|
|
|
533
552
|
const userRecord = await VerifyUserRecord(
|
|
534
553
|
email,
|
|
@@ -552,9 +571,15 @@ export const GetUserPayload = async (
|
|
|
552
571
|
// for everything else.
|
|
553
572
|
const sessionUser = BuildMagicLinkSessionUser(userRecord, payload);
|
|
554
573
|
|
|
574
|
+
// Debug-only confirmation of a freshly verified token. It names the user by ID only.
|
|
575
|
+
if (!cachedAuth && isDebugLogLevel()) {
|
|
576
|
+
console.log(`Valid token: user ${sessionUser.ID}`);
|
|
577
|
+
}
|
|
578
|
+
|
|
555
579
|
// Session-established audit — once per issued token (deduped), fire-and-forget so
|
|
556
580
|
// it never adds latency to the request. The dedup mark is set synchronously here.
|
|
557
581
|
if (markSessionAuditSeen(sessionAuditKey('sess', payload))) {
|
|
582
|
+
const identityMismatch = reportIdentityMismatch(loginEmail, sessionUser);
|
|
558
583
|
void writeSessionAudit({
|
|
559
584
|
user: sessionUser,
|
|
560
585
|
auditTypeName: SESSION_AUDIT_TYPE,
|
|
@@ -562,7 +587,16 @@ export const GetUserPayload = async (
|
|
|
562
587
|
payload,
|
|
563
588
|
requestContext,
|
|
564
589
|
requestDomain,
|
|
565
|
-
description:
|
|
590
|
+
description: identityMismatch
|
|
591
|
+
? `Session established via ${payload.iss ?? 'unknown provider'}: token identity '${loginEmail.TokenEmail ?? ''}' runs as user '${sessionUser.Email}'`
|
|
592
|
+
: `Session established via ${payload.iss ?? 'unknown provider'}`,
|
|
593
|
+
extraDetails: {
|
|
594
|
+
tokenEmail: loginEmail.TokenEmail ?? null,
|
|
595
|
+
lookupEmail: loginEmail.LookupEmail ?? null,
|
|
596
|
+
resolvedUserEmail: sessionUser.Email ?? null,
|
|
597
|
+
remappedByUserEmailMap: loginEmail.Remapped,
|
|
598
|
+
identityMismatch,
|
|
599
|
+
},
|
|
566
600
|
});
|
|
567
601
|
}
|
|
568
602
|
|
|
@@ -806,6 +840,7 @@ export const ContextFunction =
|
|
|
806
840
|
userPayload,
|
|
807
841
|
providers,
|
|
808
842
|
ClientIp: expressReq.ip,
|
|
843
|
+
RequestOrigin: ReadRequestOrigin(req.headers.origin),
|
|
809
844
|
};
|
|
810
845
|
};
|
|
811
846
|
|
|
@@ -860,8 +895,6 @@ export async function CreateReadOnlyProvider(dataSources: DataSourceInfo[]): Pro
|
|
|
860
895
|
* from the primary provider to avoid pool exhaustion.
|
|
861
896
|
*/
|
|
862
897
|
async function createPostgresProvider(): Promise<DatabaseProviderBase> {
|
|
863
|
-
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
|
|
864
|
-
|
|
865
898
|
const pgProvider = new PostgreSQLDataProvider();
|
|
866
899
|
const pgConfig = new PostgreSQLProviderConfigData(
|
|
867
900
|
BuildPostgreSQLConnectionConfig(ResolvePostgreSQLEndpoint(), configInfo.databaseSettings, 'api'),
|
|
@@ -896,8 +929,6 @@ async function tryCreateReadOnlyPostgresProvider(): Promise<DatabaseProviderBase
|
|
|
896
929
|
}
|
|
897
930
|
|
|
898
931
|
try {
|
|
899
|
-
const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
|
|
900
|
-
|
|
901
932
|
const roProvider = new PostgreSQLDataProvider();
|
|
902
933
|
const roConfig = new PostgreSQLProviderConfigData(
|
|
903
934
|
BuildPostgreSQLConnectionConfig({ ...ResolvePostgreSQLEndpoint(), ...credentials }, configInfo.databaseSettings, 'read-only'),
|
package/src/coreRoutes.ts
CHANGED
|
@@ -19,7 +19,7 @@ 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';
|
|
@@ -28,10 +28,11 @@ import type { StartupLogger } from './logging/StartupLogger.js';
|
|
|
28
28
|
|
|
29
29
|
type RouteLog = Pick<StartupLogger, 'LogIf'>;
|
|
30
30
|
|
|
31
|
-
/** Routers the public mounts create
|
|
31
|
+
/** Routers (and host services) the public mounts create for post-auth mounting and extension sharing. */
|
|
32
32
|
export interface CoreAuthenticatedRouters {
|
|
33
33
|
OAuth?: Router;
|
|
34
34
|
MagicLink?: Router;
|
|
35
|
+
MagicLinkService?: MagicLinkService;
|
|
35
36
|
Widget?: Router;
|
|
36
37
|
}
|
|
37
38
|
|
|
@@ -62,7 +63,9 @@ export function MountPublicCoreRoutes(app: Application, publicUrl: string, log:
|
|
|
62
63
|
log.LogIf('verbose', `[Realtime] WebRTC SDP broker registered at ${ApiRoute(REALTIME_SDP_EXCHANGE_PATH)}`);
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
const magicLink = mountMagicLinkPublic(app, publicUrl, log);
|
|
67
|
+
routers.MagicLink = magicLink?.authenticatedRouter;
|
|
68
|
+
routers.MagicLinkService = magicLink?.service;
|
|
66
69
|
routers.Widget = mountWidgetPublic(app, publicUrl, log);
|
|
67
70
|
mountLocalDevAuthPublic(app, publicUrl, log);
|
|
68
71
|
mountRealtimeVerify(app, log);
|
|
@@ -99,16 +102,20 @@ function mountOAuthCallback(app: Application, publicUrl: string, log: RouteLog):
|
|
|
99
102
|
return authenticatedRouter;
|
|
100
103
|
}
|
|
101
104
|
|
|
102
|
-
/** Public magic-link router (JWKS + redeem). The invite-creation router
|
|
103
|
-
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 {
|
|
104
111
|
if (!configInfo.magicLink?.enabled) {
|
|
105
112
|
return undefined;
|
|
106
113
|
}
|
|
107
|
-
const { publicRouter, authenticatedRouter } = CreateMagicLinkHandler(publicUrl, configInfo.magicLink);
|
|
114
|
+
const { publicRouter, authenticatedRouter, service } = CreateMagicLinkHandler(publicUrl, configInfo.magicLink);
|
|
108
115
|
RegisterMagicLinkAuthProvider(publicUrl, configInfo.magicLink);
|
|
109
116
|
app.use(ApiRoute(MAGIC_LINK_MOUNT_PATH), cors<cors.CorsRequest>(), publicRouter);
|
|
110
117
|
log.LogIf('verbose', `[MagicLink] Public routes registered at ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/redeem and ${ApiRoute(MAGIC_LINK_MOUNT_PATH)}/jwks.json`);
|
|
111
|
-
return authenticatedRouter;
|
|
118
|
+
return { authenticatedRouter, service };
|
|
112
119
|
}
|
|
113
120
|
|
|
114
121
|
/**
|